@plutonhq/core-frontend 0.1.22 → 0.1.23
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 +11 -20
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +49 -47
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettings.d.ts +7 -4
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettings.js +177 -52
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettingsTester.d.ts +9 -0
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettingsTester.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettingsTester.js +62 -0
- package/dist-lib/components/Plan/PlanSettings/PlanNotificationSettingsTester.js.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanPruneSettings.js +2 -2
- package/dist-lib/components/Plan/PlanSettings/PlanPruneSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +56 -40
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js.map +1 -1
- package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.d.ts.map +1 -1
- package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.js +16 -8
- package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.js.map +1 -1
- package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
- package/dist-lib/components/common/Icon/Icon.js +15 -1
- package/dist-lib/components/common/Icon/Icon.js.map +1 -1
- package/dist-lib/components/index.d.ts +1 -0
- package/dist-lib/components/index.d.ts.map +1 -1
- package/dist-lib/components.js +86 -84
- package/dist-lib/components.js.map +1 -1
- package/dist-lib/providers/s3compatible.png +0 -0
- package/dist-lib/services/plans.d.ts +13 -1
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +88 -61
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services/settings.d.ts.map +1 -1
- package/dist-lib/services/settings.js +25 -24
- package/dist-lib/services/settings.js.map +1 -1
- package/dist-lib/services.js +102 -100
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/utils/constants.d.ts.map +1 -1
- package/dist-lib/utils/constants.js +28 -5
- package/dist-lib/utils/constants.js.map +1 -1
- package/dist-lib/utils/helpers.d.ts +1 -0
- package/dist-lib/utils/helpers.d.ts.map +1 -1
- package/dist-lib/utils/helpers.js +17 -10
- package/dist-lib/utils/helpers.js.map +1 -1
- package/dist-lib/utils.js +28 -27
- package/package.json +1 -1
- package/src/@types/plans.ts +11 -20
- package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +4 -4
- package/src/components/Plan/PlanSettings/PlanNotificationSettings.tsx +179 -47
- package/src/components/Plan/PlanSettings/PlanNotificationSettingsTester.tsx +85 -0
- package/src/components/Plan/PlanSettings/PlanPruneSettings.tsx +2 -2
- package/src/components/Plan/PlanSettings/PlanSettings.module.scss +71 -0
- package/src/components/Settings/GeneralSettings/GeneralSettings.tsx +6 -1
- package/src/components/common/Icon/Icon.tsx +16 -0
- package/src/components/index.ts +1 -0
- package/src/services/plans.ts +38 -1
- package/src/services/settings.ts +2 -2
- package/src/utils/constants.ts +23 -0
- package/src/utils/helpers.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,eAAO,MAAM,QAAQ,SAAwC,CAAC;AAC9D,eAAO,MAAM,OAAO,QAAyF,CAAC;AAC9G,eAAO,MAAM,QAAQ,KAA4C,CAAC;AAClE,eAAO,MAAM,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,eAAO,MAAM,QAAQ,SAAwC,CAAC;AAC9D,eAAO,MAAM,OAAO,QAAyF,CAAC;AAC9G,eAAO,MAAM,QAAQ,KAA4C,CAAC;AAClE,eAAO,MAAM,qBAAqB,EAAE,eA0GnC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e = !1, a = `${window.location.origin}/api`,
|
|
1
|
+
const e = !1, a = `${window.location.origin}/api`, s = "Pluton", n = {
|
|
2
2
|
title: "New Backup",
|
|
3
3
|
method: "backup",
|
|
4
4
|
sourceId: "main",
|
|
@@ -37,6 +37,16 @@ const e = !1, a = `${window.location.origin}/api`, t = "Pluton", n = {
|
|
|
37
37
|
authType: "none",
|
|
38
38
|
authToken: "",
|
|
39
39
|
tags: ""
|
|
40
|
+
},
|
|
41
|
+
slack: {
|
|
42
|
+
enabled: !1,
|
|
43
|
+
case: "failure",
|
|
44
|
+
url: ""
|
|
45
|
+
},
|
|
46
|
+
discord: {
|
|
47
|
+
enabled: !1,
|
|
48
|
+
case: "failure",
|
|
49
|
+
url: ""
|
|
40
50
|
}
|
|
41
51
|
},
|
|
42
52
|
prune: {
|
|
@@ -56,20 +66,33 @@ const e = !1, a = `${window.location.origin}/api`, t = "Pluton", n = {
|
|
|
56
66
|
email: {
|
|
57
67
|
enabled: !1,
|
|
58
68
|
type: "smtp",
|
|
59
|
-
emails: ""
|
|
69
|
+
emails: "",
|
|
70
|
+
case: "failure"
|
|
60
71
|
},
|
|
61
72
|
webhook: {
|
|
62
73
|
enabled: !1,
|
|
63
74
|
method: "POST",
|
|
64
75
|
contentType: "application/json",
|
|
65
|
-
url: ""
|
|
76
|
+
url: "",
|
|
77
|
+
case: "failure"
|
|
66
78
|
},
|
|
67
79
|
push: {
|
|
68
80
|
enabled: !1,
|
|
69
81
|
url: "",
|
|
70
82
|
authType: "none",
|
|
71
83
|
authToken: "",
|
|
72
|
-
tags: ""
|
|
84
|
+
tags: "",
|
|
85
|
+
case: "failure"
|
|
86
|
+
},
|
|
87
|
+
slack: {
|
|
88
|
+
enabled: !1,
|
|
89
|
+
case: "failure",
|
|
90
|
+
url: ""
|
|
91
|
+
},
|
|
92
|
+
discord: {
|
|
93
|
+
enabled: !1,
|
|
94
|
+
case: "failure",
|
|
95
|
+
url: ""
|
|
73
96
|
}
|
|
74
97
|
}
|
|
75
98
|
},
|
|
@@ -85,7 +108,7 @@ const e = !1, a = `${window.location.origin}/api`, t = "Pluton", n = {
|
|
|
85
108
|
};
|
|
86
109
|
export {
|
|
87
110
|
a as API_URL,
|
|
88
|
-
|
|
111
|
+
s as APP_NAME,
|
|
89
112
|
n as DEFAULT_PLAN_SETTINGS,
|
|
90
113
|
e as DEV_MODE
|
|
91
114
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../src/utils/constants.ts"],"sourcesContent":["import { NewPlanSettings } from '../@types/plans';\r\n\r\nexport const DEV_MODE = import.meta.env.MODE !== 'production';\r\nexport const API_URL = DEV_MODE ? `${import.meta.env.VITE_BACKEND_URL}/api` : `${window.location.origin}/api`;\r\nexport const APP_NAME = import.meta.env.VITE_APP_NAME || 'Pluton';\r\nexport const DEFAULT_PLAN_SETTINGS: NewPlanSettings = {\r\n title: 'New Backup',\r\n method: 'backup',\r\n sourceId: 'main',\r\n sourceType: 'device',\r\n sourceConfig: {\r\n includes: [],\r\n excludes: [],\r\n },\r\n storage: { id: 's89hibdias67', name: '' },\r\n storagePath: '',\r\n settings: {\r\n interval: { type: 'daily', time: '10:00AM', days: '', hours: '', minutes: 5 },\r\n compression: true,\r\n encryption: true,\r\n retries: 5,\r\n retryDelay: 300, // in seconds\r\n notification: {\r\n email: {\r\n enabled: false,\r\n case: 'failure',\r\n type: 'smtp',\r\n emails: '',\r\n },\r\n webhook: {\r\n enabled: false,\r\n case: 'failure',\r\n method: 'POST',\r\n contentType: 'application/json',\r\n url: '',\r\n },\r\n push: {\r\n enabled: false,\r\n url: '',\r\n case: 'failure',\r\n authType: 'none',\r\n authToken: '',\r\n tags: '',\r\n },\r\n },\r\n prune: {\r\n snapCount: 5,\r\n policy: 'forgetByAge',\r\n forgetAge: '1m',\r\n revisions: true,\r\n },\r\n performance: {\r\n scan: true,\r\n },\r\n integrity: {\r\n enabled: false,\r\n interval: { type: 'weekly', time: '10:00AM', days: 'sun', hours: '', minutes: 5 },\r\n method: 'no-read',\r\n notification: {\r\n email: {\r\n enabled: false,\r\n type: 'smtp',\r\n emails: '',\r\n },\r\n webhook: {\r\n enabled: false,\r\n method: 'POST',\r\n contentType: 'application/json',\r\n url: '',\r\n },\r\n push: {\r\n enabled: false,\r\n url: '',\r\n authType: 'none',\r\n authToken: '',\r\n tags: '',\r\n },\r\n },\r\n },\r\n scripts: {\r\n onBackupStart: [],\r\n onBackupEnd: [],\r\n onBackupError: [],\r\n onBackupFailure: [],\r\n onBackupComplete: [],\r\n },\r\n },\r\n tags: [],\r\n};\r\n"],"names":["DEV_MODE","API_URL","APP_NAME","DEFAULT_PLAN_SETTINGS"],"mappings":"AAEO,MAAMA,IAAW,IACXC,IAAiE,GAAG,OAAO,SAAS,MAAM,QAC1FC,IAAW,UACXC,IAAyC;AAAA,EACnD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,IACX,UAAU,CAAA;AAAA,IACV,UAAU,CAAA;AAAA,EAAC;AAAA,EAEd,SAAS,EAAE,IAAI,gBAAgB,MAAM,GAAA;AAAA,EACrC,aAAa;AAAA,EACb,UAAU;AAAA,IACP,UAAU,EAAE,MAAM,SAAS,MAAM,WAAW,MAAM,IAAI,OAAO,IAAI,SAAS,EAAA;AAAA,IAC1E,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA;AAAA,IACZ,cAAc;AAAA,MACX,OAAO;AAAA,QACJ,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,KAAK;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACH,SAAS;AAAA,QACT,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM;AAAA,MAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/utils/constants.ts"],"sourcesContent":["import { NewPlanSettings } from '../@types/plans';\r\n\r\nexport const DEV_MODE = import.meta.env.MODE !== 'production';\r\nexport const API_URL = DEV_MODE ? `${import.meta.env.VITE_BACKEND_URL}/api` : `${window.location.origin}/api`;\r\nexport const APP_NAME = import.meta.env.VITE_APP_NAME || 'Pluton';\r\nexport const DEFAULT_PLAN_SETTINGS: NewPlanSettings = {\r\n title: 'New Backup',\r\n method: 'backup',\r\n sourceId: 'main',\r\n sourceType: 'device',\r\n sourceConfig: {\r\n includes: [],\r\n excludes: [],\r\n },\r\n storage: { id: 's89hibdias67', name: '' },\r\n storagePath: '',\r\n settings: {\r\n interval: { type: 'daily', time: '10:00AM', days: '', hours: '', minutes: 5 },\r\n compression: true,\r\n encryption: true,\r\n retries: 5,\r\n retryDelay: 300, // in seconds\r\n notification: {\r\n email: {\r\n enabled: false,\r\n case: 'failure',\r\n type: 'smtp',\r\n emails: '',\r\n },\r\n webhook: {\r\n enabled: false,\r\n case: 'failure',\r\n method: 'POST',\r\n contentType: 'application/json',\r\n url: '',\r\n },\r\n push: {\r\n enabled: false,\r\n url: '',\r\n case: 'failure',\r\n authType: 'none',\r\n authToken: '',\r\n tags: '',\r\n },\r\n slack: {\r\n enabled: false,\r\n case: 'failure',\r\n url: '',\r\n },\r\n discord: {\r\n enabled: false,\r\n case: 'failure',\r\n url: '',\r\n },\r\n },\r\n prune: {\r\n snapCount: 5,\r\n policy: 'forgetByAge',\r\n forgetAge: '1m',\r\n revisions: true,\r\n },\r\n performance: {\r\n scan: true,\r\n },\r\n integrity: {\r\n enabled: false,\r\n interval: { type: 'weekly', time: '10:00AM', days: 'sun', hours: '', minutes: 5 },\r\n method: 'no-read',\r\n notification: {\r\n email: {\r\n enabled: false,\r\n type: 'smtp',\r\n emails: '',\r\n case: 'failure',\r\n },\r\n webhook: {\r\n enabled: false,\r\n method: 'POST',\r\n contentType: 'application/json',\r\n url: '',\r\n case: 'failure',\r\n },\r\n push: {\r\n enabled: false,\r\n url: '',\r\n authType: 'none',\r\n authToken: '',\r\n tags: '',\r\n case: 'failure',\r\n },\r\n slack: {\r\n enabled: false,\r\n case: 'failure',\r\n url: '',\r\n },\r\n discord: {\r\n enabled: false,\r\n case: 'failure',\r\n url: '',\r\n },\r\n },\r\n },\r\n scripts: {\r\n onBackupStart: [],\r\n onBackupEnd: [],\r\n onBackupError: [],\r\n onBackupFailure: [],\r\n onBackupComplete: [],\r\n },\r\n },\r\n tags: [],\r\n};\r\n"],"names":["DEV_MODE","API_URL","APP_NAME","DEFAULT_PLAN_SETTINGS"],"mappings":"AAEO,MAAMA,IAAW,IACXC,IAAiE,GAAG,OAAO,SAAS,MAAM,QAC1FC,IAAW,UACXC,IAAyC;AAAA,EACnD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,IACX,UAAU,CAAA;AAAA,IACV,UAAU,CAAA;AAAA,EAAC;AAAA,EAEd,SAAS,EAAE,IAAI,gBAAgB,MAAM,GAAA;AAAA,EACrC,aAAa;AAAA,EACb,UAAU;AAAA,IACP,UAAU,EAAE,MAAM,SAAS,MAAM,WAAW,MAAM,IAAI,OAAO,IAAI,SAAS,EAAA;AAAA,IAC1E,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA;AAAA,IACZ,cAAc;AAAA,MACX,OAAO;AAAA,QACJ,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,KAAK;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACH,SAAS;AAAA,QACT,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM;AAAA,MAAA;AAAA,MAET,OAAO;AAAA,QACJ,SAAS;AAAA,QACT,MAAM;AAAA,QACN,KAAK;AAAA,MAAA;AAAA,MAER,SAAS;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,KAAK;AAAA,MAAA;AAAA,IACR;AAAA,IAEH,OAAO;AAAA,MACJ,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,IAAA;AAAA,IAEd,aAAa;AAAA,MACV,MAAM;AAAA,IAAA;AAAA,IAET,WAAW;AAAA,MACR,SAAS;AAAA,MACT,UAAU,EAAE,MAAM,UAAU,MAAM,WAAW,MAAM,OAAO,OAAO,IAAI,SAAS,EAAA;AAAA,MAC9E,QAAQ;AAAA,MACR,cAAc;AAAA,QACX,OAAO;AAAA,UACJ,SAAS;AAAA,UACT,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,MAAM;AAAA,QAAA;AAAA,QAET,SAAS;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,KAAK;AAAA,UACL,MAAM;AAAA,QAAA;AAAA,QAET,MAAM;AAAA,UACH,SAAS;AAAA,UACT,KAAK;AAAA,UACL,UAAU;AAAA,UACV,WAAW;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,QAAA;AAAA,QAET,OAAO;AAAA,UACJ,SAAS;AAAA,UACT,MAAM;AAAA,UACN,KAAK;AAAA,QAAA;AAAA,QAER,SAAS;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,UACN,KAAK;AAAA,QAAA;AAAA,MACR;AAAA,IACH;AAAA,IAEH,SAAS;AAAA,MACN,eAAe,CAAA;AAAA,MACf,aAAa,CAAA;AAAA,MACb,eAAe,CAAA;AAAA,MACf,iBAAiB,CAAA;AAAA,MACjB,kBAAkB,CAAA;AAAA,IAAC;AAAA,EACtB;AAAA,EAEH,MAAM,CAAA;AACT;"}
|
|
@@ -24,6 +24,7 @@ export declare function getLogLevelName(level: number): string;
|
|
|
24
24
|
* @returns boolean - True if email is valid, false otherwise
|
|
25
25
|
*/
|
|
26
26
|
export declare const isValidEmail: (email: string) => boolean;
|
|
27
|
+
export declare const isValidURL: (url: string) => boolean;
|
|
27
28
|
export declare const shouldDisplayStorageField: (field: storageOptionField, settings: Record<string, any>, allFields: storageOptionField[]) => boolean;
|
|
28
29
|
export declare const calculateDirectorySizes: (files: Pick<FileItem, "path" | "size" | "isDirectory">[]) => {
|
|
29
30
|
[path: string]: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,eAAO,MAAM,QAAQ,QAAO,OA0B3B,CAAC;AAGF,eAAO,MAAM,OAAO,GAAI,OAAO,IAAI,uBAkBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,GAAG,MAAM,KAAG,MAYzD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAW3C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAI7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MAEhD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAe3C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,oBAAgB,WAOtD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,yIAuCnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,kCAU7C,CAAC;AAIF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,YAa9D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,2jBAsB/C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,OAyBlE,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OA0D5C,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,kBAAkB,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,kBAAkB,EAAE,KAAG,OAqBrI,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,EAAE;;CA4B/F,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,QAAQ,EAAE,EAAE,WAAW,MAAM,QAAQ,EAAE,eAAe,KAAK,GAAG,MAAM,eAqBxG,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM;WACH,MAAM;WAAS,MAAM;GAwCtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,WAK/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,eAAO,MAAM,QAAQ,QAAO,OA0B3B,CAAC;AAGF,eAAO,MAAM,OAAO,GAAI,OAAO,IAAI,uBAkBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,GAAG,MAAM,KAAG,MAYzD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAW3C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAI7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MAEhD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAe3C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,oBAAgB,WAOtD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,yIAuCnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,kCAU7C,CAAC;AAIF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,YAa9D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,2jBAsB/C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,OAyBlE,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OA0D5C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,OAOxC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,kBAAkB,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,kBAAkB,EAAE,KAAG,OAqBrI,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,EAAE;;CA4B/F,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,QAAQ,EAAE,EAAE,WAAW,MAAM,QAAQ,EAAE,eAAe,KAAK,GAAG,MAAM,eAqBxG,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM;WACH,MAAM;WAAS,MAAM;GAwCtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,WAK/C,CAAC"}
|
|
@@ -18,13 +18,13 @@ const d = () => {
|
|
|
18
18
|
const o = s / n[r];
|
|
19
19
|
return c.format(Math.round(o), r);
|
|
20
20
|
}
|
|
21
|
-
},
|
|
21
|
+
}, h = (e) => {
|
|
22
22
|
if (!e) return "0s";
|
|
23
23
|
if (e < 1)
|
|
24
24
|
return `${Math.round(e * 1e3)}ms`;
|
|
25
25
|
const t = Math.floor(e / 3600), n = Math.floor(e % 3600 / 60), s = Math.floor(e % 60);
|
|
26
26
|
return t >= 1 ? `${t} h ${n} min` : n >= 1 ? `${n} min` : `${s}s`;
|
|
27
|
-
},
|
|
27
|
+
}, p = (e) => {
|
|
28
28
|
const t = new Date(e), n = {
|
|
29
29
|
year: "numeric",
|
|
30
30
|
month: "short",
|
|
@@ -91,10 +91,16 @@ const x = (e) => {
|
|
|
91
91
|
return !1;
|
|
92
92
|
const o = r.split("."), a = o[o.length - 1];
|
|
93
93
|
return !(!a || a.length < 2 || s.startsWith(".") || s.endsWith(".") || s.includes("..") || r.startsWith(".") || r.endsWith(".") || r.includes(".."));
|
|
94
|
-
}, B = (e
|
|
94
|
+
}, B = (e) => {
|
|
95
|
+
try {
|
|
96
|
+
return new URL(e), !0;
|
|
97
|
+
} catch {
|
|
98
|
+
return !1;
|
|
99
|
+
}
|
|
100
|
+
}, k = (e, t, n) => !e.condition || e.condition.length === 0 ? !0 : e.condition.some((s) => Object.entries(s).every(([r, o]) => {
|
|
95
101
|
const a = n.find((i) => i.value === r);
|
|
96
102
|
return a ? (t[r] !== void 0 ? t[r] : a.default) === o : !1;
|
|
97
|
-
})),
|
|
103
|
+
})), P = (e) => {
|
|
98
104
|
const t = {};
|
|
99
105
|
return e.forEach((n) => {
|
|
100
106
|
n.isDirectory && (t[n.path] = 0);
|
|
@@ -105,7 +111,7 @@ const x = (e) => {
|
|
|
105
111
|
r = r ? `${r}/${s[o]}` : `/${s[o]}`, t[r] !== void 0 && (t[r] += n.size);
|
|
106
112
|
}
|
|
107
113
|
}), t;
|
|
108
|
-
},
|
|
114
|
+
}, L = (e, t, n) => [...e].sort((s, r) => {
|
|
109
115
|
var o, a;
|
|
110
116
|
if (t === "name") {
|
|
111
117
|
const u = s.name.toLowerCase(), i = r.name.toLowerCase();
|
|
@@ -158,12 +164,12 @@ const x = (e) => {
|
|
|
158
164
|
}
|
|
159
165
|
}, C = (e) => e === 0 ? "" : e > 60 ? `${Math.round(e / 60)} min` : `${e} sec`;
|
|
160
166
|
export {
|
|
161
|
-
|
|
167
|
+
P as calculateDirectorySizes,
|
|
162
168
|
b as clipPath,
|
|
163
169
|
z as compareVersions,
|
|
164
170
|
m as formatBytes,
|
|
165
|
-
|
|
166
|
-
|
|
171
|
+
p as formatDateTime,
|
|
172
|
+
h as formatDuration,
|
|
167
173
|
g as formatNumberToK,
|
|
168
174
|
w as formatPermissions,
|
|
169
175
|
v as formatSeconds,
|
|
@@ -175,9 +181,10 @@ export {
|
|
|
175
181
|
d as isMobile,
|
|
176
182
|
M as isServerEdition,
|
|
177
183
|
x as isValidEmail,
|
|
184
|
+
B as isValidURL,
|
|
178
185
|
C as secondsToMinutes,
|
|
179
|
-
|
|
180
|
-
|
|
186
|
+
k as shouldDisplayStorageField,
|
|
187
|
+
L as sortFileItems,
|
|
181
188
|
f as timeAgo
|
|
182
189
|
};
|
|
183
190
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../src/utils/helpers.ts"],"sourcesContent":["import { storageOptionField } from '../@types/storages';\r\nimport { FileItem } from '../@types/system';\r\n\r\nexport const isMobile = (): boolean => {\r\n // Server-side rendering check\r\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera || '';\r\n\r\n // Check for mobile user agents\r\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\r\n\r\n // Check for touch capability and screen size\r\n const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n const smallScreen = window.innerWidth <= 768;\r\n\r\n // Primary check: user agent\r\n if (mobileRegex.test(userAgent)) {\r\n return true;\r\n }\r\n\r\n // Secondary check: touch + small screen (for edge cases)\r\n if (hasTouch && smallScreen) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst formatter = new Intl.RelativeTimeFormat('en');\r\nexport const timeAgo = (input: Date) => {\r\n const date = input instanceof Date ? input : new Date(input);\r\n const ranges: { [k: string]: number } = {\r\n years: 3600 * 24 * 365,\r\n months: 3600 * 24 * 30,\r\n weeks: 3600 * 24 * 7,\r\n days: 3600 * 24,\r\n hours: 3600,\r\n minutes: 60,\r\n seconds: 1,\r\n };\r\n const secondsElapsed = (date.getTime() - Date.now()) / 1000;\r\n for (const key in ranges) {\r\n if (ranges[key] < Math.abs(secondsElapsed)) {\r\n const delta = secondsElapsed / ranges[key];\r\n return formatter.format(Math.round(delta), key as Intl.RelativeTimeFormatUnit);\r\n }\r\n }\r\n};\r\n\r\n/** * Formats a duration in seconds to a human-readable string\r\n * @param seconds - Duration in seconds\r\n */\r\nexport const formatDuration = (seconds: number): string => {\r\n if (!seconds) return '0s';\r\n\r\n if (seconds < 1) {\r\n return `${Math.round(seconds * 1000)}ms`;\r\n }\r\n\r\n const hours = Math.floor(seconds / 3600);\r\n const minutes = Math.floor((seconds % 3600) / 60);\r\n const remainingSeconds = Math.floor(seconds % 60);\r\n\r\n if (hours >= 1) {\r\n return `${hours} h ${minutes} min`;\r\n }\r\n\r\n if (minutes >= 1) {\r\n return `${minutes} min`;\r\n }\r\n\r\n return `${remainingSeconds}s`;\r\n};\r\n\r\nexport const formatDateTime = (isoDate: string | number): string => {\r\n const date = new Date(isoDate);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n };\r\n\r\n return date.toLocaleString('en-US', options);\r\n};\r\n\r\nexport const formatBytes = (bytes: number): string => {\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\r\n let value = bytes || 0;\r\n let unitIndex = 0;\r\n\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024;\r\n unitIndex++;\r\n }\r\n\r\n return `${value.toFixed(2)} ${units[unitIndex]}`;\r\n};\r\n\r\nexport const formatNumberToK = (num: number): string => {\r\n if (num < 1000) return num.toString();\r\n const value = num / 1000;\r\n return `${value.toFixed(1)}k`;\r\n};\r\n\r\nexport const formatPermissions = (mode: number): string => {\r\n return (mode & 0o777).toString(8).padStart(3, '0');\r\n};\r\n\r\nexport const formatSeconds = (num: number): string => {\r\n // should convert seconds to minutes, hours or days if applicable\r\n if (num >= 86400) {\r\n return `${Math.floor(num / 86400)}d`;\r\n }\r\n\r\n if (num >= 3600) {\r\n return `${Math.floor(num / 3600)}h`;\r\n }\r\n\r\n if (num >= 60) {\r\n return `${Math.floor(num / 60)}m`;\r\n }\r\n\r\n return `${Math.floor(num)}s`;\r\n};\r\n\r\nexport const clipPath = (path: string, charsOnSide = 10) => {\r\n if (path.length <= charsOnSide * 2) return path;\r\n\r\n const start = path.slice(0, charsOnSide);\r\n const end = path.slice(-charsOnSide);\r\n\r\n return `${start}...${end}`;\r\n};\r\n\r\nexport const getOSIcon = (os: string) => {\r\n const osString = os.toLowerCase();\r\n if (osString.includes('windows')) {\r\n return 'windows';\r\n }\r\n if (osString.includes('mac')) {\r\n return 'macos';\r\n }\r\n if (osString.includes('centos')) {\r\n return 'centos';\r\n }\r\n if (osString.includes('fedora')) {\r\n return 'fedora';\r\n }\r\n if (osString.includes('debian')) {\r\n return 'debian';\r\n }\r\n if (osString.includes('mint')) {\r\n return 'mint';\r\n }\r\n if (osString.includes('pop')) {\r\n return 'popos';\r\n }\r\n if (osString.includes('ubuntu')) {\r\n return 'ubuntu';\r\n }\r\n if (osString.includes('kali')) {\r\n return 'kali';\r\n }\r\n if (osString.includes('arch')) {\r\n return 'arch';\r\n }\r\n if (osString.includes('zorin')) {\r\n return 'zorin';\r\n }\r\n if (osString.includes('manjaro')) {\r\n return 'manjaro';\r\n }\r\n return 'linux';\r\n};\r\n\r\nexport const getProcessorIcon = (brand: string) => {\r\n const osString = brand.toLowerCase();\r\n if (osString.includes('amd')) {\r\n return 'amd';\r\n }\r\n if (osString.includes('intel')) {\r\n return 'intel';\r\n }\r\n\r\n return 'processor';\r\n};\r\n\r\n// Compares two version strings (e.g., \"1.2.3\" and \"1.3.0\")\r\n// returns true if the latest version is newer than the current version\r\nexport const compareVersions = (current: string, latest: string) => {\r\n if (!current || !latest) return false;\r\n const currentParts = current.split('.').map(Number);\r\n const latestParts = latest.split('.').map(Number);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n const curr = currentParts[i] || 0;\r\n const late = latestParts[i] || 0;\r\n\r\n if (curr < late) return true;\r\n if (curr > late) return false;\r\n }\r\n return false;\r\n};\r\n\r\nexport const getUpdateDocLink = (isPRO?: boolean) => {\r\n const installType = (window as any).plutonInstallType || 'unknown';\r\n console.log('installType :', installType);\r\n if (installType === 'binary') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-desktop#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/install-pluton-desktop#updating';\r\n }\r\n if (installType === 'server') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-linux-server#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/install-pluton-linux-server#updating-pluton';\r\n }\r\n if (installType === 'docker') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/deploy-pluton-pro-docker#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/deploy-docker#quick-reference';\r\n }\r\n return 'https://github.com/plutonhq/pluton/releases/latest';\r\n};\r\n\r\nexport const isServerEdition = (distro: string, platform: string): boolean => {\r\n // Check Windows Server editions\r\n if (platform === 'win32') {\r\n return distro.includes('server') || distro.includes('windows server');\r\n }\r\n\r\n // Check Linux server distributions\r\n if (platform === 'linux') {\r\n return (\r\n distro.includes('server') ||\r\n distro.includes('enterprise') ||\r\n distro.includes('centos') ||\r\n distro.includes('redhat') ||\r\n distro.includes('ubuntu server') ||\r\n distro.includes('debian') ||\r\n distro.includes('fedora server')\r\n );\r\n }\r\n\r\n // Check macOS Server (though it's discontinued, some may still use it)\r\n if (platform === 'darwin') {\r\n return distro.includes('server');\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport function getLogLevelName(level: number): string {\r\n switch (level) {\r\n case 10:\r\n return 'trace';\r\n case 20:\r\n return 'debug';\r\n case 30:\r\n return 'info';\r\n case 40:\r\n return 'warn';\r\n case 50:\r\n return 'error';\r\n case 60:\r\n return 'fatal';\r\n default:\r\n return 'unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Validates if a string is a valid email address\r\n * @param email - The email string to validate\r\n * @returns boolean - True if email is valid, false otherwise\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n if (!email || typeof email !== 'string') {\r\n return false;\r\n }\r\n\r\n const trimmedEmail = email.trim();\r\n\r\n // Check length limits\r\n if (trimmedEmail.length === 0 || trimmedEmail.length > 254) {\r\n return false;\r\n }\r\n\r\n // More strict email regex that requires proper TLD\r\n const emailRegex =\r\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\r\n\r\n if (!emailRegex.test(trimmedEmail)) {\r\n return false;\r\n }\r\n\r\n // Split and validate local and domain parts\r\n const [localPart, domainPart] = trimmedEmail.split('@');\r\n\r\n // Validate local part (before @)\r\n if (!localPart || localPart.length > 64) {\r\n return false;\r\n }\r\n\r\n // Validate domain part (after @)\r\n if (!domainPart || domainPart.length > 253) {\r\n return false;\r\n }\r\n\r\n // Ensure domain has at least one dot and proper TLD\r\n if (!domainPart.includes('.')) {\r\n return false;\r\n }\r\n\r\n // Check TLD is at least 2 characters\r\n const domainParts = domainPart.split('.');\r\n const tld = domainParts[domainParts.length - 1];\r\n if (!tld || tld.length < 2) {\r\n return false;\r\n }\r\n\r\n // Check for invalid patterns\r\n if (\r\n localPart.startsWith('.') ||\r\n localPart.endsWith('.') ||\r\n localPart.includes('..') ||\r\n domainPart.startsWith('.') ||\r\n domainPart.endsWith('.') ||\r\n domainPart.includes('..')\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const shouldDisplayStorageField = (field: storageOptionField, settings: Record<string, any>, allFields: storageOptionField[]): boolean => {\r\n // If no conditions, always display the field\r\n if (!field.condition || field.condition.length === 0) {\r\n return true;\r\n }\r\n\r\n // A field is displayed if ANY of its conditions are fully satisfied\r\n return field.condition.some((condition) => {\r\n // A condition is satisfied if ALL its key-value pairs match\r\n return Object.entries(condition).every(([condKey, condValue]) => {\r\n // Find the field that this condition refers to\r\n const targetField = allFields.find((f) => f.value === condKey);\r\n if (!targetField) return false;\r\n\r\n // Get the current value from settings, or use the default\r\n const currentValue = settings[condKey] !== undefined ? settings[condKey] : targetField.default;\r\n\r\n // Check if the condition value matches the field's value\r\n return currentValue === condValue;\r\n });\r\n });\r\n};\r\n\r\n// Calculate the size of each directory based on its files\r\nexport const calculateDirectorySizes = (files: Pick<FileItem, 'path' | 'size' | 'isDirectory'>[]) => {\r\n const dirSizes: { [path: string]: number } = {};\r\n\r\n // Initialize all directories with size 0\r\n files.forEach((file) => {\r\n if (file.isDirectory) {\r\n dirSizes[file.path] = 0;\r\n }\r\n });\r\n\r\n // Sum up file sizes for each directory\r\n files.forEach((file) => {\r\n if (!file.isDirectory && file.size) {\r\n // For each file, add its size to all parent directories\r\n let pathParts = file.path.split('/').filter(Boolean);\r\n let currentPath = '';\r\n\r\n // Add size to each parent directory\r\n for (let i = 0; i < pathParts.length - 1; i++) {\r\n currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : `/${pathParts[i]}`;\r\n if (dirSizes[currentPath] !== undefined) {\r\n dirSizes[currentPath] += file.size;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return dirSizes;\r\n};\r\n\r\nexport const sortFileItems = (items: FileItem[], sortField: keyof FileItem, sortDirection: 'asc' | 'desc') => {\r\n return [...items].sort((a, b) => {\r\n if (sortField === 'name') {\r\n const nameA = a.name.toLowerCase();\r\n const nameB = b.name.toLowerCase();\r\n return sortDirection === 'asc' ? nameA.localeCompare(nameB) : nameB.localeCompare(nameA);\r\n } else if (sortField === 'modifiedAt') {\r\n const dateA = new Date(a.modifiedAt).getTime();\r\n const dateB = new Date(b.modifiedAt).getTime();\r\n return sortDirection === 'asc' ? dateA - dateB : dateB - dateA;\r\n } else if (sortField === 'size') {\r\n const sizeA = a.size || 0;\r\n const sizeB = b.size || 0;\r\n return sortDirection === 'asc' ? sizeA - sizeB : sizeB - sizeA;\r\n } else {\r\n const multiplier = sortDirection === 'asc' ? 1 : -1;\r\n const valueA = a[sortField]?.toString() || '';\r\n const valueB = b[sortField]?.toString() || '';\r\n return valueA.localeCompare(valueB) * multiplier;\r\n }\r\n });\r\n};\r\n\r\nexport const getAvailableCliApps = (platform?: string) => {\r\n const availableShells: Record<string, { label: string; value: string }[]> = {\r\n Windows: [\r\n { label: 'PowerShell', value: 'powershell' },\r\n { label: 'Command Prompt (CMD)', value: 'cmd' },\r\n { label: 'Bash', value: 'bash' },\r\n ],\r\n MacOs: [\r\n { label: 'Zsh', value: 'zsh' },\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n ],\r\n Linux: [\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n { label: 'Zsh', value: 'zsh' },\r\n ],\r\n };\r\n type typeofOSType = keyof typeof availableShells;\r\n\r\n switch (platform) {\r\n case 'win32':\r\n case 'windows':\r\n case 'Windows':\r\n return availableShells.Windows;\r\n case 'darwin':\r\n return availableShells.MacOs;\r\n case 'linux':\r\n case 'Linux':\r\n return availableShells.Linux;\r\n default:\r\n const allShells: { label: string; value: string }[] = [];\r\n (Object.keys(availableShells) as typeofOSType[]).map((OSType) => {\r\n availableShells[OSType].forEach((shell) => {\r\n if (allShells.findIndex((s) => s.value === shell.value) === -1) {\r\n allShells.push({ label: `${shell.label} (${shell.value})`, value: shell.value });\r\n }\r\n });\r\n });\r\n return allShells;\r\n }\r\n};\r\n\r\nexport const secondsToMinutes = (seconds: number) => {\r\n if (seconds === 0) {\r\n return '';\r\n }\r\n return seconds > 60 ? `${Math.round(seconds / 60)} min` : `${seconds} sec`;\r\n};\r\n"],"names":["isMobile","userAgent","mobileRegex","hasTouch","smallScreen","formatter","timeAgo","input","date","ranges","secondsElapsed","key","delta","formatDuration","seconds","hours","minutes","remainingSeconds","formatDateTime","isoDate","options","formatBytes","bytes","units","value","unitIndex","formatNumberToK","num","formatPermissions","mode","formatSeconds","clipPath","path","charsOnSide","start","end","getOSIcon","os","osString","getProcessorIcon","brand","compareVersions","current","latest","currentParts","latestParts","i","curr","late","getUpdateDocLink","isPRO","installType","isServerEdition","distro","platform","getLogLevelName","level","isValidEmail","email","trimmedEmail","localPart","domainPart","domainParts","tld","shouldDisplayStorageField","field","settings","allFields","condition","condKey","condValue","targetField","f","calculateDirectorySizes","files","dirSizes","file","pathParts","currentPath","sortFileItems","items","sortField","sortDirection","a","b","_a","_b","nameA","nameB","dateA","dateB","sizeA","sizeB","multiplier","valueA","valueB","getAvailableCliApps","availableShells","allShells","OSType","shell","s","secondsToMinutes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../src/utils/helpers.ts"],"sourcesContent":["import { storageOptionField } from '../@types/storages';\r\nimport { FileItem } from '../@types/system';\r\n\r\nexport const isMobile = (): boolean => {\r\n // Server-side rendering check\r\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera || '';\r\n\r\n // Check for mobile user agents\r\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\r\n\r\n // Check for touch capability and screen size\r\n const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n const smallScreen = window.innerWidth <= 768;\r\n\r\n // Primary check: user agent\r\n if (mobileRegex.test(userAgent)) {\r\n return true;\r\n }\r\n\r\n // Secondary check: touch + small screen (for edge cases)\r\n if (hasTouch && smallScreen) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst formatter = new Intl.RelativeTimeFormat('en');\r\nexport const timeAgo = (input: Date) => {\r\n const date = input instanceof Date ? input : new Date(input);\r\n const ranges: { [k: string]: number } = {\r\n years: 3600 * 24 * 365,\r\n months: 3600 * 24 * 30,\r\n weeks: 3600 * 24 * 7,\r\n days: 3600 * 24,\r\n hours: 3600,\r\n minutes: 60,\r\n seconds: 1,\r\n };\r\n const secondsElapsed = (date.getTime() - Date.now()) / 1000;\r\n for (const key in ranges) {\r\n if (ranges[key] < Math.abs(secondsElapsed)) {\r\n const delta = secondsElapsed / ranges[key];\r\n return formatter.format(Math.round(delta), key as Intl.RelativeTimeFormatUnit);\r\n }\r\n }\r\n};\r\n\r\n/** * Formats a duration in seconds to a human-readable string\r\n * @param seconds - Duration in seconds\r\n */\r\nexport const formatDuration = (seconds: number): string => {\r\n if (!seconds) return '0s';\r\n\r\n if (seconds < 1) {\r\n return `${Math.round(seconds * 1000)}ms`;\r\n }\r\n\r\n const hours = Math.floor(seconds / 3600);\r\n const minutes = Math.floor((seconds % 3600) / 60);\r\n const remainingSeconds = Math.floor(seconds % 60);\r\n\r\n if (hours >= 1) {\r\n return `${hours} h ${minutes} min`;\r\n }\r\n\r\n if (minutes >= 1) {\r\n return `${minutes} min`;\r\n }\r\n\r\n return `${remainingSeconds}s`;\r\n};\r\n\r\nexport const formatDateTime = (isoDate: string | number): string => {\r\n const date = new Date(isoDate);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n };\r\n\r\n return date.toLocaleString('en-US', options);\r\n};\r\n\r\nexport const formatBytes = (bytes: number): string => {\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\r\n let value = bytes || 0;\r\n let unitIndex = 0;\r\n\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024;\r\n unitIndex++;\r\n }\r\n\r\n return `${value.toFixed(2)} ${units[unitIndex]}`;\r\n};\r\n\r\nexport const formatNumberToK = (num: number): string => {\r\n if (num < 1000) return num.toString();\r\n const value = num / 1000;\r\n return `${value.toFixed(1)}k`;\r\n};\r\n\r\nexport const formatPermissions = (mode: number): string => {\r\n return (mode & 0o777).toString(8).padStart(3, '0');\r\n};\r\n\r\nexport const formatSeconds = (num: number): string => {\r\n // should convert seconds to minutes, hours or days if applicable\r\n if (num >= 86400) {\r\n return `${Math.floor(num / 86400)}d`;\r\n }\r\n\r\n if (num >= 3600) {\r\n return `${Math.floor(num / 3600)}h`;\r\n }\r\n\r\n if (num >= 60) {\r\n return `${Math.floor(num / 60)}m`;\r\n }\r\n\r\n return `${Math.floor(num)}s`;\r\n};\r\n\r\nexport const clipPath = (path: string, charsOnSide = 10) => {\r\n if (path.length <= charsOnSide * 2) return path;\r\n\r\n const start = path.slice(0, charsOnSide);\r\n const end = path.slice(-charsOnSide);\r\n\r\n return `${start}...${end}`;\r\n};\r\n\r\nexport const getOSIcon = (os: string) => {\r\n const osString = os.toLowerCase();\r\n if (osString.includes('windows')) {\r\n return 'windows';\r\n }\r\n if (osString.includes('mac')) {\r\n return 'macos';\r\n }\r\n if (osString.includes('centos')) {\r\n return 'centos';\r\n }\r\n if (osString.includes('fedora')) {\r\n return 'fedora';\r\n }\r\n if (osString.includes('debian')) {\r\n return 'debian';\r\n }\r\n if (osString.includes('mint')) {\r\n return 'mint';\r\n }\r\n if (osString.includes('pop')) {\r\n return 'popos';\r\n }\r\n if (osString.includes('ubuntu')) {\r\n return 'ubuntu';\r\n }\r\n if (osString.includes('kali')) {\r\n return 'kali';\r\n }\r\n if (osString.includes('arch')) {\r\n return 'arch';\r\n }\r\n if (osString.includes('zorin')) {\r\n return 'zorin';\r\n }\r\n if (osString.includes('manjaro')) {\r\n return 'manjaro';\r\n }\r\n return 'linux';\r\n};\r\n\r\nexport const getProcessorIcon = (brand: string) => {\r\n const osString = brand.toLowerCase();\r\n if (osString.includes('amd')) {\r\n return 'amd';\r\n }\r\n if (osString.includes('intel')) {\r\n return 'intel';\r\n }\r\n\r\n return 'processor';\r\n};\r\n\r\n// Compares two version strings (e.g., \"1.2.3\" and \"1.3.0\")\r\n// returns true if the latest version is newer than the current version\r\nexport const compareVersions = (current: string, latest: string) => {\r\n if (!current || !latest) return false;\r\n const currentParts = current.split('.').map(Number);\r\n const latestParts = latest.split('.').map(Number);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n const curr = currentParts[i] || 0;\r\n const late = latestParts[i] || 0;\r\n\r\n if (curr < late) return true;\r\n if (curr > late) return false;\r\n }\r\n return false;\r\n};\r\n\r\nexport const getUpdateDocLink = (isPRO?: boolean) => {\r\n const installType = (window as any).plutonInstallType || 'unknown';\r\n console.log('installType :', installType);\r\n if (installType === 'binary') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-desktop#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/install-pluton-desktop#updating';\r\n }\r\n if (installType === 'server') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-linux-server#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/install-pluton-linux-server#updating-pluton';\r\n }\r\n if (installType === 'docker') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/deploy-pluton-pro-docker#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/deploy-docker#quick-reference';\r\n }\r\n return 'https://github.com/plutonhq/pluton/releases/latest';\r\n};\r\n\r\nexport const isServerEdition = (distro: string, platform: string): boolean => {\r\n // Check Windows Server editions\r\n if (platform === 'win32') {\r\n return distro.includes('server') || distro.includes('windows server');\r\n }\r\n\r\n // Check Linux server distributions\r\n if (platform === 'linux') {\r\n return (\r\n distro.includes('server') ||\r\n distro.includes('enterprise') ||\r\n distro.includes('centos') ||\r\n distro.includes('redhat') ||\r\n distro.includes('ubuntu server') ||\r\n distro.includes('debian') ||\r\n distro.includes('fedora server')\r\n );\r\n }\r\n\r\n // Check macOS Server (though it's discontinued, some may still use it)\r\n if (platform === 'darwin') {\r\n return distro.includes('server');\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport function getLogLevelName(level: number): string {\r\n switch (level) {\r\n case 10:\r\n return 'trace';\r\n case 20:\r\n return 'debug';\r\n case 30:\r\n return 'info';\r\n case 40:\r\n return 'warn';\r\n case 50:\r\n return 'error';\r\n case 60:\r\n return 'fatal';\r\n default:\r\n return 'unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Validates if a string is a valid email address\r\n * @param email - The email string to validate\r\n * @returns boolean - True if email is valid, false otherwise\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n if (!email || typeof email !== 'string') {\r\n return false;\r\n }\r\n\r\n const trimmedEmail = email.trim();\r\n\r\n // Check length limits\r\n if (trimmedEmail.length === 0 || trimmedEmail.length > 254) {\r\n return false;\r\n }\r\n\r\n // More strict email regex that requires proper TLD\r\n const emailRegex =\r\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\r\n\r\n if (!emailRegex.test(trimmedEmail)) {\r\n return false;\r\n }\r\n\r\n // Split and validate local and domain parts\r\n const [localPart, domainPart] = trimmedEmail.split('@');\r\n\r\n // Validate local part (before @)\r\n if (!localPart || localPart.length > 64) {\r\n return false;\r\n }\r\n\r\n // Validate domain part (after @)\r\n if (!domainPart || domainPart.length > 253) {\r\n return false;\r\n }\r\n\r\n // Ensure domain has at least one dot and proper TLD\r\n if (!domainPart.includes('.')) {\r\n return false;\r\n }\r\n\r\n // Check TLD is at least 2 characters\r\n const domainParts = domainPart.split('.');\r\n const tld = domainParts[domainParts.length - 1];\r\n if (!tld || tld.length < 2) {\r\n return false;\r\n }\r\n\r\n // Check for invalid patterns\r\n if (\r\n localPart.startsWith('.') ||\r\n localPart.endsWith('.') ||\r\n localPart.includes('..') ||\r\n domainPart.startsWith('.') ||\r\n domainPart.endsWith('.') ||\r\n domainPart.includes('..')\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const isValidURL = (url: string): boolean => {\r\n try {\r\n new URL(url);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nexport const shouldDisplayStorageField = (field: storageOptionField, settings: Record<string, any>, allFields: storageOptionField[]): boolean => {\r\n // If no conditions, always display the field\r\n if (!field.condition || field.condition.length === 0) {\r\n return true;\r\n }\r\n\r\n // A field is displayed if ANY of its conditions are fully satisfied\r\n return field.condition.some((condition) => {\r\n // A condition is satisfied if ALL its key-value pairs match\r\n return Object.entries(condition).every(([condKey, condValue]) => {\r\n // Find the field that this condition refers to\r\n const targetField = allFields.find((f) => f.value === condKey);\r\n if (!targetField) return false;\r\n\r\n // Get the current value from settings, or use the default\r\n const currentValue = settings[condKey] !== undefined ? settings[condKey] : targetField.default;\r\n\r\n // Check if the condition value matches the field's value\r\n return currentValue === condValue;\r\n });\r\n });\r\n};\r\n\r\n// Calculate the size of each directory based on its files\r\nexport const calculateDirectorySizes = (files: Pick<FileItem, 'path' | 'size' | 'isDirectory'>[]) => {\r\n const dirSizes: { [path: string]: number } = {};\r\n\r\n // Initialize all directories with size 0\r\n files.forEach((file) => {\r\n if (file.isDirectory) {\r\n dirSizes[file.path] = 0;\r\n }\r\n });\r\n\r\n // Sum up file sizes for each directory\r\n files.forEach((file) => {\r\n if (!file.isDirectory && file.size) {\r\n // For each file, add its size to all parent directories\r\n let pathParts = file.path.split('/').filter(Boolean);\r\n let currentPath = '';\r\n\r\n // Add size to each parent directory\r\n for (let i = 0; i < pathParts.length - 1; i++) {\r\n currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : `/${pathParts[i]}`;\r\n if (dirSizes[currentPath] !== undefined) {\r\n dirSizes[currentPath] += file.size;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return dirSizes;\r\n};\r\n\r\nexport const sortFileItems = (items: FileItem[], sortField: keyof FileItem, sortDirection: 'asc' | 'desc') => {\r\n return [...items].sort((a, b) => {\r\n if (sortField === 'name') {\r\n const nameA = a.name.toLowerCase();\r\n const nameB = b.name.toLowerCase();\r\n return sortDirection === 'asc' ? nameA.localeCompare(nameB) : nameB.localeCompare(nameA);\r\n } else if (sortField === 'modifiedAt') {\r\n const dateA = new Date(a.modifiedAt).getTime();\r\n const dateB = new Date(b.modifiedAt).getTime();\r\n return sortDirection === 'asc' ? dateA - dateB : dateB - dateA;\r\n } else if (sortField === 'size') {\r\n const sizeA = a.size || 0;\r\n const sizeB = b.size || 0;\r\n return sortDirection === 'asc' ? sizeA - sizeB : sizeB - sizeA;\r\n } else {\r\n const multiplier = sortDirection === 'asc' ? 1 : -1;\r\n const valueA = a[sortField]?.toString() || '';\r\n const valueB = b[sortField]?.toString() || '';\r\n return valueA.localeCompare(valueB) * multiplier;\r\n }\r\n });\r\n};\r\n\r\nexport const getAvailableCliApps = (platform?: string) => {\r\n const availableShells: Record<string, { label: string; value: string }[]> = {\r\n Windows: [\r\n { label: 'PowerShell', value: 'powershell' },\r\n { label: 'Command Prompt (CMD)', value: 'cmd' },\r\n { label: 'Bash', value: 'bash' },\r\n ],\r\n MacOs: [\r\n { label: 'Zsh', value: 'zsh' },\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n ],\r\n Linux: [\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n { label: 'Zsh', value: 'zsh' },\r\n ],\r\n };\r\n type typeofOSType = keyof typeof availableShells;\r\n\r\n switch (platform) {\r\n case 'win32':\r\n case 'windows':\r\n case 'Windows':\r\n return availableShells.Windows;\r\n case 'darwin':\r\n return availableShells.MacOs;\r\n case 'linux':\r\n case 'Linux':\r\n return availableShells.Linux;\r\n default:\r\n const allShells: { label: string; value: string }[] = [];\r\n (Object.keys(availableShells) as typeofOSType[]).map((OSType) => {\r\n availableShells[OSType].forEach((shell) => {\r\n if (allShells.findIndex((s) => s.value === shell.value) === -1) {\r\n allShells.push({ label: `${shell.label} (${shell.value})`, value: shell.value });\r\n }\r\n });\r\n });\r\n return allShells;\r\n }\r\n};\r\n\r\nexport const secondsToMinutes = (seconds: number) => {\r\n if (seconds === 0) {\r\n return '';\r\n }\r\n return seconds > 60 ? `${Math.round(seconds / 60)} min` : `${seconds} sec`;\r\n};\r\n"],"names":["isMobile","userAgent","mobileRegex","hasTouch","smallScreen","formatter","timeAgo","input","date","ranges","secondsElapsed","key","delta","formatDuration","seconds","hours","minutes","remainingSeconds","formatDateTime","isoDate","options","formatBytes","bytes","units","value","unitIndex","formatNumberToK","num","formatPermissions","mode","formatSeconds","clipPath","path","charsOnSide","start","end","getOSIcon","os","osString","getProcessorIcon","brand","compareVersions","current","latest","currentParts","latestParts","i","curr","late","getUpdateDocLink","isPRO","installType","isServerEdition","distro","platform","getLogLevelName","level","isValidEmail","email","trimmedEmail","localPart","domainPart","domainParts","tld","isValidURL","url","shouldDisplayStorageField","field","settings","allFields","condition","condKey","condValue","targetField","f","calculateDirectorySizes","files","dirSizes","file","pathParts","currentPath","sortFileItems","items","sortField","sortDirection","a","b","_a","_b","nameA","nameB","dateA","dateB","sizeA","sizeB","multiplier","valueA","valueB","getAvailableCliApps","availableShells","allShells","OSType","shell","s","secondsToMinutes"],"mappings":"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"}
|
package/dist-lib/utils.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { API_URL as r, APP_NAME as
|
|
2
|
-
import { calculateDirectorySizes as g, clipPath as n, compareVersions as
|
|
3
|
-
import { isPlanSettingsValid as
|
|
4
|
-
import { extractResticData as b, generateBackupProgressMessage as k, generateMirrorProgressMessage as y, generateRestoreProgressMessage as B, getBackupEventActionMessage as
|
|
5
|
-
import { getParentPath as
|
|
6
|
-
import { getIconNameForFile as
|
|
1
|
+
import { API_URL as r, APP_NAME as a, DEFAULT_PLAN_SETTINGS as o, DEV_MODE as s } from "./utils/constants.js";
|
|
2
|
+
import { calculateDirectorySizes as g, clipPath as n, compareVersions as l, formatBytes as m, formatDateTime as c, formatDuration as p, formatNumberToK as P, formatPermissions as f, formatSeconds as A, getAvailableCliApps as M, getLogLevelName as d, getOSIcon as D, getProcessorIcon as E, getUpdateDocLink as S, isMobile as I, isServerEdition as N, isValidEmail as u, isValidURL as v, secondsToMinutes as x, shouldDisplayStorageField as L, sortFileItems as h, timeAgo as T } from "./utils/helpers.js";
|
|
3
|
+
import { isPlanSettingsValid as R, planIntervalAgeName as V, planIntervalName as _ } from "./utils/plans.js";
|
|
4
|
+
import { extractResticData as b, generateBackupProgressMessage as k, generateMirrorProgressMessage as y, generateRestoreProgressMessage as B, getBackupEventActionMessage as z, getRestoreEventActionMessage as O } from "./utils/progressHelpers.js";
|
|
5
|
+
import { getParentPath as G, getPathSeparator as K, normalizePath as j, splitPath as q } from "./utils/restore.js";
|
|
6
|
+
import { getIconNameForFile as H } from "./utils/getIconNameforFile.js";
|
|
7
7
|
export {
|
|
8
8
|
r as API_URL,
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
a as APP_NAME,
|
|
10
|
+
o as DEFAULT_PLAN_SETTINGS,
|
|
11
11
|
s as DEV_MODE,
|
|
12
12
|
g as calculateDirectorySizes,
|
|
13
13
|
n as clipPath,
|
|
14
|
-
|
|
14
|
+
l as compareVersions,
|
|
15
15
|
b as extractResticData,
|
|
16
|
-
|
|
16
|
+
m as formatBytes,
|
|
17
17
|
c as formatDateTime,
|
|
18
18
|
p as formatDuration,
|
|
19
19
|
P as formatNumberToK,
|
|
@@ -23,26 +23,27 @@ export {
|
|
|
23
23
|
y as generateMirrorProgressMessage,
|
|
24
24
|
B as generateRestoreProgressMessage,
|
|
25
25
|
M as getAvailableCliApps,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
z as getBackupEventActionMessage,
|
|
27
|
+
H as getIconNameForFile,
|
|
28
|
+
d as getLogLevelName,
|
|
29
|
+
D as getOSIcon,
|
|
30
|
+
G as getParentPath,
|
|
31
|
+
K as getPathSeparator,
|
|
32
|
+
E as getProcessorIcon,
|
|
33
|
+
O as getRestoreEventActionMessage,
|
|
34
|
+
S as getUpdateDocLink,
|
|
35
35
|
I as isMobile,
|
|
36
|
-
|
|
36
|
+
R as isPlanSettingsValid,
|
|
37
37
|
N as isServerEdition,
|
|
38
38
|
u as isValidEmail,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
x as
|
|
39
|
+
v as isValidURL,
|
|
40
|
+
j as normalizePath,
|
|
41
|
+
V as planIntervalAgeName,
|
|
42
|
+
_ as planIntervalName,
|
|
43
|
+
x as secondsToMinutes,
|
|
44
|
+
L as shouldDisplayStorageField,
|
|
44
45
|
h as sortFileItems,
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
q as splitPath,
|
|
47
|
+
T as timeAgo
|
|
47
48
|
};
|
|
48
49
|
//# sourceMappingURL=utils.js.map
|
package/package.json
CHANGED
package/src/@types/plans.ts
CHANGED
|
@@ -36,6 +36,16 @@ export type PlanNotification = {
|
|
|
36
36
|
authToken: string;
|
|
37
37
|
tags: string;
|
|
38
38
|
};
|
|
39
|
+
slack: {
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
case: PlanNotificationCase;
|
|
42
|
+
url: string;
|
|
43
|
+
};
|
|
44
|
+
discord: {
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
case: PlanNotificationCase;
|
|
47
|
+
url: string;
|
|
48
|
+
};
|
|
39
49
|
};
|
|
40
50
|
|
|
41
51
|
export type PlanInterval = {
|
|
@@ -96,26 +106,7 @@ export type PlanIntegritySettings = {
|
|
|
96
106
|
enabled: boolean;
|
|
97
107
|
interval: PlanInterval; // in days
|
|
98
108
|
method: string; //full, no-read, read-10%,
|
|
99
|
-
notification:
|
|
100
|
-
email: {
|
|
101
|
-
enabled: boolean;
|
|
102
|
-
type: string;
|
|
103
|
-
emails: string;
|
|
104
|
-
};
|
|
105
|
-
webhook: {
|
|
106
|
-
enabled: boolean;
|
|
107
|
-
method: 'GET' | 'POST';
|
|
108
|
-
contentType: 'application/json' | 'application/x-www-form-urlencoded' | 'text/plain';
|
|
109
|
-
url: string;
|
|
110
|
-
};
|
|
111
|
-
push: {
|
|
112
|
-
enabled: boolean;
|
|
113
|
-
url: string;
|
|
114
|
-
authType: string;
|
|
115
|
-
authToken: string;
|
|
116
|
-
tags: string;
|
|
117
|
-
};
|
|
118
|
-
};
|
|
109
|
+
notification: PlanNotification;
|
|
119
110
|
};
|
|
120
111
|
|
|
121
112
|
export type PlanScript = {
|
|
@@ -80,11 +80,11 @@ const PlanAdvancedSettings = ({ plan, appSettings, device, onUpdate }: PlanAdvan
|
|
|
80
80
|
{advancedTab === 'Notification' && (
|
|
81
81
|
<PlanNotificationSettings
|
|
82
82
|
types={integrationTypes}
|
|
83
|
-
|
|
83
|
+
planID={plan.id}
|
|
84
|
+
isSync={plan.method === 'sync'}
|
|
84
85
|
admin_email={appSettings?.admin_email}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
86
|
+
notificationSettings={plan.settings?.notification || {}}
|
|
87
|
+
onUpdate={(notification) => onUpdate({ ...plan, settings: { ...settings, notification } })}
|
|
88
88
|
/>
|
|
89
89
|
)}
|
|
90
90
|
{/* {advancedTab === 'Prune' && (
|