@plutonhq/core-frontend 0.1.30 → 0.1.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/@types/devices.d.ts +4 -4
- package/dist-lib/@types/devices.d.ts.map +1 -1
- package/dist-lib/@types/plans.d.ts +1 -0
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/components/App/Footer/Footer.d.ts +2 -1
- package/dist-lib/components/App/Footer/Footer.d.ts.map +1 -1
- package/dist-lib/components/App/Footer/Footer.js +10 -8
- package/dist-lib/components/App/Footer/Footer.js.map +1 -1
- package/dist-lib/components/Device/EditDevice/EditDevice.d.ts.map +1 -1
- package/dist-lib/components/Device/EditDevice/EditDevice.js +70 -61
- package/dist-lib/components/Device/EditDevice/EditDevice.js.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +33 -33
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js +36 -36
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +79 -72
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +27 -25
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.d.ts.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.js +148 -144
- package/dist-lib/components/Plan/Backups/Backups.js.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js +34 -32
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js +89 -101
- package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js +31 -25
- package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js.map +1 -1
- package/dist-lib/components/common/form/StoragePicker/StoragePicker.d.ts.map +1 -1
- package/dist-lib/components/common/form/StoragePicker/StoragePicker.js +52 -46
- package/dist-lib/components/common/form/StoragePicker/StoragePicker.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +76 -72
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js +14 -12
- package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js.map +1 -1
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/styles/global.scss +4 -0
- package/dist-lib/utils/progressHelpers.d.ts.map +1 -1
- package/dist-lib/utils/progressHelpers.js +1 -0
- package/dist-lib/utils/progressHelpers.js.map +1 -1
- package/package.json +1 -1
- package/src/@types/devices.ts +4 -4
- package/src/@types/plans.ts +1 -0
- package/src/components/App/Footer/Footer.tsx +3 -2
- package/src/components/Device/EditDevice/EditDevice.tsx +11 -4
- package/src/components/Plan/BackupEvents/BackupEvents.module.scss +2 -0
- package/src/components/Plan/BackupEvents/BackupEvents.tsx +2 -2
- package/src/components/Plan/BackupProgress/BackupProgress.module.scss +4 -0
- package/src/components/Plan/BackupProgress/BackupProgress.tsx +11 -4
- package/src/components/Plan/Backups/Backups.module.scss +16 -0
- package/src/components/Plan/Backups/Backups.tsx +13 -2
- package/src/components/Plan/PlanSettings/PlanScriptsSettings.tsx +29 -31
- package/src/components/Plan/PlanSettings/PlanSourceSettings.tsx +11 -3
- package/src/components/common/form/StoragePicker/StoragePicker.tsx +10 -2
- package/src/routes/PlanSingle/PlanSingle.module.scss +10 -0
- package/src/routes/PlanSingle/PlanSingle.tsx +6 -1
- package/src/styles/global.scss +4 -0
- package/src/utils/progressHelpers.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanScriptsSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanScriptsSettings.tsx"],"sourcesContent":["import classes from './PlanSettings.module.scss';\r\nimport { useState } from 'react';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport { secondsToMinutes } from '../../../utils/helpers';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\n\r\ninterface PlanScriptsSettingsProps {\r\n settings: NewPlanSettings['settings']['scripts'];\r\n onUpdate: (settings: NewPlanSettings['settings']['scripts']) => void;\r\n platform?: string;\r\n}\r\n\r\ntype ScriptEventKey = 'onBackupStart' | 'onBackupEnd' | 'onBackupError' | 'onBackupFailure' | 'onBackupComplete';\r\n\r\nconst scriptEvents: Record<ScriptEventKey, { title: string; description: string }> = {\r\n onBackupStart: {\r\n title: 'Before Backup Start',\r\n description: 'Scripts that run before the backup starts.',\r\n },\r\n onBackupEnd: {\r\n title: 'After Backup End',\r\n description: 'Scripts that run after the backup ends.',\r\n },\r\n onBackupError: {\r\n title: 'On Backup Error',\r\n description: 'Scripts that run when there is a backup error.',\r\n },\r\n onBackupFailure: {\r\n title: 'On Backup Failure',\r\n description: 'Scripts that run when the backup fails.',\r\n },\r\n onBackupComplete: {\r\n title: 'On Backup Complete',\r\n description: 'Scripts that run when the backup completes.',\r\n },\r\n};\r\n\r\nconst PlanScriptsSettings = ({\r\n settings = {\r\n onBackupStart: [],\r\n onBackupEnd: [],\r\n onBackupError: [],\r\n onBackupFailure: [],\r\n onBackupComplete: [],\r\n },\r\n platform,\r\n onUpdate,\r\n}: PlanScriptsSettingsProps) => {\r\n const [showTimeoutSettings, setShowTimeoutSettings] = useState<string | false>(false);\r\n const [activeTabs, setActiveTabs] = useState({\r\n onBackupStart: false,\r\n onBackupEnd: false,\r\n onBackupError: false,\r\n onBackupFailure: false,\r\n onBackupComplete: false,\r\n });\r\n console.log('settings :', settings);\r\n console.log('### platform :', platform);\r\n\r\n return (\r\n <div className={classes.eventTabs}>\r\n {Object.entries(scriptEvents).map(([eventKey, { title, description }]) => {\r\n const key = eventKey as ScriptEventKey;\r\n const scripts = settings[key] || [];\r\n const isActive = activeTabs[key];\r\n return (\r\n <div className={classes.eventTab} key={eventKey}>\r\n <div className={classes.eventTabHead}>\r\n <div>\r\n <span className={classes.eventTabHeadTitle} onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n {title} ({scripts.length || 0})\r\n </span>\r\n <button\r\n onClick={() => {\r\n const newScript = {\r\n id: Math.random().toString(36).substring(2, 15),\r\n type: 'script',\r\n enabled: true,\r\n scriptPath: '',\r\n logOutput: false,\r\n abortOnError: false,\r\n };\r\n if (!activeTabs[key]) {\r\n setActiveTabs({ ...activeTabs, [eventKey]: true });\r\n }\r\n onUpdate({ ...settings, [eventKey]: [...(scripts || []), newScript] });\r\n }}\r\n className={classes.addScriptButton}\r\n >\r\n +\r\n </button>\r\n </div>\r\n <div>\r\n <span\r\n className={classes.eventTabHeadDescription}\r\n data-tooltip-id=\"hintTooltip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-content={description}\r\n >\r\n <Icon type=\"help\" size={13} />\r\n </span>\r\n\r\n <button onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n <Icon type={isActive ? 'caret-up' : 'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n </div>\r\n {isActive && (\r\n <div className={classes.eventTabContent}>\r\n {scripts?.length === 0 && (\r\n <div className={classes.noScriptsMessage}>\r\n <span>No scripts configured for this event.</span>\r\n </div>\r\n )}\r\n {scripts?.map((script, index) => (\r\n <div key={script.id} className={classes.scriptItem}>\r\n <div className={classes.scriptHeader}>\r\n <span className={classes.scriptTitle}>\r\n <Icon type=\"cli\" size={13} /> Script {index + 1}\r\n </span>\r\n {scripts.length > 1 && (\r\n <div className={classes.scriptPositionControls}>\r\n <button\r\n title=\"Move Up\"\r\n disabled={index === 0}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index - 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type={'caret-up'} size={14} />\r\n </button>\r\n <button\r\n title=\"Move Down\"\r\n disabled={index === scripts.length - 1}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index + 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type={'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n className={classes.scriptPathInput}\r\n value={script?.scriptPath || ''}\r\n placeholder=\"Enter absolute path to script file (e.g. /opt/scripts/pre-backup.sh)\"\r\n onChange={(e) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n scriptPath: e.target.value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <div className={classes.scriptFooter}>\r\n <div className={classes.scriptOptions}>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n // label=\"Enabled\"\r\n fieldValue={script?.enabled || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n enabled: checked,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <span>Enabled</span>\r\n </div>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.logOutput || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n logOutput: checked,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <span>Log Output</span>\r\n </div>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n // label=\"Abort On Error\"\r\n fieldValue={script?.abortOnError || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n abortOnError: checked,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <span>Abort on Error</span>\r\n </div>\r\n <i className=\"pipe\">|</i>\r\n <div\r\n title=\"Timeout Settings\"\r\n className={`${classes.scriptOptionTimeout} ${script.id === showTimeoutSettings ? classes.hasTimeOutSettings : ''}`}\r\n >\r\n <button\r\n onClick={() => setShowTimeoutSettings(script.id === showTimeoutSettings ? false : script.id)}\r\n className={classes.timeoutButton}\r\n >\r\n <Icon type=\"clock\" size={13} /> {(script?.timeout && secondsToMinutes(script.timeout)) || 'Off'}\r\n </button>\r\n {showTimeoutSettings === script.id && (\r\n <div className={classes.timeoutSettings}>\r\n <NumberInput\r\n label=\"Timeout (seconds)\"\r\n inline={true}\r\n fieldValue={script?.timeout || 0}\r\n onUpdate={(value) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n timeout: value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n min={0}\r\n max={3600} // 1 hour\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.scriptRemove}>\r\n <button\r\n className={classes.removeScriptButton}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts.splice(index, 1);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type=\"trash\" size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanScriptsSettings;\r\n"],"names":["scriptEvents","PlanScriptsSettings","settings","platform","onUpdate","showTimeoutSettings","setShowTimeoutSettings","useState","activeTabs","setActiveTabs","classes","eventKey","title","description","key","scripts","isActive","jsxs","jsx","newScript","Icon","script","index","updatedScripts","movedScript","e","Toggle","checked","secondsToMinutes","NumberInput","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanScriptsSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanScriptsSettings.tsx"],"sourcesContent":["import classes from './PlanSettings.module.scss';\r\nimport { useState } from 'react';\r\nimport { NewPlanSettings, PlanScript } from '../../../@types/plans';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport { secondsToMinutes } from '../../../utils/helpers';\r\nimport NumberInput from '../../common/form/NumberInput/NumberInput';\r\n\r\ninterface PlanScriptsSettingsProps {\r\n settings: NewPlanSettings['settings']['scripts'];\r\n onUpdate: (settings: NewPlanSettings['settings']['scripts']) => void;\r\n platform?: string;\r\n}\r\n\r\ntype ScriptEventKey = 'onBackupStart' | 'onBackupEnd' | 'onBackupError' | 'onBackupFailure' | 'onBackupComplete';\r\n\r\nconst scriptEvents: Record<ScriptEventKey, { title: string; description: string }> = {\r\n onBackupStart: {\r\n title: 'Before Backup Start',\r\n description: 'Scripts that run before the backup starts.',\r\n },\r\n onBackupEnd: {\r\n title: 'After Backup End',\r\n description: 'Scripts that run after the backup ends.',\r\n },\r\n onBackupError: {\r\n title: 'On Backup Error',\r\n description: 'Scripts that run when there is a backup error.',\r\n },\r\n onBackupFailure: {\r\n title: 'On Backup Failure',\r\n description: 'Scripts that run when the backup fails.',\r\n },\r\n onBackupComplete: {\r\n title: 'On Backup Complete',\r\n description: 'Scripts that run when the backup completes.',\r\n },\r\n};\r\n\r\nconst PlanScriptsSettings = ({\r\n settings = {\r\n onBackupStart: [],\r\n onBackupEnd: [],\r\n onBackupError: [],\r\n onBackupFailure: [],\r\n onBackupComplete: [],\r\n },\r\n platform = '',\r\n onUpdate,\r\n}: PlanScriptsSettingsProps) => {\r\n const [showTimeoutSettings, setShowTimeoutSettings] = useState<string | false>(false);\r\n const [activeTabs, setActiveTabs] = useState({\r\n onBackupStart: false,\r\n onBackupEnd: false,\r\n onBackupError: false,\r\n onBackupFailure: false,\r\n onBackupComplete: false,\r\n });\r\n\r\n const showRootOption = platform.toLowerCase().includes('linux');\r\n // const showRootOption = true;\r\n\r\n const updateScriptBool = (eventKey: ScriptEventKey, index: number, key: keyof PlanScript, value: boolean) => {\r\n const updatedScripts = [...(settings[eventKey] || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n [key]: value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n };\r\n\r\n return (\r\n <div className={classes.eventTabs}>\r\n {Object.entries(scriptEvents).map(([eventKey, { title, description }]) => {\r\n const key = eventKey as ScriptEventKey;\r\n const scripts = settings[key] || [];\r\n const isActive = activeTabs[key];\r\n return (\r\n <div className={classes.eventTab} key={eventKey}>\r\n <div className={classes.eventTabHead}>\r\n <div>\r\n <span className={classes.eventTabHeadTitle} onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n {title} ({scripts.length || 0})\r\n </span>\r\n <button\r\n onClick={() => {\r\n const newScript = {\r\n id: Math.random().toString(36).substring(2, 15),\r\n type: 'script',\r\n enabled: true,\r\n scriptPath: '',\r\n logOutput: false,\r\n abortOnError: false,\r\n };\r\n if (!activeTabs[key]) {\r\n setActiveTabs({ ...activeTabs, [eventKey]: true });\r\n }\r\n onUpdate({ ...settings, [eventKey]: [...(scripts || []), newScript] });\r\n }}\r\n className={classes.addScriptButton}\r\n >\r\n +\r\n </button>\r\n </div>\r\n <div>\r\n <span\r\n className={classes.eventTabHeadDescription}\r\n data-tooltip-id=\"hintTooltip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-content={description}\r\n >\r\n <Icon type=\"help\" size={13} />\r\n </span>\r\n\r\n <button onClick={() => setActiveTabs({ ...activeTabs, [eventKey]: !isActive })}>\r\n <Icon type={isActive ? 'caret-up' : 'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n </div>\r\n {isActive && (\r\n <div className={classes.eventTabContent}>\r\n {scripts?.length === 0 && (\r\n <div className={classes.noScriptsMessage}>\r\n <span>No scripts configured for this event.</span>\r\n </div>\r\n )}\r\n {scripts?.map((script, index) => (\r\n <div key={script.id} className={classes.scriptItem}>\r\n <div className={classes.scriptHeader}>\r\n <span className={classes.scriptTitle}>\r\n <Icon type=\"cli\" size={13} /> Script {index + 1}\r\n </span>\r\n {scripts.length > 1 && (\r\n <div className={classes.scriptPositionControls}>\r\n <button\r\n title=\"Move Up\"\r\n disabled={index === 0}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index - 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type={'caret-up'} size={14} />\r\n </button>\r\n <button\r\n title=\"Move Down\"\r\n disabled={index === scripts.length - 1}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n const [movedScript] = updatedScripts.splice(index, 1);\r\n updatedScripts.splice(index + 1, 0, movedScript);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type={'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n className={classes.scriptPathInput}\r\n value={script?.scriptPath || ''}\r\n placeholder=\"Enter absolute path to script file (e.g. /opt/scripts/pre-backup.sh)\"\r\n onChange={(e) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n scriptPath: e.target.value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n />\r\n <div className={classes.scriptFooter}>\r\n <div className={classes.scriptOptions}>\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n // label=\"Enabled\"\r\n fieldValue={script?.enabled || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'enabled', checked)}\r\n />\r\n <span>Enabled</span>\r\n </div>\r\n {/* <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.logOutput || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'logOutput', checked)}\r\n />\r\n <span>Log Output</span>\r\n </div> */}\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.abortOnError || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'abortOnError', checked)}\r\n />\r\n <span>Abort on Error</span>\r\n </div>\r\n {showRootOption && (\r\n <div className={classes.scriptOptionCheckbox}>\r\n <Toggle\r\n fieldValue={script?.runAsRoot || false}\r\n inline={true}\r\n onUpdate={(checked: boolean) => updateScriptBool(key, index, 'runAsRoot', checked)}\r\n />\r\n <span>Run as Root</span>\r\n </div>\r\n )}\r\n <i className=\"pipe\">|</i>\r\n <div\r\n title=\"Timeout Settings\"\r\n className={`${classes.scriptOptionTimeout} ${script.id === showTimeoutSettings ? classes.hasTimeOutSettings : ''}`}\r\n >\r\n <button\r\n onClick={() => setShowTimeoutSettings(script.id === showTimeoutSettings ? false : script.id)}\r\n className={classes.timeoutButton}\r\n >\r\n <Icon type=\"clock\" size={13} /> {(script?.timeout && secondsToMinutes(script.timeout)) || 'Off'}\r\n </button>\r\n {showTimeoutSettings === script.id && (\r\n <div className={classes.timeoutSettings}>\r\n <NumberInput\r\n label=\"Timeout (seconds)\"\r\n inline={true}\r\n fieldValue={script?.timeout || 0}\r\n onUpdate={(value) => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts[index] = {\r\n ...updatedScripts[index],\r\n timeout: value,\r\n };\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n min={0}\r\n max={3600} // 1 hour\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.scriptRemove}>\r\n <button\r\n className={classes.removeScriptButton}\r\n onClick={() => {\r\n const updatedScripts = [...(scripts || [])];\r\n updatedScripts.splice(index, 1);\r\n onUpdate({ ...settings, [eventKey]: updatedScripts });\r\n }}\r\n >\r\n <Icon type=\"trash\" size={18} />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanScriptsSettings;\r\n"],"names":["scriptEvents","PlanScriptsSettings","settings","platform","onUpdate","showTimeoutSettings","setShowTimeoutSettings","useState","activeTabs","setActiveTabs","showRootOption","updateScriptBool","eventKey","index","key","value","updatedScripts","classes","title","description","scripts","isActive","jsxs","jsx","newScript","Icon","script","movedScript","e","Toggle","checked","secondsToMinutes","NumberInput"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanSourceSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,UAAU,uBAAuB;IAC9B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,kBAAkB,GAAI,sCAAsC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"PlanSourceSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,UAAU,uBAAuB;IAC9B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,kBAAkB,GAAI,sCAAsC,uBAAuB,4CA6DxF,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,57 +1,63 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useEffect as
|
|
1
|
+
import { jsxs as n, Fragment as d, jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as f, useEffect as h } from "react";
|
|
3
3
|
import o from "./PlanSettings.module.scss.js";
|
|
4
|
-
import
|
|
5
|
-
import { useGetDevices as
|
|
6
|
-
import
|
|
7
|
-
const
|
|
8
|
-
const { data:
|
|
9
|
-
|
|
10
|
-
...
|
|
4
|
+
import p from "../../common/PathPicker/PathPicker.js";
|
|
5
|
+
import { useGetDevices as b } from "../../../services/devices.js";
|
|
6
|
+
import v from "../../common/form/Select/Select.js";
|
|
7
|
+
const D = ({ plan: e, onUpdate: t, error: m, isEditing: u }) => {
|
|
8
|
+
const { data: r } = b(), a = [], c = e.sourceId || "main";
|
|
9
|
+
r != null && r.success && r.result && a.push(
|
|
10
|
+
...r.result.map((s) => ({
|
|
11
11
|
label: `${s.name} ${s.id === "main" ? "(Main)" : ""}`,
|
|
12
12
|
value: s.id,
|
|
13
13
|
icon: s.id === "main" ? "computer" : "computer-remote"
|
|
14
14
|
// disabled: device.id === 'main' || device.connected ? false : true,
|
|
15
15
|
}))
|
|
16
|
-
)
|
|
17
|
-
|
|
16
|
+
);
|
|
17
|
+
const i = f(null);
|
|
18
|
+
return h(() => {
|
|
19
|
+
if (u) {
|
|
20
|
+
i.current = c;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
i.current !== null && i.current !== c && t({
|
|
18
24
|
...e,
|
|
19
25
|
sourceConfig: {
|
|
20
26
|
includes: [],
|
|
21
27
|
excludes: []
|
|
22
28
|
}
|
|
23
|
-
});
|
|
24
|
-
}, [
|
|
25
|
-
/* @__PURE__ */
|
|
29
|
+
}), i.current = c;
|
|
30
|
+
}, [u, c]), /* @__PURE__ */ n(d, { children: [
|
|
31
|
+
/* @__PURE__ */ n("div", { className: o.field, children: [
|
|
26
32
|
/* @__PURE__ */ l("label", { className: o.label, children: "Select Device*" }),
|
|
27
33
|
/* @__PURE__ */ l(
|
|
28
|
-
|
|
34
|
+
v,
|
|
29
35
|
{
|
|
30
36
|
options: a,
|
|
31
|
-
fieldValue:
|
|
32
|
-
disabled:
|
|
37
|
+
fieldValue: c,
|
|
38
|
+
disabled: u,
|
|
33
39
|
full: !0,
|
|
34
|
-
onUpdate: (s) =>
|
|
40
|
+
onUpdate: (s) => t({ ...e, sourceId: s })
|
|
35
41
|
}
|
|
36
42
|
)
|
|
37
43
|
] }),
|
|
38
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ n("div", { className: o.field, children: [
|
|
39
45
|
/* @__PURE__ */ l("label", { className: o.label, children: "Backup Sources*" }),
|
|
40
|
-
|
|
46
|
+
m && /* @__PURE__ */ l("span", { className: o.fieldErrorLabel, children: m }),
|
|
41
47
|
/* @__PURE__ */ l(
|
|
42
|
-
|
|
48
|
+
p,
|
|
43
49
|
{
|
|
44
50
|
paths: { includes: e.sourceConfig.includes, excludes: e.sourceConfig.excludes },
|
|
45
|
-
onUpdate: (s) =>
|
|
46
|
-
deviceId:
|
|
51
|
+
onUpdate: (s) => t({ ...e, sourceConfig: { ...s } }),
|
|
52
|
+
deviceId: c,
|
|
47
53
|
single: e.method === "sync",
|
|
48
|
-
disallowChange: e.method === "sync" &&
|
|
54
|
+
disallowChange: e.method === "sync" && u
|
|
49
55
|
}
|
|
50
56
|
)
|
|
51
57
|
] })
|
|
52
58
|
] });
|
|
53
59
|
};
|
|
54
60
|
export {
|
|
55
|
-
|
|
61
|
+
D as default
|
|
56
62
|
};
|
|
57
63
|
//# sourceMappingURL=PlanSourceSettings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanSourceSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"sourcesContent":["import { useEffect } from 'react';\r\nimport classes from './PlanSettings.module.scss';\r\nimport PathPicker from '../../common/PathPicker/PathPicker';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport { useGetDevices } from '../../../services/devices';\r\nimport Select from '../../common/form/Select/Select';\r\nimport { Device } from '../../../@types/devices';\r\n\r\ninterface PlanSourceSettingsProps {\r\n plan: NewPlanSettings;\r\n isEditing: boolean;\r\n onUpdate: (plan: NewPlanSettings) => void;\r\n error: string;\r\n}\r\n\r\nconst PlanSourceSettings = ({ plan, onUpdate, error, isEditing }: PlanSourceSettingsProps) => {\r\n const { data } = useGetDevices();\r\n const deviceList = [];\r\n const deviceId = plan.sourceId || 'main';\r\n if (data?.success && data.result) {\r\n deviceList.push(\r\n ...data.result.map((device: Device) => ({\r\n label: `${device.name} ${device.id === 'main' ? '(Main)' : ''}`,\r\n value: device.id,\r\n icon: device.id === 'main' ? 'computer' : 'computer-remote',\r\n // disabled: device.id === 'main' || device.connected ? false : true,\r\n })),\r\n );\r\n }\r\n\r\n // When the device changes, reset the sourceConfig paths to prevent invalid paths from being submitted\r\n useEffect(() => {\r\n if (
|
|
1
|
+
{"version":3,"file":"PlanSourceSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanSourceSettings.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\r\nimport classes from './PlanSettings.module.scss';\r\nimport PathPicker from '../../common/PathPicker/PathPicker';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport { useGetDevices } from '../../../services/devices';\r\nimport Select from '../../common/form/Select/Select';\r\nimport { Device } from '../../../@types/devices';\r\n\r\ninterface PlanSourceSettingsProps {\r\n plan: NewPlanSettings;\r\n isEditing: boolean;\r\n onUpdate: (plan: NewPlanSettings) => void;\r\n error: string;\r\n}\r\n\r\nconst PlanSourceSettings = ({ plan, onUpdate, error, isEditing }: PlanSourceSettingsProps) => {\r\n const { data } = useGetDevices();\r\n const deviceList = [];\r\n const deviceId = plan.sourceId || 'main';\r\n if (data?.success && data.result) {\r\n deviceList.push(\r\n ...data.result.map((device: Device) => ({\r\n label: `${device.name} ${device.id === 'main' ? '(Main)' : ''}`,\r\n value: device.id,\r\n icon: device.id === 'main' ? 'computer' : 'computer-remote',\r\n // disabled: device.id === 'main' || device.connected ? false : true,\r\n })),\r\n );\r\n }\r\n\r\n // When the device changes, reset the sourceConfig paths to prevent invalid paths from being submitted.\r\n // Use a ref to track the previous deviceId so we only reset on an actual change (not on mount/remount,\r\n // e.g. when navigating between steps in the Add Plan form).\r\n const prevDeviceIdRef = useRef<string | null>(null);\r\n useEffect(() => {\r\n if (isEditing) {\r\n prevDeviceIdRef.current = deviceId;\r\n return;\r\n }\r\n if (prevDeviceIdRef.current !== null && prevDeviceIdRef.current !== deviceId) {\r\n onUpdate({\r\n ...plan,\r\n sourceConfig: {\r\n includes: [],\r\n excludes: [],\r\n },\r\n });\r\n }\r\n prevDeviceIdRef.current = deviceId;\r\n }, [isEditing, deviceId]);\r\n\r\n return (\r\n <>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Select Device*</label>\r\n <Select\r\n options={deviceList}\r\n fieldValue={deviceId}\r\n disabled={isEditing}\r\n full={true}\r\n onUpdate={(val) => onUpdate({ ...plan, sourceId: val })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Sources*</label>\r\n {error && <span className={classes.fieldErrorLabel}>{error}</span>}\r\n <PathPicker\r\n paths={{ includes: plan.sourceConfig.includes, excludes: plan.sourceConfig.excludes }}\r\n onUpdate={(paths) => onUpdate({ ...plan, sourceConfig: { ...paths } })}\r\n deviceId={deviceId}\r\n single={plan.method === 'sync'}\r\n disallowChange={plan.method === 'sync' && isEditing}\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default PlanSourceSettings;\r\n"],"names":["PlanSourceSettings","plan","onUpdate","error","isEditing","data","useGetDevices","deviceList","deviceId","device","prevDeviceIdRef","useRef","useEffect","jsxs","Fragment","classes","jsx","Select","val","PathPicker","paths"],"mappings":";;;;;;AAeA,MAAMA,IAAqB,CAAC,EAAE,MAAAC,GAAM,UAAAC,GAAU,OAAAC,GAAO,WAAAC,QAAyC;AAC3F,QAAM,EAAE,MAAAC,EAAA,IAASC,EAAA,GACXC,IAAa,CAAA,GACbC,IAAWP,EAAK,YAAY;AAClC,EAAII,KAAA,QAAAA,EAAM,WAAWA,EAAK,UACvBE,EAAW;AAAA,IACR,GAAGF,EAAK,OAAO,IAAI,CAACI,OAAoB;AAAA,MACrC,OAAO,GAAGA,EAAO,IAAI,IAAIA,EAAO,OAAO,SAAS,WAAW,EAAE;AAAA,MAC7D,OAAOA,EAAO;AAAA,MACd,MAAMA,EAAO,OAAO,SAAS,aAAa;AAAA;AAAA,IAAA,EAE3C;AAAA,EAAA;AAOR,QAAMC,IAAkBC,EAAsB,IAAI;AAClD,SAAAC,EAAU,MAAM;AACb,QAAIR,GAAW;AACZ,MAAAM,EAAgB,UAAUF;AAC1B;AAAA,IACH;AACA,IAAIE,EAAgB,YAAY,QAAQA,EAAgB,YAAYF,KACjEN,EAAS;AAAA,MACN,GAAGD;AAAA,MACH,cAAc;AAAA,QACX,UAAU,CAAA;AAAA,QACV,UAAU,CAAA;AAAA,MAAC;AAAA,IACd,CACF,GAEJS,EAAgB,UAAUF;AAAA,EAC7B,GAAG,CAACJ,GAAWI,CAAQ,CAAC,GAGrB,gBAAAK,EAAAC,GAAA,EACG,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,kBAAc;AAAA,MAC/C,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACE,SAASV;AAAA,UACT,YAAYC;AAAA,UACZ,UAAUJ;AAAA,UACV,MAAM;AAAA,UACN,UAAU,CAACc,MAAQhB,EAAS,EAAE,GAAGD,GAAM,UAAUiB,EAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACzD,GACH;AAAA,IACA,gBAAAL,EAAC,OAAA,EAAI,WAAWE,EAAQ,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EAAM,WAAWD,EAAQ,OAAO,UAAA,mBAAe;AAAA,MAC/CZ,KAAS,gBAAAa,EAAC,QAAA,EAAK,WAAWD,EAAQ,iBAAkB,UAAAZ,GAAM;AAAA,MAC3D,gBAAAa;AAAA,QAACG;AAAA,QAAA;AAAA,UACE,OAAO,EAAE,UAAUlB,EAAK,aAAa,UAAU,UAAUA,EAAK,aAAa,SAAA;AAAA,UAC3E,UAAU,CAACmB,MAAUlB,EAAS,EAAE,GAAGD,GAAM,cAAc,EAAE,GAAGmB,EAAA,GAAS;AAAA,UACrE,UAAAZ;AAAA,UACA,QAAQP,EAAK,WAAW;AAAA,UACxB,gBAAgBA,EAAK,WAAW,UAAUG;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7C,EAAA,CACH;AAAA,EAAA,GACH;AAEN;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoragePicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/common/form/StoragePicker/StoragePicker.tsx"],"names":[],"mappings":"AASA,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,UAAU,kBAAkB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE;AAED,QAAA,MAAM,aAAa,GAAI,0DAAuE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"StoragePicker.d.ts","sourceRoot":"","sources":["../../../../../src/components/common/form/StoragePicker/StoragePicker.tsx"],"names":[],"mappings":"AASA,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,UAAU,kBAAkB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE;AAED,QAAA,MAAM,aAAa,GAAI,0DAAuE,kBAAkB,4CAgI/G,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,62 +1,68 @@
|
|
|
1
|
-
import { jsx as o, jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { useGetStorages as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
const
|
|
11
|
-
const [t,
|
|
1
|
+
import { jsx as o, jsxs as P } from "react/jsx-runtime";
|
|
2
|
+
import { useState as m, useMemo as O, useEffect as S, useRef as U } from "react";
|
|
3
|
+
import n from "./StoragePicker.module.scss.js";
|
|
4
|
+
import R from "../Select/Select.js";
|
|
5
|
+
import { useGetStorages as j } from "../../../../services/storage.js";
|
|
6
|
+
import q from "../Input/Input.js";
|
|
7
|
+
import V from "../../FolderPicker/FolderPicker.js";
|
|
8
|
+
import W from "../../Icon/Icon.js";
|
|
9
|
+
import _ from "../../../Storage/AddStorage/AddStorage.js";
|
|
10
|
+
const Q = ({ onUpdate: $, storagePath: y = "", storageId: k, disabled: a = !1, deviceId: i }) => {
|
|
11
|
+
const [t, g] = m(), [M, w] = m(!1), [v, N] = m(!1), [r, u] = m(() => y), f = (t == null ? void 0 : t.type) === "local", p = (t == null ? void 0 : t.defaultPath) && (t == null ? void 0 : t.defaultPath) !== "/", x = p ? `${t.defaultPath}${r ? `/${r}` : ""}` : r, { data: d } = j(), c = [...(d == null ? void 0 : d.result) || []];
|
|
12
12
|
console.log("allStorages :", c), console.log("selectedStorage :", t);
|
|
13
|
-
const
|
|
13
|
+
const A = O(() => c.map(({ name: l, id: s, type: F }) => ({
|
|
14
14
|
label: l,
|
|
15
15
|
value: s.toString(),
|
|
16
|
-
image: /* @__PURE__ */ o("img", { src: `/providers/${
|
|
17
|
-
})), [c]),
|
|
16
|
+
image: /* @__PURE__ */ o("img", { src: `/providers/${F}.png` })
|
|
17
|
+
})), [c]), B = (e) => {
|
|
18
18
|
if (console.log("storageID :", e), e === "add_new")
|
|
19
|
-
return
|
|
19
|
+
return N(!0);
|
|
20
20
|
const l = c.find((s) => s.id == e);
|
|
21
|
-
(l || e === "local") &&
|
|
21
|
+
(l || e === "local") && g(l);
|
|
22
22
|
};
|
|
23
|
-
|
|
24
|
-
if (c.length > 0 &&
|
|
25
|
-
const e = c.find((l) => l.id ===
|
|
26
|
-
if (
|
|
23
|
+
S(() => {
|
|
24
|
+
if (c.length > 0 && k) {
|
|
25
|
+
const e = c.find((l) => l.id === k);
|
|
26
|
+
if (g(e), e != null && e.defaultPath && e.defaultPath !== "/") {
|
|
27
27
|
const l = e.defaultPath + "/";
|
|
28
|
-
|
|
28
|
+
u((s) => s.startsWith(l) ? s.slice(l.length) : s);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
}, [
|
|
32
|
-
t &&
|
|
33
|
-
}, [t, r])
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
}, [d]), S(() => {
|
|
32
|
+
t && $({ storage: t, path: x });
|
|
33
|
+
}, [t, r]);
|
|
34
|
+
const h = U(null);
|
|
35
|
+
return S(() => {
|
|
36
|
+
if (a) {
|
|
37
|
+
h.current = i;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
h.current !== null && h.current !== i && (g(null), u("")), h.current = i;
|
|
41
|
+
}, [i, a]), /* @__PURE__ */ P("div", { className: n.storagePicker, children: [
|
|
42
|
+
/* @__PURE__ */ o("div", { className: n.storagePickerInput, children: /* @__PURE__ */ P("div", { children: [
|
|
43
|
+
/* @__PURE__ */ o("div", { className: n.storage, children: /* @__PURE__ */ o(
|
|
44
|
+
R,
|
|
39
45
|
{
|
|
40
46
|
fieldValue: t != null && t.id ? t.id : "",
|
|
41
47
|
options: [
|
|
42
48
|
{ label: "Select Storage", value: "", icon: "storages" },
|
|
43
|
-
...
|
|
49
|
+
...A,
|
|
44
50
|
{ label: "+ Add New Storage", value: "add_new", icon: "plus" }
|
|
45
51
|
],
|
|
46
|
-
onUpdate:
|
|
52
|
+
onUpdate: B,
|
|
47
53
|
full: !0,
|
|
48
54
|
disabled: a
|
|
49
55
|
}
|
|
50
56
|
) }),
|
|
51
|
-
/* @__PURE__ */
|
|
52
|
-
|
|
57
|
+
/* @__PURE__ */ P("div", { className: `${n.path} ${p ? n.withBucket : ""}`, children: [
|
|
58
|
+
p && /* @__PURE__ */ o("span", { className: n.defaultPath, title: `Bucket: ${t.defaultPath}`, children: t.defaultPath + "/" }),
|
|
53
59
|
/* @__PURE__ */ o(
|
|
54
|
-
|
|
60
|
+
q,
|
|
55
61
|
{
|
|
56
62
|
disabled: a,
|
|
57
63
|
fieldValue: r,
|
|
58
|
-
onUpdate: (e) =>
|
|
59
|
-
placeholder: f ? "Select a folder" :
|
|
64
|
+
onUpdate: (e) => u(!f && e.startsWith("/") ? e.slice(1) : e),
|
|
65
|
+
placeholder: f ? "Select a folder" : p ? "subfolder" : "folder-or-bucket/subfolder",
|
|
60
66
|
full: !0,
|
|
61
67
|
required: !a && f,
|
|
62
68
|
error: !a && f && !r ? "Required" : ""
|
|
@@ -65,30 +71,30 @@ const I = ({ onUpdate: N, storagePath: $ = "", storageId: P, disabled: a = !1, d
|
|
|
65
71
|
(t == null ? void 0 : t.type) && !a && t.type === "local" && /* @__PURE__ */ o(
|
|
66
72
|
"button",
|
|
67
73
|
{
|
|
68
|
-
className:
|
|
74
|
+
className: n.fileManagerBtn,
|
|
69
75
|
"data-tooltip-id": "appTooltip",
|
|
70
76
|
"data-tooltip-content": "Open FileManager to Select Directory",
|
|
71
77
|
"data-tooltip-place": "top",
|
|
72
|
-
onClick: () =>
|
|
73
|
-
children: /* @__PURE__ */ o(
|
|
78
|
+
onClick: () => w(!0),
|
|
79
|
+
children: /* @__PURE__ */ o(W, { type: "folders", size: 16 })
|
|
74
80
|
}
|
|
75
81
|
)
|
|
76
82
|
] })
|
|
77
83
|
] }) }),
|
|
78
|
-
|
|
79
|
-
|
|
84
|
+
M && !a && /* @__PURE__ */ o(
|
|
85
|
+
V,
|
|
80
86
|
{
|
|
81
|
-
deviceId:
|
|
87
|
+
deviceId: i || "main",
|
|
82
88
|
title: "Select Path",
|
|
83
89
|
selected: r,
|
|
84
|
-
close: () =>
|
|
85
|
-
onSelect: (e) =>
|
|
90
|
+
close: () => w(!1),
|
|
91
|
+
onSelect: (e) => u(e)
|
|
86
92
|
}
|
|
87
93
|
),
|
|
88
|
-
|
|
94
|
+
v && /* @__PURE__ */ o(_, { close: () => N(!1) })
|
|
89
95
|
] });
|
|
90
96
|
};
|
|
91
97
|
export {
|
|
92
|
-
|
|
98
|
+
Q as default
|
|
93
99
|
};
|
|
94
100
|
//# sourceMappingURL=StoragePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoragePicker.js","sources":["../../../../../src/components/common/form/StoragePicker/StoragePicker.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\r\nimport classes from './StoragePicker.module.scss';\r\nimport Select from '../Select/Select';\r\nimport { useGetStorages } from '../../../../services/storage';\r\nimport Input from '../Input/Input';\r\nimport FolderPicker from '../../FolderPicker/FolderPicker';\r\nimport Icon from '../../Icon/Icon';\r\nimport AddStorage from '../../../Storage/AddStorage/AddStorage';\r\n\r\ntype storageItem = { name: string; id: string; type: string; defaultPath?: string };\r\n\r\ninterface StoragePickerProps {\r\n storagePath?: string;\r\n storageId?: string;\r\n disabled?: boolean;\r\n deviceId?: string;\r\n onUpdate: (val: { storage: storageItem; path: string }) => void;\r\n}\r\n\r\nconst StoragePicker = ({ onUpdate, storagePath = '', storageId, disabled = false, deviceId }: StoragePickerProps) => {\r\n const [selectedStorage, setSelectedStorage] = useState<null | storageItem>();\r\n const [showFolderPicker, setShowFolderPicker] = useState(false);\r\n const [showAddStorageModal, setShowAddStorageModal] = useState(false);\r\n const [path, setPath] = useState(() => storagePath);\r\n const isLocalStorage = selectedStorage?.type === 'local';\r\n const hasBucketName = selectedStorage?.defaultPath && selectedStorage?.defaultPath !== '/';\r\n const fullPath = hasBucketName ? `${selectedStorage.defaultPath}${path ? `/${path}` : ''}` : path;\r\n\r\n const { data: allStorageData } = useGetStorages();\r\n const allUserStorages = (allStorageData?.result as storageItem[]) || [];\r\n const allStorages = [...allUserStorages];\r\n\r\n console.log('allStorages :', allStorages);\r\n console.log('selectedStorage :', selectedStorage);\r\n\r\n const storageOptions = useMemo(() => {\r\n const storageOpts = allStorages.map(({ name, id, type }) => ({\r\n label: name,\r\n value: id.toString(),\r\n image: <img src={`/providers/${type}.png`} />,\r\n }));\r\n return storageOpts;\r\n }, [allStorages]);\r\n\r\n const selectStorage = (storageID: string) => {\r\n console.log('storageID :', storageID);\r\n if (storageID === 'add_new') {\r\n return setShowAddStorageModal(true);\r\n }\r\n const theStorage = allStorages.find((s) => s.id == storageID);\r\n if (theStorage || storageID === 'local') {\r\n setSelectedStorage(theStorage);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (allStorages.length > 0 && storageId) {\r\n const currentStorage = allStorages.find((s) => s.id === storageId);\r\n setSelectedStorage(currentStorage);\r\n if (currentStorage?.defaultPath && currentStorage.defaultPath !== '/') {\r\n const prefix = currentStorage.defaultPath + '/';\r\n setPath((prev) => (prev.startsWith(prefix) ? prev.slice(prefix.length) : prev));\r\n }\r\n }\r\n }, [allStorageData]);\r\n\r\n useEffect(() => {\r\n if (selectedStorage) {\r\n onUpdate({ storage: selectedStorage, path: fullPath });\r\n }\r\n }, [selectedStorage, path]);\r\n\r\n useEffect(() => {\r\n if (!disabled) {\r\n setSelectedStorage(null);\r\n setPath('');\r\n }\r\n }, [deviceId, disabled]);\r\n\r\n // console.log('Storage path :', path, !disabled && isLocalStorage && !path);\r\n\r\n return (\r\n <div className={classes.storagePicker}>\r\n <div className={classes.storagePickerInput}>\r\n <div>\r\n <div className={classes.storage}>\r\n <Select\r\n fieldValue={selectedStorage?.id ? selectedStorage.id : ''}\r\n options={[\r\n { label: 'Select Storage', value: '', icon: 'storages' },\r\n ...storageOptions,\r\n { label: '+ Add New Storage', value: 'add_new', icon: 'plus' },\r\n ]}\r\n onUpdate={selectStorage}\r\n full={true}\r\n disabled={disabled}\r\n />\r\n </div>\r\n <div className={`${classes.path} ${hasBucketName ? classes.withBucket : ''}`}>\r\n {hasBucketName && (\r\n <span className={classes.defaultPath} title={`Bucket: ${selectedStorage.defaultPath}`}>\r\n {selectedStorage.defaultPath + '/'}\r\n </span>\r\n )}\r\n <Input\r\n disabled={disabled}\r\n fieldValue={path}\r\n onUpdate={(val) => setPath(!isLocalStorage && val.startsWith('/') ? val.slice(1) : val)} //if the val starts with a slash remove it (only for remote storages, local paths need the leading slash)\r\n placeholder={isLocalStorage ? 'Select a folder' : hasBucketName ? 'subfolder' : `folder-or-bucket/subfolder`}\r\n full={true}\r\n required={!disabled && isLocalStorage}\r\n error={(!disabled && isLocalStorage && !path ? 'Required' : '') as string}\r\n />\r\n {selectedStorage?.type && !disabled && selectedStorage.type === 'local' && (\r\n <button\r\n className={classes.fileManagerBtn}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content=\"Open FileManager to Select Directory\"\r\n data-tooltip-place=\"top\"\r\n onClick={() => setShowFolderPicker(true)}\r\n >\r\n <Icon type=\"folders\" size={16} />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {showFolderPicker && !disabled && (\r\n <FolderPicker\r\n deviceId={deviceId || 'main'}\r\n title=\"Select Path\"\r\n selected={path}\r\n close={() => setShowFolderPicker(false)}\r\n onSelect={(newVal) => setPath(newVal)}\r\n />\r\n )}\r\n {showAddStorageModal && <AddStorage close={() => setShowAddStorageModal(false)} />}\r\n </div>\r\n );\r\n};\r\n\r\nexport default StoragePicker;\r\n"],"names":["StoragePicker","onUpdate","storagePath","storageId","disabled","deviceId","selectedStorage","setSelectedStorage","useState","showFolderPicker","setShowFolderPicker","showAddStorageModal","setShowAddStorageModal","path","setPath","isLocalStorage","hasBucketName","fullPath","allStorageData","useGetStorages","allStorages","storageOptions","useMemo","name","id","type","jsx","selectStorage","storageID","theStorage","useEffect","currentStorage","s","prefix","prev","jsxs","classes","Select","Input","val","Icon","FolderPicker","newVal","AddStorage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StoragePicker.js","sources":["../../../../../src/components/common/form/StoragePicker/StoragePicker.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport classes from './StoragePicker.module.scss';\r\nimport Select from '../Select/Select';\r\nimport { useGetStorages } from '../../../../services/storage';\r\nimport Input from '../Input/Input';\r\nimport FolderPicker from '../../FolderPicker/FolderPicker';\r\nimport Icon from '../../Icon/Icon';\r\nimport AddStorage from '../../../Storage/AddStorage/AddStorage';\r\n\r\ntype storageItem = { name: string; id: string; type: string; defaultPath?: string };\r\n\r\ninterface StoragePickerProps {\r\n storagePath?: string;\r\n storageId?: string;\r\n disabled?: boolean;\r\n deviceId?: string;\r\n onUpdate: (val: { storage: storageItem; path: string }) => void;\r\n}\r\n\r\nconst StoragePicker = ({ onUpdate, storagePath = '', storageId, disabled = false, deviceId }: StoragePickerProps) => {\r\n const [selectedStorage, setSelectedStorage] = useState<null | storageItem>();\r\n const [showFolderPicker, setShowFolderPicker] = useState(false);\r\n const [showAddStorageModal, setShowAddStorageModal] = useState(false);\r\n const [path, setPath] = useState(() => storagePath);\r\n const isLocalStorage = selectedStorage?.type === 'local';\r\n const hasBucketName = selectedStorage?.defaultPath && selectedStorage?.defaultPath !== '/';\r\n const fullPath = hasBucketName ? `${selectedStorage.defaultPath}${path ? `/${path}` : ''}` : path;\r\n\r\n const { data: allStorageData } = useGetStorages();\r\n const allUserStorages = (allStorageData?.result as storageItem[]) || [];\r\n const allStorages = [...allUserStorages];\r\n\r\n console.log('allStorages :', allStorages);\r\n console.log('selectedStorage :', selectedStorage);\r\n\r\n const storageOptions = useMemo(() => {\r\n const storageOpts = allStorages.map(({ name, id, type }) => ({\r\n label: name,\r\n value: id.toString(),\r\n image: <img src={`/providers/${type}.png`} />,\r\n }));\r\n return storageOpts;\r\n }, [allStorages]);\r\n\r\n const selectStorage = (storageID: string) => {\r\n console.log('storageID :', storageID);\r\n if (storageID === 'add_new') {\r\n return setShowAddStorageModal(true);\r\n }\r\n const theStorage = allStorages.find((s) => s.id == storageID);\r\n if (theStorage || storageID === 'local') {\r\n setSelectedStorage(theStorage);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (allStorages.length > 0 && storageId) {\r\n const currentStorage = allStorages.find((s) => s.id === storageId);\r\n setSelectedStorage(currentStorage);\r\n if (currentStorage?.defaultPath && currentStorage.defaultPath !== '/') {\r\n const prefix = currentStorage.defaultPath + '/';\r\n setPath((prev) => (prev.startsWith(prefix) ? prev.slice(prefix.length) : prev));\r\n }\r\n }\r\n }, [allStorageData]);\r\n\r\n useEffect(() => {\r\n if (selectedStorage) {\r\n onUpdate({ storage: selectedStorage, path: fullPath });\r\n }\r\n }, [selectedStorage, path]);\r\n\r\n // Reset the storage selection only when the device actually changes (not on mount/remount,\r\n // e.g. when navigating between steps in the Add Plan form).\r\n const prevDeviceIdRef = useRef<string | undefined | null>(null);\r\n useEffect(() => {\r\n if (disabled) {\r\n prevDeviceIdRef.current = deviceId;\r\n return;\r\n }\r\n if (prevDeviceIdRef.current !== null && prevDeviceIdRef.current !== deviceId) {\r\n setSelectedStorage(null);\r\n setPath('');\r\n }\r\n prevDeviceIdRef.current = deviceId;\r\n }, [deviceId, disabled]);\r\n\r\n // console.log('Storage path :', path, !disabled && isLocalStorage && !path);\r\n\r\n return (\r\n <div className={classes.storagePicker}>\r\n <div className={classes.storagePickerInput}>\r\n <div>\r\n <div className={classes.storage}>\r\n <Select\r\n fieldValue={selectedStorage?.id ? selectedStorage.id : ''}\r\n options={[\r\n { label: 'Select Storage', value: '', icon: 'storages' },\r\n ...storageOptions,\r\n { label: '+ Add New Storage', value: 'add_new', icon: 'plus' },\r\n ]}\r\n onUpdate={selectStorage}\r\n full={true}\r\n disabled={disabled}\r\n />\r\n </div>\r\n <div className={`${classes.path} ${hasBucketName ? classes.withBucket : ''}`}>\r\n {hasBucketName && (\r\n <span className={classes.defaultPath} title={`Bucket: ${selectedStorage.defaultPath}`}>\r\n {selectedStorage.defaultPath + '/'}\r\n </span>\r\n )}\r\n <Input\r\n disabled={disabled}\r\n fieldValue={path}\r\n onUpdate={(val) => setPath(!isLocalStorage && val.startsWith('/') ? val.slice(1) : val)} //if the val starts with a slash remove it (only for remote storages, local paths need the leading slash)\r\n placeholder={isLocalStorage ? 'Select a folder' : hasBucketName ? 'subfolder' : `folder-or-bucket/subfolder`}\r\n full={true}\r\n required={!disabled && isLocalStorage}\r\n error={(!disabled && isLocalStorage && !path ? 'Required' : '') as string}\r\n />\r\n {selectedStorage?.type && !disabled && selectedStorage.type === 'local' && (\r\n <button\r\n className={classes.fileManagerBtn}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content=\"Open FileManager to Select Directory\"\r\n data-tooltip-place=\"top\"\r\n onClick={() => setShowFolderPicker(true)}\r\n >\r\n <Icon type=\"folders\" size={16} />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {showFolderPicker && !disabled && (\r\n <FolderPicker\r\n deviceId={deviceId || 'main'}\r\n title=\"Select Path\"\r\n selected={path}\r\n close={() => setShowFolderPicker(false)}\r\n onSelect={(newVal) => setPath(newVal)}\r\n />\r\n )}\r\n {showAddStorageModal && <AddStorage close={() => setShowAddStorageModal(false)} />}\r\n </div>\r\n );\r\n};\r\n\r\nexport default StoragePicker;\r\n"],"names":["StoragePicker","onUpdate","storagePath","storageId","disabled","deviceId","selectedStorage","setSelectedStorage","useState","showFolderPicker","setShowFolderPicker","showAddStorageModal","setShowAddStorageModal","path","setPath","isLocalStorage","hasBucketName","fullPath","allStorageData","useGetStorages","allStorages","storageOptions","useMemo","name","id","type","jsx","selectStorage","storageID","theStorage","useEffect","currentStorage","s","prefix","prev","prevDeviceIdRef","useRef","jsxs","classes","Select","Input","val","Icon","FolderPicker","newVal","AddStorage"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanSingle.d.ts","sourceRoot":"","sources":["../../../src/routes/PlanSingle/PlanSingle.tsx"],"names":[],"mappings":"AAkBA,QAAA,MAAM,UAAU,+
|
|
1
|
+
{"version":3,"file":"PlanSingle.d.ts","sourceRoot":"","sources":["../../../src/routes/PlanSingle/PlanSingle.tsx"],"names":[],"mappings":"AAkBA,QAAA,MAAM,UAAU,+CAiMf,CAAC;AAEF,eAAe,UAAU,CAAC"}
|