@plutonhq/core-frontend 0.1.29 → 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.
- package/dist-lib/@types/devices.d.ts +4 -4
- package/dist-lib/@types/devices.d.ts.map +1 -1
- package/dist-lib/@types/plans.d.ts +1 -0
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/components/App/Footer/Footer.d.ts +2 -1
- package/dist-lib/components/App/Footer/Footer.d.ts.map +1 -1
- package/dist-lib/components/App/Footer/Footer.js +10 -8
- package/dist-lib/components/App/Footer/Footer.js.map +1 -1
- package/dist-lib/components/Device/EditDevice/EditDevice.d.ts.map +1 -1
- package/dist-lib/components/Device/EditDevice/EditDevice.js +70 -61
- package/dist-lib/components/Device/EditDevice/EditDevice.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +66 -68
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +40 -38
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.js +20 -11
- package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts +2 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +28 -21
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts +2 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js +21 -20
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js +89 -101
- package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js +31 -25
- package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js.map +1 -1
- package/dist-lib/components/common/form/StoragePicker/StoragePicker.d.ts.map +1 -1
- package/dist-lib/components/common/form/StoragePicker/StoragePicker.js +52 -46
- package/dist-lib/components/common/form/StoragePicker/StoragePicker.js.map +1 -1
- package/dist-lib/components/common/form/Toggle/Toggle.d.ts +2 -1
- package/dist-lib/components/common/form/Toggle/Toggle.d.ts.map +1 -1
- package/dist-lib/components/common/form/Toggle/Toggle.js +21 -11
- package/dist-lib/components/common/form/Toggle/Toggle.js.map +1 -1
- package/dist-lib/components/common/form/Toggle/Toggle.module.scss.js +6 -4
- package/dist-lib/components/common/form/Toggle/Toggle.module.scss.js.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.js +34 -33
- package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +76 -72
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js +14 -12
- package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js.map +1 -1
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/utils/progressHelpers.d.ts.map +1 -1
- package/dist-lib/utils/progressHelpers.js +1 -0
- package/dist-lib/utils/progressHelpers.js.map +1 -1
- package/package.json +1 -1
- package/src/@types/devices.ts +4 -4
- package/src/@types/plans.ts +1 -0
- package/src/components/App/Footer/Footer.tsx +3 -2
- package/src/components/Device/EditDevice/EditDevice.tsx +11 -4
- package/src/components/Plan/BackupProgress/BackupProgress.module.scss +3 -0
- package/src/components/Plan/BackupProgress/BackupProgress.tsx +5 -3
- package/src/components/Plan/PlanForm/PlanForm.tsx +7 -1
- package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +7 -2
- package/src/components/Plan/PlanSettings/PlanGeneralSettings.tsx +3 -1
- package/src/components/Plan/PlanSettings/PlanScriptsSettings.tsx +29 -31
- package/src/components/Plan/PlanSettings/PlanSourceSettings.tsx +11 -3
- package/src/components/common/form/StoragePicker/StoragePicker.tsx +10 -2
- package/src/components/common/form/Toggle/Toggle.module.scss +7 -0
- package/src/components/common/form/Toggle/Toggle.tsx +14 -3
- package/src/hooks/usePlanSingleActions.tsx +4 -2
- package/src/routes/PlanSingle/PlanSingle.module.scss +10 -0
- package/src/routes/PlanSingle/PlanSingle.tsx +6 -1
- package/src/utils/progressHelpers.ts +1 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { jsx as
|
|
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
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import { secondsToMinutes as
|
|
7
|
-
import
|
|
8
|
-
const
|
|
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
|
-
},
|
|
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:
|
|
38
|
-
onUpdate:
|
|
37
|
+
platform: T = "",
|
|
38
|
+
onUpdate: u
|
|
39
39
|
}) => {
|
|
40
|
-
const [
|
|
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
|
-
|
|
48
|
-
|
|
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: () =>
|
|
53
|
-
|
|
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__ */
|
|
64
|
+
/* @__PURE__ */ e(
|
|
59
65
|
"button",
|
|
60
66
|
{
|
|
61
67
|
onClick: () => {
|
|
62
|
-
const
|
|
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
|
-
|
|
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__ */
|
|
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":
|
|
85
|
-
children: /* @__PURE__ */
|
|
90
|
+
"data-tooltip-content": v,
|
|
91
|
+
children: /* @__PURE__ */ e(d, { type: "help", size: 13 })
|
|
86
92
|
}
|
|
87
93
|
),
|
|
88
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
92
|
-
(i == null ? void 0 : i.length) === 0 && /* @__PURE__ */
|
|
93
|
-
i == null ? void 0 : i.map((
|
|
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__ */
|
|
102
|
+
/* @__PURE__ */ e(d, { type: "cli", size: 13 }),
|
|
97
103
|
" Script ",
|
|
98
|
-
|
|
104
|
+
l + 1
|
|
99
105
|
] }),
|
|
100
106
|
i.length > 1 && /* @__PURE__ */ n("div", { className: a.scriptPositionControls, children: [
|
|
101
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ e(
|
|
102
108
|
"button",
|
|
103
109
|
{
|
|
104
110
|
title: "Move Up",
|
|
105
|
-
disabled:
|
|
111
|
+
disabled: l === 0,
|
|
106
112
|
onClick: () => {
|
|
107
|
-
const
|
|
108
|
-
|
|
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__ */
|
|
116
|
+
children: /* @__PURE__ */ e(d, { type: "caret-up", size: 14 })
|
|
111
117
|
}
|
|
112
118
|
),
|
|
113
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ e(
|
|
114
120
|
"button",
|
|
115
121
|
{
|
|
116
122
|
title: "Move Down",
|
|
117
|
-
disabled:
|
|
123
|
+
disabled: l === i.length - 1,
|
|
118
124
|
onClick: () => {
|
|
119
|
-
const
|
|
120
|
-
|
|
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__ */
|
|
128
|
+
children: /* @__PURE__ */ e(d, { type: "caret-down", size: 14 })
|
|
123
129
|
}
|
|
124
130
|
)
|
|
125
131
|
] })
|
|
126
132
|
] }),
|
|
127
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ e(
|
|
128
134
|
"input",
|
|
129
135
|
{
|
|
130
136
|
type: "text",
|
|
131
137
|
className: a.scriptPathInput,
|
|
132
|
-
value: (
|
|
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: (
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
...
|
|
138
|
-
scriptPath:
|
|
139
|
-
},
|
|
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__ */
|
|
147
|
-
|
|
152
|
+
/* @__PURE__ */ e(
|
|
153
|
+
N,
|
|
148
154
|
{
|
|
149
|
-
fieldValue: (
|
|
155
|
+
fieldValue: (t == null ? void 0 : t.enabled) || !1,
|
|
150
156
|
inline: !0,
|
|
151
|
-
onUpdate: (
|
|
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__ */
|
|
160
|
+
/* @__PURE__ */ e("span", { children: "Enabled" })
|
|
161
161
|
] }),
|
|
162
162
|
/* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
|
|
163
|
-
/* @__PURE__ */
|
|
164
|
-
|
|
163
|
+
/* @__PURE__ */ e(
|
|
164
|
+
N,
|
|
165
165
|
{
|
|
166
|
-
fieldValue: (
|
|
166
|
+
fieldValue: (t == null ? void 0 : t.abortOnError) || !1,
|
|
167
167
|
inline: !0,
|
|
168
|
-
onUpdate: (
|
|
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__ */
|
|
171
|
+
/* @__PURE__ */ e("span", { children: "Abort on Error" })
|
|
178
172
|
] }),
|
|
179
|
-
/* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
|
|
180
|
-
/* @__PURE__ */
|
|
181
|
-
|
|
173
|
+
O && /* @__PURE__ */ n("div", { className: a.scriptOptionCheckbox, children: [
|
|
174
|
+
/* @__PURE__ */ e(
|
|
175
|
+
N,
|
|
182
176
|
{
|
|
183
|
-
fieldValue: (
|
|
177
|
+
fieldValue: (t == null ? void 0 : t.runAsRoot) || !1,
|
|
184
178
|
inline: !0,
|
|
185
|
-
onUpdate: (
|
|
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__ */
|
|
182
|
+
/* @__PURE__ */ e("span", { children: "Run as Root" })
|
|
195
183
|
] }),
|
|
196
|
-
/* @__PURE__ */
|
|
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} ${
|
|
189
|
+
className: `${a.scriptOptionTimeout} ${t.id === k ? a.hasTimeOutSettings : ""}`,
|
|
202
190
|
children: [
|
|
203
191
|
/* @__PURE__ */ n(
|
|
204
192
|
"button",
|
|
205
193
|
{
|
|
206
|
-
onClick: () =>
|
|
194
|
+
onClick: () => C(t.id === k ? !1 : t.id),
|
|
207
195
|
className: a.timeoutButton,
|
|
208
196
|
children: [
|
|
209
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ e(d, { type: "clock", size: 13 }),
|
|
210
198
|
" ",
|
|
211
|
-
(
|
|
199
|
+
(t == null ? void 0 : t.timeout) && E(t.timeout) || "Off"
|
|
212
200
|
]
|
|
213
201
|
}
|
|
214
202
|
),
|
|
215
|
-
|
|
216
|
-
|
|
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: (
|
|
221
|
-
onUpdate: (
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
...
|
|
225
|
-
timeout:
|
|
226
|
-
},
|
|
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__ */
|
|
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
|
|
242
|
-
|
|
229
|
+
const o = [...i || []];
|
|
230
|
+
o.splice(l, 1), u({ ...s, [c]: o });
|
|
243
231
|
},
|
|
244
|
-
children: /* @__PURE__ */
|
|
232
|
+
children: /* @__PURE__ */ e(d, { type: "trash", size: 18 })
|
|
245
233
|
}
|
|
246
234
|
) })
|
|
247
235
|
] })
|
|
248
|
-
] },
|
|
236
|
+
] }, t.id))
|
|
249
237
|
] })
|
|
250
|
-
] },
|
|
238
|
+
] }, c);
|
|
251
239
|
}) });
|
|
252
240
|
};
|
|
253
241
|
export {
|
|
254
|
-
|
|
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,
|
|
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
|
|
2
|
-
import { useEffect as
|
|
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
|
|
5
|
-
import { useGetDevices as
|
|
6
|
-
import
|
|
7
|
-
const
|
|
8
|
-
const { data:
|
|
9
|
-
|
|
10
|
-
...
|
|
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
|
-
)
|
|
17
|
-
|
|
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
|
-
}, [
|
|
25
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
34
|
+
v,
|
|
29
35
|
{
|
|
30
36
|
options: a,
|
|
31
|
-
fieldValue:
|
|
32
|
-
disabled:
|
|
37
|
+
fieldValue: c,
|
|
38
|
+
disabled: u,
|
|
33
39
|
full: !0,
|
|
34
|
-
onUpdate: (s) =>
|
|
40
|
+
onUpdate: (s) => t({ ...e, sourceId: s })
|
|
35
41
|
}
|
|
36
42
|
)
|
|
37
43
|
] }),
|
|
38
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ n("div", { className: o.field, children: [
|
|
39
45
|
/* @__PURE__ */ l("label", { className: o.label, children: "Backup Sources*" }),
|
|
40
|
-
|
|
46
|
+
m && /* @__PURE__ */ l("span", { className: o.fieldErrorLabel, children: m }),
|
|
41
47
|
/* @__PURE__ */ l(
|
|
42
|
-
|
|
48
|
+
p,
|
|
43
49
|
{
|
|
44
50
|
paths: { includes: e.sourceConfig.includes, excludes: e.sourceConfig.excludes },
|
|
45
|
-
onUpdate: (s) =>
|
|
46
|
-
deviceId:
|
|
51
|
+
onUpdate: (s) => t({ ...e, sourceConfig: { ...s } }),
|
|
52
|
+
deviceId: c,
|
|
47
53
|
single: e.method === "sync",
|
|
48
|
-
disallowChange: e.method === "sync" &&
|
|
54
|
+
disallowChange: e.method === "sync" && u
|
|
49
55
|
}
|
|
50
56
|
)
|
|
51
57
|
] })
|
|
52
58
|
] });
|
|
53
59
|
};
|
|
54
60
|
export {
|
|
55
|
-
|
|
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 (
|
|
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,
|
|
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"}
|