diff --git a/lerna.json b/lerna.json index 66d922c199..21ea8e3df8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 70a110acab..72d47ca33e 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "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", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index a779bd6902..c1acdac1b6 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "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", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@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/actiongroup": "^1.0.1", "@spectrum-css/avatar": "^3.0.2", diff --git a/packages/builder/cypress/integration/appPublishWorkflow.spec.js b/packages/builder/cypress/integration/appPublishWorkflow.spec.js index d05a97f691..f0a7dd791a 100644 --- a/packages/builder/cypress/integration/appPublishWorkflow.spec.js +++ b/packages/builder/cypress/integration/appPublishWorkflow.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +import { APP_TABLE_APP_NAME, DEPLOY_SUCCESS_MODAL } from "../support/interact"; const interact = require('../support/interact') filterTests(['all'], () => { @@ -20,10 +21,9 @@ filterTests(['all'], () => { cy.get(interact.APP_TABLE_ROW_ACTION).eq(0) .within(() => { - cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Preview") 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_GLOBE).should("not.exist") }) @@ -39,7 +39,7 @@ filterTests(['all'], () => { }); //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") .within(() => { 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.PUBLISH_POPOVER_MENU).should("be.visible") .within(() => { 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 - + cy.visit(`${Cypress.config().baseUrl}/builder`) cy.get(interact.APP_TABLE_STATUS).eq(0) @@ -85,17 +85,11 @@ filterTests(['all'], () => { cy.get(interact.APP_TABLE_ROW_ACTION).eq(0) .within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("View app") - cy.get(interact.SPECTRUM_BUTTON).contains("Edit").click({ force: true }) + cy.get(interact.SPECTRUM_BUTTON).contains("View") + cy.get(interact.APP_TABLE_APP_NAME).click({ force: true }) }) - //The published status - 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.SPECTRUM_LINK).contains('Unpublish').click(); cy.get(interact.UNPUBLISH_MODAL).should("be.visible") .within(() => { diff --git a/packages/builder/cypress/integration/createAutomation.spec.js b/packages/builder/cypress/integration/createAutomation.spec.js index 69ef3f98a3..6a4b70f8dc 100644 --- a/packages/builder/cypress/integration/createAutomation.spec.js +++ b/packages/builder/cypress/integration/createAutomation.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +const interact = require('../support/interact') filterTests(['smoke', 'all'], () => { context("Create a automation", () => { @@ -11,51 +12,51 @@ filterTests(['smoke', 'all'], () => { cy.createTestTableWithData() cy.wait(2000) cy.contains("Automate").click() - cy.get(".add-button .spectrum-Icon").click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.ADD_BUTTON_SPECTRUM).click() + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.get("input").type("Add Row") cy.contains("Row Created").click({ force: true }) cy.wait(500) - cy.get(".spectrum-Button--cta").click() + cy.get(interact.SPECTRUM_BUTTON_CTA).click() }) // Setup trigger - cy.get(".spectrum-Picker-label").click() + cy.get(interact.SPECTRUM_PICKER_LABEL).click() cy.wait(500) cy.contains("dog").click() cy.wait(2000) // Create action 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.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.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .first() .type("{{ trigger.row.name }}", { parseSpecialCharSequences: false }) - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(1) .type("11") cy.contains("Finish and test automation").click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.wait(1000) - cy.get(".spectrum-Picker-label").click() + cy.get(interact.SPECTRUM_PICKER_LABEL).click() cy.contains("dog").click() cy.wait(1000) - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .first() .type("automationGoodboy") - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(1) .type("11") - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(2) .type("123456") - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(3) .type("123456") cy.contains("Test").click() diff --git a/packages/builder/cypress/integration/createTable.spec.js b/packages/builder/cypress/integration/createTable.spec.js index 4600807cbc..7d55a1f03c 100644 --- a/packages/builder/cypress/integration/createTable.spec.js +++ b/packages/builder/cypress/integration/createTable.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +const interact = require('../support/interact') filterTests(["smoke", "all"], () => { context("Create a Table", () => { @@ -11,7 +12,7 @@ filterTests(["smoke", "all"], () => { cy.createTable("dog") cy.wait(1000) // 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", () => { @@ -25,13 +26,13 @@ filterTests(["smoke", "all"], () => { }) it("updates a column on the table", () => { - cy.get(".title").click() - cy.get(".spectrum-Table-editIcon > use").click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.TABLE_TITLE).click() + cy.get(interact.SPECTRUM_TABLE_EDIT).click() + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.get("input").eq(0).type("updated", { force: true }) // 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("nameupdated ").should("contain", "nameupdated") @@ -40,16 +41,16 @@ filterTests(["smoke", "all"], () => { it("edits a row", () => { cy.contains("button", "Edit").click({ force: true }) cy.wait(1000) - cy.get(".spectrum-Modal input").clear() - cy.get(".spectrum-Modal input").type("Updated") + cy.get(interact.SPECTRUM_MODAL_INPUT).clear() + cy.get(interact.SPECTRUM_MODAL_INPUT).type("Updated") cy.contains("Save").click() cy.contains("Updated").should("have.text", "Updated") }) 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.get(".spectrum-Modal").contains("Delete").click() + cy.get(interact.SPECTRUM_MODAL).contains("Delete").click() cy.contains("RoverUpdated").should("not.exist") }) @@ -63,50 +64,50 @@ filterTests(["smoke", "all"], () => { } cy.reload() cy.wait(2000) - cy.get(".spectrum-Pagination").within(() => { - cy.get(".spectrum-ActionButton").eq(1).click() + cy.get(interact.SPECTRUM_PAGINATION).within(() => { + cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).click() }) - cy.get(".spectrum-Pagination").within(() => { - cy.get(".spectrum-Body--secondary").contains("Page 2") + cy.get(interact.SPECTRUM_PAGINATION).within(() => { + cy.get(interact.SPECTRUM_BODY_SECOND).contains("Page 2") }) }) xit("Deletes rows and checks pagination", () => { // Delete rows, removing second page from table - cy.get(".spectrum-Checkbox-input").check({ force: true }) - cy.get(".popovers").within(() => { - cy.get(".spectrum-Button").click({ force: true }) + cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true }) + cy.get(interact.POPOVERS).within(() => { + 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) // Confirm table only has one page - cy.get(".spectrum-Pagination").within(() => { - cy.get(".spectrum-ActionButton").eq(1).should("not.be.enabled") + cy.get(interact.SPECTRUM_PAGINATION).within(() => { + cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).should("not.be.enabled") }) }) } it("deletes a column", () => { const columnName = "nameupdated" - cy.get(".title").click() - cy.get(".spectrum-Table-editIcon > use").click() + cy.get(interact.TABLE_TITLE).click() + cy.get(interact.SPECTRUM_TABLE_EDIT).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("nameupdated").should("not.exist") }) it("deletes a table", () => { - cy.get(".nav-item") + cy.get(interact.NAV_ITEM) .contains("dog") - .parents(".nav-item") + .parents(interact.NAV_ITEM) .first() .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('[data-cy="delete-table-confirm"]').type("dog") + cy.get(interact.SPECTRUM_MENU_CHILD2).click() + cy.get(interact.DELETE_TABLE_CONFIRM).type("dog") cy.contains("Delete Table").click() cy.contains("dog").should("not.exist") }) diff --git a/packages/builder/cypress/integration/createUserAndRoles.spec.js b/packages/builder/cypress/integration/createUserAndRoles.spec.js index ac7ec1b5fd..d47a96ed8d 100644 --- a/packages/builder/cypress/integration/createUserAndRoles.spec.js +++ b/packages/builder/cypress/integration/createUserAndRoles.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +const interact = require('../support/interact') filterTests(["smoke", "all"], () => { context("Create a User and Assign Roles", () => { @@ -12,7 +13,7 @@ filterTests(["smoke", "all"], () => { cy.visit(`${Cypress.config().baseUrl}/builder`) cy.wait(1000) 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", () => { @@ -20,9 +21,9 @@ filterTests(["smoke", "all"], () => { cy.contains("bbuser").click() cy.wait(500) // 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 - 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")) { @@ -40,7 +41,7 @@ filterTests(["smoke", "all"], () => { } else { cy.visit(`${Cypress.config().baseUrl}/builder`) 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) } } @@ -49,35 +50,35 @@ filterTests(["smoke", "all"], () => { // Navigate back to the user cy.visit(`${Cypress.config().baseUrl}/builder`) cy.wait(500) - cy.get(".spectrum-SideNav").contains("Users").click() + cy.get(interact.SPECTRUM_SIDENAV).contains("Users").click() cy.wait(500) - cy.get(".spectrum-Table").contains("bbuser").click() + cy.get(interact.SPECTRUM_TABLE).contains("bbuser").click() cy.wait(1000) for (let i = 0; i < 3; i++) { - cy.get(".spectrum-Table", { timeout: 3000}) + cy.get(interact.SPECTRUM_TABLE, { timeout: 3000}) .eq(1) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .eq(0) - .find(".spectrum-Table-cell") + .find(interact.SPECTRUM_TABLE_CELL) .eq(0) .click() cy.wait(500) - cy.get(".spectrum-Dialog-grid") + cy.get(interact.SPECTRUM_DIALOG_GRID) .contains("Choose an option") .click() .then(() => { cy.wait(1000) 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) { - cy.get(".spectrum-Menu").contains("Power").click({ force: true }) + cy.get(interact.SPECTRUM_MENU).contains("Power").click({ force: true }) } 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.get(".spectrum-Button") + cy.get(interact.SPECTRUM_BUTTON) .contains("Update role") .click({ force: true }) }) @@ -85,7 +86,7 @@ filterTests(["smoke", "all"], () => { } // Confirm roles exist within Configure roles table cy.wait(2000) - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) .within(assginedRoles => { expect(assginedRoles).to.contain("Admin") @@ -96,60 +97,60 @@ filterTests(["smoke", "all"], () => { it("should unassign role types", () => { // Set each app within Configure roles table to 'No Access' - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .its("length") .then(len => { for (let i = 0; i < len; i++) { - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .eq(0) - .find(".spectrum-Table-cell") + .find(interact.SPECTRUM_TABLE_CELL) .eq(0) .click() .then(() => { - cy.get(".spectrum-Picker").eq(1).click({ force: true }) + cy.get(interact.SPECTRUM_PICKER).eq(1).click({ force: true }) 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") .click({ force: true }) cy.wait(1000) } }) // 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", () => { // Enable Developer access - cy.get(".field") + cy.get(interact.FIELD) .eq(4) .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 - cy.get(".container") + cy.get(interact.CONTAINER) .contains("No Access") .parent() .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 - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .its("length") .then(len => { for (let i = 0; i < len; i++) { - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .eq(i) .contains("Admin") cy.wait(500) @@ -169,26 +170,26 @@ filterTests(["smoke", "all"], () => { .contains("Configure roles") .parent() .within(() => { - cy.get(".spectrum-Table").contains("No rows found") + cy.get(interact.SPECTRUM_TABLE).contains("No rows found") }) }) it("should delete a user", () => { // Click Delete user button - cy.get(".spectrum-Button") + cy.get(interact.SPECTRUM_BUTTON) .contains("Delete user") .click({ force: true }) .then(() => { // Confirm deletion within modal cy.wait(500) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button") + cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { + cy.get(interact.SPECTRUM_BUTTON) .contains("Delete user") .click({ force: true }) cy.wait(4000) }) }) - cy.get(".spectrum-Table").should("not.have.text", "bbuser") + cy.get(interact.SPECTRUM_TABLE).should("not.have.text", "bbuser") }) }) }) diff --git a/packages/builder/cypress/support/interact.js b/packages/builder/cypress/support/interact.js index 22ab13a48b..4a70b2fa8c 100644 --- a/packages/builder/cypress/support/interact.js +++ b/packages/builder/cypress/support/interact.js @@ -26,6 +26,7 @@ export const SPECTRUM_POPOVER = ".spectrum-Popover" export const OPTION_SOURCE_PROP_CONROL = '[data-cy="optionsSource-prop-control' export const APP_TABLE_STATUS = ".appTable .app-status" 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 = ".deployment-top-nav svg[aria-label=GlobeStrike]" 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_MESSAGE = ".publish-popover-message" export const SPECTRUM_BUTTON = ".spectrum-Button" +export const SPECTRUM_LINK = ".spectrum-Link" export const TOPRIGHTNAV_BUTTON_SPECTRUM = ".toprightnav button.spectrum-Button" //createComponents export const SETTINGS = "[data-cy=Settings]" export const SETTINGS_INPUT = "[data-cy=setting-text] input" 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 DROPDOWN_CONTAINER = ".dropdown-container" export const SPECTRUM_PICKER = ".spectrum-Picker" @@ -53,8 +55,52 @@ export const NAV_ITEMS_CONTAINER = ".nav-items-container" //publishWorkFlow 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 GLOBESTRIKE = "svg[aria-label=GlobeStrike]" export const GLOBE = "svg[aria-label=Globe]" export const UNPUBLISH_MODAL = "[data-cy=unpublish-modal]" 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" diff --git a/packages/builder/package.json b/packages/builder/package.json index 6fcccd78a9..3bb279dce1 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "license": "GPL-3.0", "private": true, "scripts": { @@ -69,10 +69,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.192-alpha.2", - "@budibase/client": "^1.0.192-alpha.2", - "@budibase/frontend-core": "^1.0.192-alpha.2", - "@budibase/string-templates": "^1.0.192-alpha.2", + "@budibase/bbui": "^1.0.192-alpha.6", + "@budibase/client": "^1.0.192-alpha.6", + "@budibase/frontend-core": "^1.0.192-alpha.6", + "@budibase/string-templates": "^1.0.192-alpha.6", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/builder/src/components/deploy/DeployModal.svelte b/packages/builder/src/components/deploy/DeployModal.svelte index 0d9bfb7539..ed2687579e 100644 --- a/packages/builder/src/components/deploy/DeployModal.svelte +++ b/packages/builder/src/components/deploy/DeployModal.svelte @@ -101,7 +101,7 @@ confirmText="Done" cancelText="View App" onCancel={viewApp} - dataCy={"deploy-app-success-modal"} + dataCy="deploy-app-success-modal" >
-
appOverview(app)}> +
appOverview(app)}> {app.name} diff --git a/packages/builder/src/components/start/ExportAppModal.svelte b/packages/builder/src/components/start/ExportAppModal.svelte new file mode 100644 index 0000000000..05a42dfa4a --- /dev/null +++ b/packages/builder/src/components/start/ExportAppModal.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/packages/builder/src/pages/builder/portal/apps/index.svelte b/packages/builder/src/pages/builder/portal/apps/index.svelte index 2685881973..2892a9b723 100644 --- a/packages/builder/src/pages/builder/portal/apps/index.svelte +++ b/packages/builder/src/pages/builder/portal/apps/index.svelte @@ -17,6 +17,7 @@ import CreateAppModal from "components/start/CreateAppModal.svelte" import UpdateAppModal from "components/start/UpdateAppModal.svelte" import ChooseIconModal from "components/start/ChooseIconModal.svelte" + import ExportAppModal from "components/start/ExportAppModal.svelte" import { store, automationStore } from "builderStore" import { API } from "api" @@ -37,6 +38,7 @@ let updatingModal let deletionModal let unpublishModal + let exportModal let iconModal let creatingApp = false let loaded = $apps?.length || $templates?.length @@ -200,9 +202,8 @@ } const exportApp = app => { - const id = app.deployed ? app.prodId : app.devId - const appName = encodeURIComponent(app.name) - window.location = `/api/backups/export?appId=${id}&appname=${appName}` + exportModal.show() + selectedApp = app } const unpublishApp = app => { @@ -457,6 +458,10 @@ + + + + {#if isPublished} - unpublishApp(selectedApp)} - icon="GlobeRemove" - > - Unpublish - copyAppId(selectedApp)} icon="Copy"> Copy App ID @@ -305,6 +299,7 @@ app={selectedApp} deployments={latestDeployments} navigateTab={handleTabChange} + on:unpublish={e => unpublishApp(e.detail)} /> {#if false} diff --git a/packages/builder/src/pages/builder/portal/overview/_components/OverviewTab.svelte b/packages/builder/src/pages/builder/portal/overview/_components/OverviewTab.svelte index ae5189543c..7b7258cada 100644 --- a/packages/builder/src/pages/builder/portal/overview/_components/OverviewTab.svelte +++ b/packages/builder/src/pages/builder/portal/overview/_components/OverviewTab.svelte @@ -13,10 +13,12 @@ import clientPackage from "@budibase/client/package.json" import { processStringSync } from "@budibase/string-templates" import { users, auth } from "stores/portal" + import { createEventDispatcher } from "svelte" export let app export let deployments export let navigateTab + const dispatch = createEventDispatcher() const userInit = async () => { try { @@ -26,6 +28,10 @@ } } + const unpublishApp = () => { + dispatch("unpublish", app) + } + let userPromise = userInit() $: updateAvailable = clientPackage.version !== $store.version @@ -72,6 +78,9 @@ new Date(deployments[0].updatedAt).getTime(), } )} + {#if isPublished} + - Unpublish + {/if} {/if} {#if !deployments?.length} - diff --git a/packages/cli/package.json b/packages/cli/package.json index ffbe6e5680..c75f7f39e2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index 2698323e78..0ab74ead08 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.192-alpha.2", - "@budibase/frontend-core": "^1.0.192-alpha.2", - "@budibase/string-templates": "^1.0.192-alpha.2", + "@budibase/bbui": "^1.0.192-alpha.6", + "@budibase/frontend-core": "^1.0.192-alpha.6", + "@budibase/string-templates": "^1.0.192-alpha.6", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index fe83d72cc5..f8ee7b78c0 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "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", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "^1.0.192-alpha.2", + "@budibase/bbui": "^1.0.192-alpha.6", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/server/package.json b/packages/server/package.json index c387674837..86b17d1b5f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -70,10 +70,10 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "^10.0.3", - "@budibase/backend-core": "^1.0.192-alpha.2", - "@budibase/client": "^1.0.192-alpha.2", - "@budibase/pro": "1.0.192-alpha.2", - "@budibase/string-templates": "^1.0.192-alpha.2", + "@budibase/backend-core": "^1.0.192-alpha.6", + "@budibase/client": "^1.0.192-alpha.6", + "@budibase/pro": "1.0.192-alpha.6", + "@budibase/string-templates": "^1.0.192-alpha.6", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/server/src/api/controllers/backup.js b/packages/server/src/api/controllers/backup.js index daaa59b341..0ebf01176e 100644 --- a/packages/server/src/api/controllers/backup.js +++ b/packages/server/src/api/controllers/backup.js @@ -1,9 +1,11 @@ const { streamBackup } = require("../../utilities/fileSystem") exports.exportAppDump = async function (ctx) { - const { appId } = ctx.query + let { appId, excludeRows } = ctx.query const appName = decodeURI(ctx.query.appname) + excludeRows = excludeRows === "true" const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt` ctx.attachment(backupIdentifier) - ctx.body = await streamBackup(appId) + + ctx.body = await streamBackup(appId, excludeRows) } diff --git a/packages/server/src/db/utils.js b/packages/server/src/db/utils.js index 280596928b..3fe4a3de73 100644 --- a/packages/server/src/db/utils.js +++ b/packages/server/src/db/utils.js @@ -74,6 +74,7 @@ exports.isDevAppID = isDevAppID exports.isProdAppID = isProdAppID exports.USER_METDATA_PREFIX = `${DocumentTypes.ROW}${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.InternalTables = InternalTables exports.DocumentTypes = DocumentTypes diff --git a/packages/server/src/utilities/fileSystem/index.js b/packages/server/src/utilities/fileSystem/index.js index e2a76c49a1..ed1cb1923a 100644 --- a/packages/server/src/utilities/fileSystem/index.js +++ b/packages/server/src/utilities/fileSystem/index.js @@ -21,6 +21,7 @@ const env = require("../../environment") const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, + TABLE_ROW_PREFIX, } = require("../../db/utils") const MemoryStream = require("memorystream") const { getAppId } = require("@budibase/backend-core/context") @@ -109,6 +110,23 @@ exports.apiFileReturn = contents => { 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 * data or user relationships. @@ -116,14 +134,10 @@ exports.apiFileReturn = contents => { * @param {object} config Config to send to export DB * @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, { ...config, - filter: doc => - !( - doc._id.includes(USER_METDATA_PREFIX) || - doc._id.includes(LINK_USER_METADATA_PREFIX) - ), + filter: exports.defineFilter(includeRows), }) } @@ -142,8 +156,8 @@ exports.performBackup = async (appId, backupName) => { * @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 */ -exports.streamBackup = async appId => { - return await backupAppData(appId, { stream: true }) +exports.streamBackup = async (appId, includeRows) => { + return await backupAppData(appId, { stream: true }, includeRows) } /** diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index a8d9ddd1f0..f502c3ed4a 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 38cac53c04..f53231db2f 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.192-alpha.2", + "version": "1.0.192-alpha.6", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -32,9 +32,9 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "^1.0.192-alpha.2", - "@budibase/pro": "1.0.192-alpha.2", - "@budibase/string-templates": "^1.0.192-alpha.2", + "@budibase/backend-core": "^1.0.192-alpha.6", + "@budibase/pro": "1.0.192-alpha.6", + "@budibase/string-templates": "^1.0.192-alpha.6", "@koa/router": "^8.0.0", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "^0.3.0",