TODO Explain what backup targets are and what primary/secondary is
diff --git a/dashboard/src/components/BackupTargetDialog.vue b/dashboard/src/components/NewBackupTargetDialog.vue similarity index 90% rename from dashboard/src/components/BackupTargetDialog.vue rename to dashboard/src/components/NewBackupTargetDialog.vue index 1fc092711..e34f09385 100644 --- a/dashboard/src/components/BackupTargetDialog.vue +++ b/dashboard/src/components/NewBackupTargetDialog.vue @@ -17,7 +17,6 @@ const systemModel = SystemModel.create(); const dialog = useTemplateRef('dialog'); const form = useTemplateRef('form'); const step = ref('storage'); -const target = ref({}); const newTargetId = ref(''); const name = ref(''); const useEncryption = ref(false); @@ -38,7 +37,7 @@ const format = ref(''); const minMemoryLimit = ref(1024 * 1024 * 1024); // 1 GB const maxMemoryLimit = ref(minMemoryLimit.value); // set later -async function onSubmitAdd() { +async function onSubmit() { if (!form.value.reportValidity()) return; // TODO define good default @@ -199,44 +198,6 @@ watch(encryptionPassword, () => { formError.value.password = null; }); -async function onSubmitEdit() { - // TODO set config (eg. provider config passwords) - - // name - let [error] = await backupTargetsModel.setName(target.value.id, name.value); - if (error) { - formError.value.generic = 'Failed to set name'; - busy.value = false; - return console.error(error); - } - - // limits - const limitsConfig = { - memoryLimit: parseInt(limits.value.memoryLimit), - syncConcurrency: parseInt(limits.value.syncConcurrency), - copyConcurrency: parseInt(limits.value.copyConcurrency), - downloadConcurrency: parseInt(limits.value.downloadConcurrency), - uploadPartSize: parseInt(limits.value.uploadPartSize), - // deleteConcurrency: parseInt(providerConfig.value.limits.deleteConcurrency), - }; - - [error] = await backupTargetsModel.setLimits(target.value.id, limitsConfig); - if (error) { - formError.value.generic = 'Failed to set limits'; - busy.value = false; - return console.error(error); - } - - emit('success'); - dialog.value.close(); -} - -async function onSubmit() { - if (target.value) return await onSubmitEdit(); - - await onSubmitAdd(); -} - async function getMemory() { // TODO what is this exactly? // if (props.provisioning) { @@ -251,23 +212,21 @@ async function getMemory() { } defineExpose({ - async open(t = null) { + async open() { step.value = 'storage'; - target.value = t; - formError.value = {}; busy.value = false; - name.value = t?.name || ''; - provider.value = t?.provider || ''; - format.value = t?.format || ''; - providerConfig.value = t?.config || {}; - useEncryption.value = t?.encrypted || false; + name.value = ''; + provider.value = ''; + format.value = ''; + providerConfig.value = {}; + useEncryption.value = false; encryptionPassword.value = ''; encryptionPasswordRepeat.value = ''; - encryptionPasswordHint.value = t?.encryptionPasswordHint || ''; - encryptedFilenames.value = t?.encryptedFilenames || false; - limits.value = t?.limits || {}; + encryptionPasswordHint.value = ''; + encryptedFilenames.value = false; + limits.value = {}; // ensure we have all required child objects if (!providerConfig.value.mountOptions) providerConfig.value.mountOptions = {}; @@ -280,8 +239,8 @@ defineExpose({ if (!limits.value.copyConcurrency) limits.value.copyConcurrency = 10; // needs translation for UI - providerConfig.value.useHardlinks = !(t?.noHardlinks || true); - providerConfig.value.encryptionPassword = t?.password || null; + providerConfig.value.useHardlinks = false; + providerConfig.value.encryptionPassword = null; await getMemory(); diff --git a/dashboard/src/views/BackupTargetsView.vue b/dashboard/src/views/BackupTargetsView.vue index 8100c9e8e..e94075ce1 100644 --- a/dashboard/src/views/BackupTargetsView.vue +++ b/dashboard/src/views/BackupTargetsView.vue @@ -5,11 +5,11 @@ const i18n = useI18n(); const t = i18n.t; import { ref, onMounted, useTemplateRef } from 'vue'; -import { Button, Menu, ButtonGroup, TableView, InputDialog } from '@cloudron/pankow'; +import { Button, Menu, TableView, InputDialog } from '@cloudron/pankow'; import Section from '../components/Section.vue'; import StateLED from '../components/StateLED.vue'; import BackupScheduleDialog from '../components/BackupScheduleDialog.vue'; -import BackupTargetDialog from '../components/BackupTargetDialog.vue'; +import NewBackupTargetDialog from '../components/NewBackupTargetDialog.vue'; import BackupTargetsModel from '../models/BackupTargetsModel.js'; import ProfileModel from '../models/ProfileModel.js'; @@ -33,18 +33,23 @@ const columns = { provider: { label: 'Provider', sort: true, + hideMobile: true, }, format: { label: 'Format', - sort: false, + sort: true, hideMobile: true, }, actions: {} }; -const backupTargetDialog = useTemplateRef('backupTargetDialog'); -function onAddOrEdit(target = null) { - backupTargetDialog.value.open(target); +const newBackupTargetDialog = useTemplateRef('newBackupTargetDialog'); +function onAdd() { + newBackupTargetDialog.value.open(); +} + +function onEdit(target) { + console.log(target); } const backupScheduleDialog = useTemplateRef('backupScheduleDialog'); @@ -52,25 +57,6 @@ function onEditSchedule(target) { backupScheduleDialog.value.open(target); } -async function onMakePrimaryTarget(target) { - // TODO translate - const yes = await inputDialog.value.confirm({ - title: '', - message: 'Make this target the primary backup destination?', - confirmLabel: t('main.dialog.yes'), - confirmStyle: 'primary', - rejectLabel: t('main.dialog.cancel'), - rejectStyle: 'secondary', - }); - - if (!yes) return; - - const [error] = await backupTargetsModel.setPrimary(target.id); - if (error) console.error(error); - - await refresh(); -} - async function onRemoveTarget(target) { // TODO translate const yes = await inputDialog.value.confirm({ @@ -145,14 +131,10 @@ function onActionMenu(target, event) { icon: 'fa-solid fa-clock', label: 'Schedule and Retention', action: onEditSchedule.bind(null, target), - }, { - icon: 'fa-solid fa-crown', - label: 'Set as Primary', - disabled: target.primary, - action: onMakePrimaryTarget.bind(null, target), }, { icon: 'fa-solid fa-pencil-alt', label: 'Edit', + action: onEdit.bind(null, target), }, { separator: true }, { @@ -180,13 +162,13 @@ onMounted(async () => {
TODO Explain what backup targets are and what primary/secondary is