forked from tsai/budibase
26 changed files with 263 additions and 70 deletions
@ -0,0 +1,110 @@ |
|||||
|
<script> |
||||
|
import { onMount, onDestroy } from "svelte" |
||||
|
import { Button, Modal, notifications, ModalContent } from "@budibase/bbui" |
||||
|
import { store } from "builderStore" |
||||
|
import api from "builderStore/api" |
||||
|
import analytics from "analytics" |
||||
|
import FeedbackIframe from "components/feedback/FeedbackIframe.svelte" |
||||
|
|
||||
|
const DeploymentStatus = { |
||||
|
SUCCESS: "SUCCESS", |
||||
|
PENDING: "PENDING", |
||||
|
FAILURE: "FAILURE", |
||||
|
} |
||||
|
|
||||
|
const POLL_INTERVAL = 1000 |
||||
|
|
||||
|
|
||||
|
let loading = false |
||||
|
let feedbackModal |
||||
|
let deployments = [] |
||||
|
let poll |
||||
|
let publishModal |
||||
|
|
||||
|
$: appId = $store.appId |
||||
|
|
||||
|
async function deployApp() { |
||||
|
try { |
||||
|
notifications.info(`Deployment started. Please wait.`) |
||||
|
const response = await api.post("/api/deploy") |
||||
|
const json = await response.json() |
||||
|
if (response.status !== 200) { |
||||
|
throw new Error() |
||||
|
} |
||||
|
|
||||
|
if (analytics.requestFeedbackOnDeploy()) { |
||||
|
feedbackModal.show() |
||||
|
} |
||||
|
} catch (err) { |
||||
|
analytics.captureException(err) |
||||
|
notifications.error("Deployment unsuccessful. Please try again later.") |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async function fetchDeployments() { |
||||
|
try { |
||||
|
const response = await api.get(`/api/deployments`) |
||||
|
const json = await response.json() |
||||
|
|
||||
|
if (deployments.length > 0) { |
||||
|
checkIncomingDeploymentStatus(deployments, json) |
||||
|
} |
||||
|
|
||||
|
deployments = json |
||||
|
} catch (err) { |
||||
|
console.error(err) |
||||
|
clearInterval(poll) |
||||
|
notifications.error( |
||||
|
"Error fetching deployment history. Please try again." |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Required to check any updated deployment statuses between polls |
||||
|
function checkIncomingDeploymentStatus(current, incoming) { |
||||
|
for (let incomingDeployment of incoming) { |
||||
|
if (incomingDeployment.status === DeploymentStatus.FAILURE || incomingDeployment.status === DeploymentStatus.SUCCESS) { |
||||
|
const currentDeployment = current.find( |
||||
|
deployment => deployment._id === incomingDeployment._id |
||||
|
) |
||||
|
|
||||
|
// We have just been notified of an ongoing deployments status change |
||||
|
if ( |
||||
|
!currentDeployment || |
||||
|
currentDeployment.status === DeploymentStatus.PENDING |
||||
|
) { |
||||
|
if (incomingDeployment.status === DeploymentStatus.FAILURE) { |
||||
|
notifications.error(incomingDeployment.err) |
||||
|
} else { |
||||
|
notifications.send("Published to Production.", "success", "CheckmarkCircle") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
onMount(() => { |
||||
|
fetchDeployments() |
||||
|
poll = setInterval(fetchDeployments, POLL_INTERVAL) |
||||
|
}) |
||||
|
|
||||
|
onDestroy(() => clearInterval(poll)) |
||||
|
</script> |
||||
|
|
||||
|
|
||||
|
<Button |
||||
|
secondary |
||||
|
on:click={publishModal.show} |
||||
|
> |
||||
|
Publish |
||||
|
</Button> |
||||
|
<Modal bind:this={publishModal}> |
||||
|
<ModalContent |
||||
|
title="Publish to Production" |
||||
|
confirmText="Publish" |
||||
|
onConfirm={deployApp} |
||||
|
> |
||||
|
<span>The changes you have made will be published to the production version of the application.</span> |
||||
|
</ModalContent> |
||||
|
</Modal> |
||||
@ -0,0 +1,35 @@ |
|||||
|
<script> |
||||
|
import { onMount, onDestroy } from "svelte" |
||||
|
import { Button, Icon, Modal, notifications, ModalContent } from "@budibase/bbui" |
||||
|
import { store } from "builderStore" |
||||
|
import { apps } from "stores/portal" |
||||
|
import api from "builderStore/api" |
||||
|
|
||||
|
let revertModal |
||||
|
|
||||
|
$: appId = $store.appId |
||||
|
|
||||
|
const revert = async () => { |
||||
|
try { |
||||
|
const response = await api.post(`/api/dev/${appId}/revert`) |
||||
|
const json = await response.json() |
||||
|
if (response.status !== 200) throw json.message |
||||
|
|
||||
|
notifications.info("Changes reverted.") |
||||
|
} catch (err) { |
||||
|
notifications.error(`Error reverting changes: ${err}`) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
|
||||
|
<Icon name="Revert" hoverable on:click={revertModal.show} /> |
||||
|
<Modal bind:this={revertModal}> |
||||
|
<ModalContent |
||||
|
title="Revert Changes" |
||||
|
confirmText="Revert" |
||||
|
onConfirm={revert} |
||||
|
> |
||||
|
<span>The changes you have made will be deleted and the application reverted back to its production state.</span> |
||||
|
</ModalContent> |
||||
|
</Modal> |
||||
@ -1,2 +1,2 @@ |
|||||
<!-- routify:options index=4 --> |
<!-- routify:options index=4 --> |
||||
<slot /> |
<!-- <slot /> --> |
||||
Loading…
Reference in new issue