@plutonhq/core-frontend 0.1.32 → 0.1.34
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/plans.d.ts +4 -0
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/components/Device/DeviceResticSettings/DeviceResticSettings.js +4 -4
- package/dist-lib/components/Device/DeviceResticSettings/DeviceResticSettings.js.map +1 -1
- package/dist-lib/components/Plan/AddPlan/AddPlan.d.ts.map +1 -1
- package/dist-lib/components/Plan/AddPlan/AddPlan.js +29 -24
- package/dist-lib/components/Plan/AddPlan/AddPlan.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +34 -33
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts +9 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts.map +1 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.js +117 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.js.map +1 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js +20 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +4 -2
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.js +33 -29
- package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts +2 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js +85 -57
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js +11 -9
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts +9 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.js +262 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.js.map +1 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js +14 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts +4 -2
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +24 -22
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts +4 -2
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js +39 -28
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanPerformanceSettings.js +2 -2
- package/dist-lib/components/Plan/PlanSettings/PlanPerformanceSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +66 -64
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts +7 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js +116 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js.map +1 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js +20 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.js +29 -30
- package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +16 -14
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js.map +1 -1
- package/dist-lib/components/common/FileManager/FileManager.module.scss.js +18 -16
- package/dist-lib/components/common/FileManager/FileManager.module.scss.js.map +1 -1
- package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
- package/dist-lib/components/common/Icon/Icon.js +395 -378
- package/dist-lib/components/common/Icon/Icon.js.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.d.ts +2 -1
- package/dist-lib/components/common/SortItems/SortItems.d.ts.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.js +14 -14
- package/dist-lib/components/common/SortItems/SortItems.js.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.module.scss.js +1 -1
- package/dist-lib/components/common/form/MultiSelect/MultiSelect.module.scss.js +16 -16
- package/dist-lib/components/index.d.ts +2 -0
- package/dist-lib/components/index.d.ts.map +1 -1
- package/dist-lib/components.js +199 -195
- package/dist-lib/components.js.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.js +22 -19
- package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
- package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js +449 -0
- package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js +5219 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js +1691 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/react-chartjs-2@5.3.1_chart.js@4.5.1_react@18.3.1/node_modules/react-chartjs-2/dist/index.js +93 -0
- package/dist-lib/node_modules/.pnpm/react-chartjs-2@5.3.1_chart.js@4.5.1_react@18.3.1/node_modules/react-chartjs-2/dist/index.js.map +1 -0
- package/dist-lib/routes/Login/Login.d.ts.map +1 -1
- package/dist-lib/routes/Login/Login.js +45 -36
- package/dist-lib/routes/Login/Login.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +131 -118
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/routes/Plans/Plans.d.ts.map +1 -1
- package/dist-lib/routes/Plans/Plans.js +77 -51
- package/dist-lib/routes/Plans/Plans.js.map +1 -1
- package/dist-lib/services/plans.d.ts +33 -5
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +92 -67
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services.js +93 -91
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/utils/helpers.d.ts +2 -0
- package/dist-lib/utils/helpers.d.ts.map +1 -1
- package/dist-lib/utils/helpers.js +68 -42
- package/dist-lib/utils/helpers.js.map +1 -1
- package/dist-lib/utils.js +36 -34
- package/package.json +3 -1
- package/src/@types/plans.ts +5 -0
- package/src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx +2 -2
- package/src/components/Plan/AddPlan/AddPlan.tsx +22 -16
- package/src/components/Plan/BackupProgress/BackupProgress.tsx +1 -1
- package/src/components/Plan/FilterPlans/FilterPlans.module.scss +65 -0
- package/src/components/Plan/FilterPlans/FilterPlans.tsx +126 -0
- package/src/components/Plan/PlanForm/PlanForm.tsx +7 -1
- package/src/components/Plan/PlanIntegrity/PlanIntegrity.module.scss +19 -0
- package/src/components/Plan/PlanIntegrity/PlanIntegrity.tsx +40 -3
- package/src/components/Plan/PlanItems/PlanItem.tsx +1 -1
- package/src/components/Plan/PlanRepair/PlanRepair.module.scss +53 -0
- package/src/components/Plan/PlanRepair/PlanRepair.tsx +243 -0
- package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +6 -2
- package/src/components/Plan/PlanSettings/PlanGeneralSettings.tsx +14 -2
- package/src/components/Plan/PlanSettings/PlanPerformanceSettings.tsx +2 -2
- package/src/components/Plan/PlanSettings/PlanSettings.module.scss +8 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +76 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +166 -0
- package/src/components/Plan/PlanStats/PlanStats.module.scss +16 -2
- package/src/components/Plan/PlanStats/PlanStats.tsx +8 -11
- package/src/components/common/FileManager/FileManager.module.scss +7 -0
- package/src/components/common/Icon/Icon.tsx +21 -0
- package/src/components/common/SortItems/SortItems.module.scss +3 -2
- package/src/components/common/SortItems/SortItems.tsx +6 -3
- package/src/components/common/form/MultiSelect/MultiSelect.module.scss +1 -0
- package/src/components/index.ts +2 -0
- package/src/hooks/usePlanSingleActions.tsx +26 -23
- package/src/routes/Login/Login.tsx +8 -2
- package/src/routes/PlanSingle/PlanSingle.tsx +17 -0
- package/src/routes/Plans/Plans.tsx +70 -35
- package/src/services/plans.ts +40 -4
- package/src/utils/helpers.ts +25 -0
|
@@ -70,6 +70,7 @@ export type PlanVerifiedResult = {
|
|
|
70
70
|
logs: string[];
|
|
71
71
|
fix?: string;
|
|
72
72
|
hasError: boolean;
|
|
73
|
+
errorType?: string;
|
|
73
74
|
};
|
|
74
75
|
export type PlanVerification = {
|
|
75
76
|
status: string;
|
|
@@ -204,4 +205,7 @@ export interface NewPlanSettings {
|
|
|
204
205
|
settings: PlanSettings;
|
|
205
206
|
}
|
|
206
207
|
export type PlanChildItem = Pick<Plan, 'id' | 'title' | 'createdAt' | 'isActive' | 'stats' | 'method'>;
|
|
208
|
+
export interface PlanAddRunSettings {
|
|
209
|
+
runNow: boolean;
|
|
210
|
+
}
|
|
207
211
|
//# sourceMappingURL=plans.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/@types/plans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,SAAS,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpF,MAAM,MAAM,gBAAgB,GAAG;IAC5B,KAAK,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;QACvB,WAAW,EAAE,kBAAkB,GAAG,mCAAmC,GAAG,YAAY,CAAC;QACrF,GAAG,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACH,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC;KACd,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACxB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/@types/plans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,SAAS,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpF,MAAM,MAAM,gBAAgB,GAAG;IAC5B,KAAK,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;QACvB,WAAW,EAAE,kBAAkB,GAAG,mCAAmC,GAAG,YAAY,CAAC;QACrF,GAAG,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACH,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,oBAAoB,CAAC;QAC3B,GAAG,EAAE,MAAM,CAAC;KACd,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACxB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,YAAY,GAAG;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,qBAAqB,CAAC;IACjC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC;QAC7B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;QAC3B,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC;QAC7B,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC;QAC/B,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;KACtB,EAAE,CAAC;CACN,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,iBAAiB,GAAG,cAAc,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,UAAU,CAAC;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IAEvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE;QACX,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,iBAAiB,GAAG,cAAc,CAAC;IACvE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;AAEvG,MAAM,WAAW,kBAAkB;IAChC,MAAM,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as i, jsx as a } from "react/jsx-runtime";
|
|
|
2
2
|
import d from "../../common/form/Input/Input.js";
|
|
3
3
|
import o from "../../common/form/NumberInput/NumberInput.js";
|
|
4
4
|
import l from "../EditDevice/EditDevice.module.scss.js";
|
|
5
|
-
const
|
|
5
|
+
const n = ({ settings: e = {}, onUpdate: c }) => /* @__PURE__ */ i("div", { children: [
|
|
6
6
|
/* @__PURE__ */ a("div", { className: l.field, children: /* @__PURE__ */ a(
|
|
7
7
|
d,
|
|
8
8
|
{
|
|
@@ -40,8 +40,8 @@ const h = ({ settings: e = {}, onUpdate: c }) => /* @__PURE__ */ i("div", { chil
|
|
|
40
40
|
o,
|
|
41
41
|
{
|
|
42
42
|
label: "Packet Size (MB)",
|
|
43
|
-
fieldValue: e != null && e.packSize ? parseInt(e.packSize
|
|
44
|
-
onUpdate: (r) => c({ ...e, packSize: r ? r
|
|
43
|
+
fieldValue: e != null && e.packSize ? parseInt(e.packSize, 10) : "",
|
|
44
|
+
onUpdate: (r) => c({ ...e, packSize: r ? r.toString() : "" }),
|
|
45
45
|
min: 0,
|
|
46
46
|
max: 4e3,
|
|
47
47
|
hint: "Packs are blobs of data, which are encrypted and stored in the repository. Increasing the pack size requires more disk space for temporary pack files to be created before uploading.",
|
|
@@ -50,6 +50,6 @@ const h = ({ settings: e = {}, onUpdate: c }) => /* @__PURE__ */ i("div", { chil
|
|
|
50
50
|
) })
|
|
51
51
|
] });
|
|
52
52
|
export {
|
|
53
|
-
|
|
53
|
+
n as default
|
|
54
54
|
};
|
|
55
55
|
//# sourceMappingURL=DeviceResticSettings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceResticSettings.js","sources":["../../../../src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx"],"sourcesContent":["import { DeviceSettings } from '../../../@types/devices';\r\nimport Input from '../../common/form/Input/Input';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport classes from '../EditDevice/EditDevice.module.scss';\r\n\r\ninterface DeviceResticSettingsProps {\r\n settings?: DeviceSettings['restic'];\r\n onUpdate: (settings: DeviceResticSettingsProps['settings']) => void;\r\n}\r\n\r\nconst DeviceResticSettings = ({ settings = {}, onUpdate }: DeviceResticSettingsProps) => {\r\n return (\r\n <div>\r\n <div className={classes.field}>\r\n <Input\r\n label=\"Cache Directory\"\r\n fieldValue={settings?.cacheDir || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, cacheDir: val })}\r\n hint=\"Where Restic will store it's cache.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Max Processor Cores\"\r\n fieldValue={settings?.maxProcessor || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, maxProcessor: val === 0 ? '' : val })}\r\n min={0}\r\n max={64}\r\n hint=\"Keep 0 or empty to use all cores. Uses all cores by default.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Read Concurrency\"\r\n fieldValue={settings?.readConcurrency || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, readConcurrency: val === 0 ? '' : val })}\r\n min={0}\r\n hint=\"Read n files Concurrently. Default: 2\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Packet Size (MB)\"\r\n fieldValue={settings?.packSize ? parseInt(settings.packSize
|
|
1
|
+
{"version":3,"file":"DeviceResticSettings.js","sources":["../../../../src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx"],"sourcesContent":["import { DeviceSettings } from '../../../@types/devices';\r\nimport Input from '../../common/form/Input/Input';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\nimport classes from '../EditDevice/EditDevice.module.scss';\r\n\r\ninterface DeviceResticSettingsProps {\r\n settings?: DeviceSettings['restic'];\r\n onUpdate: (settings: DeviceResticSettingsProps['settings']) => void;\r\n}\r\n\r\nconst DeviceResticSettings = ({ settings = {}, onUpdate }: DeviceResticSettingsProps) => {\r\n return (\r\n <div>\r\n <div className={classes.field}>\r\n <Input\r\n label=\"Cache Directory\"\r\n fieldValue={settings?.cacheDir || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, cacheDir: val })}\r\n hint=\"Where Restic will store it's cache.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Max Processor Cores\"\r\n fieldValue={settings?.maxProcessor || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, maxProcessor: val === 0 ? '' : val })}\r\n min={0}\r\n max={64}\r\n hint=\"Keep 0 or empty to use all cores. Uses all cores by default.\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Read Concurrency\"\r\n fieldValue={settings?.readConcurrency || ''}\r\n onUpdate={(val) => onUpdate({ ...settings, readConcurrency: val === 0 ? '' : val })}\r\n min={0}\r\n hint=\"Read n files Concurrently. Default: 2\"\r\n inline={true}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <NumberInput\r\n label=\"Packet Size (MB)\"\r\n fieldValue={settings?.packSize ? parseInt(settings.packSize, 10) : ''}\r\n onUpdate={(val) => onUpdate({ ...settings, packSize: val ? val.toString() : '' })}\r\n min={0}\r\n max={4000}\r\n hint=\"Packs are blobs of data, which are encrypted and stored in the repository. Increasing the pack size requires more disk space for temporary pack files to be created before uploading.\"\r\n inline={true}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DeviceResticSettings;\r\n"],"names":["DeviceResticSettings","settings","onUpdate","jsx","classes","Input","val","NumberInput"],"mappings":";;;;AAUA,MAAMA,IAAuB,CAAC,EAAE,UAAAC,IAAW,CAAA,GAAI,UAAAC,0BAExC,OAAA,EACE,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,aAAYJ,KAAA,gBAAAA,EAAU,aAAY;AAAA,MAClC,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,UAAUK,GAAK;AAAA,MAC1D,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,GAEd;AAAA,EACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACI;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,aAAYN,KAAA,gBAAAA,EAAU,iBAAgB;AAAA,MACtC,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,cAAcK,MAAQ,IAAI,KAAKA,EAAA,CAAK;AAAA,MAC/E,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,GAEd;AAAA,EACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACI;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,aAAYN,KAAA,gBAAAA,EAAU,oBAAmB;AAAA,MACzC,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,iBAAiBK,MAAQ,IAAI,KAAKA,EAAA,CAAK;AAAA,MAClF,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,GAEd;AAAA,EACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,OACrB,UAAA,gBAAAD;AAAA,IAACI;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,YAAYN,KAAA,QAAAA,EAAU,WAAW,SAASA,EAAS,UAAU,EAAE,IAAI;AAAA,MACnE,UAAU,CAACK,MAAQJ,EAAS,EAAE,GAAGD,GAAU,UAAUK,IAAMA,EAAI,SAAA,IAAa,IAAI;AAAA,MAChF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAAA,EACX,CACH;AAAA,GACH;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddPlan.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/AddPlan/AddPlan.tsx"],"names":[],"mappings":"AASA,KAAK,YAAY,GAAG;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,OAAO,GAAI,WAAW,YAAY,
|
|
1
|
+
{"version":3,"file":"AddPlan.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/AddPlan/AddPlan.tsx"],"names":[],"mappings":"AASA,KAAK,YAAY,GAAG;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,OAAO,GAAI,WAAW,YAAY,4CA6CvC,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1,38 +1,43 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { toast as
|
|
4
|
-
import { useNavigate as
|
|
5
|
-
import { DEFAULT_PLAN_SETTINGS as
|
|
6
|
-
import { useCreatePlan as
|
|
7
|
-
import
|
|
8
|
-
const
|
|
9
|
-
const [n, i] =
|
|
10
|
-
console.log("newPlan :", n), r.mutate(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { jsx as p } from "react/jsx-runtime";
|
|
2
|
+
import { useState as i } from "react";
|
|
3
|
+
import { toast as u } from "react-toastify";
|
|
4
|
+
import { useNavigate as g } from "react-router";
|
|
5
|
+
import { DEFAULT_PLAN_SETTINGS as P } from "../../../utils/constants.js";
|
|
6
|
+
import { useCreatePlan as S } from "../../../services/plans.js";
|
|
7
|
+
import f from "../PlanForm/PlanForm.js";
|
|
8
|
+
const b = ({ close: o }) => {
|
|
9
|
+
const [n, l] = i(P), [t, a] = i({ runNow: !0 }), r = S(), c = g(), m = () => {
|
|
10
|
+
console.log("newPlan :", n), r.mutate(
|
|
11
|
+
{ newPlan: n, runSettings: t },
|
|
12
|
+
{
|
|
13
|
+
onError: (e) => {
|
|
14
|
+
console.log("error :", e), u.error(e.message || "Error Creating New Backup Plan.");
|
|
15
|
+
},
|
|
16
|
+
onSuccess: (e) => {
|
|
17
|
+
if (console.log("Success :", e), u.success("New Backup Plan Created!", { autoClose: 5e3 }), o(), e != null && e.result) {
|
|
18
|
+
const s = Array.isArray(e.result) ? e.result[0].id : e.result.id;
|
|
19
|
+
s && c(`/plan/${s}${t.runNow ? "?pendingbackup=1" : ""}`);
|
|
20
|
+
}
|
|
18
21
|
}
|
|
19
22
|
}
|
|
20
|
-
|
|
23
|
+
);
|
|
21
24
|
};
|
|
22
|
-
return /* @__PURE__ */
|
|
23
|
-
|
|
25
|
+
return /* @__PURE__ */ p(
|
|
26
|
+
f,
|
|
24
27
|
{
|
|
25
28
|
title: "Add New Plan",
|
|
26
29
|
type: "add",
|
|
27
30
|
isSubmitting: r.isPending,
|
|
28
31
|
planSettings: n,
|
|
29
|
-
onPlanSettingsChange:
|
|
30
|
-
onSubmit:
|
|
31
|
-
close: o
|
|
32
|
+
onPlanSettingsChange: l,
|
|
33
|
+
onSubmit: m,
|
|
34
|
+
close: o,
|
|
35
|
+
runSettings: t,
|
|
36
|
+
setRunSettings: (e) => a(e)
|
|
32
37
|
}
|
|
33
38
|
);
|
|
34
39
|
};
|
|
35
40
|
export {
|
|
36
|
-
|
|
41
|
+
b as default
|
|
37
42
|
};
|
|
38
43
|
//# sourceMappingURL=AddPlan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddPlan.js","sources":["../../../../src/components/Plan/AddPlan/AddPlan.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { toast } from 'react-toastify';\r\nimport { useNavigate } from 'react-router';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport { DEFAULT_PLAN_SETTINGS } from '../../../utils/constants';\r\nimport { useCreatePlan } from '../../../services/plans';\r\n\r\nimport PlanForm from '../PlanForm/PlanForm';\r\n\r\ntype AddPlanProps = {\r\n isPRO?: boolean;\r\n close: () => void;\r\n};\r\n\r\nconst AddPlan = ({ close }: AddPlanProps) => {\r\n const [newPlan, setNewPlan] = useState<NewPlanSettings>(DEFAULT_PLAN_SETTINGS);\r\n\r\n const createPlanMutation = useCreatePlan();\r\n const navigate = useNavigate();\r\n\r\n const createBackup = () => {\r\n console.log('newPlan :', newPlan);\r\n\r\n createPlanMutation.mutate(newPlan, {\r\n
|
|
1
|
+
{"version":3,"file":"AddPlan.js","sources":["../../../../src/components/Plan/AddPlan/AddPlan.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { toast } from 'react-toastify';\r\nimport { useNavigate } from 'react-router';\r\nimport { NewPlanSettings, PlanAddRunSettings } from '../../../@types/plans';\r\nimport { DEFAULT_PLAN_SETTINGS } from '../../../utils/constants';\r\nimport { useCreatePlan } from '../../../services/plans';\r\n\r\nimport PlanForm from '../PlanForm/PlanForm';\r\n\r\ntype AddPlanProps = {\r\n isPRO?: boolean;\r\n close: () => void;\r\n};\r\n\r\nconst AddPlan = ({ close }: AddPlanProps) => {\r\n const [newPlan, setNewPlan] = useState<NewPlanSettings>(DEFAULT_PLAN_SETTINGS);\r\n const [runSettings, setRunSettings] = useState<PlanAddRunSettings>({ runNow: true });\r\n\r\n const createPlanMutation = useCreatePlan();\r\n const navigate = useNavigate();\r\n\r\n const createBackup = () => {\r\n console.log('newPlan :', newPlan);\r\n\r\n createPlanMutation.mutate(\r\n { newPlan, runSettings },\r\n {\r\n onError: (error: any) => {\r\n console.log('error :', error);\r\n toast.error(error.message || `Error Creating New Backup Plan.`);\r\n },\r\n onSuccess: (data: any) => {\r\n console.log('Success :', data);\r\n toast.success(`New Backup Plan Created!`, { autoClose: 5000 });\r\n close();\r\n if (data?.result) {\r\n const planID = Array.isArray(data.result) ? data.result[0].id : data.result.id;\r\n if (planID) {\r\n navigate(`/plan/${planID}${runSettings.runNow ? '?pendingbackup=1' : ''}`);\r\n }\r\n }\r\n },\r\n },\r\n );\r\n };\r\n\r\n return (\r\n <PlanForm\r\n title=\"Add New Plan\"\r\n type=\"add\"\r\n isSubmitting={createPlanMutation.isPending}\r\n planSettings={newPlan}\r\n onPlanSettingsChange={setNewPlan}\r\n onSubmit={createBackup}\r\n close={close}\r\n runSettings={runSettings}\r\n setRunSettings={(settings) => setRunSettings(settings)}\r\n />\r\n );\r\n};\r\n\r\nexport default AddPlan;\r\n"],"names":["AddPlan","close","newPlan","setNewPlan","useState","DEFAULT_PLAN_SETTINGS","runSettings","setRunSettings","createPlanMutation","useCreatePlan","navigate","useNavigate","createBackup","error","toast","data","planID","jsx","PlanForm","settings"],"mappings":";;;;;;;AAcA,MAAMA,IAAU,CAAC,EAAE,OAAAC,QAA0B;AAC1C,QAAM,CAACC,GAASC,CAAU,IAAIC,EAA0BC,CAAqB,GACvE,CAACC,GAAaC,CAAc,IAAIH,EAA6B,EAAE,QAAQ,IAAM,GAE7EI,IAAqBC,EAAA,GACrBC,IAAWC,EAAA,GAEXC,IAAe,MAAM;AACxB,YAAQ,IAAI,aAAaV,CAAO,GAEhCM,EAAmB;AAAA,MAChB,EAAE,SAAAN,GAAS,aAAAI,EAAA;AAAA,MACX;AAAA,QACG,SAAS,CAACO,MAAe;AACtB,kBAAQ,IAAI,WAAWA,CAAK,GAC5BC,EAAM,MAAMD,EAAM,WAAW,iCAAiC;AAAA,QACjE;AAAA,QACA,WAAW,CAACE,MAAc;AAIvB,cAHA,QAAQ,IAAI,aAAaA,CAAI,GAC7BD,EAAM,QAAQ,4BAA4B,EAAE,WAAW,KAAM,GAC7Db,EAAA,GACIc,KAAA,QAAAA,EAAM,QAAQ;AACf,kBAAMC,IAAS,MAAM,QAAQD,EAAK,MAAM,IAAIA,EAAK,OAAO,CAAC,EAAE,KAAKA,EAAK,OAAO;AAC5E,YAAIC,KACDN,EAAS,SAASM,CAAM,GAAGV,EAAY,SAAS,qBAAqB,EAAE,EAAE;AAAA,UAE/E;AAAA,QACH;AAAA,MAAA;AAAA,IACH;AAAA,EAEN;AAEA,SACG,gBAAAW;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,OAAM;AAAA,MACN,MAAK;AAAA,MACL,cAAcV,EAAmB;AAAA,MACjC,cAAcN;AAAA,MACd,sBAAsBC;AAAA,MACtB,UAAUS;AAAA,MACV,OAAAX;AAAA,MACA,aAAAK;AAAA,MACA,gBAAgB,CAACa,MAAaZ,EAAeY,CAAQ;AAAA,IAAA;AAAA,EAAA;AAG9D;"}
|
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
import { jsxs as r, jsx as t, Fragment as R } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
3
|
-
import { useQueryClient as
|
|
4
|
-
import { toast as
|
|
2
|
+
import { useState as O } from "react";
|
|
3
|
+
import { useQueryClient as X } from "@tanstack/react-query";
|
|
4
|
+
import { toast as j } from "react-toastify";
|
|
5
5
|
import d from "../../common/Icon/Icon.js";
|
|
6
|
-
import { useCancelBackup as
|
|
6
|
+
import { useCancelBackup as Z, useGetBackupProgress as D } from "../../../services/backups.js";
|
|
7
7
|
import e from "./BackupProgress.module.scss.js";
|
|
8
|
-
import { timeAgo as
|
|
9
|
-
import { extractResticData as
|
|
10
|
-
import
|
|
11
|
-
import { useCancelRestore as
|
|
12
|
-
import
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
import { timeAgo as ee, formatDateTime as se, formatBytes as I, formatSeconds as re } from "../../../utils/helpers.js";
|
|
9
|
+
import { extractResticData as te, generateBackupProgressMessage as ne, generateRestoreProgressMessage as ie, generateMirrorProgressMessage as oe } from "../../../utils/progressHelpers.js";
|
|
10
|
+
import ae from "../../common/ActionModal/ActionModal.js";
|
|
11
|
+
import { useCancelRestore as le, useGetRestoreProgress as ce } from "../../../services/restores.js";
|
|
12
|
+
import de from "../BackupEvents/BackupEvents.js";
|
|
13
|
+
const Pe = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup" }) => {
|
|
14
|
+
var E;
|
|
15
|
+
const [K, S] = O(!1), [L, y] = O(!1), $ = X(), B = le(), w = Z(), { id: g, started: N } = l, { data: o } = i === "backup" ? D({ id: g, sourceId: b, sourceType: v, planId: c }) : ce({ id: g, sourceId: b, sourceType: v, planId: c }), s = te(o), Q = i === "backup" ? ne(o) : ie(o), U = (E = o == null ? void 0 : o.events) == null ? void 0 : E.find((a) => a.action === "BACKUP_OPERATION_START" && a.resticData), G = i === "backup" && !U, {
|
|
16
|
+
total_files_processed: Y = (s == null ? void 0 : s.total_files) || 0,
|
|
17
|
+
files_done: H = 0,
|
|
17
18
|
total_bytes_processed: _ = (s == null ? void 0 : s.total_bytes_processed) || (s == null ? void 0 : s.total_bytes) || 0,
|
|
18
19
|
bytes_done: F = 0,
|
|
19
20
|
bytes_restored: A = 0,
|
|
20
21
|
files_restored: T = 0,
|
|
21
|
-
seconds_remaining:
|
|
22
|
+
seconds_remaining: J = 0,
|
|
22
23
|
percent_done: P = 0
|
|
23
24
|
} = s || {};
|
|
24
|
-
let h =
|
|
25
|
+
let h = H, f = F, C = _, z = Y, m = _ ? Math.round(F / _ * 100) : 0;
|
|
25
26
|
i === "restore" && (m = Math.round(P * 100), s != null && s.total_bytes && (C = s.total_bytes), A ? f = A : s != null && s.total_bytes && (f = Math.round(P * s.total_bytes)), T ? h = T : s != null && s.total_files && (h = Math.round(P * s.total_files))), (s == null ? void 0 : s.message_type) === "summary" && (m = 100, h = z, f = C);
|
|
26
|
-
const
|
|
27
|
-
console.log("cancel :", i, l), i === "backup" ?
|
|
27
|
+
const V = () => {
|
|
28
|
+
console.log("cancel :", i, l), i === "backup" ? j.promise(
|
|
28
29
|
w.mutateAsync(
|
|
29
30
|
{ planId: c, backupId: l.id },
|
|
30
31
|
{
|
|
@@ -40,7 +41,7 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
|
-
) :
|
|
44
|
+
) : j.promise(
|
|
44
45
|
B.mutateAsync(
|
|
45
46
|
{ planId: c, restoreId: l.id },
|
|
46
47
|
{
|
|
@@ -66,10 +67,10 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
66
67
|
i === "restore" ? "Restoring " : "",
|
|
67
68
|
"backup-",
|
|
68
69
|
g,
|
|
69
|
-
/* @__PURE__ */ r("span", { className: e.backupTime, title:
|
|
70
|
+
/* @__PURE__ */ r("span", { className: e.backupTime, title: se(N), children: [
|
|
70
71
|
/* @__PURE__ */ t(d, { type: "clock", size: 12 }),
|
|
71
72
|
" Started ",
|
|
72
|
-
N ?
|
|
73
|
+
N ? ee(new Date(N)) : "a few seconds ago"
|
|
73
74
|
] }),
|
|
74
75
|
l.errorMsg && /* @__PURE__ */ r("span", { className: e.backupError, children: [
|
|
75
76
|
/* @__PURE__ */ t(d, { type: "error-circle-filled", size: 13 }),
|
|
@@ -92,7 +93,7 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
92
93
|
] })
|
|
93
94
|
] }),
|
|
94
95
|
/* @__PURE__ */ r("div", { className: e.backupStart, children: [
|
|
95
|
-
/* @__PURE__ */ t("div", { children: /* @__PURE__ */ t("span", { className: e.progressMessage, onClick: () => y(!0), children:
|
|
96
|
+
/* @__PURE__ */ t("div", { children: /* @__PURE__ */ t("span", { className: e.progressMessage, onClick: () => y(!0), children: Q }) }),
|
|
96
97
|
/* @__PURE__ */ r("button", { onClick: () => S(!0), title: `Cancel ${i}`, children: [
|
|
97
98
|
/* @__PURE__ */ t(d, { type: "close", size: 12 }),
|
|
98
99
|
" Cancel"
|
|
@@ -110,20 +111,20 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
110
111
|
] }),
|
|
111
112
|
/* @__PURE__ */ t("i", {}),
|
|
112
113
|
/* @__PURE__ */ r("span", { children: [
|
|
113
|
-
|
|
114
|
+
I(f),
|
|
114
115
|
" / ",
|
|
115
|
-
|
|
116
|
+
I(C)
|
|
116
117
|
] })
|
|
117
118
|
] }),
|
|
118
119
|
/* @__PURE__ */ t("div", { className: e.ProgressStatsRight, children: i !== "restore" && /* @__PURE__ */ r(R, { children: [
|
|
119
120
|
"Remaining: ",
|
|
120
|
-
|
|
121
|
+
re(J)
|
|
121
122
|
] }) })
|
|
122
123
|
] }),
|
|
123
124
|
/* @__PURE__ */ t("div", { className: e.progressBar, children: /* @__PURE__ */ t(
|
|
124
125
|
"div",
|
|
125
126
|
{
|
|
126
|
-
className: `${e.progressBarFill} ${m > 3 ? e.progressBarFilled : ""} ${
|
|
127
|
+
className: `${e.progressBarFill} ${m > 3 ? e.progressBarFilled : ""} ${G ? e.progressBarDryRun : ""}`,
|
|
127
128
|
style: { width: m + "%" },
|
|
128
129
|
children: /* @__PURE__ */ r("span", { children: [
|
|
129
130
|
m,
|
|
@@ -132,8 +133,8 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
132
133
|
}
|
|
133
134
|
) })
|
|
134
135
|
] }),
|
|
135
|
-
|
|
136
|
-
|
|
136
|
+
K && /* @__PURE__ */ t(
|
|
137
|
+
ae,
|
|
137
138
|
{
|
|
138
139
|
title: `Cancel ${i}`,
|
|
139
140
|
message: /* @__PURE__ */ t(R, { children: `Are you sure you want to cancel the ${i} process?` }),
|
|
@@ -143,12 +144,12 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
143
144
|
title: `Yes, Cancel ${i}`,
|
|
144
145
|
type: "danger",
|
|
145
146
|
isPending: i === "restore" ? B.isPending : w.isPending,
|
|
146
|
-
action: () =>
|
|
147
|
+
action: () => V()
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
),
|
|
150
|
-
|
|
151
|
-
|
|
151
|
+
L && /* @__PURE__ */ t(
|
|
152
|
+
de,
|
|
152
153
|
{
|
|
153
154
|
id: g,
|
|
154
155
|
type: i,
|
|
@@ -164,8 +165,8 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
164
165
|
(o == null ? void 0 : o.mirrors) && Object.keys(o.mirrors).length > 0 && /* @__PURE__ */ r("div", { className: e.mirrorsSection, children: [
|
|
165
166
|
/* @__PURE__ */ t("div", { className: e.mirrorsTitle, children: "Replicating" }),
|
|
166
167
|
/* @__PURE__ */ t("div", { className: e.mirrorsList, children: Object.entries(o.mirrors).map(([a, n]) => {
|
|
167
|
-
var
|
|
168
|
-
const k = (
|
|
168
|
+
var q, x;
|
|
169
|
+
const k = (x = (q = n.events) == null ? void 0 : q.slice().reverse().find((W) => W.resticData)) == null ? void 0 : x.resticData, p = k != null && k.percent_done ? Math.round(k.percent_done * 100) : 0, M = oe(n);
|
|
169
170
|
let u = e.mirrorPending;
|
|
170
171
|
return n.status === "running" && (u = p > 0 ? e.mirrorRunning : e.mirrorRunningIndeterminate), n.status === "completed" && (u = e.mirrorCompleted), n.status === "failed" && (u = e.mirrorFailed), n.status === "retrying" && (u = e.mirrorRunningIndeterminate), /* @__PURE__ */ r("div", { className: e.mirrorItem, children: [
|
|
171
172
|
/* @__PURE__ */ r("div", { className: e.mirrorStorageIcon, children: [
|
|
@@ -205,6 +206,6 @@ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup"
|
|
|
205
206
|
] }, l.id);
|
|
206
207
|
};
|
|
207
208
|
export {
|
|
208
|
-
|
|
209
|
+
Pe as default
|
|
209
210
|
};
|
|
210
211
|
//# sourceMappingURL=BackupProgress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackupProgress.js","sources":["../../../../src/components/Plan/BackupProgress/BackupProgress.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport { useCancelBackup, useGetBackupProgress } from '../../../services/backups';\r\nimport classes from './BackupProgress.module.scss';\r\nimport { formatBytes, formatDateTime, formatSeconds, timeAgo } from '../../../utils/helpers';\r\nimport {\r\n generateBackupProgressMessage,\r\n extractResticData,\r\n generateRestoreProgressMessage,\r\n generateMirrorProgressMessage,\r\n} from '../../../utils/progressHelpers';\r\nimport { Backup } from '../../../@types/backups';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { useCancelRestore, useGetRestoreProgress } from '../../../services/restores';\r\nimport BackupEvents from '../BackupEvents/BackupEvents';\r\nimport { ReplicationProgressData } from '../../../@types/backups';\r\n\r\ninterface BackupProgressProps {\r\n item: Backup | RestoreSlim;\r\n sourceId: string;\r\n sourceType: string;\r\n planId: string;\r\n type: 'backup' | 'restore';\r\n}\r\n\r\nconst BackupProgress = ({ item, sourceId, sourceType, planId, type = 'backup' }: BackupProgressProps) => {\r\n const [showCancelModal, setShowCancelModal] = useState(false);\r\n const [showProgressDetails, setShowProgressDetails] = useState(false);\r\n const queryClient = useQueryClient();\r\n const cancelRestoreMutation = useCancelRestore();\r\n const cancelBackupMutation = useCancelBackup();\r\n\r\n const { id, started } = item;\r\n const { data: progressData } =\r\n type === 'backup' ? useGetBackupProgress({ id, sourceId, sourceType, planId }) : useGetRestoreProgress({ id, sourceId, sourceType, planId });\r\n\r\n const resticData = extractResticData(progressData);\r\n const progressMessage = type === 'backup' ? generateBackupProgressMessage(progressData) : generateRestoreProgressMessage(progressData);\r\n\r\n // Check if DryRun progress tracking phase\r\n const actualBackupStarted = progressData?.events.find((e: any) => e.action === 'BACKUP_OPERATION_START' && e.resticData);\r\n const isDryRun = type === 'backup' && !actualBackupStarted;\r\n\r\n // Extract progress values from restic data or use defaults\r\n const {\r\n total_files_processed: total_files = resticData?.total_files || 0,\r\n files_done = 0,\r\n total_bytes_processed: total_bytes = resticData?.total_bytes_processed || resticData?.total_bytes || 0,\r\n bytes_done = 0,\r\n bytes_restored = 0,\r\n files_restored = 0,\r\n seconds_remaining = 0,\r\n percent_done = 0,\r\n } = resticData || {};\r\n\r\n let filesProcessed = files_done;\r\n let bytesProcessed = bytes_done;\r\n let totalBytes = total_bytes;\r\n let totalFiles = total_files;\r\n let progressPercent = total_bytes ? Math.round((bytes_done / total_bytes) * 100) : 0;\r\n\r\n if (type === 'restore') {\r\n progressPercent = Math.round(percent_done * 100);\r\n if (resticData?.total_bytes) {\r\n totalBytes = resticData.total_bytes;\r\n }\r\n if (bytes_restored) {\r\n bytesProcessed = bytes_restored;\r\n } else {\r\n if (resticData?.total_bytes) {\r\n bytesProcessed = Math.round(percent_done * resticData.total_bytes);\r\n }\r\n }\r\n if (files_restored) {\r\n filesProcessed = files_restored;\r\n } else {\r\n if (resticData?.total_files) {\r\n filesProcessed = Math.round(percent_done * resticData.total_files);\r\n }\r\n }\r\n }\r\n\r\n // For completed backups, show 100% if we have summary data\r\n if (resticData?.message_type === 'summary') {\r\n progressPercent = 100;\r\n filesProcessed = totalFiles;\r\n bytesProcessed = totalBytes;\r\n }\r\n\r\n const cancel = () => {\r\n console.log('cancel :', type, item);\r\n if (type === 'backup') {\r\n toast.promise(\r\n cancelBackupMutation.mutateAsync(\r\n { planId, backupId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Backup process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel backup process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n } else {\r\n toast.promise(\r\n cancelRestoreMutation.mutateAsync(\r\n { planId, restoreId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Restore process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel restore process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div key={item.id} className={classes.backup}>\r\n <div key={item.id} className={classes.backupProgress}>\r\n <div className={classes.backupIcon}>\r\n <Icon type=\"loading\" size={24} />\r\n </div>\r\n <div className={classes.backupLeft}>\r\n <div className={classes.backupId}>\r\n {type === 'restore' ? 'Restoring ' : ''}backup-{id}\r\n <span className={classes.backupTime} title={formatDateTime(started)}>\r\n <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'}\r\n </span>\r\n {item.errorMsg && (\r\n <span className={classes.backupError}>\r\n <Icon type=\"error-circle-filled\" size={13} />{' '}\r\n <i\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={`<div class=\"linebreak-tooltip-content\">${item.errorMsg.slice(0, 120) + (item.errorMsg.length > 120 ? '...' : '')}</div>`}\r\n onClick={() => setShowProgressDetails(true)}\r\n >\r\n <u>Error</u> Occurred.\r\n </i>{' '}\r\n Retrying...\r\n </span>\r\n )}\r\n </div>\r\n <div className={classes.backupStart}>\r\n <div>\r\n <span className={classes.progressMessage} onClick={() => setShowProgressDetails(true)}>\r\n {progressMessage}\r\n </span>\r\n {/* <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'} */}\r\n </div>\r\n <button onClick={() => setShowCancelModal(true)} title={`Cancel ${type}`}>\r\n <Icon type=\"close\" size={12} /> Cancel\r\n </button>\r\n </div>\r\n </div>\r\n <div className={classes.backupRight}>\r\n <div className={classes.ProgressStats}>\r\n <div className={classes.ProgressStatsLeft}>\r\n <span>\r\n {filesProcessed} / {totalFiles} Files\r\n </span>\r\n <i></i>\r\n <span>\r\n {formatBytes(bytesProcessed)} / {formatBytes(totalBytes)}\r\n </span>\r\n </div>\r\n <div className={classes.ProgressStatsRight}>{type !== 'restore' && <>Remaining: {formatSeconds(seconds_remaining)}</>}</div>\r\n </div>\r\n <div className={classes.progressBar}>\r\n <div\r\n className={`${classes.progressBarFill} ${progressPercent > 3 ? classes.progressBarFilled : ''} ${isDryRun ? classes.progressBarDryRun : ''}`}\r\n style={{ width: progressPercent + '%' }}\r\n >\r\n <span>{progressPercent}%</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showCancelModal && (\r\n <ActionModal\r\n title={`Cancel ${type}`}\r\n message={<>{`Are you sure you want to cancel the ${type} process?`}</>}\r\n closeModal={() => setShowCancelModal(false)}\r\n width=\"400px\"\r\n primaryAction={{\r\n title: `Yes, Cancel ${type}`,\r\n type: 'danger',\r\n isPending: type === 'restore' ? cancelRestoreMutation.isPending : cancelBackupMutation.isPending,\r\n action: () => cancel(),\r\n }}\r\n />\r\n )}\r\n {showProgressDetails && (\r\n <BackupEvents\r\n id={id}\r\n type={type}\r\n planId={planId}\r\n sourceId={sourceId}\r\n sourceType={sourceType}\r\n progressData={progressData}\r\n inProgress={true}\r\n close={() => setShowProgressDetails(false)}\r\n />\r\n )}\r\n </div>\r\n {/* Mirrors Progress */}\r\n {progressData?.mirrors && Object.keys(progressData.mirrors).length > 0 && (\r\n <div className={classes.mirrorsSection}>\r\n <div className={classes.mirrorsTitle}>Replicating</div>\r\n <div className={classes.mirrorsList}>\r\n {Object.entries(progressData.mirrors as Record<string, ReplicationProgressData>).map(([storageId, mirror]) => {\r\n const mirrorResticData = mirror.events\r\n ?.slice()\r\n .reverse()\r\n .find((e: any) => e.resticData)?.resticData;\r\n const mirrorPercent = mirrorResticData?.percent_done ? Math.round(mirrorResticData.percent_done * 100) : 0;\r\n const mirrorMessage = generateMirrorProgressMessage(mirror);\r\n\r\n let mirrorStatusClass = classes.mirrorPending;\r\n if (mirror.status === 'running')\r\n mirrorStatusClass = mirrorPercent > 0 ? classes.mirrorRunning : classes.mirrorRunningIndeterminate;\r\n if (mirror.status === 'completed') mirrorStatusClass = classes.mirrorCompleted;\r\n if (mirror.status === 'failed') mirrorStatusClass = classes.mirrorFailed;\r\n if (mirror.status === 'retrying') mirrorStatusClass = classes.mirrorRunningIndeterminate;\r\n\r\n return (\r\n <div key={storageId} className={classes.mirrorItem}>\r\n <div className={classes.mirrorStorageIcon}>\r\n {(mirror.status === 'running' || mirror.status === 'pending' || mirror.status === 'retrying') && (\r\n <Icon type=\"loading\" size={12} />\r\n )}\r\n <img src={`/providers/${mirror.storageType}.png`} />\r\n </div>\r\n <div className={classes.mirrorProgress}>\r\n <div className={classes.mirrorInfo}>\r\n <span className={classes.mirrorName}>{mirror.storageName}</span>\r\n <span className={`${classes.mirrorStatus} ${mirrorStatusClass}`}>\r\n {mirror.status === 'pending' && 'Pending'}\r\n {mirror.status === 'running' && (mirrorPercent > 0 ? `${mirrorPercent}% — ${mirrorMessage}` : mirrorMessage)}\r\n {mirror.status === 'completed' && (\r\n <>\r\n <Icon type=\"check\" size={10} /> Completed\r\n </>\r\n )}\r\n {mirror.status === 'failed' && (\r\n <span data-tooltip-id=\"htmlToolTip\" data-tooltip-html={mirror.error || 'Replication failed'}>\r\n <Icon type=\"error\" size={12} /> Failed\r\n </span>\r\n )}\r\n {mirror.status === 'retrying' && mirrorMessage}\r\n </span>\r\n </div>\r\n <div className={classes.mirrorBar}>\r\n <div\r\n className={`${classes.mirrorBarFill} ${mirrorStatusClass}`}\r\n style={{\r\n width:\r\n mirror.status === 'completed'\r\n ? '100%'\r\n : mirror.status === 'failed'\r\n ? '100%'\r\n : mirrorPercent > 0\r\n ? `${mirrorPercent}%`\r\n : undefined,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default BackupProgress;\r\n"],"names":["BackupProgress","item","sourceId","sourceType","planId","type","showCancelModal","setShowCancelModal","useState","showProgressDetails","setShowProgressDetails","queryClient","useQueryClient","cancelRestoreMutation","useCancelRestore","cancelBackupMutation","useCancelBackup","id","started","progressData","useGetBackupProgress","useGetRestoreProgress","resticData","extractResticData","progressMessage","generateBackupProgressMessage","generateRestoreProgressMessage","actualBackupStarted","e","isDryRun","total_files","files_done","total_bytes","bytes_done","bytes_restored","files_restored","seconds_remaining","percent_done","filesProcessed","bytesProcessed","totalBytes","totalFiles","progressPercent","cancel","toast","data","jsxs","classes","jsx","Icon","formatDateTime","timeAgo","formatBytes","Fragment","formatSeconds","ActionModal","BackupEvents","storageId","mirror","mirrorResticData","_b","_a","mirrorPercent","mirrorMessage","generateMirrorProgressMessage","mirrorStatusClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackupProgress.js","sources":["../../../../src/components/Plan/BackupProgress/BackupProgress.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport { useCancelBackup, useGetBackupProgress } from '../../../services/backups';\r\nimport classes from './BackupProgress.module.scss';\r\nimport { formatBytes, formatDateTime, formatSeconds, timeAgo } from '../../../utils/helpers';\r\nimport {\r\n generateBackupProgressMessage,\r\n extractResticData,\r\n generateRestoreProgressMessage,\r\n generateMirrorProgressMessage,\r\n} from '../../../utils/progressHelpers';\r\nimport { Backup } from '../../../@types/backups';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { useCancelRestore, useGetRestoreProgress } from '../../../services/restores';\r\nimport BackupEvents from '../BackupEvents/BackupEvents';\r\nimport { ReplicationProgressData } from '../../../@types/backups';\r\n\r\ninterface BackupProgressProps {\r\n item: Backup | RestoreSlim;\r\n sourceId: string;\r\n sourceType: string;\r\n planId: string;\r\n type: 'backup' | 'restore';\r\n}\r\n\r\nconst BackupProgress = ({ item, sourceId, sourceType, planId, type = 'backup' }: BackupProgressProps) => {\r\n const [showCancelModal, setShowCancelModal] = useState(false);\r\n const [showProgressDetails, setShowProgressDetails] = useState(false);\r\n const queryClient = useQueryClient();\r\n const cancelRestoreMutation = useCancelRestore();\r\n const cancelBackupMutation = useCancelBackup();\r\n\r\n const { id, started } = item;\r\n const { data: progressData } =\r\n type === 'backup' ? useGetBackupProgress({ id, sourceId, sourceType, planId }) : useGetRestoreProgress({ id, sourceId, sourceType, planId });\r\n\r\n const resticData = extractResticData(progressData);\r\n const progressMessage = type === 'backup' ? generateBackupProgressMessage(progressData) : generateRestoreProgressMessage(progressData);\r\n\r\n // Check if DryRun progress tracking phase\r\n const actualBackupStarted = progressData?.events?.find((e: any) => e.action === 'BACKUP_OPERATION_START' && e.resticData);\r\n const isDryRun = type === 'backup' && !actualBackupStarted;\r\n\r\n // Extract progress values from restic data or use defaults\r\n const {\r\n total_files_processed: total_files = resticData?.total_files || 0,\r\n files_done = 0,\r\n total_bytes_processed: total_bytes = resticData?.total_bytes_processed || resticData?.total_bytes || 0,\r\n bytes_done = 0,\r\n bytes_restored = 0,\r\n files_restored = 0,\r\n seconds_remaining = 0,\r\n percent_done = 0,\r\n } = resticData || {};\r\n\r\n let filesProcessed = files_done;\r\n let bytesProcessed = bytes_done;\r\n let totalBytes = total_bytes;\r\n let totalFiles = total_files;\r\n let progressPercent = total_bytes ? Math.round((bytes_done / total_bytes) * 100) : 0;\r\n\r\n if (type === 'restore') {\r\n progressPercent = Math.round(percent_done * 100);\r\n if (resticData?.total_bytes) {\r\n totalBytes = resticData.total_bytes;\r\n }\r\n if (bytes_restored) {\r\n bytesProcessed = bytes_restored;\r\n } else {\r\n if (resticData?.total_bytes) {\r\n bytesProcessed = Math.round(percent_done * resticData.total_bytes);\r\n }\r\n }\r\n if (files_restored) {\r\n filesProcessed = files_restored;\r\n } else {\r\n if (resticData?.total_files) {\r\n filesProcessed = Math.round(percent_done * resticData.total_files);\r\n }\r\n }\r\n }\r\n\r\n // For completed backups, show 100% if we have summary data\r\n if (resticData?.message_type === 'summary') {\r\n progressPercent = 100;\r\n filesProcessed = totalFiles;\r\n bytesProcessed = totalBytes;\r\n }\r\n\r\n const cancel = () => {\r\n console.log('cancel :', type, item);\r\n if (type === 'backup') {\r\n toast.promise(\r\n cancelBackupMutation.mutateAsync(\r\n { planId, backupId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Backup process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel backup process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n } else {\r\n toast.promise(\r\n cancelRestoreMutation.mutateAsync(\r\n { planId, restoreId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Restore process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel restore process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div key={item.id} className={classes.backup}>\r\n <div key={item.id} className={classes.backupProgress}>\r\n <div className={classes.backupIcon}>\r\n <Icon type=\"loading\" size={24} />\r\n </div>\r\n <div className={classes.backupLeft}>\r\n <div className={classes.backupId}>\r\n {type === 'restore' ? 'Restoring ' : ''}backup-{id}\r\n <span className={classes.backupTime} title={formatDateTime(started)}>\r\n <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'}\r\n </span>\r\n {item.errorMsg && (\r\n <span className={classes.backupError}>\r\n <Icon type=\"error-circle-filled\" size={13} />{' '}\r\n <i\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={`<div class=\"linebreak-tooltip-content\">${item.errorMsg.slice(0, 120) + (item.errorMsg.length > 120 ? '...' : '')}</div>`}\r\n onClick={() => setShowProgressDetails(true)}\r\n >\r\n <u>Error</u> Occurred.\r\n </i>{' '}\r\n Retrying...\r\n </span>\r\n )}\r\n </div>\r\n <div className={classes.backupStart}>\r\n <div>\r\n <span className={classes.progressMessage} onClick={() => setShowProgressDetails(true)}>\r\n {progressMessage}\r\n </span>\r\n {/* <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'} */}\r\n </div>\r\n <button onClick={() => setShowCancelModal(true)} title={`Cancel ${type}`}>\r\n <Icon type=\"close\" size={12} /> Cancel\r\n </button>\r\n </div>\r\n </div>\r\n <div className={classes.backupRight}>\r\n <div className={classes.ProgressStats}>\r\n <div className={classes.ProgressStatsLeft}>\r\n <span>\r\n {filesProcessed} / {totalFiles} Files\r\n </span>\r\n <i></i>\r\n <span>\r\n {formatBytes(bytesProcessed)} / {formatBytes(totalBytes)}\r\n </span>\r\n </div>\r\n <div className={classes.ProgressStatsRight}>{type !== 'restore' && <>Remaining: {formatSeconds(seconds_remaining)}</>}</div>\r\n </div>\r\n <div className={classes.progressBar}>\r\n <div\r\n className={`${classes.progressBarFill} ${progressPercent > 3 ? classes.progressBarFilled : ''} ${isDryRun ? classes.progressBarDryRun : ''}`}\r\n style={{ width: progressPercent + '%' }}\r\n >\r\n <span>{progressPercent}%</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showCancelModal && (\r\n <ActionModal\r\n title={`Cancel ${type}`}\r\n message={<>{`Are you sure you want to cancel the ${type} process?`}</>}\r\n closeModal={() => setShowCancelModal(false)}\r\n width=\"400px\"\r\n primaryAction={{\r\n title: `Yes, Cancel ${type}`,\r\n type: 'danger',\r\n isPending: type === 'restore' ? cancelRestoreMutation.isPending : cancelBackupMutation.isPending,\r\n action: () => cancel(),\r\n }}\r\n />\r\n )}\r\n {showProgressDetails && (\r\n <BackupEvents\r\n id={id}\r\n type={type}\r\n planId={planId}\r\n sourceId={sourceId}\r\n sourceType={sourceType}\r\n progressData={progressData}\r\n inProgress={true}\r\n close={() => setShowProgressDetails(false)}\r\n />\r\n )}\r\n </div>\r\n {/* Mirrors Progress */}\r\n {progressData?.mirrors && Object.keys(progressData.mirrors).length > 0 && (\r\n <div className={classes.mirrorsSection}>\r\n <div className={classes.mirrorsTitle}>Replicating</div>\r\n <div className={classes.mirrorsList}>\r\n {Object.entries(progressData.mirrors as Record<string, ReplicationProgressData>).map(([storageId, mirror]) => {\r\n const mirrorResticData = mirror.events\r\n ?.slice()\r\n .reverse()\r\n .find((e: any) => e.resticData)?.resticData;\r\n const mirrorPercent = mirrorResticData?.percent_done ? Math.round(mirrorResticData.percent_done * 100) : 0;\r\n const mirrorMessage = generateMirrorProgressMessage(mirror);\r\n\r\n let mirrorStatusClass = classes.mirrorPending;\r\n if (mirror.status === 'running')\r\n mirrorStatusClass = mirrorPercent > 0 ? classes.mirrorRunning : classes.mirrorRunningIndeterminate;\r\n if (mirror.status === 'completed') mirrorStatusClass = classes.mirrorCompleted;\r\n if (mirror.status === 'failed') mirrorStatusClass = classes.mirrorFailed;\r\n if (mirror.status === 'retrying') mirrorStatusClass = classes.mirrorRunningIndeterminate;\r\n\r\n return (\r\n <div key={storageId} className={classes.mirrorItem}>\r\n <div className={classes.mirrorStorageIcon}>\r\n {(mirror.status === 'running' || mirror.status === 'pending' || mirror.status === 'retrying') && (\r\n <Icon type=\"loading\" size={12} />\r\n )}\r\n <img src={`/providers/${mirror.storageType}.png`} />\r\n </div>\r\n <div className={classes.mirrorProgress}>\r\n <div className={classes.mirrorInfo}>\r\n <span className={classes.mirrorName}>{mirror.storageName}</span>\r\n <span className={`${classes.mirrorStatus} ${mirrorStatusClass}`}>\r\n {mirror.status === 'pending' && 'Pending'}\r\n {mirror.status === 'running' && (mirrorPercent > 0 ? `${mirrorPercent}% — ${mirrorMessage}` : mirrorMessage)}\r\n {mirror.status === 'completed' && (\r\n <>\r\n <Icon type=\"check\" size={10} /> Completed\r\n </>\r\n )}\r\n {mirror.status === 'failed' && (\r\n <span data-tooltip-id=\"htmlToolTip\" data-tooltip-html={mirror.error || 'Replication failed'}>\r\n <Icon type=\"error\" size={12} /> Failed\r\n </span>\r\n )}\r\n {mirror.status === 'retrying' && mirrorMessage}\r\n </span>\r\n </div>\r\n <div className={classes.mirrorBar}>\r\n <div\r\n className={`${classes.mirrorBarFill} ${mirrorStatusClass}`}\r\n style={{\r\n width:\r\n mirror.status === 'completed'\r\n ? '100%'\r\n : mirror.status === 'failed'\r\n ? '100%'\r\n : mirrorPercent > 0\r\n ? `${mirrorPercent}%`\r\n : undefined,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default BackupProgress;\r\n"],"names":["BackupProgress","item","sourceId","sourceType","planId","type","showCancelModal","setShowCancelModal","useState","showProgressDetails","setShowProgressDetails","queryClient","useQueryClient","cancelRestoreMutation","useCancelRestore","cancelBackupMutation","useCancelBackup","id","started","progressData","useGetBackupProgress","useGetRestoreProgress","resticData","extractResticData","progressMessage","generateBackupProgressMessage","generateRestoreProgressMessage","actualBackupStarted","_a","e","isDryRun","total_files","files_done","total_bytes","bytes_done","bytes_restored","files_restored","seconds_remaining","percent_done","filesProcessed","bytesProcessed","totalBytes","totalFiles","progressPercent","cancel","toast","data","jsxs","classes","jsx","Icon","formatDateTime","timeAgo","formatBytes","Fragment","formatSeconds","ActionModal","BackupEvents","storageId","mirror","mirrorResticData","_b","mirrorPercent","mirrorMessage","generateMirrorProgressMessage","mirrorStatusClass"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Plan } from '../../..';
|
|
2
|
+
type FilterPlansProps = {
|
|
3
|
+
onUpdate: (s: Record<PlanFilterTypes, string[]> | null) => void;
|
|
4
|
+
plans: Plan[];
|
|
5
|
+
};
|
|
6
|
+
export type PlanFilterTypes = 'devices' | 'tags' | 'storages' | 'methods';
|
|
7
|
+
declare const FilterPlans: ({ onUpdate, plans }: FilterPlansProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default FilterPlans;
|
|
9
|
+
//# sourceMappingURL=FilterPlans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterPlans.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/FilterPlans/FilterPlans.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,KAAK,gBAAgB,GAAG;IACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,KAAK,EAAE,IAAI,EAAE,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAI1E,QAAA,MAAM,WAAW,GAAI,qBAAqB,gBAAgB,4CA8GzD,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { jsxs as l, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useState as v, useMemo as S } from "react";
|
|
3
|
+
import i from "./FilterPlans.module.scss.js";
|
|
4
|
+
import m from "../../common/Icon/Icon.js";
|
|
5
|
+
import c from "../../common/form/MultiSelect/MultiSelect.js";
|
|
6
|
+
const g = { devices: [], tags: [], storages: [], methods: [] }, I = ({ onUpdate: h, plans: u }) => {
|
|
7
|
+
const [n, f] = v(!1), [o, d] = v(() => {
|
|
8
|
+
const e = localStorage.getItem("plans_filter");
|
|
9
|
+
return (e ? JSON.parse(e) : null) || g;
|
|
10
|
+
}), p = Object.values(o).some((e) => e.length > 0), r = S(() => {
|
|
11
|
+
const e = { devices: [], tags: [], storages: [], methods: [] };
|
|
12
|
+
return u.forEach((t) => {
|
|
13
|
+
t.tags.forEach((a) => {
|
|
14
|
+
e.tags.find((b) => b.value === a) || e.tags.push({ label: a, value: a });
|
|
15
|
+
}), e.devices.find((a) => a.value === t.device.id) || e.devices.push({ label: t.device.name, value: t.device.id }), e.storages.find((a) => a.value === t.storage.id) || e.storages.push({ label: t.storage.name, value: t.storage.id }), e.methods.find((a) => a.value === t.method) || e.methods.push({ label: t.method, value: t.method });
|
|
16
|
+
}), e;
|
|
17
|
+
}, [u]);
|
|
18
|
+
return /* @__PURE__ */ l("div", { className: i.filterItems, children: [
|
|
19
|
+
/* @__PURE__ */ l(
|
|
20
|
+
"button",
|
|
21
|
+
{
|
|
22
|
+
className: `${i.filterBtn} ${n || p ? i.filterBtnActive : ""}`,
|
|
23
|
+
onClick: () => f(!n),
|
|
24
|
+
"data-tooltip-id": "appTooltip",
|
|
25
|
+
"data-tooltip-content": "Filter",
|
|
26
|
+
"aria-label": "Filter Plans",
|
|
27
|
+
"data-tooltip-place": "top",
|
|
28
|
+
"data-tooltip-delay-show": 500,
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ s(m, { type: "filter", size: 18 }),
|
|
31
|
+
" ",
|
|
32
|
+
p && /* @__PURE__ */ s("span", { className: i.filterCount, children: Object.values(o).reduce((e, t) => e + t.length, 0) })
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
n && /* @__PURE__ */ l("div", { className: `${i.dropdown} styled__scrollbar`, children: [
|
|
37
|
+
r.devices.length > 1 && /* @__PURE__ */ l("div", { className: i.field, children: [
|
|
38
|
+
/* @__PURE__ */ s("label", { children: "Devices" }),
|
|
39
|
+
/* @__PURE__ */ s(
|
|
40
|
+
c,
|
|
41
|
+
{
|
|
42
|
+
title: "Devices",
|
|
43
|
+
fieldValue: o.devices,
|
|
44
|
+
options: r.devices,
|
|
45
|
+
onUpdate: (e) => d((t) => ({ ...t, devices: e }))
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ l("div", { className: i.field, children: [
|
|
50
|
+
/* @__PURE__ */ s("label", { children: "Backup Type" }),
|
|
51
|
+
/* @__PURE__ */ s(
|
|
52
|
+
c,
|
|
53
|
+
{
|
|
54
|
+
title: "Backup Type",
|
|
55
|
+
fieldValue: o.methods,
|
|
56
|
+
options: r.methods,
|
|
57
|
+
onUpdate: (e) => d((t) => ({ ...t, methods: e }))
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ l("div", { className: i.field, children: [
|
|
62
|
+
/* @__PURE__ */ s("label", { children: "Storage" }),
|
|
63
|
+
/* @__PURE__ */ s(
|
|
64
|
+
c,
|
|
65
|
+
{
|
|
66
|
+
title: "Storages",
|
|
67
|
+
fieldValue: o.storages,
|
|
68
|
+
options: r.storages,
|
|
69
|
+
onUpdate: (e) => d((t) => ({ ...t, storages: e }))
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ l("div", { className: i.field, children: [
|
|
74
|
+
/* @__PURE__ */ s("label", { children: "Tags" }),
|
|
75
|
+
/* @__PURE__ */ s(
|
|
76
|
+
c,
|
|
77
|
+
{
|
|
78
|
+
title: "Tags",
|
|
79
|
+
fieldValue: o.tags,
|
|
80
|
+
options: r.tags,
|
|
81
|
+
onUpdate: (e) => d((t) => ({ ...t, tags: e }))
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ l("div", { className: i.footer, children: [
|
|
86
|
+
/* @__PURE__ */ l(
|
|
87
|
+
"button",
|
|
88
|
+
{
|
|
89
|
+
onClick: () => {
|
|
90
|
+
localStorage.removeItem("plans_filter"), d(g), h(null), f(!1);
|
|
91
|
+
},
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ s(m, { type: "reload" }),
|
|
94
|
+
" Reset"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
),
|
|
98
|
+
/* @__PURE__ */ l(
|
|
99
|
+
"button",
|
|
100
|
+
{
|
|
101
|
+
onClick: () => {
|
|
102
|
+
localStorage.setItem("plans_filter", JSON.stringify(o)), h(o), f(!1);
|
|
103
|
+
},
|
|
104
|
+
children: [
|
|
105
|
+
/* @__PURE__ */ s(m, { type: "check", size: 12 }),
|
|
106
|
+
" Apply"
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
] })
|
|
111
|
+
] })
|
|
112
|
+
] });
|
|
113
|
+
};
|
|
114
|
+
export {
|
|
115
|
+
I as default
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=FilterPlans.js.map
|