add restore funtionality

This commit is contained in:
Peter Clement 2022-10-20 13:33:50 +01:00
parent f5c9e22d42
commit 047d605f2f
4 changed files with 53 additions and 20 deletions

View File

@ -1,5 +1,12 @@
<script> <script>
import { ActionButton, ActionMenu, MenuItem, Icon } from "@budibase/bbui" import {
ActionButton,
ActionMenu,
MenuItem,
Icon,
Heading,
Body,
} from "@budibase/bbui"
import ConfirmDialog from "components/common/ConfirmDialog.svelte" import ConfirmDialog from "components/common/ConfirmDialog.svelte"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
@ -7,13 +14,16 @@
let deleteDialog let deleteDialog
let restoreDialog let restoreDialog
let editDialog
let restoreBackupName
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
const onClickRestore = () => { const onClickRestore = () => {
dispatch("buttonclick", { dispatch("buttonclick", {
type: "backupRestore", type: "backupRestore",
backupId: row._id, backupId: row._id,
restoreBackupName,
}) })
} }
@ -33,7 +43,8 @@
</div> </div>
<MenuItem on:click={deleteDialog.show} icon="Delete">Delete</MenuItem> <MenuItem on:click={deleteDialog.show} icon="Delete">Delete</MenuItem>
<MenuItem on:click={editDialog.show} icon="Edit">Edit</MenuItem> <MenuItem icon="Edit">Edit</MenuItem>
<MenuItem icon="Edit">Download</MenuItem>
</ActionMenu> </ActionMenu>
</div> </div>
@ -55,8 +66,8 @@
title="Confirm Restore" title="Confirm Restore"
warning={false} warning={false}
> >
Are you sure you wish to restore this backup <Heading size="S">{row.name}</Heading>
<i>{row.name}</i>. This action cannot be undone. <Body size="S">{new Date(row.timestamp).toLocaleString()}</Body>
</ConfirmDialog> </ConfirmDialog>
<style> <style>

View File

@ -80,9 +80,21 @@
function flattenBackups(backups) { function flattenBackups(backups) {
let flattened = backups.map(backup => { let flattened = backups.map(backup => {
if (!backup.name) {
if (backup.trigger === "publish") {
backup.name = "Published Backup"
} else if (backup.trigger === "scheduled") {
backup.name = "Scheduled Backup"
}
}
if (backup.type === "restore") {
backup.trigger = "restore"
backup.name = "Restored"
}
return { return {
...backup, ...backup,
days: getDaysBetween(backup.createdAt), days: getDaysBetween(backup.timestamp),
...backup?.contents, ...backup?.contents,
} }
}) })
@ -123,19 +135,15 @@
} }
} }
function selectBackup({ detail }) {
console.log(detail)
}
async function deleteBackup(backupId) { async function deleteBackup(backupId) {
await backups.deleteBackup({ appId: app.instance._id, backupId }) await backups.deleteBackup({ appId: app.instance._id, backupId })
await fetchBackups(app.instance._id, trigger, page) await fetchBackups(app.instance._id, trigger, page)
} }
async function restoreBackup(backupId) { async function restoreBackup(backupId) {
console.log(backupId) backups.restoreBackup({ appId: app.instance._id, backupId })
//backups.restoreBackup(app.instance._id, backupId)
} }
async function handleButtonClick({ detail }) { function handleButtonClick({ detail }) {
if (detail.type === "backupDelete") { if (detail.type === "backupDelete") {
deleteBackup(detail.backupId) deleteBackup(detail.backupId)
} else if (detail.type === "backupRestore") { } else if (detail.type === "backupRestore") {
@ -152,6 +160,7 @@
placeholder="All" placeholder="All"
label="Trigger" label="Trigger"
options={Object.values(triggers)} options={Object.values(triggers)}
bind:value={trigger}
/> />
</div> </div>
<div> <div>
@ -167,7 +176,6 @@
{#if backupData} {#if backupData}
<div> <div>
<Table <Table
on:click={selectBackup}
{schema} {schema}
allowSelectRows={false} allowSelectRows={false}
allowEditColumns={false} allowEditColumns={false}

View File

@ -2,8 +2,8 @@
import { Icon } from "@budibase/bbui" import { Icon } from "@budibase/bbui"
export let value export let value
$: console.log(value)
let trigger = value.charAt(0).toUpperCase() + value.slice(1) let trigger = value?.charAt(0).toUpperCase() + value?.slice(1)
</script> </script>
<div class="cell"> <div class="cell">
@ -16,6 +16,9 @@
{:else if value === "scheduled"} {:else if value === "scheduled"}
<Icon name="Clock" /> <Icon name="Clock" />
<div>{trigger}</div> <div>{trigger}</div>
{:else if value === "restore"}
<Icon name="Refresh" />
<div>{trigger}</div>
{/if} {/if}
</div> </div>

View File

@ -2,12 +2,17 @@ export const buildBackupsEndpoints = API => ({
/** /**
* Gets a list of users in the current tenant. * Gets a list of users in the current tenant.
*/ */
searchBackups: async ({ appId, page }) => { searchBackups: async ({ appId, trigger, page }) => {
const opts = {}
if (page) {
opts.page = page
}
if (trigger) {
opts.trigger = trigger.toLowerCase()
}
return await API.post({ return await API.post({
url: `/api/apps/${appId}/backups/search`, url: `/api/apps/${appId}/backups/search`,
body: { body: opts,
page,
},
}) })
}, },
@ -26,7 +31,13 @@ export const buildBackupsEndpoints = API => ({
updateBackup: async ({ appId, backupId }) => { updateBackup: async ({ appId, backupId }) => {
return await API.patch({ return await API.patch({
url: `/api/apps/${appId}/backups/${backupId}}`, url: `/api/apps/${appId}/backups/${backupId}`,
})
},
restoreBackup: async ({ appId, backupId }) => {
return await API.post({
url: `/api/apps/${appId}/backups/${backupId}/import`,
}) })
}, },
}) })