forked from tsai/budibase
41 changed files with 690 additions and 1108 deletions
@ -1,9 +1,15 @@ |
|||
#!/bin/bash |
|||
|
|||
tag=$1 |
|||
tag=${tag:-latest} |
|||
|
|||
pushd ../../build |
|||
docker-compose build --force app-service |
|||
docker-compose build --force worker-service |
|||
docker tag build_app-service budibase/budibase-apps:latest |
|||
|
|||
docker tag build_app-service budibase/budibase-apps:$tag |
|||
docker tag build_worker-service budibase/budibase-worker:$tag |
|||
|
|||
docker push budibase/budibase-apps |
|||
docker tag build_worker-service budibase/budibase-worker:latest |
|||
docker push budibase/budibase-worker |
|||
popd |
|||
|
|||
@ -0,0 +1,41 @@ |
|||
<script> |
|||
export let width = "100" |
|||
export let height = "100" |
|||
</script> |
|||
|
|||
<svg |
|||
version="1.1" |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
xmlns:xlink="http://www.w3.org/1999/xlink" |
|||
x="0px" |
|||
y="0px" |
|||
{width} |
|||
{height} |
|||
viewBox="0 0 2900 2000"> |
|||
<g id="layer101"> |
|||
<path |
|||
fill="#5b350f" |
|||
d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z" /> |
|||
</g> |
|||
<g id="layer102"> |
|||
<path |
|||
fill="#406f23" |
|||
d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z m460 -643 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -51 -100 -126 -173 -238 -230 l-89 -45 -131 0 c-151 0 -222 18 -323 84 -138 89 -243 264 -243 406 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z" /> |
|||
</g> |
|||
<g id="layer103"> |
|||
<path |
|||
fill="#c6d821" |
|||
d="M2215 1789 c-27 -4 -68 -15 -90 -23 -42 -15 -264 -116 -397 -180 l-77 -38 78 -102 c102 -134 144 -208 175 -305 37 -116 49 -200 44 -309 -7 -157 -46 -218 -175 -278 -94 -44 -178 -56 -313 -43 -108 10 -401 53 -479 70 -24 5 -45 8 -47 6 -2 -2 20 -44 49 -92 67 -115 176 -225 281 -284 87 -49 235 -103 335 -121 91 -16 253 -14 346 5 175 37 269 95 419 264 307 347 422 563 457 859 18 148 9 247 -29 325 -88 179 -340 286 -577 246z" /> |
|||
<path |
|||
fill="#c6d821" |
|||
d="M549 1680 c-272 -34 -426 -142 -495 -346 -22 -68 -26 -91 -22 -164 6 -115 32 -173 112 -248 70 -65 236 -153 370 -196 241 -79 722 -172 985 -192 180 -14 343 55 404 170 34 64 30 168 -11 271 -88 223 -245 373 -568 542 -222 116 -379 161 -584 168 -69 2 -155 0 -191 -5z m646 -340 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -50 -100 -126 -173 -235 -229 -84 -42 -90 -44 -200 -48 -190 -8 -312 37 -434 161 -98 99 -155 221 -155 331 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z" /> |
|||
</g> |
|||
<g id="layer104"> |
|||
<path |
|||
fill="#f6f654" |
|||
d="M2190 1721 c-57 -19 -469 -184 -494 -198 -12 -7 -5 -21 34 -72 28 -35 71 -96 97 -137 l46 -74 69 0 c38 0 83 -6 102 -14 52 -22 105 -75 139 -140 28 -55 32 -70 32 -147 0 -84 -2 -90 -48 -183 -96 -187 -234 -296 -376 -296 -44 0 -80 7 -110 20 -28 13 -65 20 -105 20 -72 0 -264 22 -426 49 -63 10 -117 17 -118 15 -10 -8 59 -113 110 -169 106 -115 238 -183 448 -231 155 -35 313 -29 447 17 78 27 210 117 279 191 82 89 277 353 336 456 92 159 137 344 125 513 -9 117 -37 189 -101 258 -109 116 -332 172 -486 122z" /> |
|||
<path |
|||
fill="#f6f654" |
|||
d="M490 1624 c-153 -33 -275 -125 -339 -257 -54 -109 -59 -201 -17 -301 32 -76 164 -189 288 -245 51 -23 260 -91 281 -91 3 0 -21 25 -54 56 -94 91 -150 193 -170 313 -14 90 1 111 123 172 161 81 195 91 343 96 111 5 143 2 215 -16 221 -55 380 -192 380 -327 0 -52 -46 -143 -106 -212 -75 -85 -233 -170 -323 -173 -25 -1 -25 -1 4 -10 140 -43 411 -62 527 -38 142 30 238 125 238 234 0 88 -58 230 -139 337 -105 139 -431 343 -676 423 -161 52 -429 71 -575 39z" /> |
|||
</g> |
|||
</svg> |
|||
@ -0,0 +1,83 @@ |
|||
<script> |
|||
export let width = "100" |
|||
export let height = "100" |
|||
</script> |
|||
|
|||
<svg |
|||
{width} |
|||
{height} |
|||
viewBox="0 0 147 147" |
|||
fill="none" |
|||
xmlns="http://www.w3.org/2000/svg"> |
|||
<path |
|||
d="M128.244 27.5625H83.3444L74.1569 |
|||
45.9375H22.9688V124.031H137.812V27.5625H128.244ZM128.625 |
|||
45.9375H92.7478L97.5621 36.75H128.625V45.9375Z" |
|||
fill="#2A4B59" /> |
|||
<path |
|||
fill-rule="evenodd" |
|||
clip-rule="evenodd" |
|||
d="M73.5827 67.597C72.6671 67.5874 71.7543 67.6986 70.8678 |
|||
67.9278V68.061H70.9964C71.6302 69.0199 72.3383 69.9277 73.1141 |
|||
70.7759C73.647 71.837 74.111 72.889 74.6393 73.9502L74.7679 73.8169C75.2581 |
|||
73.4258 75.6415 72.917 75.8825 72.3379C76.1234 71.7589 76.2141 71.1283 |
|||
76.146 70.5048C75.8564 70.0602 75.5911 69.6001 75.3513 69.1267C74.9562 |
|||
68.4652 74.0926 68.1345 73.5597 67.6062" |
|||
fill="white" /> |
|||
<path |
|||
fill-rule="evenodd" |
|||
clip-rule="evenodd" |
|||
d="M139.319 125.345C134.95 125.032 130.564 125.658 126.457 127.183C125.464 |
|||
127.578 123.875 127.578 123.742 128.836C124.275 129.365 124.339 130.214 |
|||
124.808 130.959C125.714 132.492 126.878 133.858 128.248 134.997C129.626 |
|||
136.058 131.028 137.11 132.488 138.038C135.07 139.632 138.001 140.555 |
|||
140.495 142.144C141.956 143.063 143.408 144.262 144.873 145.259C145.599 |
|||
145.787 146.058 146.637 146.986 146.977V146.775C146.712 146.039 146.374 |
|||
145.329 145.976 144.653C145.314 143.996 144.653 143.394 143.986 |
|||
142.737C142.043 140.171 139.72 137.917 137.096 136.053C134.974 134.592 |
|||
130.338 132.608 129.479 130.164L129.346 130.031C130.906 129.811 132.443 |
|||
129.454 133.94 128.965C136.186 128.372 138.24 128.506 140.56 127.913C141.621 |
|||
127.647 143.541 126.994 143.541 126.994V125.961C142.356 124.785 141.51 |
|||
123.204 140.266 122.097C136.876 119.139 133.264 116.447 129.461 |
|||
114.045C127.426 112.735 124.808 111.885 122.649 110.769C121.868 110.374 |
|||
120.558 110.181 120.099 109.524C119.022 107.943 118.121 106.248 117.412 |
|||
104.471C115.475 100.744 113.684 96.944 112.042 93.0786C111.076 90.527 |
|||
109.961 88.0344 108.702 85.6138C102.629 75.3049 93.8692 66.8402 83.3582 |
|||
61.1245C80.7056 59.8389 77.8847 58.9342 74.9792 58.4372C73.3392 58.3683 |
|||
71.7038 58.2396 70.0685 58.1753C69.0107 57.4823 68.0036 56.7147 67.055 |
|||
55.8784C63.3202 53.5218 53.7009 48.4136 50.9493 55.1572C49.1807 59.4156 |
|||
53.5677 63.6051 55.0836 65.7688C56.3514 67.2941 57.4683 68.9387 58.4187 |
|||
70.6795C58.8781 71.7912 59.0067 72.9764 59.4707 74.1524C60.4281 77.1443 |
|||
61.5648 80.0758 62.8746 82.931C63.5769 84.3429 64.3863 85.699 65.2956 |
|||
86.9873C65.8238 87.7131 66.738 88.0347 66.9355 89.2199C66.2106 90.78 65.7036 |
|||
92.4324 65.4288 94.1306C64.2846 97.7426 63.8637 101.545 64.19 105.32C64.5163 |
|||
109.094 65.5835 112.768 67.3306 116.13C68.378 117.765 70.8678 121.372 |
|||
74.2212 119.993C77.1658 118.817 76.5181 115.083 77.3633 111.812C77.5609 |
|||
111.022 77.4276 110.503 77.8227 109.974V110.618C77.8227 110.618 79.4948 |
|||
114.293 80.3217 116.171C82.5698 119.591 85.3631 122.618 88.5905 |
|||
125.134C89.8767 126.245 90.9145 127.614 91.6361 |
|||
129.153V130.339H93.1153C93.0837 129.805 92.9362 129.285 92.6832 |
|||
128.815C92.4301 128.344 92.0775 127.935 91.6499 127.614C90.4391 126.367 |
|||
89.33 125.024 88.3332 123.6C85.6231 119.742 83.234 115.669 81.1899 |
|||
111.421C80.1655 109.34 79.2743 107.071 78.4337 104.99C78.0524 104.191 |
|||
78.0524 102.983 77.4139 102.583C76.2312 103.981 75.2053 105.505 74.3544 |
|||
107.126C73.3203 110.403 72.7195 113.8 72.5675 117.233C72.3148 117.301 |
|||
72.4388 117.233 72.3148 117.366C70.2752 116.833 69.5586 114.61 68.8052 |
|||
112.772C66.8219 107.009 66.6218 100.781 68.231 94.9023C68.6903 93.5242 |
|||
70.5967 89.0821 69.825 87.7453C69.4391 86.4682 68.1666 85.7378 67.4638 |
|||
84.7318C66.5711 83.3765 65.8024 81.9436 65.1669 80.4504C63.6372 76.7065 |
|||
62.8701 72.5538 61.2117 68.8098C60.2956 67.0053 59.2292 65.2811 58.0236 |
|||
63.6557C56.6915 62.031 55.5163 60.2837 54.514 58.4372C54.2707 58.0251 |
|||
54.1215 57.5643 54.077 57.0878C54.0326 56.6113 54.0939 56.1309 54.2568 |
|||
55.6809C54.2928 55.4547 54.4023 55.2467 54.5684 55.0889C54.7344 54.9312 |
|||
54.9478 54.8325 55.1755 54.8081C56.0024 54.0731 58.3636 55.0056 59.1905 |
|||
55.4099C61.4133 56.2841 63.5306 57.4059 65.5023 58.7541C66.421 59.4248 |
|||
68.4974 61.1245 68.4974 61.1245H69.1176C71.2353 61.5839 73.624 61.2531 |
|||
75.6085 61.8503C78.9646 62.967 82.1671 64.5011 85.1406 66.4165C93.9149 |
|||
72.002 101.049 79.8174 105.812 89.0637C106.607 90.5842 106.942 91.9761 |
|||
107.65 93.561C109.028 96.8133 110.764 100.125 112.152 103.3C113.372 106.43 |
|||
114.951 109.408 116.856 112.175C117.848 113.553 121.822 114.293 123.609 |
|||
115.023C125.17 115.557 126.703 116.17 128.202 116.86C130.453 118.239 132.7 |
|||
119.842 134.822 121.367C135.879 122.162 139.191 123.815 139.388 125.143" |
|||
fill="#F3FDFF" /> |
|||
</svg> |
|||
@ -1,60 +1,59 @@ |
|||
<script> |
|||
import { flip } from 'svelte/animate'; |
|||
import { fly } from "svelte/transition" |
|||
import { getContext } from "svelte" |
|||
const { notifications } = getContext("sdk") |
|||
|
|||
export let themes = { |
|||
danger: "#E26D69", |
|||
success: "#84C991", |
|||
warning: "#f0ad4e", |
|||
info: "#5bc0de", |
|||
default: "#aaaaaa", |
|||
} |
|||
</script> |
|||
|
|||
<div class="notifications"> |
|||
{#each $notifications as notification (notification.id)} |
|||
<div |
|||
animate:flip |
|||
class="toast" |
|||
style="background: {themes[notification.type]};" |
|||
transition:fly={{ y: -30 }}> |
|||
<div class="content">{notification.message}</div> |
|||
{#if notification.icon}<i class={notification.icon} />{/if} |
|||
</div> |
|||
{/each} |
|||
</div> |
|||
|
|||
<style> |
|||
.notifications { |
|||
position: fixed; |
|||
top: 10px; |
|||
left: 0; |
|||
right: 0; |
|||
margin: 0 auto; |
|||
padding: 0; |
|||
z-index: 9999; |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
pointer-events: none; |
|||
} |
|||
|
|||
.toast { |
|||
flex: 0 0 auto; |
|||
margin-bottom: 10px; |
|||
border-radius: var(--border-radius-s); |
|||
/* The toasts now support being auto sized, so this static width could be removed */ |
|||
width: 40vw; |
|||
} |
|||
|
|||
.content { |
|||
padding: 10px; |
|||
display: block; |
|||
color: white; |
|||
font-weight: 500; |
|||
} |
|||
</style> |
|||
|
|||
import { flip } from "svelte/animate" |
|||
import { fly } from "svelte/transition" |
|||
import { getContext } from "svelte" |
|||
const { notifications } = getContext("sdk") |
|||
|
|||
export let themes = { |
|||
danger: "#E26D69", |
|||
success: "#84C991", |
|||
warning: "#f0ad4e", |
|||
info: "#5bc0de", |
|||
default: "#aaaaaa", |
|||
} |
|||
</script> |
|||
|
|||
<div class="notifications"> |
|||
{#each $notifications as notification (notification.id)} |
|||
<div |
|||
animate:flip |
|||
class="toast" |
|||
style="background: {themes[notification.type]};" |
|||
transition:fly={{ y: -30 }}> |
|||
<div class="content">{notification.message}</div> |
|||
{#if notification.icon}<i class={notification.icon} />{/if} |
|||
</div> |
|||
{/each} |
|||
</div> |
|||
|
|||
<style> |
|||
.notifications { |
|||
position: fixed; |
|||
top: 10px; |
|||
left: 0; |
|||
right: 0; |
|||
margin: 0 auto; |
|||
padding: 0; |
|||
z-index: 9999; |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
pointer-events: none; |
|||
} |
|||
|
|||
.toast { |
|||
flex: 0 0 auto; |
|||
margin-bottom: 10px; |
|||
border-radius: var(--border-radius-s); |
|||
/* The toasts now support being auto sized, so this static width could be removed */ |
|||
width: 40vw; |
|||
} |
|||
|
|||
.content { |
|||
padding: 10px; |
|||
display: block; |
|||
color: white; |
|||
font-weight: 500; |
|||
} |
|||
</style> |
|||
|
|||
@ -0,0 +1,83 @@ |
|||
const { Database, aql } = require("arangojs") |
|||
const { FIELD_TYPES, QUERY_TYPES } = require("./Integration") |
|||
|
|||
const SCHEMA = { |
|||
docs: "https://github.com/arangodb/arangojs", |
|||
datasource: { |
|||
url: { |
|||
type: FIELD_TYPES.STRING, |
|||
default: "http://localhost:8529", |
|||
required: true, |
|||
}, |
|||
username: { |
|||
type: FIELD_TYPES.STRING, |
|||
default: "root", |
|||
required: true, |
|||
}, |
|||
password: { |
|||
type: FIELD_TYPES.PASSWORD, |
|||
required: true, |
|||
}, |
|||
databaseName: { |
|||
type: FIELD_TYPES.STRING, |
|||
default: "_system", |
|||
required: true, |
|||
}, |
|||
collection: { |
|||
type: FIELD_TYPES.STRING, |
|||
required: true, |
|||
}, |
|||
}, |
|||
query: { |
|||
read: { |
|||
type: QUERY_TYPES.SQL, |
|||
}, |
|||
create: { |
|||
type: QUERY_TYPES.JSON, |
|||
}, |
|||
}, |
|||
} |
|||
|
|||
class ArangoDBIntegration { |
|||
constructor(config) { |
|||
config.auth = { |
|||
username: config.username, |
|||
password: config.password, |
|||
} |
|||
|
|||
this.config = config |
|||
this.client = new Database(config) |
|||
} |
|||
|
|||
async read(query) { |
|||
try { |
|||
const result = await this.client.query(query.sql) |
|||
return result.all() |
|||
} catch (err) { |
|||
console.error("Error querying arangodb", err.message) |
|||
throw err |
|||
} finally { |
|||
this.client.close() |
|||
} |
|||
} |
|||
|
|||
async create(query) { |
|||
const clc = this.client.collection(this.config.collection) |
|||
try { |
|||
const result = await this.client.query( |
|||
aql`INSERT ${query.json} INTO ${clc} RETURN NEW` |
|||
) |
|||
return result.all() |
|||
} catch (err) { |
|||
console.error("Error querying arangodb", err.message) |
|||
throw err |
|||
} finally { |
|||
this.client.close() |
|||
} |
|||
} |
|||
} |
|||
|
|||
module.exports = { |
|||
schema: SCHEMA, |
|||
integration: ArangoDBIntegration, |
|||
} |
|||
@ -0,0 +1,80 @@ |
|||
const mysql = require("mysql") |
|||
|
|||
const SCHEMA = { |
|||
docs: "https://github.com/mysqljs/mysql", |
|||
datasource: { |
|||
host: { |
|||
type: "string", |
|||
default: "localhost", |
|||
required: true, |
|||
}, |
|||
user: { |
|||
type: "string", |
|||
default: "root", |
|||
required: true, |
|||
}, |
|||
password: { |
|||
type: "password", |
|||
default: "root", |
|||
required: true, |
|||
}, |
|||
database: { |
|||
type: "string", |
|||
required: true, |
|||
}, |
|||
}, |
|||
query: { |
|||
create: { |
|||
type: "sql", |
|||
}, |
|||
read: { |
|||
type: "sql", |
|||
}, |
|||
update: { |
|||
type: "sql", |
|||
}, |
|||
delete: { |
|||
type: "sql", |
|||
}, |
|||
}, |
|||
} |
|||
|
|||
class MySQLIntegration { |
|||
constructor(config) { |
|||
this.config = config |
|||
this.client = mysql.createConnection(config) |
|||
} |
|||
|
|||
query(query) { |
|||
// Node MySQL is callback based, so we must wrap our call in a promise
|
|||
return new Promise((resolve, reject) => { |
|||
this.client.connect() |
|||
return this.client.query(query.sql, (error, results) => { |
|||
if (error) return reject(error) |
|||
resolve(results) |
|||
this.client.end() |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
create(query) { |
|||
return this.query(query) |
|||
} |
|||
|
|||
read(query) { |
|||
return this.query(query) |
|||
} |
|||
|
|||
update(query) { |
|||
return this.query(query) |
|||
} |
|||
|
|||
delete(query) { |
|||
return this.query(query) |
|||
} |
|||
} |
|||
|
|||
module.exports = { |
|||
schema: SCHEMA, |
|||
integration: MySQLIntegration, |
|||
} |
|||
File diff suppressed because it is too large
@ -1,3 +0,0 @@ |
|||
* |
|||
!dist/* |
|||
!components.json |
|||
Loading…
Reference in new issue