diff --git a/packages/builder/package.json b/packages/builder/package.json
index 0926b82fb0..1cb53bc99b 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -38,6 +38,7 @@
]
},
"dependencies": {
+ "@beyonk/svelte-notifications": "^2.0.3",
"@budibase/client": "^0.0.32",
"@nx-js/compiler-util": "^2.0.0",
"codemirror": "^5.51.0",
diff --git a/packages/builder/rollup.config.js b/packages/builder/rollup.config.js
index fd7c487c3f..ae9a7e069e 100644
--- a/packages/builder/rollup.config.js
+++ b/packages/builder/rollup.config.js
@@ -152,7 +152,7 @@ export default {
{
find: "builderStore",
replacement: path.resolve(projectRootDir, "src/builderStore"),
- },
+ }
],
customResolver,
}),
diff --git a/packages/builder/src/App.svelte b/packages/builder/src/App.svelte
index c6b76090f9..54968a52c2 100644
--- a/packages/builder/src/App.svelte
+++ b/packages/builder/src/App.svelte
@@ -7,6 +7,8 @@
import AppNotification, {
showAppNotification,
} from "components/common/AppNotification.svelte"
+ import { NotificationDisplay } from '@beyonk/svelte-notifications'
+
function showErrorBanner() {
showAppNotification({
@@ -24,8 +26,7 @@
$basepath = "/_builder"
-
{@html block.body} @@ -21,7 +32,6 @@ div { width: 320px; padding: 20px; - margin-bottom: 60px; border-radius: 5px; transition: 0.3s all; box-shadow: 0 4px 30px 0 rgba(57, 60, 68, 0.08); @@ -30,6 +40,18 @@ color: var(--white); } + header { + font-size: 16px; + font-weight: 500; + display: flex; + align-items: center; + } + + header i { + font-size: 20px; + margin-right: 5px; + } + .ACTION { background-color: var(--white); color: var(--font); diff --git a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/BlockList/BlockList.svelte b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/BlockList/BlockList.svelte index 8db781af36..e288e78e94 100644 --- a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/BlockList/BlockList.svelte +++ b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/BlockList/BlockList.svelte @@ -52,16 +52,21 @@ grid-gap: 5px; grid-auto-flow: column; grid-auto-columns: 1fr 1fr 1fr; + margin-bottom: 10px; } .subtabs span { + transition: 0.3s all; text-align: center; - color: var(--font); + color: var(--dark-grey); font-weight: 500; + padding: 10px; } .subtabs span.selected { - border-bottom: 4px solid var(--primary); + background: var(--dark-grey); + color: var(--white); + border-radius: 2px; } .subtabs span:not(.selected) { diff --git a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/CreateWorkflowModal.svelte b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/CreateWorkflowModal.svelte index 510b21704e..0a31cf3702 100644 --- a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/CreateWorkflowModal.svelte +++ b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/CreateWorkflowModal.svelte @@ -1,5 +1,6 @@ diff --git a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/WorkflowList.svelte b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/WorkflowList.svelte index 2218414ad9..2dc3e05a80 100644 --- a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/WorkflowList.svelte +++ b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowList/WorkflowList.svelte @@ -1,5 +1,6 @@ @@ -82,7 +85,7 @@ display: flex; align-items: center; border-radius: 3px; - height: 40px; + height: 32px; font-weight: 500; } diff --git a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowPanel.svelte b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowPanel.svelte index c9625d2441..016c789c64 100644 --- a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowPanel.svelte +++ b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/WorkflowPanel.svelte @@ -5,17 +5,6 @@ import api from "builderStore/api" import blockDefinitions from "./blockDefinitions" - const WORKFLOW_TABS = [ - { - name: "Workflows", - key: "WORKFLOWS", - }, - { - name: "Add", - key: "ADD", - }, - ] - let selectedTab = "WORKFLOWS" let definitions = [] @@ -57,15 +46,4 @@ span:not(.selected) { color: var(--dark-grey); } - - .delete-workflow-button { - font-family: Roboto; - width: 100%; - border: solid 1px #f2f2f2; - border-radius: 2px; - background: var(--white); - height: 32px; - font-size: 12px; - font-weight: 500; - } diff --git a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/blockDefinitions.js b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/blockDefinitions.js index c0d81b95e8..1d6402ebe5 100644 --- a/packages/builder/src/pages/[application]/workflow/WorkflowPanel/blockDefinitions.js +++ b/packages/builder/src/pages/[application]/workflow/WorkflowPanel/blockDefinitions.js @@ -2,7 +2,7 @@ const ACTION = { SET_STATE: { name: "Update UI State", tagline: "Update {{path}} to {{value}}", - icon: "", + icon: "ri-refresh-line", description: "Update your User Interface with some data.", environment: "CLIENT", params: { @@ -38,8 +38,8 @@ const ACTION = { }, }, FIND_RECORD: { - description: "Delete a record from your database.", - icon: "ri-delete-bin-line", + description: "Find a record in your database.", + icon: "ri-search-line", name: "Find Record", environment: "SERVER", params: { @@ -59,7 +59,7 @@ const ACTION = { }, SEND_EMAIL: { description: "Send an email.", - tagline: "Send email to {{to}}", + tagline: "Send email to {{to}}", icon: "ri-mail-open-fill", name: "Send Email", environment: "SERVER", @@ -73,9 +73,9 @@ const ACTION = { } const TRIGGER = { - SAVE_RECORD: { + RECORD_SAVED: { name: "Record Saved", - icon: "ri-delete-bin-line", + icon: "ri-save-line", tagline: "Record is added to {{model}}", description: "Save a record to your database.", environment: "SERVER", @@ -83,39 +83,72 @@ const TRIGGER = { model: "model", }, }, + RECORD_DELETED: { + name: "Record Deleted", + icon: "ri-delete-bin-line", + tagline: "Record is deleted from {{model}}", + description: "Fired when a record is deleted from your database.", + environment: "SERVER", + params: { + model: "model" + }, + }, CLICK: { name: "Click", icon: "ri-cursor-line", + tagline: "{{component}} is clicked", description: "Trigger when you click on an element in the UI.", + environment: "CLIENT", + params: { + component: "component" + } }, LOAD: { name: "Load", icon: "ri-loader-line", + tagline: "{{component}} is loaded", description: "Trigger an element has finished loading.", + environment: "CLIENT", + params: { + component: "component" + } }, INPUT: { name: "Input", icon: "ri-text", - description: "Trigger when you environment into an input box.", + tagline: "Text entered into {{component}", + description: "Trigger when you type into an input box.", + environment: "CLIENT", + params: { + component: "component" + } }, } const LOGIC = { FILTER: { name: "Filter", - tagline: "{{key}} {{condition}} {{value}}", + tagline: "{{field}} {{condition}} {{value}}", icon: "ri-git-branch-line", description: "Filter any workflows which do not meet certain conditions.", environment: "CLIENT", params: { - if: "string", + field: "string", + condition: [ + "equals" + ], + value: "string" }, }, DELAY: { name: "Delay", - icon: "ri-git-branch-line", + icon: "ri-time-fill", + tagline: "Delay for {{time}} milliseconds", description: "Delay the workflow until an amount of time has passed.", environment: "CLIENT", + params: { + time: "number", + }, }, } diff --git a/packages/client/src/api/workflow/orchestrator.js b/packages/client/src/api/workflow/orchestrator.js index afa92d007e..532219eebc 100644 --- a/packages/client/src/api/workflow/orchestrator.js +++ b/packages/client/src/api/workflow/orchestrator.js @@ -1,7 +1,7 @@ import get from "lodash/fp/get" /** - * The workflow orhestrator is a class responsible for executing workflows. + * The workflow orchestrator is a class responsible for executing workflows. * It relies on the strategy pattern, which allows composable behaviour to be * passed into its execute() function. This allows custom execution behaviour based * on where the orchestrator is run. @@ -30,6 +30,7 @@ export default class Orchestrator { // Execute a workflow from a running budibase app export const clientStrategy = { + delay: ms => new Promise(resolve => setTimeout(resolve, ms)), context: {}, bindContextArgs: function(args, api) { const mappedArgs = { ...args } @@ -80,6 +81,10 @@ export const clientStrategy = { SET_STATE: block.args, } } + + if (block.actionId === "DELAY") { + await this.delay(block.args.time) + } } // this workflow block gets executed on the server @@ -102,6 +107,6 @@ export const clientStrategy = { console.log("workflowContext", this.context) // TODO: clean this up, don't pass all those args - this.run({ workflow: workflow.next, instanceId, api }) + await this.run({ workflow: workflow.next, instanceId, api }) }, }