{heading}
\n{description}
\ndiff --git a/.github/workflows/ecs_deploy.yml b/.github/workflows/ecs_deploy.yml
new file mode 100644
index 0000000000..0d662c9c28
--- /dev/null
+++ b/.github/workflows/ecs_deploy.yml
@@ -0,0 +1,85 @@
+# This workflow will build and push a new container image to Amazon ECR,
+# and then will deploy a new task definition to Amazon ECS, when a release is created
+#
+# To use this workflow, you will need to complete the following set-up steps:
+#
+# 1. Create an ECR repository to store your images.
+# For example: `aws ecr create-repository --repository-name my-ecr-repo --region us-east-2`.
+# Replace the value of `ECR_REPOSITORY` in the workflow below with your repository's name.
+# Replace the value of `aws-region` in the workflow below with your repository's region.
+#
+# 2. Create an ECS task definition, an ECS cluster, and an ECS service.
+# For example, follow the Getting Started guide on the ECS console:
+# https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun
+# Replace the values for `service` and `cluster` in the workflow below with your service and cluster names.
+#
+# 3. Store your ECS task definition as a JSON file in your repository.
+# The format should follow the output of `aws ecs register-task-definition --generate-cli-skeleton`.
+# Replace the value of `task-definition` in the workflow below with your JSON file's name.
+# Replace the value of `container-name` in the workflow below with the name of the container
+# in the `containerDefinitions` section of the task definition.
+#
+# 4. Store an IAM user access key in GitHub Actions secrets named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.
+# See the documentation for each action used below for the recommended IAM policies for this IAM user,
+# and best practices on handling the access key credentials.
+
+on:
+ push:
+ tags:
+ - 'v*'
+
+name: Deploy to Amazon ECS
+
+jobs:
+ deploy:
+ name: deploy
+ runs-on: ubuntu-16.04
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: eu-west-1
+
+ - name: Download task definition
+ run: |
+ aws ecs describe-task-definition --task-definition ProdAppServerStackprodbudiapplbfargateserviceprodbudiappserverfargatetaskdefinition2EF7F1E7 --query taskDefinition > task-definition.json
+
+ - name: Login to Amazon ECR
+ id: login-ecr
+ uses: aws-actions/amazon-ecr-login@v1
+
+ - name: Build, tag, and push image to Amazon ECR
+ id: build-image
+ env:
+ ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
+ ECR_REPOSITORY: prod-budi-app-server
+ IMAGE_TAG: ${{ github.sha }}
+ run: |
+ # Build a docker container and
+ # push it to ECR so that it can
+ # be deployed to ECS
+ cd packages/server
+ docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
+ docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
+ echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
+ - name: Fill in the new image ID in the Amazon ECS task definition
+ id: task-def
+ uses: aws-actions/amazon-ecs-render-task-definition@v1
+ with:
+ task-definition: task-definition.json
+ container-name: prod-budi-app-server
+ image: ${{ steps.build-image.outputs.image }}
+
+ - name: Deploy Amazon ECS task definition
+ uses: aws-actions/amazon-ecs-deploy-task-definition@v1
+ with:
+ task-definition: ${{ steps.task-def.outputs.task-definition }}
+ service: prod-budi-app-server-service
+ cluster: prod-budi-app-server
+ wait-for-service-stability: true
diff --git a/packages/builder/cypress/integration/createBinding.spec.js b/packages/builder/cypress/integration/createBinding.spec.js
index 64e6f33475..971df3ed75 100644
--- a/packages/builder/cypress/integration/createBinding.spec.js
+++ b/packages/builder/cypress/integration/createBinding.spec.js
@@ -1,4 +1,4 @@
-context('Create a Binding', () => {
+xcontext('Create a Binding', () => {
before(() => {
cy.visit('localhost:4001/_builder')
cy.createApp('Binding App', 'Binding App Description')
diff --git a/packages/builder/cypress/integration/createUser.spec.js b/packages/builder/cypress/integration/createUser.spec.js
index 192cdae316..b1f737068b 100644
--- a/packages/builder/cypress/integration/createUser.spec.js
+++ b/packages/builder/cypress/integration/createUser.spec.js
@@ -9,7 +9,7 @@ context('Create a User', () => {
// https://on.cypress.io/interacting-with-elements
it('should create a user', () => {
- cy.createUser('bbuser', 'test', 'ADMIN')
+ cy.createUser('bbuser', 'test', 'POWER_USER')
// Check to make sure user was created!
cy.get("input[disabled]").should('have.value', 'bbuser')
diff --git a/packages/builder/cypress/integration/createView.spec.js b/packages/builder/cypress/integration/createView.spec.js
index 3c13405914..3ccf4d5cfd 100644
--- a/packages/builder/cypress/integration/createView.spec.js
+++ b/packages/builder/cypress/integration/createView.spec.js
@@ -54,7 +54,7 @@ context('Create a View', () => {
expect($headers).to.have.length(7)
const headers = $headers.map((i, header) => Cypress.$(header).text())
expect(headers.get()).to.deep.eq([
- "group",
+ "field",
"sum",
"min",
"max",
@@ -66,7 +66,7 @@ context('Create a View', () => {
cy.get("tbody td").should(($values) => {
const values = $values.map((i, value) => Cypress.$(value).text())
expect(values.get()).to.deep.eq([
- "null",
+ "age",
"155",
"20",
"49",
diff --git a/packages/builder/cypress/integration/createWorkflow.spec.js b/packages/builder/cypress/integration/createWorkflow.spec.js
index f341bf86b1..e7fe34b630 100644
--- a/packages/builder/cypress/integration/createWorkflow.spec.js
+++ b/packages/builder/cypress/integration/createWorkflow.spec.js
@@ -1,4 +1,4 @@
-xcontext('Create a workflow', () => {
+context('Create a workflow', () => {
before(() => {
cy.server()
@@ -9,7 +9,7 @@ xcontext('Create a workflow', () => {
// https://on.cypress.io/interacting-with-elements
it('should create a workflow', () => {
- cy.createTable('dog', 'name', 'age')
+ cy.createTestTableWithData()
cy.contains('workflow').click()
cy.contains('Create New Workflow').click()
@@ -23,21 +23,23 @@ xcontext('Create a workflow', () => {
// Create action
cy.get('[data-cy=SAVE_RECORD]').click()
- cy.get(':nth-child(2) > .budibase__input').type('goodboy')
- cy.get(':nth-child(3) > .budibase__input').type('11')
+ cy.get('.container input').first().type('goodboy')
+ cy.get('.container input').eq(1).type('11')
// Save
cy.contains('Save Workflow').click()
// Activate Workflow
cy.get('[data-cy=activate-workflow]').click()
-
+ cy.contains("Add Record").should("be.visible")
+ cy.get(".stop-button.highlighted").should("be.visible")
})
- xit('should add record when a new record is added', () => {
+
+ it('should add record when a new record is added', () => {
cy.contains('backend').click()
- cy.addRecord('bob', '15')
-
+ cy.addRecord(["Rover", 15])
+ cy.reload()
cy.contains('goodboy').should('have.text', 'goodboy')
})
diff --git a/packages/builder/cypress/support/commands.js b/packages/builder/cypress/support/commands.js
index da85abddb3..fc8397f13f 100644
--- a/packages/builder/cypress/support/commands.js
+++ b/packages/builder/cypress/support/commands.js
@@ -57,12 +57,17 @@ Cypress.Commands.add("createApp", name => {
})
})
+Cypress.Commands.add("createTestTableWithData", () => {
+ cy.createTable("dog")
+ cy.addColumn("dog", "name", "Plain Text")
+ cy.addColumn("dog", "age", "Number")
+})
+
Cypress.Commands.add("createTable", tableName => {
// Enter model name
cy.contains("Create New Table").click()
cy.get("[placeholder='Table Name']").type(tableName)
- // Add 'name' field
cy.contains("Save").click()
cy.contains(tableName).should("be.visible")
})
@@ -84,7 +89,7 @@ Cypress.Commands.add("addRecord", values => {
cy.contains("Create New Row").click()
for (let i = 0; i < values.length; i++) {
- cy.get("input")
+ cy.get(".actions input")
.eq(i)
.type(values[i])
}
@@ -93,7 +98,7 @@ Cypress.Commands.add("addRecord", values => {
cy.contains("Save").click()
})
-Cypress.Commands.add("createUser", (username, password) => {
+Cypress.Commands.add("createUser", (username, password, accessLevel) => {
// Create User
cy.get(".toprightnav > .settings").click()
cy.contains("Users").click()
@@ -104,9 +109,12 @@ Cypress.Commands.add("createUser", (username, password) => {
cy.get("[name=Password]")
.first()
.type(password)
+ cy.get("select")
+ .first()
+ .select(accessLevel)
// Save
- cy.get(".create-button").click()
+ cy.get(".create-button > button").click()
})
Cypress.Commands.add("addHeadlineComponent", text => {
diff --git a/packages/builder/cypress/support/cookies.js b/packages/builder/cypress/support/cookies.js
index bfb470c57b..1c172f4d4c 100644
--- a/packages/builder/cypress/support/cookies.js
+++ b/packages/builder/cypress/support/cookies.js
@@ -1,3 +1,3 @@
Cypress.Cookies.defaults({
- whitelist: "builder:token",
+ preserve: "builder:token",
})
diff --git a/packages/builder/cypress/videos/createApp.spec.js.mp4 b/packages/builder/cypress/videos/createApp.spec.js.mp4
new file mode 100644
index 0000000000..4e13dbe91b
Binary files /dev/null and b/packages/builder/cypress/videos/createApp.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/createBinding.spec.js.mp4 b/packages/builder/cypress/videos/createBinding.spec.js.mp4
new file mode 100644
index 0000000000..6cbfc19b9d
Binary files /dev/null and b/packages/builder/cypress/videos/createBinding.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/createComponents.spec.js.mp4 b/packages/builder/cypress/videos/createComponents.spec.js.mp4
new file mode 100644
index 0000000000..8b5fcbe188
Binary files /dev/null and b/packages/builder/cypress/videos/createComponents.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/createTable.spec.js.mp4 b/packages/builder/cypress/videos/createTable.spec.js.mp4
new file mode 100644
index 0000000000..162b21a8b5
Binary files /dev/null and b/packages/builder/cypress/videos/createTable.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/createUser.spec.js.mp4 b/packages/builder/cypress/videos/createUser.spec.js.mp4
new file mode 100644
index 0000000000..cae887ed6c
Binary files /dev/null and b/packages/builder/cypress/videos/createUser.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/createView.spec.js.mp4 b/packages/builder/cypress/videos/createView.spec.js.mp4
new file mode 100644
index 0000000000..e24101c222
Binary files /dev/null and b/packages/builder/cypress/videos/createView.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/createWorkflow.spec.js.mp4 b/packages/builder/cypress/videos/createWorkflow.spec.js.mp4
new file mode 100644
index 0000000000..52116ef9e9
Binary files /dev/null and b/packages/builder/cypress/videos/createWorkflow.spec.js.mp4 differ
diff --git a/packages/builder/cypress/videos/screens.spec.js.mp4 b/packages/builder/cypress/videos/screens.spec.js.mp4
new file mode 100644
index 0000000000..812238057d
Binary files /dev/null and b/packages/builder/cypress/videos/screens.spec.js.mp4 differ
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 68fbf9031a..613d61696b 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -57,7 +57,10 @@
"eslintConfig": {
"extends": [
"plugin:cypress/recommended"
- ]
+ ],
+ "rules": {
+ "cypress/no-unnecessary-waiting": "off"
+ }
},
"dependencies": {
"@budibase/bbui": "^1.29.2",
@@ -91,7 +94,7 @@
"@testing-library/jest-dom": "^5.11.0",
"@testing-library/svelte": "^3.0.0",
"babel-jest": "^24.8.0",
- "cypress": "^4.8.0",
+ "cypress": "^5.1.0",
"cypress-terminal-report": "^1.4.1",
"eslint-plugin-cypress": "^2.11.1",
"identity-obj-proxy": "^3.0.0",
@@ -114,4 +117,4 @@
"svelte-jester": "^1.0.6"
},
"gitHead": "115189f72a850bfb52b65ec61d932531bf327072"
-}
\ No newline at end of file
+}
diff --git a/packages/builder/src/components/database/DataTable/Table.svelte b/packages/builder/src/components/database/DataTable/Table.svelte
index 6e56e28a4a..47be4eab37 100644
--- a/packages/builder/src/components/database/DataTable/Table.svelte
+++ b/packages/builder/src/components/database/DataTable/Table.svelte
@@ -25,6 +25,7 @@
let currentPage = 0
$: columns = schema ? Object.keys(schema) : []
+
$: paginatedData =
data && data.length
? data.slice(
diff --git a/packages/builder/src/components/database/DataTable/ViewDataTable.svelte b/packages/builder/src/components/database/DataTable/ViewDataTable.svelte
index 289e3a6e12..7ffa2a1963 100644
--- a/packages/builder/src/components/database/DataTable/ViewDataTable.svelte
+++ b/packages/builder/src/components/database/DataTable/ViewDataTable.svelte
@@ -32,7 +32,10 @@
async function fetchViewData(name, field, groupBy) {
const params = new URLSearchParams()
- if (field) params.set("stats", true)
+ if (field) {
+ params.set("field", field)
+ params.set("stats", true)
+ }
if (groupBy) params.set("group", groupBy)
let QUERY_VIEW_URL = `/api/views/${name}?${params}`
diff --git a/packages/builder/src/components/userInterface/ModelViewFieldSelect.svelte b/packages/builder/src/components/userInterface/ModelViewFieldSelect.svelte
new file mode 100644
index 0000000000..a6b3ef2224
--- /dev/null
+++ b/packages/builder/src/components/userInterface/ModelViewFieldSelect.svelte
@@ -0,0 +1,25 @@
+
+
+
Tables
+ +Views
+ sortColumn(header)}>\n \n {header}\n {#if sort.column === header}\n | \n {/each}\n
---|
{row[header]} | \n {/if}\n {/each}\n
{description}
\nl)break;v.push(h)}}else for(;d
=1;--f)if(!((h=s*f) P?[t,Math.abs(f-t) P?[Math.abs(h-r) P?[e,Math.abs(f-e) P?[Math.abs(h-n) =u)return null;var c=t-i.site[0],l=n-i.site[1],s=c*c+l*l;do{i=a.cells[r=o],o=null,i.halfedges.forEach((function(e){var r=a.edges[e],u=r.left;if(u!==i.site&&u||(u=r.right)){var c=t-u[0],l=n-u[1],f=c*c+l*l;f {description} l)break;v.push(h)}}else for(;d =1;--f)if(!((h=s*f) P?[t,Math.abs(f-t) P?[Math.abs(h-r) P?[e,Math.abs(f-e) P?[Math.abs(h-n) =u)return null;var c=t-i.site[0],l=n-i.site[1],s=c*c+l*l;do{i=a.cells[r=o],o=null,i.halfedges.forEach((function(e){var r=a.edges[e],u=r.left;if(u!==i.site&&u||(u=r.right)){var c=t-u[0],l=n-u[1],f=c*c+l*l;f -1}function cr(n,t){var r=this.__data__,e=Er(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this}function ar(n){var t=-1,r=null==n?0:n.length;for(this.clear();++tn?1:t>=n?0:NaN}var f=e(43);function h(t){return function(){this.removeAttribute(t)}}function d(t){return function(){this.removeAttributeNS(t.space,t.local)}}function p(t,n){return function(){this.setAttribute(t,n)}}function g(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function v(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function y(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}var m=e(66);function x(t){return function(){delete this[t]}}function b(t,n){return function(){this[t]=n}}function _(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function w(t){return t.trim().split(/^|\\s+/)}function M(t){return t.classList||new A(t)}function A(t){this._node=t,this._names=w(t.getAttribute(\"class\")||\"\")}function k(t,n){for(var e=M(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute(\"class\",this._names.join(\" \")))},contains:function(t){return this._names.indexOf(t)>=0}};function N(){this.textContent=\"\"}function j(t){return function(){this.textContent=t}}function D(t){return function(){var n=t.apply(this,arguments);this.textContent=null==n?\"\":n}}function E(){this.innerHTML=\"\"}function L(t){return function(){this.innerHTML=t}}function F(t){return function(){var n=t.apply(this,arguments);this.innerHTML=null==n?\"\":n}}function R(){this.nextSibling&&this.parentNode.appendChild(this)}function P(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}var B=e(28);function I(){return null}function U(){var t=this.parentNode;t&&t.removeChild(this)}function H(){var t=this.cloneNode(!1),n=this.parentNode;return n?n.insertBefore(t,this.nextSibling):t}function z(){var t=this.cloneNode(!0),n=this.parentNode;return n?n.insertBefore(t,this.nextSibling):t}var q=e(36),Y=e(44);function G(t,n,e){var r=Object(Y.a)(t),i=r.CustomEvent;\"function\"==typeof i?i=new i(n,e):(i=r.document.createEvent(\"Event\"),e?(i.initEvent(n,e.bubbles,e.cancelable),i.detail=e.detail):i.initEvent(n,!1,!1)),t.dispatchEvent(i)}function V(t,n){return function(){return G(this,t,n)}}function W(t,n){return function(){return G(this,t,n.apply(this,arguments))}}e.d(n,\"c\",(function(){return X})),e.d(n,\"a\",(function(){return $}));var X=[null];function $(t,n){this._groups=t,this._parents=n}function Q(){return new $([[document.documentElement]],X)}$.prototype=Q.prototype={constructor:$,select:function(t){\"function\"!=typeof t&&(t=Object(r.a)(t));for(var n=this._groups,e=n.length,i=new Array(e),a=0;a0){if(a>f)return;a>s&&(s=a)}if(a=r-c,h||!(a<0)){if(a/=h,h<0){if(a>f)return;a>s&&(s=a)}else if(h>0){if(a0)){if(a/=d,d<0){if(a0){if(a>f)return;a>s&&(s=a)}if(a=i-l,d||!(a<0)){if(a/=d,d<0){if(a>f)return;a>s&&(s=a)}else if(d>0){if(a0||f<1)||(s>0&&(t[0]=[c+s*h,l+s*d]),f<1&&(t[1]=[c+f*h,l+f*d]),!0)}}}}}function v(t,n,e,r,i){var a=t[1];if(a)return!0;var o,u,c=t[0],l=t.left,s=t.right,f=l[0],h=l[1],d=s[0],p=s[1],g=(f+d)/2,v=(h+p)/2;if(p===h){if(gMath.abs(t[1]-et[1])?L=!0:E=!0),et=t,D=!0,v(),ct()}function ct(){var t;switch(Z=et[0]-nt[0],K=et[1]-nt[1],I){case m:case y:z&&(Z=Math.max(W-e,Math.min($-d,Z)),r=e+Z,p=d+Z),q&&(K=Math.max(X-l,Math.min(Q-w,K)),s=l+K,O=w+K);break;case x:z<0?(Z=Math.max(W-e,Math.min($-e,Z)),r=e+Z,p=d):z>0&&(Z=Math.max(W-d,Math.min($-d,Z)),r=e,p=d+Z),q<0?(K=Math.max(X-l,Math.min(Q-l,K)),s=l+K,O=w):q>0&&(K=Math.max(X-w,Math.min(Q-w,K)),s=l,O=w+K);break;case b:z&&(r=Math.max(W,Math.min($,e-Z*z)),p=Math.max(W,Math.min($,d+Z*z))),q&&(s=Math.max(X,Math.min(Q,l-K*q)),O=Math.max(X,Math.min(Q,w+K*q)))}p{text}\n{:else if isTag('ins')}\n {text}\n{:else if isTag('sub')}\n {text}\n{:else if isTag('sup')}\n {text}\n{:else}\n {text}\n{/if}\n","\n\n{#if type === 'h1'}\n {text}
\n{:else if type === 'h2'}\n {text}
\n{:else if type === 'h3'}\n {text}
\n{:else if type === 'h4'}\n {text}
\n{:else if type === 'h5'}\n {text}
\n{:else if type === 'h6'}\n {text}
\n{/if}\n","\n\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n\n\n","\n\n{title}
\n {/if}\n\n \n \n
\n\n\n","import { cubicInOut, linear, cubicOut } from '../easing';\nimport { is_function, assign } from '../internal';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\n\nfunction blur(node, { delay = 0, duration = 400, easing = cubicInOut, amount = 5, opacity = 0 }) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const f = style.filter === 'none' ? '' : style.filter;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `opacity: ${target_opacity - (od * u)}; filter: ${f} blur(${u * amount}px);`\n };\n}\nfunction fade(node, { delay = 0, duration = 400, easing = linear }) {\n const o = +getComputedStyle(node).opacity;\n return {\n delay,\n duration,\n easing,\n css: t => `opacity: ${t * o}`\n };\n}\nfunction fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 }) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (t, u) => `\n\t\t\ttransform: ${transform} translate(${(1 - t) * x}px, ${(1 - t) * y}px);\n\t\t\topacity: ${target_opacity - (od * u)}`\n };\n}\nfunction slide(node, { delay = 0, duration = 400, easing = cubicOut }) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const height = parseFloat(style.height);\n const padding_top = parseFloat(style.paddingTop);\n const padding_bottom = parseFloat(style.paddingBottom);\n const margin_top = parseFloat(style.marginTop);\n const margin_bottom = parseFloat(style.marginBottom);\n const border_top_width = parseFloat(style.borderTopWidth);\n const border_bottom_width = parseFloat(style.borderBottomWidth);\n return {\n delay,\n duration,\n easing,\n css: t => `overflow: hidden;` +\n `opacity: ${Math.min(t * 20, 1) * opacity};` +\n `height: ${t * height}px;` +\n `padding-top: ${t * padding_top}px;` +\n `padding-bottom: ${t * padding_bottom}px;` +\n `margin-top: ${t * margin_top}px;` +\n `margin-bottom: ${t * margin_bottom}px;` +\n `border-top-width: ${t * border_top_width}px;` +\n `border-bottom-width: ${t * border_bottom_width}px;`\n };\n}\nfunction scale(node, { delay = 0, duration = 400, easing = cubicOut, start = 0, opacity = 0 }) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const sd = 1 - start;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `\n\t\t\ttransform: ${transform} scale(${1 - (sd * u)});\n\t\t\topacity: ${target_opacity - (od * u)}\n\t\t`\n };\n}\nfunction draw(node, { delay = 0, speed, duration, easing = cubicInOut }) {\n const len = node.getTotalLength();\n if (duration === undefined) {\n if (speed === undefined) {\n duration = 800;\n }\n else {\n duration = len / speed;\n }\n }\n else if (typeof duration === 'function') {\n duration = duration(len);\n }\n return {\n delay,\n duration,\n easing,\n css: (t, u) => `stroke-dasharray: ${t * len} ${u * len}`\n };\n}\nfunction crossfade(_a) {\n var { fallback } = _a, defaults = __rest(_a, [\"fallback\"]);\n const to_receive = new Map();\n const to_send = new Map();\n function crossfade(from, node, params) {\n const { delay = 0, duration = d => Math.sqrt(d) * 30, easing = cubicOut } = assign(assign({}, defaults), params);\n const to = node.getBoundingClientRect();\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n const dw = from.width / to.width;\n const dh = from.height / to.height;\n const d = Math.sqrt(dx * dx + dy * dy);\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n const opacity = +style.opacity;\n return {\n delay,\n duration: is_function(duration) ? duration(d) : duration,\n easing,\n css: (t, u) => `\n\t\t\t\topacity: ${t * opacity};\n\t\t\t\ttransform-origin: top left;\n\t\t\t\ttransform: ${transform} translate(${u * dx}px,${u * dy}px) scale(${t + (1 - t) * dw}, ${t + (1 - t) * dh});\n\t\t\t`\n };\n }\n function transition(items, counterparts, intro) {\n return (node, params) => {\n items.set(params.key, {\n rect: node.getBoundingClientRect()\n });\n return () => {\n if (counterparts.has(params.key)) {\n const { rect } = counterparts.get(params.key);\n counterparts.delete(params.key);\n return crossfade(rect, node, params);\n }\n // if the node is disappearing altogether\n // (i.e. wasn't claimed by the other list)\n // then we need to supply an outro\n items.delete(params.key);\n return fallback && fallback(node, params, intro);\n };\n };\n }\n return [\n transition(to_send, to_receive, false),\n transition(to_receive, to_send, true)\n ];\n}\n\nexport { blur, crossfade, draw, fade, fly, scale, slide };\n","\n\n\n\n\n","\n\n\n\n\n","/**!\n* @license FusionCharts JavaScript Library\n* Copyright FusionCharts, Inc.\n* License Information at \n {#each headers as header}\n \n \n \n {#each sorted as row (row._id)}\n sortColumn(header)}>\n \n {header}\n {#if sort.column === header}\n \n {/each}\n \n {#each headers as header}\n {#if row[header]}\n \n {/each}\n \n{row[header]} \n {/if}\n {/each}\n \n {#each Object.keys(data) as key}\n
\n {heading}
\n n?1:t>=n?0:NaN}var f=e(43);function h(t){return function(){this.removeAttribute(t)}}function d(t){return function(){this.removeAttributeNS(t.space,t.local)}}function p(t,n){return function(){this.setAttribute(t,n)}}function g(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function v(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function y(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}var m=e(66);function x(t){return function(){delete this[t]}}function b(t,n){return function(){this[t]=n}}function _(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function w(t){return t.trim().split(/^|\\s+/)}function M(t){return t.classList||new A(t)}function A(t){this._node=t,this._names=w(t.getAttribute(\"class\")||\"\")}function k(t,n){for(var e=M(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute(\"class\",this._names.join(\" \")))},contains:function(t){return this._names.indexOf(t)>=0}};function N(){this.textContent=\"\"}function j(t){return function(){this.textContent=t}}function D(t){return function(){var n=t.apply(this,arguments);this.textContent=null==n?\"\":n}}function E(){this.innerHTML=\"\"}function L(t){return function(){this.innerHTML=t}}function F(t){return function(){var n=t.apply(this,arguments);this.innerHTML=null==n?\"\":n}}function R(){this.nextSibling&&this.parentNode.appendChild(this)}function P(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}var B=e(28);function I(){return null}function U(){var t=this.parentNode;t&&t.removeChild(this)}function H(){var t=this.cloneNode(!1),n=this.parentNode;return n?n.insertBefore(t,this.nextSibling):t}function z(){var t=this.cloneNode(!0),n=this.parentNode;return n?n.insertBefore(t,this.nextSibling):t}var q=e(36),Y=e(44);function G(t,n,e){var r=Object(Y.a)(t),i=r.CustomEvent;\"function\"==typeof i?i=new i(n,e):(i=r.document.createEvent(\"Event\"),e?(i.initEvent(n,e.bubbles,e.cancelable),i.detail=e.detail):i.initEvent(n,!1,!1)),t.dispatchEvent(i)}function V(t,n){return function(){return G(this,t,n)}}function W(t,n){return function(){return G(this,t,n.apply(this,arguments))}}e.d(n,\"c\",(function(){return X})),e.d(n,\"a\",(function(){return $}));var X=[null];function $(t,n){this._groups=t,this._parents=n}function Q(){return new $([[document.documentElement]],X)}$.prototype=Q.prototype={constructor:$,select:function(t){\"function\"!=typeof t&&(t=Object(r.a)(t));for(var n=this._groups,e=n.length,i=new Array(e),a=0;a0){if(a>f)return;a>s&&(s=a)}if(a=r-c,h||!(a<0)){if(a/=h,h<0){if(a>f)return;a>s&&(s=a)}else if(h>0){if(a0)){if(a/=d,d<0){if(a0){if(a>f)return;a>s&&(s=a)}if(a=i-l,d||!(a<0)){if(a/=d,d<0){if(a>f)return;a>s&&(s=a)}else if(d>0){if(a0||f<1)||(s>0&&(t[0]=[c+s*h,l+s*d]),f<1&&(t[1]=[c+f*h,l+f*d]),!0)}}}}}function v(t,n,e,r,i){var a=t[1];if(a)return!0;var o,u,c=t[0],l=t.left,s=t.right,f=l[0],h=l[1],d=s[0],p=s[1],g=(f+d)/2,v=(h+p)/2;if(p===h){if(gMath.abs(t[1]-et[1])?L=!0:E=!0),et=t,D=!0,v(),ct()}function ct(){var t;switch(Z=et[0]-nt[0],K=et[1]-nt[1],I){case m:case y:z&&(Z=Math.max(W-e,Math.min($-d,Z)),r=e+Z,p=d+Z),q&&(K=Math.max(X-l,Math.min(Q-w,K)),s=l+K,O=w+K);break;case x:z<0?(Z=Math.max(W-e,Math.min($-e,Z)),r=e+Z,p=d):z>0&&(Z=Math.max(W-d,Math.min($-d,Z)),r=e,p=d+Z),q<0?(K=Math.max(X-l,Math.min(Q-l,K)),s=l+K,O=w):q>0&&(K=Math.max(X-w,Math.min(Q-w,K)),s=l,O=w+K);break;case b:z&&(r=Math.max(W,Math.min($,e-Z*z)),p=Math.max(W,Math.min($,d+Z*z))),q&&(s=Math.max(X,Math.min(Q,l-K*q)),O=Math.max(X,Math.min(Q,w+K*q)))}p{text}\n{:else if isTag('ins')}\n {text}\n{:else if isTag('sub')}\n {text}\n{:else if isTag('sup')}\n {text}\n{:else}\n {text}\n{/if}\n","\n\n{#if type === 'h1'}\n {text}
\n{:else if type === 'h2'}\n {text}
\n{:else if type === 'h3'}\n {text}
\n{:else if type === 'h4'}\n {text}
\n{:else if type === 'h5'}\n {text}
\n{:else if type === 'h6'}\n {text}
\n{/if}\n","\n\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n\n\n","\n\n{title}
\n {/if}\n\n