@plutonhq/core-frontend 0.1.30 → 0.1.31

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 (47) hide show
  1. package/dist-lib/@types/devices.d.ts +4 -4
  2. package/dist-lib/@types/devices.d.ts.map +1 -1
  3. package/dist-lib/@types/plans.d.ts +1 -0
  4. package/dist-lib/@types/plans.d.ts.map +1 -1
  5. package/dist-lib/components/App/Footer/Footer.d.ts +2 -1
  6. package/dist-lib/components/App/Footer/Footer.d.ts.map +1 -1
  7. package/dist-lib/components/App/Footer/Footer.js +10 -8
  8. package/dist-lib/components/App/Footer/Footer.js.map +1 -1
  9. package/dist-lib/components/Device/EditDevice/EditDevice.d.ts.map +1 -1
  10. package/dist-lib/components/Device/EditDevice/EditDevice.js +70 -61
  11. package/dist-lib/components/Device/EditDevice/EditDevice.js.map +1 -1
  12. package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
  13. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +66 -68
  14. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
  15. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +40 -38
  16. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js.map +1 -1
  17. package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.d.ts.map +1 -1
  18. package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js +89 -101
  19. package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js.map +1 -1
  20. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.d.ts.map +1 -1
  21. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js +31 -25
  22. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js.map +1 -1
  23. package/dist-lib/components/common/form/StoragePicker/StoragePicker.d.ts.map +1 -1
  24. package/dist-lib/components/common/form/StoragePicker/StoragePicker.js +52 -46
  25. package/dist-lib/components/common/form/StoragePicker/StoragePicker.js.map +1 -1
  26. package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
  27. package/dist-lib/routes/PlanSingle/PlanSingle.js +76 -72
  28. package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
  29. package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js +14 -12
  30. package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js.map +1 -1
  31. package/dist-lib/styles/core-frontend.css +1 -1
  32. package/dist-lib/utils/progressHelpers.d.ts.map +1 -1
  33. package/dist-lib/utils/progressHelpers.js +1 -0
  34. package/dist-lib/utils/progressHelpers.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/@types/devices.ts +4 -4
  37. package/src/@types/plans.ts +1 -0
  38. package/src/components/App/Footer/Footer.tsx +3 -2
  39. package/src/components/Device/EditDevice/EditDevice.tsx +11 -4
  40. package/src/components/Plan/BackupProgress/BackupProgress.module.scss +3 -0
  41. package/src/components/Plan/BackupProgress/BackupProgress.tsx +5 -3
  42. package/src/components/Plan/PlanSettings/PlanScriptsSettings.tsx +29 -31
  43. package/src/components/Plan/PlanSettings/PlanSourceSettings.tsx +11 -3
  44. package/src/components/common/form/StoragePicker/StoragePicker.tsx +10 -2
  45. package/src/routes/PlanSingle/PlanSingle.module.scss +10 -0
  46. package/src/routes/PlanSingle/PlanSingle.tsx +6 -1
  47. package/src/utils/progressHelpers.ts +1 -0
@@ -1,11 +1,11 @@
1
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
1
+ import { jsx as e, jsxs as n } from "react/jsx-runtime";
2
2
  import a from "./PlanSettings.module.scss.js";
3
- import { useState as S } from "react";
4
- import u from "../../common/Icon/Icon.js";
5
- import f from "../../common/form/Toggle/Toggle.js";
6
- import { secondsToMinutes as O } from "../../../utils/helpers.js";
7
- import C from "../../common/form/NumberInput/NumberInput.js";
8
- const g = {
3
+ import { useState as B } from "react";
4
+ import d from "../../common/Icon/Icon.js";
5
+ import N from "../../common/form/Toggle/Toggle.js";
6
+ import { secondsToMinutes as E } from "../../../utils/helpers.js";
7
+ import g from "../../common/form/NumberInput/NumberInput.js";
8
+ const w = {
9
9
  onBackupStart: {
10
10
  title: "Before Backup Start",
11
11
  description: "Scripts that run before the backup starts."
@@ -26,7 +26,7 @@ const g = {
26
26
  title: "On Backup Complete",
27
27
  description: "Scripts that run when the backup completes."
28
28
  }
29
- }, H = ({
29
+ }, I = ({
30
30
  settings: s = {
31
31
  onBackupStart: [],
32
32
  onBackupEnd: [],
@@ -34,32 +34,38 @@ const g = {
34
34
  onBackupFailure: [],
35
35
  onBackupComplete: []
36
36
  },
37
- platform: N,
38
- onUpdate: p
37
+ platform: T = "",
38
+ onUpdate: u
39
39
  }) => {
40
- const [m, v] = S(!1), [d, b] = S({
40
+ const [k, C] = B(!1), [h, f] = B({
41
41
  onBackupStart: !1,
42
42
  onBackupEnd: !1,
43
43
  onBackupError: !1,
44
44
  onBackupFailure: !1,
45
45
  onBackupComplete: !1
46
- });
47
- return console.log("settings :", s), console.log("### platform :", N), /* @__PURE__ */ t("div", { className: a.eventTabs, children: Object.entries(g).map(([r, { title: B, description: T }]) => {
48
- const k = r, i = s[k] || [], h = d[k];
46
+ }), O = T.toLowerCase().includes("linux"), S = (c, m, v, p) => {
47
+ const i = [...s[c] || []];
48
+ i[m] = {
49
+ ...i[m],
50
+ [v]: p
51
+ }, u({ ...s, [c]: i });
52
+ };
53
+ return /* @__PURE__ */ e("div", { className: a.eventTabs, children: Object.entries(w).map(([c, { title: m, description: v }]) => {
54
+ const p = c, i = s[p] || [], b = h[p];
49
55
  return /* @__PURE__ */ n("div", { className: a.eventTab, children: [
50
56
  /* @__PURE__ */ n("div", { className: a.eventTabHead, children: [
51
57
  /* @__PURE__ */ n("div", { children: [
52
- /* @__PURE__ */ n("span", { className: a.eventTabHeadTitle, onClick: () => b({ ...d, [r]: !h }), children: [
53
- B,
58
+ /* @__PURE__ */ n("span", { className: a.eventTabHeadTitle, onClick: () => f({ ...h, [c]: !b }), children: [
59
+ m,
54
60
  " (",
55
61
  i.length || 0,
56
62
  ")"
57
63
  ] }),
58
- /* @__PURE__ */ t(
64
+ /* @__PURE__ */ e(
59
65
  "button",
60
66
  {
61
67
  onClick: () => {
62
- const e = {
68
+ const t = {
63
69
  id: Math.random().toString(36).substring(2, 15),
64
70
  type: "script",
65
71
  enabled: !0,
@@ -67,7 +73,7 @@ const g = {
67
73
  logOutput: !1,
68
74
  abortOnError: !1
69
75
  };
70
- d[k] || b({ ...d, [r]: !0 }), p({ ...s, [r]: [...i || [], e] });
76
+ h[p] || f({ ...h, [c]: !0 }), u({ ...s, [c]: [...i || [], t] });
71
77
  },
72
78
  className: a.addScriptButton,
73
79
  children: "+"
@@ -75,155 +81,137 @@ const g = {
75
81
  )
76
82
  ] }),
77
83
  /* @__PURE__ */ n("div", { children: [
78
- /* @__PURE__ */ t(
84
+ /* @__PURE__ */ e(
79
85
  "span",
80
86
  {
81
87
  className: a.eventTabHeadDescription,
82
88
  "data-tooltip-id": "hintTooltip",
83
89
  "data-tooltip-place": "top",
84
- "data-tooltip-content": T,
85
- children: /* @__PURE__ */ t(u, { type: "help", size: 13 })
90
+ "data-tooltip-content": v,
91
+ children: /* @__PURE__ */ e(d, { type: "help", size: 13 })
86
92
  }
87
93
  ),
88
- /* @__PURE__ */ t("button", { onClick: () => b({ ...d, [r]: !h }), children: /* @__PURE__ */ t(u, { type: h ? "caret-up" : "caret-down", size: 14 }) })
94
+ /* @__PURE__ */ e("button", { onClick: () => f({ ...h, [c]: !b }), children: /* @__PURE__ */ e(d, { type: b ? "caret-up" : "caret-down", size: 14 }) })
89
95
  ] })
90
96
  ] }),
91
- h && /* @__PURE__ */ n("div", { className: a.eventTabContent, children: [
92
- (i == null ? void 0 : i.length) === 0 && /* @__PURE__ */ t("div", { className: a.noScriptsMessage, children: /* @__PURE__ */ t("span", { children: "No scripts configured for this event." }) }),
93
- i == null ? void 0 : i.map((e, c) => /* @__PURE__ */ n("div", { className: a.scriptItem, children: [
97
+ b && /* @__PURE__ */ n("div", { className: a.eventTabContent, children: [
98
+ (i == null ? void 0 : i.length) === 0 && /* @__PURE__ */ e("div", { className: a.noScriptsMessage, children: /* @__PURE__ */ e("span", { children: "No scripts configured for this event." }) }),
99
+ i == null ? void 0 : i.map((t, l) => /* @__PURE__ */ n("div", { className: a.scriptItem, children: [
94
100
  /* @__PURE__ */ n("div", { className: a.scriptHeader, children: [
95
101
  /* @__PURE__ */ n("span", { className: a.scriptTitle, children: [
96
- /* @__PURE__ */ t(u, { type: "cli", size: 13 }),
102
+ /* @__PURE__ */ e(d, { type: "cli", size: 13 }),
97
103
  " Script ",
98
- c + 1
104
+ l + 1
99
105
  ] }),
100
106
  i.length > 1 && /* @__PURE__ */ n("div", { className: a.scriptPositionControls, children: [
101
- /* @__PURE__ */ t(
107
+ /* @__PURE__ */ e(
102
108
  "button",
103
109
  {
104
110
  title: "Move Up",
105
- disabled: c === 0,
111
+ disabled: l === 0,
106
112
  onClick: () => {
107
- const l = [...i || []], [o] = l.splice(c, 1);
108
- l.splice(c - 1, 0, o), p({ ...s, [r]: l });
113
+ const o = [...i || []], [r] = o.splice(l, 1);
114
+ o.splice(l - 1, 0, r), u({ ...s, [c]: o });
109
115
  },
110
- children: /* @__PURE__ */ t(u, { type: "caret-up", size: 14 })
116
+ children: /* @__PURE__ */ e(d, { type: "caret-up", size: 14 })
111
117
  }
112
118
  ),
113
- /* @__PURE__ */ t(
119
+ /* @__PURE__ */ e(
114
120
  "button",
115
121
  {
116
122
  title: "Move Down",
117
- disabled: c === i.length - 1,
123
+ disabled: l === i.length - 1,
118
124
  onClick: () => {
119
- const l = [...i || []], [o] = l.splice(c, 1);
120
- l.splice(c + 1, 0, o), p({ ...s, [r]: l });
125
+ const o = [...i || []], [r] = o.splice(l, 1);
126
+ o.splice(l + 1, 0, r), u({ ...s, [c]: o });
121
127
  },
122
- children: /* @__PURE__ */ t(u, { type: "caret-down", size: 14 })
128
+ children: /* @__PURE__ */ e(d, { type: "caret-down", size: 14 })
123
129
  }
124
130
  )
125
131
  ] })
126
132
  ] }),
127
- /* @__PURE__ */ t(
133
+ /* @__PURE__ */ e(
128
134
  "input",
129
135
  {
130
136
  type: "text",
131
137
  className: a.scriptPathInput,
132
- value: (e == null ? void 0 : e.scriptPath) || "",
138
+ value: (t == null ? void 0 : t.scriptPath) || "",
133
139
  placeholder: "Enter absolute path to script file (e.g. /opt/scripts/pre-backup.sh)",
134
- onChange: (l) => {
135
- const o = [...i || []];
136
- o[c] = {
137
- ...o[c],
138
- scriptPath: l.target.value
139
- }, p({ ...s, [r]: o });
140
+ onChange: (o) => {
141
+ const r = [...i || []];
142
+ r[l] = {
143
+ ...r[l],
144
+ scriptPath: o.target.value
145
+ }, u({ ...s, [c]: r });
140
146
  }
141
147
  }
142
148
  ),
143
149
  /* @__PURE__ */ n("div", { className: a.scriptFooter, children: [
144
150
  /* @__PURE__ */ n("div", { className: a.scriptOptions, children: [
145
151
  /* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
146
- /* @__PURE__ */ t(
147
- f,
152
+ /* @__PURE__ */ e(
153
+ N,
148
154
  {
149
- fieldValue: (e == null ? void 0 : e.enabled) || !1,
155
+ fieldValue: (t == null ? void 0 : t.enabled) || !1,
150
156
  inline: !0,
151
- onUpdate: (l) => {
152
- const o = [...i || []];
153
- o[c] = {
154
- ...o[c],
155
- enabled: l
156
- }, p({ ...s, [r]: o });
157
- }
157
+ onUpdate: (o) => S(p, l, "enabled", o)
158
158
  }
159
159
  ),
160
- /* @__PURE__ */ t("span", { children: "Enabled" })
160
+ /* @__PURE__ */ e("span", { children: "Enabled" })
161
161
  ] }),
162
162
  /* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
163
- /* @__PURE__ */ t(
164
- f,
163
+ /* @__PURE__ */ e(
164
+ N,
165
165
  {
166
- fieldValue: (e == null ? void 0 : e.logOutput) || !1,
166
+ fieldValue: (t == null ? void 0 : t.abortOnError) || !1,
167
167
  inline: !0,
168
- onUpdate: (l) => {
169
- const o = [...i || []];
170
- o[c] = {
171
- ...o[c],
172
- logOutput: l
173
- }, p({ ...s, [r]: o });
174
- }
168
+ onUpdate: (o) => S(p, l, "abortOnError", o)
175
169
  }
176
170
  ),
177
- /* @__PURE__ */ t("span", { children: "Log Output" })
171
+ /* @__PURE__ */ e("span", { children: "Abort on Error" })
178
172
  ] }),
179
- /* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
180
- /* @__PURE__ */ t(
181
- f,
173
+ O && /* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
174
+ /* @__PURE__ */ e(
175
+ N,
182
176
  {
183
- fieldValue: (e == null ? void 0 : e.abortOnError) || !1,
177
+ fieldValue: (t == null ? void 0 : t.runAsRoot) || !1,
184
178
  inline: !0,
185
- onUpdate: (l) => {
186
- const o = [...i || []];
187
- o[c] = {
188
- ...o[c],
189
- abortOnError: l
190
- }, p({ ...s, [r]: o });
191
- }
179
+ onUpdate: (o) => S(p, l, "runAsRoot", o)
192
180
  }
193
181
  ),
194
- /* @__PURE__ */ t("span", { children: "Abort on Error" })
182
+ /* @__PURE__ */ e("span", { children: "Run as Root" })
195
183
  ] }),
196
- /* @__PURE__ */ t("i", { className: "pipe", children: "|" }),
184
+ /* @__PURE__ */ e("i", { className: "pipe", children: "|" }),
197
185
  /* @__PURE__ */ n(
198
186
  "div",
199
187
  {
200
188
  title: "Timeout Settings",
201
- className: `${a.scriptOptionTimeout} ${e.id === m ? a.hasTimeOutSettings : ""}`,
189
+ className: `${a.scriptOptionTimeout} ${t.id === k ? a.hasTimeOutSettings : ""}`,
202
190
  children: [
203
191
  /* @__PURE__ */ n(
204
192
  "button",
205
193
  {
206
- onClick: () => v(e.id === m ? !1 : e.id),
194
+ onClick: () => C(t.id === k ? !1 : t.id),
207
195
  className: a.timeoutButton,
208
196
  children: [
209
- /* @__PURE__ */ t(u, { type: "clock", size: 13 }),
197
+ /* @__PURE__ */ e(d, { type: "clock", size: 13 }),
210
198
  " ",
211
- (e == null ? void 0 : e.timeout) && O(e.timeout) || "Off"
199
+ (t == null ? void 0 : t.timeout) && E(t.timeout) || "Off"
212
200
  ]
213
201
  }
214
202
  ),
215
- m === e.id && /* @__PURE__ */ t("div", { className: a.timeoutSettings, children: /* @__PURE__ */ t(
216
- C,
203
+ k === t.id && /* @__PURE__ */ e("div", { className: a.timeoutSettings, children: /* @__PURE__ */ e(
204
+ g,
217
205
  {
218
206
  label: "Timeout (seconds)",
219
207
  inline: !0,
220
- fieldValue: (e == null ? void 0 : e.timeout) || 0,
221
- onUpdate: (l) => {
222
- const o = [...i || []];
223
- o[c] = {
224
- ...o[c],
225
- timeout: l
226
- }, p({ ...s, [r]: o });
208
+ fieldValue: (t == null ? void 0 : t.timeout) || 0,
209
+ onUpdate: (o) => {
210
+ const r = [...i || []];
211
+ r[l] = {
212
+ ...r[l],
213
+ timeout: o
214
+ }, u({ ...s, [c]: r });
227
215
  },
228
216
  min: 0,
229
217
  max: 3600
@@ -233,24 +221,24 @@ const g = {
233
221
  }
234
222
  )
235
223
  ] }),
236
- /* @__PURE__ */ t("div", { className: a.scriptRemove, children: /* @__PURE__ */ t(
224
+ /* @__PURE__ */ e("div", { className: a.scriptRemove, children: /* @__PURE__ */ e(
237
225
  "button",
238
226
  {
239
227
  className: a.removeScriptButton,
240
228
  onClick: () => {
241
- const l = [...i || []];
242
- l.splice(c, 1), p({ ...s, [r]: l });
229
+ const o = [...i || []];
230
+ o.splice(l, 1), u({ ...s, [c]: o });
243
231
  },
244
- children: /* @__PURE__ */ t(u, { type: "trash", size: 18 })
232
+ children: /* @__PURE__ */ e(d, { type: "trash", size: 18 })
245
233
  }
246
234
  ) })
247
235
  ] })
248
- ] }, e.id))
236
+ ] }, t.id))
249
237
  ] })
250
- ] }, r);
238
+ ] }, c);
251
239
  }) });
252
240
  };
253
241
  export {
254
- H as default
242
+ I as default
255
243
  };
256
244
  //# sourceMappingURL=PlanScriptsSettings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanScriptsSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanScriptsSettings.tsx"],"sourcesContent":["import classes from './PlanSettings.module.scss';\r\nimport { useState } from 'react';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport { secondsToMinutes } from '../../../utils/helpers';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\n\r\ninterface PlanScriptsSettingsProps {\r\n settings: NewPlanSettings['settings']['scripts'];\r\n onUpdate: (settings: NewPlanSettings['settings']['scripts']) => void;\r\n platform?: string;\r\n}\r\n\r\ntype ScriptEventKey = 'onBackupStart' | 'onBackupEnd' | 'onBackupError' | 'onBackupFailure' | 'onBackupComplete';\r\n\r\nconst scriptEvents: Record<ScriptEventKey, { title: string; description: string }> = {\r\n onBackupStart: {\r\n title: 'Before Backup Start',\r\n description: 'Scripts that run before the backup starts.',\r\n },\r\n onBackupEnd: {\r\n title: 'After Backup End',\r\n description: 'Scripts that run after the backup ends.',\r\n },\r\n onBackupError: {\r\n title: 'On Backup Error',\r\n description: 'Scripts that run when there is a backup error.',\r\n },\r\n onBackupFailure: {\r\n title: 'On Backup Failure',\r\n description: 'Scripts that run when the backup fails.',\r\n },\r\n onBackupComplete: {\r\n title: 'On Backup Complete',\r\n description: 'Scripts that run when the backup completes.',\r\n },\r\n};\r\n\r\nconst PlanScriptsSettings = ({\r\n settings = {\r\n onBackupStart: [],\r\n onBackupEnd: [],\r\n onBackupError: [],\r\n onBackupFailure: [],\r\n onBackupComplete: [],\r\n },\r\n platform,\r\n onUpdate,\r\n}: PlanScriptsSettingsProps) => {\r\n const [showTimeoutSettings, setShowTimeoutSettings] = useState<string | false>(false);\r\n const [activeTabs, setActiveTabs] = useState({\r\n onBackupStart: false,\r\n onBackupEnd: false,\r\n onBackupError: false,\r\n onBackupFailure: false,\r\n onBackupComplete: false,\r\n });\r\n console.log('settings :', settings);\r\n console.log('### platform :', platform);\r\n\r\n return (\r\n <div className={classes.eventTabs}>\r\n {Object.entries(scriptEvents).map(([eventKey, { title, description }]) => {\r\n const key = eventKey as ScriptEventKey;\r\n const scripts = settings[key] || [];\r\n const isActive = activeTabs[key];\r\n return (\r\n <div className={classes.eventTab} key={eventKey}>\r\n <div className={classes.eventTabHead}>\r\n <div>\r\n <span className={classes.eventTabHeadTitle} onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n {title} ({scripts.length || 0})\r\n </span>\r\n <button\r\n onClick={() => {\r\n const newScript = {\r\n id: Math.random().toString(36).substring(2, 15),\r\n type: 'script',\r\n enabled: true,\r\n scriptPath: '',\r\n logOutput: false,\r\n abortOnError: false,\r\n };\r\n if (!activeTabs[key]) {\r\n setActiveTabs({ ...activeTabs, [eventKey]: true });\r\n }\r\n onUpdate({ ...settings, [eventKey]: [...(scripts || []), newScript] });\r\n }}\r\n className={classes.addScriptButton}\r\n >\r\n +\r\n </button>\r\n </div>\r\n <div>\r\n <span\r\n className={classes.eventTabHeadDescription}\r\n data-tooltip-id=\"hintTooltip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-content={description}\r\n >\r\n <Icon type=\"help\" size={13} />\r\n </span>\r\n\r\n <button onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n <Icon type={isActive ? 'caret-up' : 'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n </div>\r\n {isActive && (\r\n <div className={classes.eventTabContent}>\r\n {scripts?.length === 0 && (\r\n <div className={classes.noScriptsMessage}>\r\n <span>No scripts configured for this event.</span>\r\n </div>\r\n )}\r\n {scripts?.map((script, index) => (\r\n <div key={script.id} className={classes.scriptItem}>\r\n <div className={classes.scriptHeader}>\r\n <span className={classes.scriptTitle}>\r\n <Icon type=\"cli\" size={13} /> Script {index + 1}\r\n </span>\r\n {scripts.length > 1 && (\r\n <div className={classes.scriptPositionControls}>\r\n <button\r\n title=\"Move Up\"\r\n disabled={index === 0}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index - 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\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 === scripts.length - 1}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index + 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type={'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n className={classes.scriptPathInput}\r\n value={script?.scriptPath || ''}\r\n placeholder=\"Enter absolute path to script file (e.g. /opt/scripts/pre-backup.sh)\"\r\n onChange={(e) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n scriptPath: e.target.value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <div className={classes.scriptFooter}>\r\n <div className={classes.scriptOptions}>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n // label=\"Enabled\"\r\n fieldValue={script?.enabled || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n enabled: checked,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <span>Enabled</span>\r\n </div>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.logOutput || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n logOutput: checked,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <span>Log Output</span>\r\n </div>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n // label=\"Abort On Error\"\r\n fieldValue={script?.abortOnError || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n abortOnError: checked,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <span>Abort on Error</span>\r\n </div>\r\n <i className=\"pipe\">|</i>\r\n <div\r\n title=\"Timeout Settings\"\r\n className={`${classes.scriptOptionTimeout} ${script.id === showTimeoutSettings ? classes.hasTimeOutSettings : ''}`}\r\n >\r\n <button\r\n onClick={() => setShowTimeoutSettings(script.id === showTimeoutSettings ? false : script.id)}\r\n className={classes.timeoutButton}\r\n >\r\n <Icon type=\"clock\" size={13} /> {(script?.timeout && secondsToMinutes(script.timeout)) || 'Off'}\r\n </button>\r\n {showTimeoutSettings === script.id && (\r\n <div className={classes.timeoutSettings}>\r\n <NumberInput\r\n label=\"Timeout (seconds)\"\r\n inline={true}\r\n fieldValue={script?.timeout || 0}\r\n onUpdate={(value) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n timeout: value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n min={0}\r\n max={3600} // 1 hour\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.scriptRemove}>\r\n <button\r\n className={classes.removeScriptButton}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts.splice(index, 1);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type=\"trash\" size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanScriptsSettings;\r\n"],"names":["scriptEvents","PlanScriptsSettings","settings","platform","onUpdate","showTimeoutSettings","setShowTimeoutSettings","useState","activeTabs","setActiveTabs","classes","eventKey","title","description","key","scripts","isActive","jsxs","jsx","newScript","Icon","script","index","updatedScripts","movedScript","e","Toggle","checked","secondsToMinutes","NumberInput","value"],"mappings":"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"}
1
+ {"version":3,"file":"PlanScriptsSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanScriptsSettings.tsx"],"sourcesContent":["import classes from './PlanSettings.module.scss';\r\nimport { useState } from 'react';\r\nimport { NewPlanSettings, PlanScript } from '../../../@types/plans';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport { secondsToMinutes } from '../../../utils/helpers';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\n\r\ninterface PlanScriptsSettingsProps {\r\n settings: NewPlanSettings['settings']['scripts'];\r\n onUpdate: (settings: NewPlanSettings['settings']['scripts']) => void;\r\n platform?: string;\r\n}\r\n\r\ntype ScriptEventKey = 'onBackupStart' | 'onBackupEnd' | 'onBackupError' | 'onBackupFailure' | 'onBackupComplete';\r\n\r\nconst scriptEvents: Record<ScriptEventKey, { title: string; description: string }> = {\r\n onBackupStart: {\r\n title: 'Before Backup Start',\r\n description: 'Scripts that run before the backup starts.',\r\n },\r\n onBackupEnd: {\r\n title: 'After Backup End',\r\n description: 'Scripts that run after the backup ends.',\r\n },\r\n onBackupError: {\r\n title: 'On Backup Error',\r\n description: 'Scripts that run when there is a backup error.',\r\n },\r\n onBackupFailure: {\r\n title: 'On Backup Failure',\r\n description: 'Scripts that run when the backup fails.',\r\n },\r\n onBackupComplete: {\r\n title: 'On Backup Complete',\r\n description: 'Scripts that run when the backup completes.',\r\n },\r\n};\r\n\r\nconst PlanScriptsSettings = ({\r\n settings = {\r\n onBackupStart: [],\r\n onBackupEnd: [],\r\n onBackupError: [],\r\n onBackupFailure: [],\r\n onBackupComplete: [],\r\n },\r\n platform = '',\r\n onUpdate,\r\n}: PlanScriptsSettingsProps) => {\r\n const [showTimeoutSettings, setShowTimeoutSettings] = useState<string | false>(false);\r\n const [activeTabs, setActiveTabs] = useState({\r\n onBackupStart: false,\r\n onBackupEnd: false,\r\n onBackupError: false,\r\n onBackupFailure: false,\r\n onBackupComplete: false,\r\n });\r\n\r\n const showRootOption = platform.toLowerCase().includes('linux');\r\n // const showRootOption = true;\r\n\r\n const updateScriptBool = (eventKey: ScriptEventKey, index: number, key: keyof PlanScript, value: boolean) => {\r\n const updatedScripts = [...(settings[eventKey] || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n [key]: value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n };\r\n\r\n return (\r\n <div className={classes.eventTabs}>\r\n {Object.entries(scriptEvents).map(([eventKey, { title, description }]) => {\r\n const key = eventKey as ScriptEventKey;\r\n const scripts = settings[key] || [];\r\n const isActive = activeTabs[key];\r\n return (\r\n <div className={classes.eventTab} key={eventKey}>\r\n <div className={classes.eventTabHead}>\r\n <div>\r\n <span className={classes.eventTabHeadTitle} onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n {title} ({scripts.length || 0})\r\n </span>\r\n <button\r\n onClick={() => {\r\n const newScript = {\r\n id: Math.random().toString(36).substring(2, 15),\r\n type: 'script',\r\n enabled: true,\r\n scriptPath: '',\r\n logOutput: false,\r\n abortOnError: false,\r\n };\r\n if (!activeTabs[key]) {\r\n setActiveTabs({ ...activeTabs, [eventKey]: true });\r\n }\r\n onUpdate({ ...settings, [eventKey]: [...(scripts || []), newScript] });\r\n }}\r\n className={classes.addScriptButton}\r\n >\r\n +\r\n </button>\r\n </div>\r\n <div>\r\n <span\r\n className={classes.eventTabHeadDescription}\r\n data-tooltip-id=\"hintTooltip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-content={description}\r\n >\r\n <Icon type=\"help\" size={13} />\r\n </span>\r\n\r\n <button onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n <Icon type={isActive ? 'caret-up' : 'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n </div>\r\n {isActive && (\r\n <div className={classes.eventTabContent}>\r\n {scripts?.length === 0 && (\r\n <div className={classes.noScriptsMessage}>\r\n <span>No scripts configured for this event.</span>\r\n </div>\r\n )}\r\n {scripts?.map((script, index) => (\r\n <div key={script.id} className={classes.scriptItem}>\r\n <div className={classes.scriptHeader}>\r\n <span className={classes.scriptTitle}>\r\n <Icon type=\"cli\" size={13} /> Script {index + 1}\r\n </span>\r\n {scripts.length > 1 && (\r\n <div className={classes.scriptPositionControls}>\r\n <button\r\n title=\"Move Up\"\r\n disabled={index === 0}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index - 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\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 === scripts.length - 1}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index + 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type={'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n className={classes.scriptPathInput}\r\n value={script?.scriptPath || ''}\r\n placeholder=\"Enter absolute path to script file (e.g. /opt/scripts/pre-backup.sh)\"\r\n onChange={(e) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n scriptPath: e.target.value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <div className={classes.scriptFooter}>\r\n <div className={classes.scriptOptions}>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n // label=\"Enabled\"\r\n fieldValue={script?.enabled || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'enabled', checked)}\r\n />\r\n <span>Enabled</span>\r\n </div>\r\n {/* <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.logOutput || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'logOutput', checked)}\r\n />\r\n <span>Log Output</span>\r\n </div> */}\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.abortOnError || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'abortOnError', checked)}\r\n />\r\n <span>Abort on Error</span>\r\n </div>\r\n {showRootOption && (\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.runAsRoot || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'runAsRoot', checked)}\r\n />\r\n <span>Run as Root</span>\r\n </div>\r\n )}\r\n <i className=\"pipe\">|</i>\r\n <div\r\n title=\"Timeout Settings\"\r\n className={`${classes.scriptOptionTimeout} ${script.id === showTimeoutSettings ? classes.hasTimeOutSettings : ''}`}\r\n >\r\n <button\r\n onClick={() => setShowTimeoutSettings(script.id === showTimeoutSettings ? false : script.id)}\r\n className={classes.timeoutButton}\r\n >\r\n <Icon type=\"clock\" size={13} /> {(script?.timeout && secondsToMinutes(script.timeout)) || 'Off'}\r\n </button>\r\n {showTimeoutSettings === script.id && (\r\n <div className={classes.timeoutSettings}>\r\n <NumberInput\r\n label=\"Timeout (seconds)\"\r\n inline={true}\r\n fieldValue={script?.timeout || 0}\r\n onUpdate={(value) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n timeout: value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n min={0}\r\n max={3600} // 1 hour\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.scriptRemove}>\r\n <button\r\n className={classes.removeScriptButton}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts.splice(index, 1);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type=\"trash\" size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanScriptsSettings;\r\n"],"names":["scriptEvents","PlanScriptsSettings","settings","platform","onUpdate","showTimeoutSettings","setShowTimeoutSettings","useState","activeTabs","setActiveTabs","showRootOption","updateScriptBool","eventKey","index","key","value","updatedScripts","classes","title","description","scripts","isActive","jsxs","jsx","newScript","Icon","script","movedScript","e","Toggle","checked","secondsToMinutes","NumberInput"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanSourceSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,UAAU,uBAAuB;IAC9B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,kBAAkB,GAAI,sCAAsC,uBAAuB,4CAqDxF,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"PlanSourceSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,UAAU,uBAAuB;IAC9B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,kBAAkB,GAAI,sCAAsC,uBAAuB,4CA6DxF,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,57 +1,63 @@
1
- import { jsxs as m, Fragment as d, jsx as l } from "react/jsx-runtime";
2
- import { useEffect as n } from "react";
1
+ import { jsxs as n, Fragment as d, jsx as l } from "react/jsx-runtime";
2
+ import { useRef as f, useEffect as h } from "react";
3
3
  import o from "./PlanSettings.module.scss.js";
4
- import f from "../../common/PathPicker/PathPicker.js";
5
- import { useGetDevices as h } from "../../../services/devices.js";
6
- import p from "../../common/form/Select/Select.js";
7
- const v = ({ plan: e, onUpdate: i, error: t, isEditing: r }) => {
8
- const { data: c } = h(), a = [], u = e.sourceId || "main";
9
- return c != null && c.success && c.result && a.push(
10
- ...c.result.map((s) => ({
4
+ import p from "../../common/PathPicker/PathPicker.js";
5
+ import { useGetDevices as b } from "../../../services/devices.js";
6
+ import v from "../../common/form/Select/Select.js";
7
+ const D = ({ plan: e, onUpdate: t, error: m, isEditing: u }) => {
8
+ const { data: r } = b(), a = [], c = e.sourceId || "main";
9
+ r != null && r.success && r.result && a.push(
10
+ ...r.result.map((s) => ({
11
11
  label: `${s.name} ${s.id === "main" ? "(Main)" : ""}`,
12
12
  value: s.id,
13
13
  icon: s.id === "main" ? "computer" : "computer-remote"
14
14
  // disabled: device.id === 'main' || device.connected ? false : true,
15
15
  }))
16
- ), n(() => {
17
- r || i({
16
+ );
17
+ const i = f(null);
18
+ return h(() => {
19
+ if (u) {
20
+ i.current = c;
21
+ return;
22
+ }
23
+ i.current !== null && i.current !== c && t({
18
24
  ...e,
19
25
  sourceConfig: {
20
26
  includes: [],
21
27
  excludes: []
22
28
  }
23
- });
24
- }, [r, u]), /* @__PURE__ */ m(d, { children: [
25
- /* @__PURE__ */ m("div", { className: o.field, children: [
29
+ }), i.current = c;
30
+ }, [u, c]), /* @__PURE__ */ n(d, { children: [
31
+ /* @__PURE__ */ n("div", { className: o.field, children: [
26
32
  /* @__PURE__ */ l("label", { className: o.label, children: "Select Device*" }),
27
33
  /* @__PURE__ */ l(
28
- p,
34
+ v,
29
35
  {
30
36
  options: a,
31
- fieldValue: u,
32
- disabled: r,
37
+ fieldValue: c,
38
+ disabled: u,
33
39
  full: !0,
34
- onUpdate: (s) => i({ ...e, sourceId: s })
40
+ onUpdate: (s) => t({ ...e, sourceId: s })
35
41
  }
36
42
  )
37
43
  ] }),
38
- /* @__PURE__ */ m("div", { className: o.field, children: [
44
+ /* @__PURE__ */ n("div", { className: o.field, children: [
39
45
  /* @__PURE__ */ l("label", { className: o.label, children: "Backup Sources*" }),
40
- t && /* @__PURE__ */ l("span", { className: o.fieldErrorLabel, children: t }),
46
+ m && /* @__PURE__ */ l("span", { className: o.fieldErrorLabel, children: m }),
41
47
  /* @__PURE__ */ l(
42
- f,
48
+ p,
43
49
  {
44
50
  paths: { includes: e.sourceConfig.includes, excludes: e.sourceConfig.excludes },
45
- onUpdate: (s) => i({ ...e, sourceConfig: { ...s } }),
46
- deviceId: u,
51
+ onUpdate: (s) => t({ ...e, sourceConfig: { ...s } }),
52
+ deviceId: c,
47
53
  single: e.method === "sync",
48
- disallowChange: e.method === "sync" && r
54
+ disallowChange: e.method === "sync" && u
49
55
  }
50
56
  )
51
57
  ] })
52
58
  ] });
53
59
  };
54
60
  export {
55
- v as default
61
+ D as default
56
62
  };
57
63
  //# sourceMappingURL=PlanSourceSettings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanSourceSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"sourcesContent":["import { useEffect } from 'react';\r\nimport classes from './PlanSettings.module.scss';\r\nimport PathPicker from '../../common/PathPicker/PathPicker';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport { useGetDevices } from '../../../services/devices';\r\nimport Select from '../../common/form/Select/Select';\r\nimport { Device } from '../../../@types/devices';\r\n\r\ninterface PlanSourceSettingsProps {\r\n plan: NewPlanSettings;\r\n isEditing: boolean;\r\n onUpdate: (plan: NewPlanSettings) => void;\r\n error: string;\r\n}\r\n\r\nconst PlanSourceSettings = ({ plan, onUpdate, error, isEditing }: PlanSourceSettingsProps) => {\r\n const { data } = useGetDevices();\r\n const deviceList = [];\r\n const deviceId = plan.sourceId || 'main';\r\n if (data?.success && data.result) {\r\n deviceList.push(\r\n ...data.result.map((device: Device) => ({\r\n label: `${device.name} ${device.id === 'main' ? '(Main)' : ''}`,\r\n value: device.id,\r\n icon: device.id === 'main' ? 'computer' : 'computer-remote',\r\n // disabled: device.id === 'main' || device.connected ? false : true,\r\n })),\r\n );\r\n }\r\n\r\n // When the device changes, reset the sourceConfig paths to prevent invalid paths from being submitted\r\n useEffect(() => {\r\n if (!isEditing) {\r\n onUpdate({\r\n ...plan,\r\n sourceConfig: {\r\n includes: [],\r\n excludes: [],\r\n },\r\n });\r\n }\r\n }, [isEditing, deviceId]);\r\n\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Select Device*</label>\r\n <Select\r\n options={deviceList}\r\n fieldValue={deviceId}\r\n disabled={isEditing}\r\n full={true}\r\n onUpdate={(val) => onUpdate({ ...plan, sourceId: val })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Sources*</label>\r\n {error && <span className={classes.fieldErrorLabel}>{error}</span>}\r\n <PathPicker\r\n paths={{ includes: plan.sourceConfig.includes, excludes: plan.sourceConfig.excludes }}\r\n onUpdate={(paths) => onUpdate({ ...plan, sourceConfig: { ...paths } })}\r\n deviceId={deviceId}\r\n single={plan.method === 'sync'}\r\n disallowChange={plan.method === 'sync' && isEditing}\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default PlanSourceSettings;\r\n"],"names":["PlanSourceSettings","plan","onUpdate","error","isEditing","data","useGetDevices","deviceList","deviceId","device","useEffect","jsxs","Fragment","classes","jsx","Select","val","PathPicker","paths"],"mappings":";;;;;;AAeA,MAAMA,IAAqB,CAAC,EAAE,MAAAC,GAAM,UAAAC,GAAU,OAAAC,GAAO,WAAAC,QAAyC;AAC3F,QAAM,EAAE,MAAAC,EAAA,IAASC,EAAA,GACXC,IAAa,CAAA,GACbC,IAAWP,EAAK,YAAY;AAClC,SAAII,KAAA,QAAAA,EAAM,WAAWA,EAAK,UACvBE,EAAW;AAAA,IACR,GAAGF,EAAK,OAAO,IAAI,CAACI,OAAoB;AAAA,MACrC,OAAO,GAAGA,EAAO,IAAI,IAAIA,EAAO,OAAO,SAAS,WAAW,EAAE;AAAA,MAC7D,OAAOA,EAAO;AAAA,MACd,MAAMA,EAAO,OAAO,SAAS,aAAa;AAAA;AAAA,IAAA,EAE3C;AAAA,EAAA,GAKRC,EAAU,MAAM;AACb,IAAKN,KACFF,EAAS;AAAA,MACN,GAAGD;AAAA,MACH,cAAc;AAAA,QACX,UAAU,CAAA;AAAA,QACV,UAAU,CAAA;AAAA,MAAC;AAAA,IACd,CACF;AAAA,EAEP,GAAG,CAACG,GAAWI,CAAQ,CAAC,GAGrB,gBAAAG,EAAAC,GAAA,EACG,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,kBAAc;AAAA,MAC/C,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACE,SAASR;AAAA,UACT,YAAYC;AAAA,UACZ,UAAUJ;AAAA,UACV,MAAM;AAAA,UACN,UAAU,CAACY,MAAQd,EAAS,EAAE,GAAGD,GAAM,UAAUe,EAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACzD,GACH;AAAA,IACA,gBAAAL,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,mBAAe;AAAA,MAC/CV,KAAS,gBAAAW,EAAC,QAAA,EAAK,WAAWD,EAAQ,iBAAkB,UAAAV,GAAM;AAAA,MAC3D,gBAAAW;AAAA,QAACG;AAAA,QAAA;AAAA,UACE,OAAO,EAAE,UAAUhB,EAAK,aAAa,UAAU,UAAUA,EAAK,aAAa,SAAA;AAAA,UAC3E,UAAU,CAACiB,MAAUhB,EAAS,EAAE,GAAGD,GAAM,cAAc,EAAE,GAAGiB,EAAA,GAAS;AAAA,UACrE,UAAAV;AAAA,UACA,QAAQP,EAAK,WAAW;AAAA,UACxB,gBAAgBA,EAAK,WAAW,UAAUG;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7C,EAAA,CACH;AAAA,EAAA,GACH;AAEN;"}
1
+ {"version":3,"file":"PlanSourceSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\r\nimport classes from './PlanSettings.module.scss';\r\nimport PathPicker from '../../common/PathPicker/PathPicker';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport { useGetDevices } from '../../../services/devices';\r\nimport Select from '../../common/form/Select/Select';\r\nimport { Device } from '../../../@types/devices';\r\n\r\ninterface PlanSourceSettingsProps {\r\n plan: NewPlanSettings;\r\n isEditing: boolean;\r\n onUpdate: (plan: NewPlanSettings) => void;\r\n error: string;\r\n}\r\n\r\nconst PlanSourceSettings = ({ plan, onUpdate, error, isEditing }: PlanSourceSettingsProps) => {\r\n const { data } = useGetDevices();\r\n const deviceList = [];\r\n const deviceId = plan.sourceId || 'main';\r\n if (data?.success && data.result) {\r\n deviceList.push(\r\n ...data.result.map((device: Device) => ({\r\n label: `${device.name} ${device.id === 'main' ? '(Main)' : ''}`,\r\n value: device.id,\r\n icon: device.id === 'main' ? 'computer' : 'computer-remote',\r\n // disabled: device.id === 'main' || device.connected ? false : true,\r\n })),\r\n );\r\n }\r\n\r\n // When the device changes, reset the sourceConfig paths to prevent invalid paths from being submitted.\r\n // Use a ref to track the previous deviceId so we only reset on an actual change (not on mount/remount,\r\n // e.g. when navigating between steps in the Add Plan form).\r\n const prevDeviceIdRef = useRef<string | null>(null);\r\n useEffect(() => {\r\n if (isEditing) {\r\n prevDeviceIdRef.current = deviceId;\r\n return;\r\n }\r\n if (prevDeviceIdRef.current !== null && prevDeviceIdRef.current !== deviceId) {\r\n onUpdate({\r\n ...plan,\r\n sourceConfig: {\r\n includes: [],\r\n excludes: [],\r\n },\r\n });\r\n }\r\n prevDeviceIdRef.current = deviceId;\r\n }, [isEditing, deviceId]);\r\n\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Select Device*</label>\r\n <Select\r\n options={deviceList}\r\n fieldValue={deviceId}\r\n disabled={isEditing}\r\n full={true}\r\n onUpdate={(val) => onUpdate({ ...plan, sourceId: val })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Sources*</label>\r\n {error && <span className={classes.fieldErrorLabel}>{error}</span>}\r\n <PathPicker\r\n paths={{ includes: plan.sourceConfig.includes, excludes: plan.sourceConfig.excludes }}\r\n onUpdate={(paths) => onUpdate({ ...plan, sourceConfig: { ...paths } })}\r\n deviceId={deviceId}\r\n single={plan.method === 'sync'}\r\n disallowChange={plan.method === 'sync' && isEditing}\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default PlanSourceSettings;\r\n"],"names":["PlanSourceSettings","plan","onUpdate","error","isEditing","data","useGetDevices","deviceList","deviceId","device","prevDeviceIdRef","useRef","useEffect","jsxs","Fragment","classes","jsx","Select","val","PathPicker","paths"],"mappings":";;;;;;AAeA,MAAMA,IAAqB,CAAC,EAAE,MAAAC,GAAM,UAAAC,GAAU,OAAAC,GAAO,WAAAC,QAAyC;AAC3F,QAAM,EAAE,MAAAC,EAAA,IAASC,EAAA,GACXC,IAAa,CAAA,GACbC,IAAWP,EAAK,YAAY;AAClC,EAAII,KAAA,QAAAA,EAAM,WAAWA,EAAK,UACvBE,EAAW;AAAA,IACR,GAAGF,EAAK,OAAO,IAAI,CAACI,OAAoB;AAAA,MACrC,OAAO,GAAGA,EAAO,IAAI,IAAIA,EAAO,OAAO,SAAS,WAAW,EAAE;AAAA,MAC7D,OAAOA,EAAO;AAAA,MACd,MAAMA,EAAO,OAAO,SAAS,aAAa;AAAA;AAAA,IAAA,EAE3C;AAAA,EAAA;AAOR,QAAMC,IAAkBC,EAAsB,IAAI;AAClD,SAAAC,EAAU,MAAM;AACb,QAAIR,GAAW;AACZ,MAAAM,EAAgB,UAAUF;AAC1B;AAAA,IACH;AACA,IAAIE,EAAgB,YAAY,QAAQA,EAAgB,YAAYF,KACjEN,EAAS;AAAA,MACN,GAAGD;AAAA,MACH,cAAc;AAAA,QACX,UAAU,CAAA;AAAA,QACV,UAAU,CAAA;AAAA,MAAC;AAAA,IACd,CACF,GAEJS,EAAgB,UAAUF;AAAA,EAC7B,GAAG,CAACJ,GAAWI,CAAQ,CAAC,GAGrB,gBAAAK,EAAAC,GAAA,EACG,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,kBAAc;AAAA,MAC/C,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACE,SAASV;AAAA,UACT,YAAYC;AAAA,UACZ,UAAUJ;AAAA,UACV,MAAM;AAAA,UACN,UAAU,CAACc,MAAQhB,EAAS,EAAE,GAAGD,GAAM,UAAUiB,EAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACzD,GACH;AAAA,IACA,gBAAAL,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,mBAAe;AAAA,MAC/CZ,KAAS,gBAAAa,EAAC,QAAA,EAAK,WAAWD,EAAQ,iBAAkB,UAAAZ,GAAM;AAAA,MAC3D,gBAAAa;AAAA,QAACG;AAAA,QAAA;AAAA,UACE,OAAO,EAAE,UAAUlB,EAAK,aAAa,UAAU,UAAUA,EAAK,aAAa,SAAA;AAAA,UAC3E,UAAU,CAACmB,MAAUlB,EAAS,EAAE,GAAGD,GAAM,cAAc,EAAE,GAAGmB,EAAA,GAAS;AAAA,UACrE,UAAAZ;AAAA,UACA,QAAQP,EAAK,WAAW;AAAA,UACxB,gBAAgBA,EAAK,WAAW,UAAUG;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7C,EAAA,CACH;AAAA,EAAA,GACH;AAEN;"}
@@ -1 +1 @@
1
- {"version":3,"file":"StoragePicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/common/form/StoragePicker/StoragePicker.tsx"],"names":[],"mappings":"AASA,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,UAAU,kBAAkB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE;AAED,QAAA,MAAM,aAAa,GAAI,0DAAuE,kBAAkB,4CAwH/G,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"StoragePicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/common/form/StoragePicker/StoragePicker.tsx"],"names":[],"mappings":"AASA,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,UAAU,kBAAkB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE;AAED,QAAA,MAAM,aAAa,GAAI,0DAAuE,kBAAkB,4CAgI/G,CAAC;AAEF,eAAe,aAAa,CAAC"}