Merge branch 'feature/backups-ui' of github.com:Budibase/budibase into feature/backups-ui

This commit is contained in:
mike12345567 2022-10-20 12:51:03 +01:00
commit f9b97ef6f7
10 changed files with 116 additions and 36 deletions

View File

@ -56,6 +56,7 @@
{schema}
value={cellValue}
on:clickrelationship
on:buttonclick
>
<slot />
</svelte:component>

View File

@ -387,6 +387,7 @@
schema={schema[field]}
value={deepGet(row, field)}
on:clickrelationship
on:buttonclick
>
<slot />
</CellRenderer>

View File

@ -1,20 +1,64 @@
<script>
import { ActionButton, ActionMenu, MenuItem, Icon } from "@budibase/bbui"
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
import { createEventDispatcher } from "svelte"
export let value
export let row
let deleteDialog
let restoreDialog
let editDialog
const dispatch = createEventDispatcher()
const onClickRestore = () => {
dispatch("buttonclick", {
type: "backupRestore",
backupId: row._id,
})
}
const onClickDelete = () => {
dispatch("buttonclick", {
type: "backupDelete",
backupId: row._id,
})
}
</script>
<div class="cell">
<ActionButton>Restore</ActionButton>
<ActionButton on:click={restoreDialog.show}>Restore</ActionButton>
<ActionMenu>
<div slot="control">
<Icon size="M" hoverable name="MoreSmallList" />
</div>
<MenuItem icon="Delete">Delete</MenuItem>
<MenuItem on:click={deleteDialog.show} icon="Delete">Delete</MenuItem>
<MenuItem on:click={editDialog.show} icon="Edit">Edit</MenuItem>
</ActionMenu>
</div>
<ConfirmDialog
bind:this={deleteDialog}
okText="Delete Backup"
onOk={onClickDelete}
title="Confirm Deletion"
>
Are you sure you wish to delete the backup
<i>{row.name}</i>
This action cannot be undone.
</ConfirmDialog>
<ConfirmDialog
bind:this={restoreDialog}
okText="Restore Backup"
onOk={onClickRestore}
title="Confirm Restore"
warning={false}
>
Are you sure you wish to restore this backup
<i>{row.name}</i>. This action cannot be undone.
</ConfirmDialog>
<style>
.cell {
display: flex;

View File

@ -6,7 +6,7 @@
<div class="cell">
<Icon name="JourneyVoyager" />
<div>{value}</div>
<div>{value || 0}</div>
</div>
<style>

View File

@ -11,6 +11,7 @@
} from "@budibase/bbui"
import { backups } from "stores/portal"
import { createPaginationStore } from "helpers/pagination"
import DatasourceRenderer from "./DatasourceRenderer.svelte"
import ScreensRenderer from "./ScreensRenderer.svelte"
import AutomationsRenderer from "./AutomationsRenderer.svelte"
@ -27,9 +28,8 @@
let trigger = null
let pageInfo = createPaginationStore()
$: page = $pageInfo.page
$: console.log(page)
$: fetchBackups(app.instance._id, trigger, page)
$: fetchBackups(trigger, page)
const triggers = {
PUBLISH: "publish",
@ -83,7 +83,7 @@
return {
...backup,
days: getDaysBetween(backup.createdAt),
//...Object.assign(...backup?.contents),
...backup?.contents,
}
})
}
@ -92,15 +92,18 @@
const now = new Date()
const backupDate = new Date(date)
backupDate.setDate(backupDate.getDate() - 1)
console.log(backupDate)
const oneDay = 24 * 60 * 60 * 1000
return now > backupDate
? Math.round(Math.abs((now - backupDate) / oneDay))
: 0
}
async function fetchBackups(appId, trigger, page) {
const response = await backups.searchBackups(appId, trigger, page)
async function fetchBackups(trigger, page) {
const response = await backups.searchBackups({
appId: app.instance._id,
trigger,
page,
})
pageInfo.fetched(response.hasNextPage, response.nextPage)
// flatten so we have an easier structure to use for the table schema
@ -118,6 +121,26 @@
notifications.error("Unable to create backup")
}
}
function selectBackup({ detail }) {
console.log(detail)
}
async function deleteBackup(backupId) {
await backups.deleteBackup({ appId: app.instance._id, backupId })
await fetchBackups(app.instance._id, trigger, page)
}
async function restoreBackup(backupId) {
console.log(backupId)
//backups.restoreBackup(app.instance._id, backupId)
}
async function handleButtonClick({ detail }) {
if (detail.type === "backupDelete") {
deleteBackup(detail.backupId)
} else if (detail.type === "backupRestore") {
restoreBackup(detail.backupId)
}
}
</script>
<div class="root">
@ -143,6 +166,7 @@
{#if backupData}
<div>
<Table
on:click={selectBackup}
{schema}
allowSelectRows={false}
allowEditColumns={false}
@ -151,6 +175,7 @@
{customRenderers}
placeholderText="No backups found"
border={false}
on:buttonclick={handleButtonClick}
/>
<div class="pagination">
<Pagination

View File

@ -6,7 +6,7 @@
<div class="cell">
<Icon name="Data" />
<div>{value}</div>
<div>{value || 0}</div>
</div>
<style>

View File

@ -1,6 +1,5 @@
<script>
export let value
$: console.log(value)
</script>
<div class="cell">

View File

@ -6,7 +6,7 @@
<div class="cell">
<Icon name="WebPage" />
<div>{value}</div>
<div>{value || 0}</div>
</div>
<style>

View File

@ -2,38 +2,38 @@ import { writable } from "svelte/store"
import { API } from "api"
export function createBackupsStore() {
const { subscribe, set } = writable([])
const store = writable({})
async function load() {
set([
{
trigger: "PUBLISH",
name: "A Backup",
date: "1665407451",
userId: "Peter Clement",
contents: [
{ datasources: ["datasource1", "datasource2"] },
{ screens: ["screen1", "screen2"] },
{ automations: ["automation1", "automation2"] },
],
},
])
function selectBackup(backupId) {
store.update(state => {
state.selectedBackup = backupId
return state
})
}
async function searchBackups(appId, trigger, page) {
async function searchBackups({ appId, trigger, page } = {}) {
return API.searchBackups({ appId, trigger, page })
}
async function restoreBackup({ appId, backupId }) {
return API.restoreBackup({ appId, backupId })
}
async function deleteBackup({ appId, backupId }) {
return API.deleteBackup({ appId, backupId })
}
async function createManualBackup(appId, name) {
let resp = API.createManualBackup(appId, name)
return resp
return API.createManualBackup(appId, name)
}
return {
subscribe,
load,
createManualBackup,
searchBackups,
selectBackup,
deleteBackup,
restoreBackup,
subscribe: store.subscribe,
}
}

View File

@ -2,13 +2,11 @@ export const buildBackupsEndpoints = API => ({
/**
* Gets a list of users in the current tenant.
*/
searchBackups: async ({ appId, trigger, page }) => {
console.log(page)
searchBackups: async ({ appId, page }) => {
return await API.post({
url: `/api/apps/${appId}/backups/search`,
body: {
page,
trigger,
},
})
},
@ -19,4 +17,16 @@ export const buildBackupsEndpoints = API => ({
body: { name },
})
},
deleteBackup: async ({ appId, backupId }) => {
return await API.delete({
url: `/api/apps/${appId}/backups/${backupId}`,
})
},
updateBackup: async ({ appId, backupId }) => {
return await API.patch({
url: `/api/apps/${appId}/backups/${backupId}}`,
})
},
})