Merge branch 'develop' into cypress-testing
This commit is contained in:
commit
03de3af587
24 changed files with 227 additions and 142 deletions
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"npmClient": "yarn",
|
"npmClient": "yarn",
|
||||||
"packages": [
|
"packages": [
|
||||||
"packages/*"
|
"packages/*"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/backend-core",
|
"name": "@budibase/backend-core",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"description": "Budibase backend core libraries used in server and worker",
|
"description": "Budibase backend core libraries used in server and worker",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"author": "Budibase",
|
"author": "Budibase",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/bbui",
|
"name": "@budibase/bbui",
|
||||||
"description": "A UI solution used in the different Budibase projects.",
|
"description": "A UI solution used in the different Budibase projects.",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"svelte": "src/index.js",
|
"svelte": "src/index.js",
|
||||||
"module": "dist/bbui.es.js",
|
"module": "dist/bbui.es.js",
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@adobe/spectrum-css-workflow-icons": "^1.2.1",
|
"@adobe/spectrum-css-workflow-icons": "^1.2.1",
|
||||||
"@budibase/string-templates": "^1.0.192-alpha.2",
|
"@budibase/string-templates": "^1.0.192-alpha.6",
|
||||||
"@spectrum-css/actionbutton": "^1.0.1",
|
"@spectrum-css/actionbutton": "^1.0.1",
|
||||||
"@spectrum-css/actiongroup": "^1.0.1",
|
"@spectrum-css/actiongroup": "^1.0.1",
|
||||||
"@spectrum-css/avatar": "^3.0.2",
|
"@spectrum-css/avatar": "^3.0.2",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import filterTests from "../support/filterTests"
|
import filterTests from "../support/filterTests"
|
||||||
|
import { APP_TABLE_APP_NAME, DEPLOY_SUCCESS_MODAL } from "../support/interact";
|
||||||
const interact = require('../support/interact')
|
const interact = require('../support/interact')
|
||||||
|
|
||||||
filterTests(['all'], () => {
|
filterTests(['all'], () => {
|
||||||
|
@ -20,10 +21,9 @@ filterTests(['all'], () => {
|
||||||
|
|
||||||
cy.get(interact.APP_TABLE_ROW_ACTION).eq(0)
|
cy.get(interact.APP_TABLE_ROW_ACTION).eq(0)
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Preview")
|
|
||||||
cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Edit").click({ force: true })
|
cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Edit").click({ force: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
cy.get(interact.DEPLOYMENT_TOP_NAV_GLOBESTRIKE).should("exist")
|
cy.get(interact.DEPLOYMENT_TOP_NAV_GLOBESTRIKE).should("exist")
|
||||||
cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("not.exist")
|
cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("not.exist")
|
||||||
})
|
})
|
||||||
|
@ -39,7 +39,7 @@ filterTests(['all'], () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
//Verify that the app url is presented correctly to the user
|
//Verify that the app url is presented correctly to the user
|
||||||
cy.get(interact.DEPLOY_APP_MODAL)
|
cy.get(interact.DEPLOY_SUCCESS_MODAL)
|
||||||
.should("be.visible")
|
.should("be.visible")
|
||||||
.within(() => {
|
.within(() => {
|
||||||
let appUrl = Cypress.config().baseUrl + '/app/cypress-tests'
|
let appUrl = Cypress.config().baseUrl + '/app/cypress-tests'
|
||||||
|
@ -63,7 +63,7 @@ filterTests(['all'], () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist").click({ force: true })
|
cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist").click({ force: true })
|
||||||
|
|
||||||
cy.get(interact.PUBLISH_POPOVER_MENU).should("be.visible")
|
cy.get(interact.PUBLISH_POPOVER_MENU).should("be.visible")
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(interact.PUBLISH_POPOVER_ACTION).should("exist")
|
cy.get(interact.PUBLISH_POPOVER_ACTION).should("exist")
|
||||||
|
@ -72,9 +72,9 @@ filterTests(['all'], () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it("Should unpublish an application from the top navigation and reflect the status change", () => {
|
it("Should unpublish an application using the link and reflect the status change", () => {
|
||||||
//Assuming the previous test app exists and is published
|
//Assuming the previous test app exists and is published
|
||||||
|
|
||||||
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
||||||
|
|
||||||
cy.get(interact.APP_TABLE_STATUS).eq(0)
|
cy.get(interact.APP_TABLE_STATUS).eq(0)
|
||||||
|
@ -85,17 +85,11 @@ filterTests(['all'], () => {
|
||||||
|
|
||||||
cy.get(interact.APP_TABLE_ROW_ACTION).eq(0)
|
cy.get(interact.APP_TABLE_ROW_ACTION).eq(0)
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(interact.SPECTRUM_BUTTON).contains("View app")
|
cy.get(interact.SPECTRUM_BUTTON).contains("View")
|
||||||
cy.get(interact.SPECTRUM_BUTTON).contains("Edit").click({ force: true })
|
cy.get(interact.APP_TABLE_APP_NAME).click({ force: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
//The published status
|
cy.get(interact.SPECTRUM_LINK).contains('Unpublish').click();
|
||||||
cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist")
|
|
||||||
.click({ force: true })
|
|
||||||
|
|
||||||
cy.get(interact.PUBLISH_POPOVER_MENU).should("be.visible")
|
|
||||||
cy.get("[data-cy='publish-popover-menu'] [data-cy='publish-popover-action']")
|
|
||||||
.click({ force : true })
|
|
||||||
|
|
||||||
cy.get(interact.UNPUBLISH_MODAL).should("be.visible")
|
cy.get(interact.UNPUBLISH_MODAL).should("be.visible")
|
||||||
.within(() => {
|
.within(() => {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import filterTests from "../support/filterTests"
|
import filterTests from "../support/filterTests"
|
||||||
|
const interact = require('../support/interact')
|
||||||
|
|
||||||
filterTests(['smoke', 'all'], () => {
|
filterTests(['smoke', 'all'], () => {
|
||||||
context("Create a automation", () => {
|
context("Create a automation", () => {
|
||||||
|
@ -11,51 +12,51 @@ filterTests(['smoke', 'all'], () => {
|
||||||
cy.createTestTableWithData()
|
cy.createTestTableWithData()
|
||||||
cy.wait(2000)
|
cy.wait(2000)
|
||||||
cy.contains("Automate").click()
|
cy.contains("Automate").click()
|
||||||
cy.get(".add-button .spectrum-Icon").click()
|
cy.get(interact.ADD_BUTTON_SPECTRUM).click()
|
||||||
cy.get(".modal-inner-wrapper").within(() => {
|
cy.get(interact.MODAL_INNER_WRAPPER).within(() => {
|
||||||
cy.get("input").type("Add Row")
|
cy.get("input").type("Add Row")
|
||||||
cy.contains("Row Created").click({ force: true })
|
cy.contains("Row Created").click({ force: true })
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(".spectrum-Button--cta").click()
|
cy.get(interact.SPECTRUM_BUTTON_CTA).click()
|
||||||
})
|
})
|
||||||
|
|
||||||
// Setup trigger
|
// Setup trigger
|
||||||
cy.get(".spectrum-Picker-label").click()
|
cy.get(interact.SPECTRUM_PICKER_LABEL).click()
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.contains("dog").click()
|
cy.contains("dog").click()
|
||||||
cy.wait(2000)
|
cy.wait(2000)
|
||||||
// Create action
|
// Create action
|
||||||
cy.get('[aria-label="AddCircle"]').eq(1).click()
|
cy.get('[aria-label="AddCircle"]').eq(1).click()
|
||||||
cy.get(".modal-inner-wrapper").within(() => {
|
cy.get(interact.MODAL_INNER_WRAPPER).within(() => {
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
cy.contains("Create Row").trigger('mouseover').click().click()
|
cy.contains("Create Row").trigger('mouseover').click().click()
|
||||||
cy.get(".spectrum-Button--cta").click()
|
cy.get(interact.SPECTRUM_BUTTON_CTA).click()
|
||||||
})
|
})
|
||||||
cy.get(".spectrum-Picker-label").eq(1).click()
|
cy.get(interact.SPECTRUM_PICKER_LABEL).eq(1).click()
|
||||||
cy.contains("dog").click()
|
cy.contains("dog").click()
|
||||||
cy.get(".spectrum-Textfield-input")
|
cy.get(interact.SPECTRUM_TEXTFIELD_INPUT)
|
||||||
.first()
|
.first()
|
||||||
.type("{{ trigger.row.name }}", { parseSpecialCharSequences: false })
|
.type("{{ trigger.row.name }}", { parseSpecialCharSequences: false })
|
||||||
cy.get(".spectrum-Textfield-input")
|
cy.get(interact.SPECTRUM_TEXTFIELD_INPUT)
|
||||||
.eq(1)
|
.eq(1)
|
||||||
.type("11")
|
.type("11")
|
||||||
cy.contains("Finish and test automation").click()
|
cy.contains("Finish and test automation").click()
|
||||||
|
|
||||||
cy.get(".modal-inner-wrapper").within(() => {
|
cy.get(interact.MODAL_INNER_WRAPPER).within(() => {
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
cy.get(".spectrum-Picker-label").click()
|
cy.get(interact.SPECTRUM_PICKER_LABEL).click()
|
||||||
cy.contains("dog").click()
|
cy.contains("dog").click()
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
cy.get(".spectrum-Textfield-input")
|
cy.get(interact.SPECTRUM_TEXTFIELD_INPUT)
|
||||||
.first()
|
.first()
|
||||||
.type("automationGoodboy")
|
.type("automationGoodboy")
|
||||||
cy.get(".spectrum-Textfield-input")
|
cy.get(interact.SPECTRUM_TEXTFIELD_INPUT)
|
||||||
.eq(1)
|
.eq(1)
|
||||||
.type("11")
|
.type("11")
|
||||||
cy.get(".spectrum-Textfield-input")
|
cy.get(interact.SPECTRUM_TEXTFIELD_INPUT)
|
||||||
.eq(2)
|
.eq(2)
|
||||||
.type("123456")
|
.type("123456")
|
||||||
cy.get(".spectrum-Textfield-input")
|
cy.get(interact.SPECTRUM_TEXTFIELD_INPUT)
|
||||||
.eq(3)
|
.eq(3)
|
||||||
.type("123456")
|
.type("123456")
|
||||||
cy.contains("Test").click()
|
cy.contains("Test").click()
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import filterTests from "../support/filterTests"
|
import filterTests from "../support/filterTests"
|
||||||
|
const interact = require('../support/interact')
|
||||||
|
|
||||||
filterTests(["smoke", "all"], () => {
|
filterTests(["smoke", "all"], () => {
|
||||||
context("Create a Table", () => {
|
context("Create a Table", () => {
|
||||||
|
@ -11,7 +12,7 @@ filterTests(["smoke", "all"], () => {
|
||||||
cy.createTable("dog")
|
cy.createTable("dog")
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
// Check if Table exists
|
// Check if Table exists
|
||||||
cy.get(".table-title h1").should("have.text", "dog")
|
cy.get(interact.TABLE_TITLE_H1).should("have.text", "dog")
|
||||||
})
|
})
|
||||||
|
|
||||||
it("adds a new column to the table", () => {
|
it("adds a new column to the table", () => {
|
||||||
|
@ -25,13 +26,13 @@ filterTests(["smoke", "all"], () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("updates a column on the table", () => {
|
it("updates a column on the table", () => {
|
||||||
cy.get(".title").click()
|
cy.get(interact.TABLE_TITLE).click()
|
||||||
cy.get(".spectrum-Table-editIcon > use").click()
|
cy.get(interact.SPECTRUM_TABLE_EDIT).click()
|
||||||
cy.get(".modal-inner-wrapper").within(() => {
|
cy.get(interact.MODAL_INNER_WRAPPER).within(() => {
|
||||||
|
|
||||||
cy.get("input").eq(0).type("updated", { force: true })
|
cy.get("input").eq(0).type("updated", { force: true })
|
||||||
// Unset table display column
|
// Unset table display column
|
||||||
cy.get(".spectrum-Switch-input").eq(1).click()
|
cy.get(interact.SPECTRUM_SWITCH_INPUT).eq(1).click()
|
||||||
cy.contains("Save Column").click()
|
cy.contains("Save Column").click()
|
||||||
})
|
})
|
||||||
cy.contains("nameupdated ").should("contain", "nameupdated")
|
cy.contains("nameupdated ").should("contain", "nameupdated")
|
||||||
|
@ -40,16 +41,16 @@ filterTests(["smoke", "all"], () => {
|
||||||
it("edits a row", () => {
|
it("edits a row", () => {
|
||||||
cy.contains("button", "Edit").click({ force: true })
|
cy.contains("button", "Edit").click({ force: true })
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
cy.get(".spectrum-Modal input").clear()
|
cy.get(interact.SPECTRUM_MODAL_INPUT).clear()
|
||||||
cy.get(".spectrum-Modal input").type("Updated")
|
cy.get(interact.SPECTRUM_MODAL_INPUT).type("Updated")
|
||||||
cy.contains("Save").click()
|
cy.contains("Save").click()
|
||||||
cy.contains("Updated").should("have.text", "Updated")
|
cy.contains("Updated").should("have.text", "Updated")
|
||||||
})
|
})
|
||||||
|
|
||||||
it("deletes a row", () => {
|
it("deletes a row", () => {
|
||||||
cy.get(".spectrum-Checkbox-input").check({ force: true })
|
cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true })
|
||||||
cy.contains("Delete 1 row(s)").click()
|
cy.contains("Delete 1 row(s)").click()
|
||||||
cy.get(".spectrum-Modal").contains("Delete").click()
|
cy.get(interact.SPECTRUM_MODAL).contains("Delete").click()
|
||||||
cy.contains("RoverUpdated").should("not.exist")
|
cy.contains("RoverUpdated").should("not.exist")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -63,50 +64,50 @@ filterTests(["smoke", "all"], () => {
|
||||||
}
|
}
|
||||||
cy.reload()
|
cy.reload()
|
||||||
cy.wait(2000)
|
cy.wait(2000)
|
||||||
cy.get(".spectrum-Pagination").within(() => {
|
cy.get(interact.SPECTRUM_PAGINATION).within(() => {
|
||||||
cy.get(".spectrum-ActionButton").eq(1).click()
|
cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).click()
|
||||||
})
|
})
|
||||||
cy.get(".spectrum-Pagination").within(() => {
|
cy.get(interact.SPECTRUM_PAGINATION).within(() => {
|
||||||
cy.get(".spectrum-Body--secondary").contains("Page 2")
|
cy.get(interact.SPECTRUM_BODY_SECOND).contains("Page 2")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
xit("Deletes rows and checks pagination", () => {
|
xit("Deletes rows and checks pagination", () => {
|
||||||
// Delete rows, removing second page from table
|
// Delete rows, removing second page from table
|
||||||
cy.get(".spectrum-Checkbox-input").check({ force: true })
|
cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true })
|
||||||
cy.get(".popovers").within(() => {
|
cy.get(interact.POPOVERS).within(() => {
|
||||||
cy.get(".spectrum-Button").click({ force: true })
|
cy.get(interact.SPECTRUM_BUTTON).click({ force: true })
|
||||||
})
|
})
|
||||||
cy.get(".spectrum-Dialog-grid").contains("Delete").click({ force: true })
|
cy.get(interact.SPECTRUM_DIALOG_GRID).contains("Delete").click({ force: true })
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
|
|
||||||
// Confirm table only has one page
|
// Confirm table only has one page
|
||||||
cy.get(".spectrum-Pagination").within(() => {
|
cy.get(interact.SPECTRUM_PAGINATION).within(() => {
|
||||||
cy.get(".spectrum-ActionButton").eq(1).should("not.be.enabled")
|
cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).should("not.be.enabled")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
it("deletes a column", () => {
|
it("deletes a column", () => {
|
||||||
const columnName = "nameupdated"
|
const columnName = "nameupdated"
|
||||||
cy.get(".title").click()
|
cy.get(interact.TABLE_TITLE).click()
|
||||||
cy.get(".spectrum-Table-editIcon > use").click()
|
cy.get(interact.SPECTRUM_TABLE_EDIT).click()
|
||||||
cy.contains("Delete").click()
|
cy.contains("Delete").click()
|
||||||
cy.get('[data-cy="delete-column-confirm"]').type(columnName)
|
cy.get(interact.DELETE_COLUMN_CONFIRM).type(columnName)
|
||||||
cy.contains("Delete Column").click()
|
cy.contains("Delete Column").click()
|
||||||
cy.contains("nameupdated").should("not.exist")
|
cy.contains("nameupdated").should("not.exist")
|
||||||
})
|
})
|
||||||
|
|
||||||
it("deletes a table", () => {
|
it("deletes a table", () => {
|
||||||
cy.get(".nav-item")
|
cy.get(interact.NAV_ITEM)
|
||||||
.contains("dog")
|
.contains("dog")
|
||||||
.parents(".nav-item")
|
.parents(interact.NAV_ITEM)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(".actions .spectrum-Icon").click({ force: true })
|
cy.get(interact.ACTION_SPECTRUM_ICON).click({ force: true })
|
||||||
})
|
})
|
||||||
cy.get(".spectrum-Menu > :nth-child(2)").click()
|
cy.get(interact.SPECTRUM_MENU_CHILD2).click()
|
||||||
cy.get('[data-cy="delete-table-confirm"]').type("dog")
|
cy.get(interact.DELETE_TABLE_CONFIRM).type("dog")
|
||||||
cy.contains("Delete Table").click()
|
cy.contains("Delete Table").click()
|
||||||
cy.contains("dog").should("not.exist")
|
cy.contains("dog").should("not.exist")
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import filterTests from "../support/filterTests"
|
import filterTests from "../support/filterTests"
|
||||||
|
const interact = require('../support/interact')
|
||||||
|
|
||||||
filterTests(["smoke", "all"], () => {
|
filterTests(["smoke", "all"], () => {
|
||||||
context("Create a User and Assign Roles", () => {
|
context("Create a User and Assign Roles", () => {
|
||||||
|
@ -12,7 +13,7 @@ filterTests(["smoke", "all"], () => {
|
||||||
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
cy.createUser("bbuser@test.com")
|
cy.createUser("bbuser@test.com")
|
||||||
cy.get(".spectrum-Table").should("contain", "bbuser")
|
cy.get(interact.SPECTRUM_TABLE).should("contain", "bbuser")
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should confirm there is No Access for a New User", () => {
|
it("should confirm there is No Access for a New User", () => {
|
||||||
|
@ -20,9 +21,9 @@ filterTests(["smoke", "all"], () => {
|
||||||
cy.contains("bbuser").click()
|
cy.contains("bbuser").click()
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
// Get No Access table - Confirm it has apps in it
|
// Get No Access table - Confirm it has apps in it
|
||||||
cy.get(".spectrum-Table").eq(1).should("not.contain", "No rows found")
|
cy.get(interact.SPECTRUM_TABLE).eq(1).should("not.contain", "No rows found")
|
||||||
// Get Configure Roles table - Confirm it has no apps
|
// Get Configure Roles table - Confirm it has no apps
|
||||||
cy.get(".spectrum-Table").eq(0).contains("No rows found")
|
cy.get(interact.SPECTRUM_TABLE).eq(0).contains("No rows found")
|
||||||
})
|
})
|
||||||
|
|
||||||
if (Cypress.env("TEST_ENV")) {
|
if (Cypress.env("TEST_ENV")) {
|
||||||
|
@ -40,7 +41,7 @@ filterTests(["smoke", "all"], () => {
|
||||||
} else {
|
} else {
|
||||||
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(`[data-cy="create-app-btn"]`).click({ force: true })
|
cy.get(interact.CREATE_APP_BUTTON).click({ force: true })
|
||||||
cy.createAppFromScratch(name)
|
cy.createAppFromScratch(name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,35 +50,35 @@ filterTests(["smoke", "all"], () => {
|
||||||
// Navigate back to the user
|
// Navigate back to the user
|
||||||
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
cy.visit(`${Cypress.config().baseUrl}/builder`)
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(".spectrum-SideNav").contains("Users").click()
|
cy.get(interact.SPECTRUM_SIDENAV).contains("Users").click()
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(".spectrum-Table").contains("bbuser").click()
|
cy.get(interact.SPECTRUM_TABLE).contains("bbuser").click()
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
for (let i = 0; i < 3; i++) {
|
for (let i = 0; i < 3; i++) {
|
||||||
cy.get(".spectrum-Table", { timeout: 3000})
|
cy.get(interact.SPECTRUM_TABLE, { timeout: 3000})
|
||||||
.eq(1)
|
.eq(1)
|
||||||
.find(".spectrum-Table-row")
|
.find(interact.SPECTRUM_TABLE_ROW)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.find(".spectrum-Table-cell")
|
.find(interact.SPECTRUM_TABLE_CELL)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.click()
|
.click()
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(".spectrum-Dialog-grid")
|
cy.get(interact.SPECTRUM_DIALOG_GRID)
|
||||||
.contains("Choose an option")
|
.contains("Choose an option")
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
cy.get(".spectrum-Menu").contains("Admin").click({ force: true })
|
cy.get(interact.SPECTRUM_MENU).contains("Admin").click({ force: true })
|
||||||
}
|
}
|
||||||
else if (i == 1) {
|
else if (i == 1) {
|
||||||
cy.get(".spectrum-Menu").contains("Power").click({ force: true })
|
cy.get(interact.SPECTRUM_MENU).contains("Power").click({ force: true })
|
||||||
}
|
}
|
||||||
else if (i == 2) {
|
else if (i == 2) {
|
||||||
cy.get(".spectrum-Menu").contains("Basic").click({ force: true })
|
cy.get(interact.SPECTRUM_MENU).contains("Basic").click({ force: true })
|
||||||
}
|
}
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
cy.get(".spectrum-Button")
|
cy.get(interact.SPECTRUM_BUTTON)
|
||||||
.contains("Update role")
|
.contains("Update role")
|
||||||
.click({ force: true })
|
.click({ force: true })
|
||||||
})
|
})
|
||||||
|
@ -85,7 +86,7 @@ filterTests(["smoke", "all"], () => {
|
||||||
}
|
}
|
||||||
// Confirm roles exist within Configure roles table
|
// Confirm roles exist within Configure roles table
|
||||||
cy.wait(2000)
|
cy.wait(2000)
|
||||||
cy.get(".spectrum-Table")
|
cy.get(interact.SPECTRUM_TABLE)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.within(assginedRoles => {
|
.within(assginedRoles => {
|
||||||
expect(assginedRoles).to.contain("Admin")
|
expect(assginedRoles).to.contain("Admin")
|
||||||
|
@ -96,60 +97,60 @@ filterTests(["smoke", "all"], () => {
|
||||||
|
|
||||||
it("should unassign role types", () => {
|
it("should unassign role types", () => {
|
||||||
// Set each app within Configure roles table to 'No Access'
|
// Set each app within Configure roles table to 'No Access'
|
||||||
cy.get(".spectrum-Table")
|
cy.get(interact.SPECTRUM_TABLE)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.find(".spectrum-Table-row")
|
.find(interact.SPECTRUM_TABLE_ROW)
|
||||||
.its("length")
|
.its("length")
|
||||||
.then(len => {
|
.then(len => {
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
cy.get(".spectrum-Table")
|
cy.get(interact.SPECTRUM_TABLE)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.find(".spectrum-Table-row")
|
.find(interact.SPECTRUM_TABLE_ROW)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.find(".spectrum-Table-cell")
|
.find(interact.SPECTRUM_TABLE_CELL)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
cy.get(".spectrum-Picker").eq(1).click({ force: true })
|
cy.get(interact.SPECTRUM_PICKER).eq(1).click({ force: true })
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(".spectrum-Popover").contains("No Access").click()
|
cy.get(interact.SPECTRUM_POPOVER).contains("No Access").click()
|
||||||
})
|
})
|
||||||
cy.get(".spectrum-Button")
|
cy.get(interact.SPECTRUM_BUTTON)
|
||||||
.contains("Update role")
|
.contains("Update role")
|
||||||
.click({ force: true })
|
.click({ force: true })
|
||||||
cy.wait(1000)
|
cy.wait(1000)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// Confirm Configure roles table no longer has any apps in it
|
// Confirm Configure roles table no longer has any apps in it
|
||||||
cy.get(".spectrum-Table").eq(0).contains("No rows found")
|
cy.get(interact.SPECTRUM_TABLE).eq(0).contains("No rows found")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
it("should enable Developer access", () => {
|
it("should enable Developer access", () => {
|
||||||
// Enable Developer access
|
// Enable Developer access
|
||||||
cy.get(".field")
|
cy.get(interact.FIELD)
|
||||||
.eq(4)
|
.eq(4)
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(".spectrum-Switch-input").click({ force: true })
|
cy.get(interact.SPECTRUM_SWITCH_INPUT).click({ force: true })
|
||||||
})
|
})
|
||||||
// No Access table should now be empty
|
// No Access table should now be empty
|
||||||
cy.get(".container")
|
cy.get(interact.CONTAINER)
|
||||||
.contains("No Access")
|
.contains("No Access")
|
||||||
.parent()
|
.parent()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(".spectrum-Table").contains("No rows found")
|
cy.get(interact.SPECTRUM_TABLE).contains("No rows found")
|
||||||
})
|
})
|
||||||
|
|
||||||
// Each app within Configure roles should have Admin access
|
// Each app within Configure roles should have Admin access
|
||||||
cy.get(".spectrum-Table")
|
cy.get(interact.SPECTRUM_TABLE)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.find(".spectrum-Table-row")
|
.find(interact.SPECTRUM_TABLE_ROW)
|
||||||
.its("length")
|
.its("length")
|
||||||
.then(len => {
|
.then(len => {
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
cy.get(".spectrum-Table")
|
cy.get(interact.SPECTRUM_TABLE)
|
||||||
.eq(0)
|
.eq(0)
|
||||||
.find(".spectrum-Table-row")
|
.find(interact.SPECTRUM_TABLE_ROW)
|
||||||
.eq(i)
|
.eq(i)
|
||||||
.contains("Admin")
|
.contains("Admin")
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
|
@ -169,26 +170,26 @@ filterTests(["smoke", "all"], () => {
|
||||||
.contains("Configure roles")
|
.contains("Configure roles")
|
||||||
.parent()
|
.parent()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(".spectrum-Table").contains("No rows found")
|
cy.get(interact.SPECTRUM_TABLE).contains("No rows found")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should delete a user", () => {
|
it("should delete a user", () => {
|
||||||
// Click Delete user button
|
// Click Delete user button
|
||||||
cy.get(".spectrum-Button")
|
cy.get(interact.SPECTRUM_BUTTON)
|
||||||
.contains("Delete user")
|
.contains("Delete user")
|
||||||
.click({ force: true })
|
.click({ force: true })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
// Confirm deletion within modal
|
// Confirm deletion within modal
|
||||||
cy.wait(500)
|
cy.wait(500)
|
||||||
cy.get(".spectrum-Dialog-grid").within(() => {
|
cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => {
|
||||||
cy.get(".spectrum-Button")
|
cy.get(interact.SPECTRUM_BUTTON)
|
||||||
.contains("Delete user")
|
.contains("Delete user")
|
||||||
.click({ force: true })
|
.click({ force: true })
|
||||||
cy.wait(4000)
|
cy.wait(4000)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
cy.get(".spectrum-Table").should("not.have.text", "bbuser")
|
cy.get(interact.SPECTRUM_TABLE).should("not.have.text", "bbuser")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -26,6 +26,7 @@ export const SPECTRUM_POPOVER = ".spectrum-Popover"
|
||||||
export const OPTION_SOURCE_PROP_CONROL = '[data-cy="optionsSource-prop-control'
|
export const OPTION_SOURCE_PROP_CONROL = '[data-cy="optionsSource-prop-control'
|
||||||
export const APP_TABLE_STATUS = ".appTable .app-status"
|
export const APP_TABLE_STATUS = ".appTable .app-status"
|
||||||
export const APP_TABLE_ROW_ACTION = ".appTable .app-row-actions"
|
export const APP_TABLE_ROW_ACTION = ".appTable .app-row-actions"
|
||||||
|
export const APP_TABLE_APP_NAME = '[data-cy="app-name-link"]'
|
||||||
export const DEPLOYMENT_TOP_NAV_GLOBESTRIKE =
|
export const DEPLOYMENT_TOP_NAV_GLOBESTRIKE =
|
||||||
".deployment-top-nav svg[aria-label=GlobeStrike]"
|
".deployment-top-nav svg[aria-label=GlobeStrike]"
|
||||||
export const DEPLOYMENT_TOP_GLOBE = ".deployment-top-nav svg[aria-label=Globe]"
|
export const DEPLOYMENT_TOP_GLOBE = ".deployment-top-nav svg[aria-label=Globe]"
|
||||||
|
@ -33,13 +34,14 @@ export const PUBLISH_POPOVER_MENU = '[data-cy="publish-popover-menu"]'
|
||||||
export const PUBLISH_POPOVER_ACTION = '[data-cy="publish-popover-action"]'
|
export const PUBLISH_POPOVER_ACTION = '[data-cy="publish-popover-action"]'
|
||||||
export const PUBLISH_POPOVER_MESSAGE = ".publish-popover-message"
|
export const PUBLISH_POPOVER_MESSAGE = ".publish-popover-message"
|
||||||
export const SPECTRUM_BUTTON = ".spectrum-Button"
|
export const SPECTRUM_BUTTON = ".spectrum-Button"
|
||||||
|
export const SPECTRUM_LINK = ".spectrum-Link"
|
||||||
export const TOPRIGHTNAV_BUTTON_SPECTRUM = ".toprightnav button.spectrum-Button"
|
export const TOPRIGHTNAV_BUTTON_SPECTRUM = ".toprightnav button.spectrum-Button"
|
||||||
|
|
||||||
//createComponents
|
//createComponents
|
||||||
export const SETTINGS = "[data-cy=Settings]"
|
export const SETTINGS = "[data-cy=Settings]"
|
||||||
export const SETTINGS_INPUT = "[data-cy=setting-text] input"
|
export const SETTINGS_INPUT = "[data-cy=setting-text] input"
|
||||||
export const DESIGN = "[data-cy=Design]"
|
export const DESIGN = "[data-cy=Design]"
|
||||||
export const FONT_SIZE_PROP_CONTRO = "[data-cy=font-size-prop-control]"
|
export const FONT_SIZE_PROP_CONTROL = "[data-cy=font-size-prop-control]"
|
||||||
export const DATA_CY_DATASOURCE = "[data-cy=setting-dataSource]"
|
export const DATA_CY_DATASOURCE = "[data-cy=setting-dataSource]"
|
||||||
export const DROPDOWN_CONTAINER = ".dropdown-container"
|
export const DROPDOWN_CONTAINER = ".dropdown-container"
|
||||||
export const SPECTRUM_PICKER = ".spectrum-Picker"
|
export const SPECTRUM_PICKER = ".spectrum-Picker"
|
||||||
|
@ -53,8 +55,52 @@ export const NAV_ITEMS_CONTAINER = ".nav-items-container"
|
||||||
|
|
||||||
//publishWorkFlow
|
//publishWorkFlow
|
||||||
export const DEPLOY_APP_MODAL = ".spectrum-Modal [data-cy=deploy-app-modal]"
|
export const DEPLOY_APP_MODAL = ".spectrum-Modal [data-cy=deploy-app-modal]"
|
||||||
|
export const DEPLOY_SUCCESS_MODAL =
|
||||||
|
".spectrum-Modal [data-cy=deploy-app-success-modal]"
|
||||||
export const DEPLOY_APP_URL_INPUT = "[data-cy=deployed-app-url] input"
|
export const DEPLOY_APP_URL_INPUT = "[data-cy=deployed-app-url] input"
|
||||||
export const GLOBESTRIKE = "svg[aria-label=GlobeStrike]"
|
export const GLOBESTRIKE = "svg[aria-label=GlobeStrike]"
|
||||||
export const GLOBE = "svg[aria-label=Globe]"
|
export const GLOBE = "svg[aria-label=Globe]"
|
||||||
export const UNPUBLISH_MODAL = "[data-cy=unpublish-modal]"
|
export const UNPUBLISH_MODAL = "[data-cy=unpublish-modal]"
|
||||||
export const CONFIRM_WRAP_BUTTON = ".confirm-wrap button"
|
export const CONFIRM_WRAP_BUTTON = ".confirm-wrap button"
|
||||||
|
|
||||||
|
//changeAppiconAndColour
|
||||||
|
export const APP_ROW_ACTION = ".app-row-actions-icon"
|
||||||
|
export const SPECTRUM_MENU = ".spectrum-Menu"
|
||||||
|
export const ICON_ITEM = ".icon-item"
|
||||||
|
export const FILL = ".fill"
|
||||||
|
export const COLOURSS = ".colors"
|
||||||
|
export const AREA_LABEL = "[aria-label]"
|
||||||
|
export const TITLE = ".title"
|
||||||
|
export const GRID = ".grid"
|
||||||
|
export const COLOUR = ".color"
|
||||||
|
|
||||||
|
//createAutomation
|
||||||
|
export const ADD_BUTTON_SPECTRUM = ".add-button .spectrum-Icon"
|
||||||
|
export const MODAL_INNER_WRAPPER = ".modal-inner-wrapper"
|
||||||
|
export const SPECTRUM_BUTTON_CTA = ".spectrum-Button--cta"
|
||||||
|
export const SPECTRUM_TEXTFIELD_INPUT = ".spectrum-Textfield-input"
|
||||||
|
|
||||||
|
//createTable
|
||||||
|
export const TABLE_TITLE_H1 = ".table-title h1"
|
||||||
|
export const TABLE_TITLE = ".title"
|
||||||
|
export const SPECTRUM_TABLE_EDIT = ".spectrum-Table-editIcon > use"
|
||||||
|
export const SPECTRUM_SWITCH_INPUT = ".spectrum-Switch-input"
|
||||||
|
export const SPECTRUM_CHECKBOX_INPUT = ".spectrum-Checkbox-input"
|
||||||
|
export const SPECTRUM_PAGINATION = ".spectrum-Pagination"
|
||||||
|
export const SPECTRUM_ACTION_BUTTON = ".spectrum-ActionButton"
|
||||||
|
export const SPECTRUM_BODY_SECOND = ".spectrum-Body--secondary"
|
||||||
|
export const POPOVERS = ".popovers"
|
||||||
|
export const SPECTRUM_DIALOG_GRID = ".spectrum-Dialog-grid"
|
||||||
|
export const DELETE_COLUMN_CONFIRM = '[data-cy="delete-column-confirm"]'
|
||||||
|
export const NAV_ITEM = ".nav-item"
|
||||||
|
export const ACTION_SPECTRUM_ICON = ".actions .spectrum-Icon"
|
||||||
|
export const SPECTRUM_MENU_CHILD2 = ".spectrum-Menu > :nth-child(2)"
|
||||||
|
export const DELETE_TABLE_CONFIRM = '[data-cy="delete-table-confirm"]'
|
||||||
|
|
||||||
|
//createUSerAndRoles
|
||||||
|
export const SPECTRUM_TABLE = ".spectrum-Table"
|
||||||
|
export const SPECTRUM_SIDENAV = ".spectrum-SideNav"
|
||||||
|
export const SPECTRUM_TABLE_ROW = ".spectrum-Table-row"
|
||||||
|
export const SPECTRUM_TABLE_CELL = ".spectrum-Table-cell"
|
||||||
|
export const FIELD = ".field"
|
||||||
|
export const CONTAINER = ".container"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/builder",
|
"name": "@budibase/builder",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -69,10 +69,10 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@budibase/bbui": "^1.0.192-alpha.2",
|
"@budibase/bbui": "^1.0.192-alpha.6",
|
||||||
"@budibase/client": "^1.0.192-alpha.2",
|
"@budibase/client": "^1.0.192-alpha.6",
|
||||||
"@budibase/frontend-core": "^1.0.192-alpha.2",
|
"@budibase/frontend-core": "^1.0.192-alpha.6",
|
||||||
"@budibase/string-templates": "^1.0.192-alpha.2",
|
"@budibase/string-templates": "^1.0.192-alpha.6",
|
||||||
"@sentry/browser": "5.19.1",
|
"@sentry/browser": "5.19.1",
|
||||||
"@spectrum-css/page": "^3.0.1",
|
"@spectrum-css/page": "^3.0.1",
|
||||||
"@spectrum-css/vars": "^3.0.1",
|
"@spectrum-css/vars": "^3.0.1",
|
||||||
|
|
|
@ -101,7 +101,7 @@
|
||||||
confirmText="Done"
|
confirmText="Done"
|
||||||
cancelText="View App"
|
cancelText="View App"
|
||||||
onCancel={viewApp}
|
onCancel={viewApp}
|
||||||
dataCy={"deploy-app-success-modal"}
|
dataCy="deploy-app-success-modal"
|
||||||
>
|
>
|
||||||
<div slot="header" class="app-published-header">
|
<div slot="header" class="app-published-header">
|
||||||
<svg
|
<svg
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<div class="app-icon" style="color: {app.icon?.color || ''}">
|
<div class="app-icon" style="color: {app.icon?.color || ''}">
|
||||||
<Icon size="XL" name={app.icon?.name || "Apps"} />
|
<Icon size="XL" name={app.icon?.name || "Apps"} />
|
||||||
</div>
|
</div>
|
||||||
<div class="name" on:click={() => appOverview(app)}>
|
<div class="name" data-cy="app-name-link" on:click={() => appOverview(app)}>
|
||||||
<Heading size="XS">
|
<Heading size="XS">
|
||||||
{app.name}
|
{app.name}
|
||||||
</Heading>
|
</Heading>
|
||||||
|
|
16
packages/builder/src/components/start/ExportAppModal.svelte
Normal file
16
packages/builder/src/components/start/ExportAppModal.svelte
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<script>
|
||||||
|
import { ModalContent, Toggle } from "@budibase/bbui"
|
||||||
|
|
||||||
|
export let app
|
||||||
|
let excludeRows = false
|
||||||
|
|
||||||
|
const exportApp = () => {
|
||||||
|
const id = app.deployed ? app.prodId : app.devId
|
||||||
|
const appName = encodeURIComponent(app.name)
|
||||||
|
window.location = `/api/backups/export?appId=${id}&appname=${appName}&excludeRows=${excludeRows}`
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<ModalContent title={"Export"} confirmText={"Export"} onConfirm={exportApp}>
|
||||||
|
<Toggle text="Exclude Rows" bind:value={excludeRows} />
|
||||||
|
</ModalContent>
|
|
@ -17,6 +17,7 @@
|
||||||
import CreateAppModal from "components/start/CreateAppModal.svelte"
|
import CreateAppModal from "components/start/CreateAppModal.svelte"
|
||||||
import UpdateAppModal from "components/start/UpdateAppModal.svelte"
|
import UpdateAppModal from "components/start/UpdateAppModal.svelte"
|
||||||
import ChooseIconModal from "components/start/ChooseIconModal.svelte"
|
import ChooseIconModal from "components/start/ChooseIconModal.svelte"
|
||||||
|
import ExportAppModal from "components/start/ExportAppModal.svelte"
|
||||||
|
|
||||||
import { store, automationStore } from "builderStore"
|
import { store, automationStore } from "builderStore"
|
||||||
import { API } from "api"
|
import { API } from "api"
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
let updatingModal
|
let updatingModal
|
||||||
let deletionModal
|
let deletionModal
|
||||||
let unpublishModal
|
let unpublishModal
|
||||||
|
let exportModal
|
||||||
let iconModal
|
let iconModal
|
||||||
let creatingApp = false
|
let creatingApp = false
|
||||||
let loaded = $apps?.length || $templates?.length
|
let loaded = $apps?.length || $templates?.length
|
||||||
|
@ -200,9 +202,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
const exportApp = app => {
|
const exportApp = app => {
|
||||||
const id = app.deployed ? app.prodId : app.devId
|
exportModal.show()
|
||||||
const appName = encodeURIComponent(app.name)
|
selectedApp = app
|
||||||
window.location = `/api/backups/export?appId=${id}&appname=${appName}`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const unpublishApp = app => {
|
const unpublishApp = app => {
|
||||||
|
@ -457,6 +458,10 @@
|
||||||
<UpdateAppModal app={selectedApp} />
|
<UpdateAppModal app={selectedApp} />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<Modal bind:this={exportModal} padding={false} width="600px">
|
||||||
|
<ExportAppModal app={selectedApp} />
|
||||||
|
</Modal>
|
||||||
|
|
||||||
<ConfirmDialog
|
<ConfirmDialog
|
||||||
bind:this={deletionModal}
|
bind:this={deletionModal}
|
||||||
title="Confirm deletion"
|
title="Confirm deletion"
|
||||||
|
|
|
@ -273,12 +273,6 @@
|
||||||
Export
|
Export
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
{#if isPublished}
|
{#if isPublished}
|
||||||
<MenuItem
|
|
||||||
on:click={() => unpublishApp(selectedApp)}
|
|
||||||
icon="GlobeRemove"
|
|
||||||
>
|
|
||||||
Unpublish
|
|
||||||
</MenuItem>
|
|
||||||
<MenuItem on:click={() => copyAppId(selectedApp)} icon="Copy">
|
<MenuItem on:click={() => copyAppId(selectedApp)} icon="Copy">
|
||||||
Copy App ID
|
Copy App ID
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
@ -305,6 +299,7 @@
|
||||||
app={selectedApp}
|
app={selectedApp}
|
||||||
deployments={latestDeployments}
|
deployments={latestDeployments}
|
||||||
navigateTab={handleTabChange}
|
navigateTab={handleTabChange}
|
||||||
|
on:unpublish={e => unpublishApp(e.detail)}
|
||||||
/>
|
/>
|
||||||
</Tab>
|
</Tab>
|
||||||
{#if false}
|
{#if false}
|
||||||
|
|
|
@ -13,10 +13,12 @@
|
||||||
import clientPackage from "@budibase/client/package.json"
|
import clientPackage from "@budibase/client/package.json"
|
||||||
import { processStringSync } from "@budibase/string-templates"
|
import { processStringSync } from "@budibase/string-templates"
|
||||||
import { users, auth } from "stores/portal"
|
import { users, auth } from "stores/portal"
|
||||||
|
import { createEventDispatcher } from "svelte"
|
||||||
|
|
||||||
export let app
|
export let app
|
||||||
export let deployments
|
export let deployments
|
||||||
export let navigateTab
|
export let navigateTab
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
const userInit = async () => {
|
const userInit = async () => {
|
||||||
try {
|
try {
|
||||||
|
@ -26,6 +28,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const unpublishApp = () => {
|
||||||
|
dispatch("unpublish", app)
|
||||||
|
}
|
||||||
|
|
||||||
let userPromise = userInit()
|
let userPromise = userInit()
|
||||||
|
|
||||||
$: updateAvailable = clientPackage.version !== $store.version
|
$: updateAvailable = clientPackage.version !== $store.version
|
||||||
|
@ -72,6 +78,9 @@
|
||||||
new Date(deployments[0].updatedAt).getTime(),
|
new Date(deployments[0].updatedAt).getTime(),
|
||||||
}
|
}
|
||||||
)}
|
)}
|
||||||
|
{#if isPublished}
|
||||||
|
- <Link on:click={unpublishApp}>Unpublish</Link>
|
||||||
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
{#if !deployments?.length}
|
{#if !deployments?.length}
|
||||||
-
|
-
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/cli",
|
"name": "@budibase/cli",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"description": "Budibase CLI, for developers, self hosting and migrations.",
|
"description": "Budibase CLI, for developers, self hosting and migrations.",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/client",
|
"name": "@budibase/client",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"module": "dist/budibase-client.js",
|
"module": "dist/budibase-client.js",
|
||||||
"main": "dist/budibase-client.js",
|
"main": "dist/budibase-client.js",
|
||||||
|
@ -19,9 +19,9 @@
|
||||||
"dev:builder": "rollup -cw"
|
"dev:builder": "rollup -cw"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@budibase/bbui": "^1.0.192-alpha.2",
|
"@budibase/bbui": "^1.0.192-alpha.6",
|
||||||
"@budibase/frontend-core": "^1.0.192-alpha.2",
|
"@budibase/frontend-core": "^1.0.192-alpha.6",
|
||||||
"@budibase/string-templates": "^1.0.192-alpha.2",
|
"@budibase/string-templates": "^1.0.192-alpha.6",
|
||||||
"@spectrum-css/button": "^3.0.3",
|
"@spectrum-css/button": "^3.0.3",
|
||||||
"@spectrum-css/card": "^3.0.3",
|
"@spectrum-css/card": "^3.0.3",
|
||||||
"@spectrum-css/divider": "^1.0.3",
|
"@spectrum-css/divider": "^1.0.3",
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/frontend-core",
|
"name": "@budibase/frontend-core",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"description": "Budibase frontend core libraries used in builder and client",
|
"description": "Budibase frontend core libraries used in builder and client",
|
||||||
"author": "Budibase",
|
"author": "Budibase",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"svelte": "src/index.js",
|
"svelte": "src/index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@budibase/bbui": "^1.0.192-alpha.2",
|
"@budibase/bbui": "^1.0.192-alpha.6",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"svelte": "^3.46.2"
|
"svelte": "^3.46.2"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/server",
|
"name": "@budibase/server",
|
||||||
"email": "hi@budibase.com",
|
"email": "hi@budibase.com",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"description": "Budibase Web Server",
|
"description": "Budibase Web Server",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -70,10 +70,10 @@
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apidevtools/swagger-parser": "^10.0.3",
|
"@apidevtools/swagger-parser": "^10.0.3",
|
||||||
"@budibase/backend-core": "^1.0.192-alpha.2",
|
"@budibase/backend-core": "^1.0.192-alpha.6",
|
||||||
"@budibase/client": "^1.0.192-alpha.2",
|
"@budibase/client": "^1.0.192-alpha.6",
|
||||||
"@budibase/pro": "1.0.192-alpha.2",
|
"@budibase/pro": "1.0.192-alpha.6",
|
||||||
"@budibase/string-templates": "^1.0.192-alpha.2",
|
"@budibase/string-templates": "^1.0.192-alpha.6",
|
||||||
"@bull-board/api": "^3.7.0",
|
"@bull-board/api": "^3.7.0",
|
||||||
"@bull-board/koa": "^3.7.0",
|
"@bull-board/koa": "^3.7.0",
|
||||||
"@elastic/elasticsearch": "7.10.0",
|
"@elastic/elasticsearch": "7.10.0",
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
const { streamBackup } = require("../../utilities/fileSystem")
|
const { streamBackup } = require("../../utilities/fileSystem")
|
||||||
|
|
||||||
exports.exportAppDump = async function (ctx) {
|
exports.exportAppDump = async function (ctx) {
|
||||||
const { appId } = ctx.query
|
let { appId, excludeRows } = ctx.query
|
||||||
const appName = decodeURI(ctx.query.appname)
|
const appName = decodeURI(ctx.query.appname)
|
||||||
|
excludeRows = excludeRows === "true"
|
||||||
const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
|
const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
|
||||||
ctx.attachment(backupIdentifier)
|
ctx.attachment(backupIdentifier)
|
||||||
ctx.body = await streamBackup(appId)
|
|
||||||
|
ctx.body = await streamBackup(appId, excludeRows)
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,7 @@ exports.isDevAppID = isDevAppID
|
||||||
exports.isProdAppID = isProdAppID
|
exports.isProdAppID = isProdAppID
|
||||||
exports.USER_METDATA_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
exports.USER_METDATA_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
||||||
exports.LINK_USER_METADATA_PREFIX = `${DocumentTypes.LINK}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
exports.LINK_USER_METADATA_PREFIX = `${DocumentTypes.LINK}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
||||||
|
exports.TABLE_ROW_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${DocumentTypes.TABLE}`
|
||||||
exports.ViewNames = ViewNames
|
exports.ViewNames = ViewNames
|
||||||
exports.InternalTables = InternalTables
|
exports.InternalTables = InternalTables
|
||||||
exports.DocumentTypes = DocumentTypes
|
exports.DocumentTypes = DocumentTypes
|
||||||
|
|
|
@ -21,6 +21,7 @@ const env = require("../../environment")
|
||||||
const {
|
const {
|
||||||
USER_METDATA_PREFIX,
|
USER_METDATA_PREFIX,
|
||||||
LINK_USER_METADATA_PREFIX,
|
LINK_USER_METADATA_PREFIX,
|
||||||
|
TABLE_ROW_PREFIX,
|
||||||
} = require("../../db/utils")
|
} = require("../../db/utils")
|
||||||
const MemoryStream = require("memorystream")
|
const MemoryStream = require("memorystream")
|
||||||
const { getAppId } = require("@budibase/backend-core/context")
|
const { getAppId } = require("@budibase/backend-core/context")
|
||||||
|
@ -109,6 +110,23 @@ exports.apiFileReturn = contents => {
|
||||||
return fs.createReadStream(path)
|
return fs.createReadStream(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exports.defineFilter = excludeRows => {
|
||||||
|
if (excludeRows) {
|
||||||
|
return doc =>
|
||||||
|
!(
|
||||||
|
doc._id.includes(USER_METDATA_PREFIX) ||
|
||||||
|
doc._id.includes(LINK_USER_METADATA_PREFIX) ||
|
||||||
|
doc._id.includes(TABLE_ROW_PREFIX)
|
||||||
|
)
|
||||||
|
} else if (!excludeRows) {
|
||||||
|
return doc =>
|
||||||
|
!(
|
||||||
|
doc._id.includes(USER_METDATA_PREFIX) ||
|
||||||
|
doc._id.includes(LINK_USER_METADATA_PREFIX)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local utility to back up the database state for an app, excluding global user
|
* Local utility to back up the database state for an app, excluding global user
|
||||||
* data or user relationships.
|
* data or user relationships.
|
||||||
|
@ -116,14 +134,10 @@ exports.apiFileReturn = contents => {
|
||||||
* @param {object} config Config to send to export DB
|
* @param {object} config Config to send to export DB
|
||||||
* @returns {*} either a string or a stream of the backup
|
* @returns {*} either a string or a stream of the backup
|
||||||
*/
|
*/
|
||||||
const backupAppData = async (appId, config) => {
|
const backupAppData = async (appId, config, includeRows) => {
|
||||||
return await exports.exportDB(appId, {
|
return await exports.exportDB(appId, {
|
||||||
...config,
|
...config,
|
||||||
filter: doc =>
|
filter: exports.defineFilter(includeRows),
|
||||||
!(
|
|
||||||
doc._id.includes(USER_METDATA_PREFIX) ||
|
|
||||||
doc._id.includes(LINK_USER_METADATA_PREFIX)
|
|
||||||
),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,8 +156,8 @@ exports.performBackup = async (appId, backupName) => {
|
||||||
* @param {string} appId The ID of the app which is to be backed up.
|
* @param {string} appId The ID of the app which is to be backed up.
|
||||||
* @returns {*} a readable stream of the backup which is written in real time
|
* @returns {*} a readable stream of the backup which is written in real time
|
||||||
*/
|
*/
|
||||||
exports.streamBackup = async appId => {
|
exports.streamBackup = async (appId, includeRows) => {
|
||||||
return await backupAppData(appId, { stream: true })
|
return await backupAppData(appId, { stream: true }, includeRows)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/string-templates",
|
"name": "@budibase/string-templates",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"description": "Handlebars wrapper for Budibase templating.",
|
"description": "Handlebars wrapper for Budibase templating.",
|
||||||
"main": "src/index.cjs",
|
"main": "src/index.cjs",
|
||||||
"module": "dist/bundle.mjs",
|
"module": "dist/bundle.mjs",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@budibase/worker",
|
"name": "@budibase/worker",
|
||||||
"email": "hi@budibase.com",
|
"email": "hi@budibase.com",
|
||||||
"version": "1.0.192-alpha.2",
|
"version": "1.0.192-alpha.6",
|
||||||
"description": "Budibase background service",
|
"description": "Budibase background service",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -32,9 +32,9 @@
|
||||||
"author": "Budibase",
|
"author": "Budibase",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@budibase/backend-core": "^1.0.192-alpha.2",
|
"@budibase/backend-core": "^1.0.192-alpha.6",
|
||||||
"@budibase/pro": "1.0.192-alpha.2",
|
"@budibase/pro": "1.0.192-alpha.6",
|
||||||
"@budibase/string-templates": "^1.0.192-alpha.2",
|
"@budibase/string-templates": "^1.0.192-alpha.6",
|
||||||
"@koa/router": "^8.0.0",
|
"@koa/router": "^8.0.0",
|
||||||
"@sentry/node": "6.17.7",
|
"@sentry/node": "6.17.7",
|
||||||
"@techpass/passport-openidconnect": "^0.3.0",
|
"@techpass/passport-openidconnect": "^0.3.0",
|
||||||
|
|
Loading…
Reference in a new issue