diff --git a/.github/workflows/build-client-server-count.yml b/.github/workflows/build-client-server-count.yml index c15a92947b0c..0b78fa2dbda7 100644 --- a/.github/workflows/build-client-server-count.yml +++ b/.github/workflows/build-client-server-count.yml @@ -17,6 +17,8 @@ jobs: matrix_count: ${{steps.matrix.outputs.matrix_count}} run_count: ${{ steps.countArgs.outputs.run_count }} is-pg-build: ${{steps.args.outputs.is-pg-build}} + update_snapshot: ${{steps.args.outputs.update_snapshot}} + specs_to_run: ${{steps.args.outputs.specs_to_run}} steps: - name: Checkout the head commit of the branch uses: actions/checkout@v4 @@ -38,6 +40,21 @@ jobs: runId=$((checkArg + 0)) echo "runId=$runId" >> $GITHUB_OUTPUT fi + + # Check for update_snapshot + checkArg=${{ github.event.client_payload.slash_command.args.named.update_snapshot }} + if [[ -z "$checkArg" ]]; then + echo "update_snapshot=false" >> $GITHUB_OUTPUT + else + echo "update_snapshot=$checkArg" >> $GITHUB_OUTPUT + fi + # Check for spec file + checkArg=${{ github.event.client_payload.slash_command.args.named.specs_to_run }} + if [[ -z "$checkArg" ]]; then + echo "specs_to_run=''" >> $GITHUB_OUTPUT + else + echo "specs_to_run=$checkArg" >> $GITHUB_OUTPUT + fi - name: Set run count id: countArgs @@ -97,7 +114,7 @@ jobs: body: | Tests running at: <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>. [Cypress dashboard](https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=${{ github.run_id }}&attempt=${{ github.run_attempt }}&selectiontype=test&testsstatus=failed&specsstatus=fail) - PR: #${{ fromJson(steps.args.outputs.pr) }}. + PR: #${{ fromJson(steps.args.outputs.pr) }} with spec: ${{steps.args.outputs.specs_to_run}} . server-build: name: server-build @@ -149,6 +166,8 @@ jobs: with: pr: ${{fromJson(needs.file-check.outputs.pr)}} run_count: ${{fromJson(needs.file-check.outputs.run_count)}} + update_snapshot: ${{fromJson(needs.file-check.outputs.update_snapshot)}} + specs_to_run: ${{needs.file-check.outputs.specs_to_run}} ci-test-limited-existing-docker-image: @@ -162,6 +181,8 @@ jobs: pr: ${{fromJson(needs.file-check.outputs.pr)}} previous-workflow-run-id: ${{ fromJson(needs.file-check.outputs.runId) }} run_count: ${{fromJson(needs.file-check.outputs.run_count)}} + update_snapshot: ${{fromJson(needs.file-check.outputs.update_snapshot)}} + specs_to_run: ${{needs.file-check.outputs.specs_to_run}} ci-test-limited-result: needs: [file-check, ci-test-limited] diff --git a/.github/workflows/ci-test-limited-with-count.yml b/.github/workflows/ci-test-limited-with-count.yml index f987d90e0e07..68f544ffaf75 100644 --- a/.github/workflows/ci-test-limited-with-count.yml +++ b/.github/workflows/ci-test-limited-with-count.yml @@ -19,6 +19,16 @@ on: required: false type: number default: 1 + update_snapshot: + description: 'Give option to update snapshot (true/false)' + required: false + type: boolean + default: false + specs_to_run: + description: 'Cypress spec file(s) to run' + required: false + type: string + workflow_call: inputs: pr: @@ -35,6 +45,15 @@ on: required: false type: number default: 1 + update_snapshot: + description: 'Give option to update snapshot (true/false)' + required: false + type: boolean + default: false + specs_to_run: + description: 'Cypress spec file(s) to run' + required: false + type: string jobs: ci-test-limited: @@ -111,10 +130,18 @@ jobs: else echo "rerun=false" >> $GITHUB_OUTPUT fi + + - name: Upload existing snapshot data + if: always() + uses: actions/upload-artifact@v4 + with: + name: cypress-existing-compare-snapshots + path: ${{ github.workspace }}/app/client/cypress/snapshots + overwrite: true # Get specs to run - name: Get specs to run - if: steps.run_result.outputs.run_result != 'success' && steps.run_result.outputs.run_result != 'failedtest' + if: ${{ (inputs.specs_to_run == '' || inputs.specs_to_run == null || !inputs.specs_to_run) && steps.run_result.outputs.run_result != 'success' && steps.run_result.outputs.run_result != 'failedtest' }} run: | specs_to_run="" while IFS= read -r line @@ -349,10 +376,19 @@ jobs: NODE_ENV: development run: | cd app/client - npx cypress-repeat-pro run -n ${{ inputs.run_count }} --force \ - --spec ${{ env.specs_to_run }} \ + if [[ "${{ inputs.update_snapshot }}" == "true" ]]; then + echo "Running Cypress with snapshot updates..." + CYPRESS_updateSnapshots=true npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ + --spec "${{ inputs.specs_to_run }}" \ --config-file "cypress_ci_custom.config.ts" \ - --browser ${{ env.BROWSER_PATH }} + --browser "${{ env.BROWSER_PATH }}" + else + echo "Running Cypress tests without snapshot updates..." + npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ + --spec "${{ env.specs_to_run }}" \ + --config-file "cypress_ci_custom.config.ts" \ + --browser "${{ env.BROWSER_PATH }}" + fi cat cy-repeat-summary.txt # Define the path for the failure flag file FAILURE_FLAG_FILE="ci_test_status.txt" @@ -453,9 +489,17 @@ jobs: if: always() with: name: server-logs - path: app/server/server-logs.log + path: ${{ github.workspace }}/app/server/server-logs.log overwrite: true + - name: Upload new compared snapshot data + if: always() + uses: actions/upload-artifact@v4 + with: + name: cypress-new-compare-snapshots + path: ${{ github.workspace }}/app/client/cypress/snapshots + overwrite: true + # Set status = success - name: Save the status of the run run: | diff --git a/.github/workflows/ci-test-limited.yml b/.github/workflows/ci-test-limited.yml index 5461d5469f35..e6be6dcdaf8c 100644 --- a/.github/workflows/ci-test-limited.yml +++ b/.github/workflows/ci-test-limited.yml @@ -418,7 +418,7 @@ jobs: if: failure() with: name: server-logs - path: app/server/server-logs.log + path: ${{ github.workspace }}/app/server/server-logs.log overwrite: true # Set status = success diff --git a/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/Bug33601_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/Bug33601_spec.ts new file mode 100644 index 000000000000..38932ca6e136 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/Bug33601_spec.ts @@ -0,0 +1,74 @@ +import { + agHelper, + appSettings, + assertHelper, + deployMode, + homePage, + locators, +} from "../../../../support/Objects/ObjectsCore"; +import EditorNavigation, { + EntityType, + PageLeftPane, +} from "../../../../support/Pages/EditorNavigation"; + +describe( + "Bug:33601: resetWidget function causes the next async method to be undefined", + { tags: ["@tag.JS"] }, + () => { + it("1. Bug 33601", () => { + homePage.NavigateToHome(); + homePage.ImportApp("resetWidgetBug33601.json"); + EditorNavigation.SelectEntityByName("List1", EntityType.Widget); + PageLeftPane.expandCollapseItem("List1"); + PageLeftPane.expandCollapseItem("Container1"); + EditorNavigation.SelectEntityByName("Input1", EntityType.Widget); + + agHelper.EnterInputText("Label", "Widget Input2"); + EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); + cy.get(locators._widgetInputSelector("inputwidgetv2")) + .first() + .invoke("attr", "value") + .should("contain", "Widget Input2"); + agHelper + .GetAttribute(locators._imgWidgetInsideList, "src") + .then((labelValue) => { + expect(labelValue).not.to.contain("data:image/png;base64"); + }); + + agHelper.ClickButton("Submit"); + cy.get(locators._widgetInputSelector("inputwidgetv2")) + .first() + .invoke("attr", "value") + .should("be.empty"); + assertHelper.WaitForNetworkCall("@postExecute"); + agHelper + .GetAttribute(locators._imgWidgetInsideList, "src") + .then((labelValue) => { + expect(labelValue).to.contain("data:image/png;base64"); + }); + + deployMode.DeployApp(); + agHelper.AssertElementVisibility(appSettings.locators._header); + agHelper.EnterInputText("Label", "Widget Input2"); + cy.get(locators._widgetInputSelector("inputwidgetv2")) + .first() + .invoke("attr", "value") + .should("contain", "Widget Input2"); + agHelper + .GetAttribute(locators._imgWidgetInsideList, "src") + .then((labelValue) => { + expect(labelValue).not.to.contain("data:image/png;base64"); + }); + agHelper.ClickButton("Submit"); + cy.get(locators._widgetInputSelector("inputwidgetv2")) + .first() + .invoke("attr", "value") + .should("be.empty"); + agHelper + .GetAttribute(locators._imgWidgetInsideList, "src") + .then((labelValue) => { + expect(labelValue).to.contain("data:image/png;base64"); + }); + }); + }, +); diff --git a/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js b/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.ts similarity index 50% rename from app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js rename to app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.ts index c1f6ed682684..d7924b495df7 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.ts @@ -24,26 +24,25 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { it("1. Should test that settings page is accessible to super user", () => { cy.LogOut(); cy.LoginFromAPI(Cypress.env("USERNAME"), Cypress.env("PASSWORD")); - cy.get(".admin-settings-menu-option").should("be.visible"); - cy.get(".admin-settings-menu-option").click(); - cy.url().should("contain", adminSettingsHelper.routes.GENERAL); + agHelper.GetNClick(adminSettingsHelper._adminSettingsBtn); + agHelper.AssertURL(adminSettingsHelper.routes.GENERAL); cy.wait("@getEnvVariables"); cy.LogOut(); }); it("2. Should test that settings page is not accessible to normal users", () => { cy.LoginFromAPI(Cypress.env("TESTUSERNAME3"), Cypress.env("TESTPASSWORD3")); - cy.get(".admin-settings-menu-option").should("not.exist"); + agHelper.AssertElementAbsence(adminSettingsHelper._adminSettingsBtn); agHelper.VisitNAssert(adminSettingsHelper.routes.GENERAL); // non super users are redirected to home page - cy.url().should("contain", "/applications"); + agHelper.AssertURL("/applications"); cy.LogOut(false); }); it("3. Should test that settings page is redirected to default tab", () => { cy.LoginFromAPI(Cypress.env("USERNAME"), Cypress.env("PASSWORD")); cy.visit("/settings", { timeout: 60000 }); - cy.url().should("contain", adminSettingsHelper.routes.GENERAL); + agHelper.AssertURL(adminSettingsHelper.routes.GENERAL); cy.wait("@getEnvVariables"); }); @@ -55,19 +54,19 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { cy.visit("/applications", { timeout: 60000 }); if (!Cypress.env("AIRGAPPED")) cy.wait("@getAllWorkspaces"); - cy.get(".admin-settings-menu-option").click(); + agHelper.GetNClick(adminSettingsHelper._adminSettingsBtn); cy.wait("@getEnvVariables"); - cy.get(adminsSettings.generalTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.GENERAL); - cy.get(adminsSettings.advancedTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.ADVANCED); - cy.get(adminsSettings.authenticationTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.AUTHENTICATION); - cy.get(adminsSettings.emailTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.EMAIL); - cy.get(adminsSettings.developerSettingsTab).should("not.exist"); - cy.get(adminsSettings.versionTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.VERSION); + agHelper.GetNClick(adminsSettings.generalTab); + agHelper.AssertURL(adminSettingsHelper.routes.GENERAL); + agHelper.GetNClick(adminsSettings.advancedTab); + agHelper.AssertURL(adminSettingsHelper.routes.ADVANCED); + agHelper.GetNClick(adminsSettings.authenticationTab); + agHelper.AssertURL(adminSettingsHelper.routes.AUTHENTICATION); + agHelper.GetNClick(adminsSettings.emailTab); + agHelper.AssertURL(adminSettingsHelper.routes.EMAIL); + agHelper.AssertElementAbsence(adminsSettings.developerSettingsTab); + agHelper.GetNClick(adminsSettings.versionTab); + agHelper.AssertURL(adminSettingsHelper.routes.VERSION); }, ); @@ -80,12 +79,12 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { adminSettingsHelper.routes.GENERAL, "getEnvVariables", ); - cy.get(adminsSettings.authenticationTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.AUTHENTICATION); - cy.get(adminsSettings.googleButton).should("not.exist"); - cy.get(adminsSettings.githubButton).should("not.exist"); - cy.get(adminsSettings.formloginButton).click(); - cy.url().should("contain", adminSettingsHelper.routes.FORMLOGIN); + agHelper.GetNClick(adminsSettings.authenticationTab); + agHelper.AssertURL(adminSettingsHelper.routes.AUTHENTICATION); + agHelper.AssertElementAbsence(adminsSettings.googleButton); + agHelper.AssertElementAbsence(adminsSettings.githubButton); + agHelper.GetNClick(adminsSettings.formloginButton); + agHelper.AssertURL(adminSettingsHelper.routes.FORMLOGIN); }, ); @@ -97,16 +96,16 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { adminSettingsHelper.routes.GENERAL, "getEnvVariables", ); - cy.get(adminsSettings.authenticationTab).click(); - cy.url().should("contain", adminSettingsHelper.routes.AUTHENTICATION); - cy.get(adminsSettings.googleButton).click(); - cy.url().should("contain", adminSettingsHelper.routes.GOOGLEAUTH); + agHelper.GetNClick(adminsSettings.authenticationTab); + agHelper.AssertURL(adminSettingsHelper.routes.AUTHENTICATION); + agHelper.GetNClick(adminsSettings.googleButton); + agHelper.AssertURL(adminSettingsHelper.routes.GOOGLEAUTH); cy.get(adminsSettings.readMoreLink).within(() => { cy.get("a") .should("have.attr", "target", "_blank") .invoke("removeAttr", "target") .click(); - cy.url().should("contain", GOOGLE_SIGNUP_SETUP_DOC); + agHelper.AssertURL(GOOGLE_SIGNUP_SETUP_DOC); }); }, ); @@ -117,19 +116,19 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { "getEnvVariables", ); const assertVisibilityAndDisabledState = () => { - cy.get(adminsSettings.saveButton).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.saveButton); cy.get(adminsSettings.saveButton).should("be.disabled"); - cy.get(adminsSettings.resetButton).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.resetButton); cy.get(adminsSettings.resetButton).should("be.disabled"); }; assertVisibilityAndDisabledState(); - cy.get(adminsSettings.instanceName).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.instanceName); cy.get(adminsSettings.instanceName).clear().type("AppsmithInstance"); - cy.get(adminsSettings.saveButton).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.saveButton); cy.get(adminsSettings.saveButton).should("not.be.disabled"); - cy.get(adminsSettings.resetButton).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.resetButton); cy.get(adminsSettings.resetButton).should("not.be.disabled"); - cy.get(adminsSettings.resetButton).click(); + agHelper.GetNClick(adminsSettings.resetButton); assertVisibilityAndDisabledState(); }); @@ -139,16 +138,16 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { "getEnvVariables", ); - cy.get(adminsSettings.restartNotice).should("not.exist"); - cy.get(adminsSettings.instanceName).should("be.visible"); - let instanceName; - cy.generateUUID().then((uuid) => { + agHelper.AssertElementAbsence(adminsSettings.restartNotice); + agHelper.AssertElementVisibility(adminsSettings.instanceName); + let instanceName: string; + cy.generateUUID().then((uuid: string) => { instanceName = uuid; cy.get(adminsSettings.instanceName).clear().type(uuid); }); - cy.get(adminsSettings.saveButton).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.saveButton); cy.get(adminsSettings.saveButton).should("not.be.disabled"); - cy.get(adminsSettings.saveButton).click(); + agHelper.GetNClick(adminsSettings.saveButton); cy.wait("@postTenantConfig").then((interception) => { expect(interception.request.body.instanceName).to.equal(instanceName); }); @@ -163,28 +162,28 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { adminSettingsHelper.routes.GENERAL, "getEnvVariables", ); - cy.get(adminsSettings.restartNotice).should("not.exist"); - cy.get(adminsSettings.instanceName).should("be.visible"); - let instanceName; - cy.generateUUID().then((uuid) => { + agHelper.AssertElementAbsence(adminsSettings.restartNotice); + agHelper.AssertElementVisibility(adminsSettings.instanceName); + let instanceName: string; + cy.generateUUID().then((uuid: string) => { instanceName = uuid; cy.get(adminsSettings.instanceName).clear().type(uuid); }); - cy.get(adminsSettings.saveButton).should("be.visible"); + agHelper.AssertElementVisibility(adminsSettings.saveButton); cy.get(adminsSettings.saveButton).should("not.be.disabled"); - cy.get(adminsSettings.emailTab).click(); - cy.get(adminsSettings.saveButton).should("be.visible"); + agHelper.GetNClick(adminsSettings.emailTab); + agHelper.AssertElementVisibility(adminsSettings.saveButton); cy.get(adminsSettings.saveButton).should("not.be.disabled"); - cy.get(adminsSettings.fromAddress).should("be.visible"); - let fromAddress; - cy.generateUUID().then((uuid) => { + agHelper.AssertElementVisibility(adminsSettings.fromAddress); + let fromAddress: string; + cy.generateUUID().then((uuid: string) => { fromAddress = uuid; cy.get(adminsSettings.fromAddress).clear().type(`${uuid}@appsmith.com`); }); cy.intercept("POST", "/api/v1/admin/restart", { body: { responseMeta: { status: 200, success: true }, data: true }, }); - cy.get(adminsSettings.saveButton).click(); + agHelper.GetNClick(adminsSettings.saveButton); cy.wait("@postTenantConfig").then((interception) => { expect(interception.request.body.instanceName).to.equal(instanceName); }); @@ -193,7 +192,43 @@ describe("Admin settings page", { tags: ["@tag.Settings"] }, function () { `${fromAddress}@appsmith.com`, ); }); - cy.get(adminsSettings.restartNotice).should("be.visible"); - cy.get(adminsSettings.restartNotice).should("not.exist"); + agHelper.AssertElementVisibility(adminsSettings.restartNotice); + }); + + it("10. Verify default instance name", () => { + cy.LogOut(); + cy.LoginFromAPI(Cypress.env("USERNAME"), Cypress.env("PASSWORD")); + agHelper.GetNClick(adminSettingsHelper._adminSettingsBtn); + agHelper.AssertURL(adminSettingsHelper.routes.GENERAL); + cy.wait("@getEnvVariables"); + agHelper + .GetText(adminSettingsHelper._instanceName, "val") + .then(($text) => expect($text).to.eq("Appsmith")); + }); + + it("11. Verify all admin setting sections are accessible", () => { + cy.visit("/applications", { timeout: 60000 }); + agHelper.GetNClick(adminSettingsHelper._adminSettingsBtn); + cy.wait("@getEnvVariables"); + agHelper.GetNClick(adminsSettings.generalTab); + agHelper.AssertURL(adminSettingsHelper.routes.GENERAL); + agHelper.GetNClick(adminsSettings.advancedTab); + agHelper.AssertURL(adminSettingsHelper.routes.ADVANCED); + agHelper.GetNClick(adminsSettings.authenticationTab); + agHelper.AssertURL(adminSettingsHelper.routes.AUTHENTICATION); + agHelper.GetNClick(adminsSettings.emailTab); + agHelper.AssertURL(adminSettingsHelper.routes.EMAIL); + agHelper.GetNClick(adminsSettings.developerSettingsTab); + agHelper.AssertURL(adminSettingsHelper.routes.DEVELOPER_SETTINGS); + agHelper.GetNClick(adminsSettings.versionTab); + agHelper.AssertURL(adminSettingsHelper.routes.VERSION); + agHelper.GetNClick(adminsSettings.branding); + agHelper.AssertURL(adminSettingsHelper.routes.BRANDING); + agHelper.GetNClick(adminsSettings.provisioning); + agHelper.AssertURL(adminSettingsHelper.routes.PROVISIONING); + agHelper.GetNClick(adminsSettings.accessControl); + agHelper.AssertURL(adminSettingsHelper.routes.ACCESS_CONTROL); + agHelper.GetNClick(adminsSettings.auditLogs); + agHelper.AssertURL(adminSettingsHelper.routes.AUDIT_LOGS); }); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/AppTheming/AnvilAppThemingSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/AppTheming/AnvilAppThemingSnapshot_spec.ts index 5b9bad823b34..6493c3eb3d46 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/AppTheming/AnvilAppThemingSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/AppTheming/AnvilAppThemingSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for App Theming`, { tags: ["@tag.Anvil"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts index a78e7ef5d47e..74e3c855ae41 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Button Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts index 66b66d583e7f..d2113759c835 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Checkbox Group Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts index 5ad568bf5a20..fe143dcab129 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Checkbox Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts index 82ae69d9a07b..c58a6eff6cd3 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Heading Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts index 5adb9bde9366..9c0b7ec75524 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Icon Button Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts index 9899b8ce2f79..67015f2c3e28 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Inline Button Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts index eac9c2178efb..81cbbbac8790 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Paragraph Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts index 7b90dbce28ab..1634c2ae7e80 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Radio Group Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts index 51da8ac23959..0449dc62d6f5 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Stats Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts index 2ffed43ba435..a36b4d2c0b12 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Switch Group Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts index aec145739a22..a6eb434fe48a 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Switch Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts index ef99aeab2938..1ed021c81277 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts @@ -5,7 +5,7 @@ import { } from "../../../../../support/Objects/ObjectsCore"; // TODO: Enable when issue(github.com/appsmithorg/appsmith/issues/36419) is solved. -describe.skip( +describe( `${ANVIL_EDITOR_TEST}: Anvil tests for Toolbar Button Widget`, { tags: ["@tag.Anvil", "@tag.Visual"] }, () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/JS_AC1_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/JS_AC1_spec.ts index f8190d48f01a..d37b4389a20d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/JS_AC1_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/JS_AC1_spec.ts @@ -298,7 +298,7 @@ describe("Autocomplete tests", { tags: ["@tag.JS", "@tag.Binding"] }, () => { ) .type("."); - agHelper.GetNAssertElementText(locators._hints, "geolocation"); + agHelper.GetNAssertElementText(locators._hints, "appName"); }); }); @@ -313,6 +313,6 @@ describe("Autocomplete tests", { tags: ["@tag.JS", "@tag.Binding"] }, () => { .type("{downArrow}{leftArrow}{leftArrow}"); agHelper.TypeText(locators._codeMirrorTextArea, "."); - agHelper.GetNAssertElementText(locators._hints, "geolocation"); + agHelper.GetNAssertElementText(locators._hints, "appName"); }); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/IDE/Tabs_Navigation_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/IDE/Tabs_Navigation_spec.ts new file mode 100644 index 000000000000..1e56f501e1b1 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/IDE/Tabs_Navigation_spec.ts @@ -0,0 +1,148 @@ +import { ObjectsRegistry } from "../../../../support/Objects/Registry"; +import { + agHelper, + dataSources, + locators, + jsEditor, +} from "../../../../support/Objects/ObjectsCore"; +import PageList from "../../../../support/Pages/PageList"; +import EditorNavigation, { + editorTabSelector, + PageLeftPane, + PagePaneSegment, +} from "../../../../support/Pages/EditorNavigation"; + +let dsName = "MongoDB"; + +describe("Tabs Navigation", { tags: ["@tag.IDE"] }, () => { + before(() => { + dataSources.CreateDataSource("Mongo"); + cy.renameDatasource(dsName); + }); + + it("should create and switch between JS files", () => { + // Create first JS file + jsEditor.CreateJSObject("", { prettify: false, toRun: false }); + jsEditor.RenameJSObjFromPane("Page1_JS1"); + + // Create second JS file + jsEditor.CreateJSObject("", { prettify: false, toRun: false }); + jsEditor.RenameJSObjFromPane("Page1_JS2"); + + agHelper.GetNClick(editorTabSelector("page1_js1")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page1_JS1"); + }); + + agHelper.GetNClick(editorTabSelector("page1_js2")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page1_JS2"); + }); + }); + + it("should create and switch between queries", () => { + dataSources.CreateQueryFromOverlay(dsName, "", "Page1_Query1"); + agHelper + .GetElement("[data-testid='t--ide-tab-page1_query1']") + .should("be.visible"); + dataSources.CreateQueryFromOverlay(dsName, "", "Page1_Query2"); + + // Switch between tabs + agHelper.GetNClick(editorTabSelector("page1_query1")); + + agHelper + .GetElement(locators._queryName) + .should("have.text", "Page1_Query1"); + + agHelper.GetNClick(editorTabSelector("page1_query2")); + + agHelper + .GetElement(locators._queryName) + .should("have.text", "Page1_Query2"); + }); + + it("should create items in the next page and navigate", () => { + // Create first page + PageList.AddNewPage("New blank page"); + + // Create first JS file + jsEditor.CreateJSObject("", { prettify: false, toRun: false }); + jsEditor.RenameJSObjFromPane("Page2_JS1"); + + // Create second JS file + jsEditor.CreateJSObject("", { prettify: false, toRun: false }); + jsEditor.RenameJSObjFromPane("Page2_JS2"); + + agHelper.GetNClick(editorTabSelector("page2_js1")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page2_JS1"); + }); + + agHelper.GetNClick(editorTabSelector("page2_js2")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page2_JS2"); + }); + + dataSources.CreateQueryFromOverlay(dsName, "", "Page2_Query1"); + dataSources.CreateQueryFromOverlay(dsName, "", "Page2_Query2"); + + agHelper.GetNClick(editorTabSelector("page2_query1")); + + agHelper + .GetElement(locators._queryName) + .should("have.text", "Page2_Query1"); + + agHelper.GetNClick(editorTabSelector("page2_query2")); + + agHelper + .GetElement(locators._queryName) + .should("have.text", "Page2_Query2"); + }); + + it("Use tabs navigation with multiple pages", () => { + EditorNavigation.NavigateToPage("Page1"); + agHelper.GetNClick(editorTabSelector("page1_query1")); + + agHelper + .GetElement(locators._queryName) + .should("have.text", "Page1_Query1"); + + agHelper.GetNClick(editorTabSelector("page1_query2")); + + agHelper + .GetElement(locators._queryName) + .should("have.text", "Page1_Query2"); + + PageLeftPane.switchSegment(PagePaneSegment.JS); + + agHelper.GetNClick(editorTabSelector("page1_js1")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page1_JS1"); + }); + + agHelper.GetNClick(editorTabSelector("page1_js2")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page1_JS2"); + }); + + EditorNavigation.NavigateToPage("Page2"); + PageLeftPane.switchSegment(PagePaneSegment.JS); + agHelper.GetNClick(editorTabSelector("page2_js1")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page2_JS1"); + }); + + agHelper.GetNClick(editorTabSelector("page2_js2")); + + jsEditor.currentJSObjectName().then((jsObjName) => { + expect(jsObjName).equal("Page2_JS2"); + }); + }); +}); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Templates/Template_DataBindingFunctions_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Templates/Template_DataBindingFunctions_spec.ts new file mode 100644 index 000000000000..93996df93d04 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/Templates/Template_DataBindingFunctions_spec.ts @@ -0,0 +1,76 @@ +import template from "../../../../locators/TemplatesLocators.json"; +import { + agHelper, + assertHelper, + dataSources, + debuggerHelper, + locators, +} from "../../../../support/Objects/ObjectsCore"; +import EditorNavigation, { + EntityType, + PageLeftPane, +} from "../../../../support/Pages/EditorNavigation"; +import PageList from "../../../../support/Pages/PageList"; + +describe( + "Fork a template to the current app", + { + tags: ["@tag.Templates", "@tag.excludeForAirgap"], + }, + () => { + it("1. Verify that all data bindings in the template are correctly connected to the corresponding data sources (e.g., APIs, databases) No errors should be seen", () => { + PageList.AddNewPage("Add page from template"); + agHelper.AssertElementVisibility(template.templateDialogBox); + agHelper.ContainsNClick("Vehicle Maintenance App"); + agHelper.FailIfErrorToast("INTERNAL_SERVER_ERROR"); + agHelper.GetNClick(template.templateViewForkButton); + agHelper.WaitUntilToastDisappear("template added successfully"); + assertHelper.AssertNetworkStatus("updateLayout"); + agHelper.WaitUntilAllToastsDisappear(); + EditorNavigation.SelectEntityByName("Home page", EntityType.Page); + EditorNavigation.SelectEntityByName( + "Container2CopyCopy", + EntityType.Widget, + ); + debuggerHelper.OpenDebugger(); + debuggerHelper.ClickLogsTab(); + debuggerHelper.AssertVisibleErrorMessagesCount(0); + }); + + it("2. Verify button actions, such as submitting forms, navigating to other pages, or calling APIs, and verify the responses", () => { + PageList.AddNewPage("Add page from template"); + agHelper.AssertElementVisibility(template.templateDialogBox); + agHelper.ContainsNClick("Vehicle Maintenance App"); + agHelper.FailIfErrorToast("INTERNAL_SERVER_ERROR"); + agHelper.GetNClick(template.templateViewForkButton); + agHelper.WaitUntilToastDisappear("template added successfully"); + assertHelper.AssertNetworkStatus("updateLayout"); + + agHelper.WaitUntilAllToastsDisappear(); + agHelper.RefreshPage(); + EditorNavigation.SelectEntityByName("Container5", EntityType.Widget); + PageLeftPane.expandCollapseItem("Container1"); + agHelper.ClickButton("Open Menu"); + agHelper.AssertText(locators._menuItem, "text", "Home page", 0); + agHelper.AssertText(locators._menuItem, "text", "New vehicle", 1); + agHelper.GetNClick(locators._menuItem, 1); + agHelper.AssertContains("New vehicle registration"); + EditorNavigation.SelectEntityByName("Home page", EntityType.Page); + EditorNavigation.SelectEntityByName( + "Container2CopyCopy", + EntityType.Widget, + ); + PageLeftPane.expandCollapseItem("Container2CopyCopy"); + agHelper.ClickButton("Register service"); + agHelper.AssertElementVisibility(locators._modalWrapper); + debuggerHelper.OpenDebugger(); + debuggerHelper.ClickLogsTab(); + debuggerHelper.AssertVisibleErrorMessagesCount(0); + + EditorNavigation.SelectEntityByName("select_cars", EntityType.Query); + dataSources.RunQuery(); + dataSources.AssertQueryResponseHeaders(["vin"]); + dataSources.AssertQueryResponseHeaders(["make"]); + }); + }, +); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/ButtonCell_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/ButtonCell_spec.ts new file mode 100644 index 000000000000..9abac91c8c5c --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/ButtonCell_spec.ts @@ -0,0 +1,61 @@ +import { + agHelper, + entityExplorer, + propPane, + table, +} from "../../../../../../support/Objects/ObjectsCore"; + +describe( + "Table Widget V2 Button cell tests", + { tags: ["@tag.Widget", "@tag.Table", "@tag.Binding"] }, + () => { + const tableDataSelector = (row: number, col: number) => + table.GetTableDataSelector(row, col) + " div"; + + before(() => { + entityExplorer.DragDropWidgetNVerify("tablewidgetv2", 650, 250); + propPane.EnterJSContext("Table data", JSON.stringify([{ button: true }])); + }); + + const validateAlignment = ( + alignment: string, + expectedValue: string, + isHorizontal: boolean, + ) => { + const property = isHorizontal + ? "Horizontal Alignment" + : "Vertical alignment"; + propPane.ToggleJSMode(property, true); + propPane.UpdatePropertyFieldValue(property, alignment); + const cssProperty = isHorizontal ? "justify-content" : "align-items"; + agHelper + .GetElement(tableDataSelector(0, 0)) + .should("have.css", cssProperty, expectedValue); + }; + + it("1. Test to validate horizontal and vertical alignments", function () { + table.ChangeColumnType("button", "Button"); + propPane.MoveToTab("Style"); + + // Horizontal alignments + const horizontalAlignments = [ + { alignment: "CENTER", expected: "center" }, + { alignment: "RIGHT", expected: "flex-end" }, + { alignment: "LEFT", expected: "flex-start" }, + ]; + horizontalAlignments.forEach(({ alignment, expected }) => { + validateAlignment(alignment, expected, true); + }); + + // Vertical alignments + const verticalAlignments = [ + { alignment: "TOP", expected: "flex-start" }, + { alignment: "BOTTOM", expected: "flex-end" }, + { alignment: "CENTER", expected: "center" }, + ]; + verticalAlignments.forEach(({ alignment, expected }) => { + validateAlignment(alignment, expected, false); + }); + }); + }, +); diff --git a/app/client/cypress/e2e/Sanity/Datasources/RestApiOAuth2Validation_spec.ts b/app/client/cypress/e2e/Sanity/Datasources/RestApiOAuth2Validation_spec.ts index c6155bfd4188..39d2a0078b5f 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/RestApiOAuth2Validation_spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/RestApiOAuth2Validation_spec.ts @@ -8,7 +8,7 @@ import { dataManager, } from "../../../support/Objects/ObjectsCore"; -describe( +describe.skip( "Datasource form OAuth2 client credentials related tests", { tags: ["@tag.Datasource", "@tag.Sanity", "@tag.Git", "@tag.AccessControl"], @@ -42,7 +42,7 @@ describe( }); }); - it("2. Validate save and Authorise", function () { + it.skip("2. Validate save and Authorise", function () { agHelper.GetNClick(dataSources._saveDs); //Accept consent diff --git a/app/client/cypress/fixtures/resetWidgetBug33601.json b/app/client/cypress/fixtures/resetWidgetBug33601.json new file mode 100644 index 000000000000..44ae3ae0e7dc --- /dev/null +++ b/app/client/cypress/fixtures/resetWidgetBug33601.json @@ -0,0 +1 @@ +{"artifactJsonType":"APPLICATION","clientSchemaVersion":1.0,"serverSchemaVersion":11.0,"exportedApplication":{"name":"Untitled application 1 (1)","isPublic":false,"pages":[{"id":"Page1","isDefault":true}],"publishedPages":[{"id":"Page1","isDefault":true}],"viewMode":false,"appIsExample":false,"unreadCommentThreads":0.0,"unpublishedApplicationDetail":{"appPositioning":{"type":"FIXED"},"navigationSetting":{},"themeSetting":{"sizing":1.0,"density":1.0,"appMaxWidth":"LARGE"}},"publishedApplicationDetail":{"appPositioning":{"type":"FIXED"},"navigationSetting":{},"themeSetting":{"sizing":1.0,"density":1.0,"appMaxWidth":"LARGE"}},"color":"#C2DAF0","icon":"smartphone","slug":"untitled-application-1-1","unpublishedCustomJSLibs":[],"publishedCustomJSLibs":[],"evaluationVersion":2.0,"applicationVersion":2.0,"collapseInvisibleWidgets":true,"isManualUpdate":false,"deleted":false},"datasourceList":[],"customJSLibList":[],"pageList":[{"unpublishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":4896.0,"snapColumns":64.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":620.0,"containerStyle":"none","snapRows":124.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":90.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[{"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":12.0,"widgetName":"Image1","topRow":0.0,"bottomRow":12.0,"parentRowSpace":10.0,"type":"IMAGE_WIDGET","mobileRightColumn":37.0,"animateLoading":true,"parentColumnSpace":13.0625,"dynamicTriggerPathList":[],"imageShape":"RECTANGLE","leftColumn":25.0,"dynamicBindingPathList":[{"key":"borderRadius"},{"key":"image"}],"defaultImage":"https://assets.appsmith.com/widgets/default.png","flexVerticalAlignment":"start","key":"lq388zxydc","image":"{{Api1.data}}","rightColumn":37.0,"objectFit":"cover","widgetId":"471dll4hnd","isVisible":true,"version":1.0,"parentId":"0","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"maxZoomLevel":1.0,"enableDownload":false,"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":25.0,"enableRotation":false},{"needsErrorInfo":false,"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","mobileBottomRow":54.0,"currentItemsView":"{{[]}}","triggeredItemView":"{{{}}}","widgetName":"List1","requiresFlatWidgetChildren":true,"listData":"[\n {\n \"id\": \"001\",\n \"name\": \"Blue\",\n \"img\": \"https://assets.appsmith.com/widgets/default.png\"\n }\n]","isCanvas":true,"templateHeight":160.0,"topRow":14.0,"bottomRow":54.0,"pageSize":3.0,"parentRowSpace":10.0,"type":"LIST_WIDGET_V2","itemSpacing":8.0,"mobileRightColumn":36.0,"mainContainerId":"pi6w1ubhgt","animateLoading":true,"primaryKeys":"{{List1.listData.map((currentItem, currentIndex) => currentItem[\"id\"] )}}","parentColumnSpace":13.0625,"dynamicTriggerPathList":[],"dynamicBindingPathList":[{"key":"currentItemsView"},{"key":"selectedItemView"},{"key":"triggeredItemView"},{"key":"primaryKeys"},{"key":"accentColor"},{"key":"borderRadius"},{"key":"boxShadow"}],"leftColumn":12.0,"gridType":"vertical","enhancements":true,"children":[{"needsErrorInfo":false,"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","mobileBottomRow":400.0,"widgetName":"Canvas1","topRow":0.0,"bottomRow":400.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":false,"dropDisabled":true,"openParentPropertyPane":true,"minHeight":400.0,"mobileRightColumn":313.5,"noPad":true,"parentColumnSpace":1.0,"leftColumn":0.0,"dynamicBindingPathList":[{"key":"borderRadius"},{"key":"boxShadow"}],"children":[{"needsErrorInfo":false,"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","mobileBottomRow":12.0,"widgetName":"Container1","borderColor":"#E0DEDE","disallowCopy":true,"isCanvas":true,"topRow":0.0,"bottomRow":12.0,"dragDisabled":true,"type":"CONTAINER_WIDGET","shouldScrollContents":false,"isDeletable":false,"mobileRightColumn":64.0,"animateLoading":true,"leftColumn":0.0,"dynamicBindingPathList":[{"key":"borderRadius"},{"key":"boxShadow"}],"children":[{"needsErrorInfo":false,"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","widgetName":"Canvas2","topRow":0.0,"bottomRow":120.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":false,"useAutoLayout":false,"parentColumnSpace":1.0,"leftColumn":0.0,"dynamicBindingPathList":[{"key":"borderRadius"},{"key":"boxShadow"}],"children":[{"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":8.0,"widgetName":"Image2","topRow":0.0,"bottomRow":8.0,"type":"IMAGE_WIDGET","mobileRightColumn":16.0,"animateLoading":true,"dynamicTriggerPathList":[],"imageShape":"RECTANGLE","dynamicBindingPathList":[{"key":"image"},{"key":"borderRadius"}],"leftColumn":0.0,"defaultImage":"https://assets.appsmith.com/widgets/default.png","flexVerticalAlignment":"start","key":"lq388zxydc","image":"{{currentItem.img}}","rightColumn":16.0,"objectFit":"cover","widgetId":"wzykiwm9ed","isVisible":true,"version":1.0,"parentId":"m26fb9ulyh","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"maxZoomLevel":1.0,"enableDownload":false,"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":0.0,"enableRotation":false},{"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":4.0,"widgetName":"Text1","topRow":0.0,"bottomRow":4.0,"type":"TEXT_WIDGET","mobileRightColumn":28.0,"animateLoading":true,"overflow":"NONE","dynamicTriggerPathList":[],"fontFamily":"{{appsmith.theme.fontFamily.appFont}}","dynamicBindingPathList":[{"key":"text"},{"key":"truncateButtonColor"},{"key":"fontFamily"},{"key":"borderRadius"},{"key":"text"}],"leftColumn":16.0,"shouldTruncate":false,"truncateButtonColor":"{{appsmith.theme.colors.primaryColor}}","text":"{{currentItem.name}}","key":"i3zhkfk0fg","rightColumn":28.0,"textAlign":"LEFT","dynamicHeight":"FIXED","widgetId":"yetf883xrd","minWidth":450.0,"isVisible":true,"fontStyle":"BOLD","textColor":"#231F20","version":1.0,"parentId":"m26fb9ulyh","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"fill","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":16.0,"maxDynamicHeight":9000.0,"fontSize":"1rem","textStyle":"HEADING","minDynamicHeight":4.0},{"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":7.0,"widgetName":"Input1","topRow":0.0,"bottomRow":7.0,"parentRowSpace":10.0,"labelWidth":5.0,"autoFocus":false,"type":"INPUT_WIDGET_V2","mobileRightColumn":50.0,"animateLoading":true,"parentColumnSpace":8.7470703125,"dynamicTriggerPathList":[],"resetOnSubmit":true,"leftColumn":30.0,"dynamicBindingPathList":[{"key":"accentColor"},{"key":"borderRadius"}],"labelPosition":"Top","labelStyle":"","inputType":"TEXT","isDisabled":false,"key":"eqcv4yaupf","labelTextSize":"0.875rem","isRequired":false,"rightColumn":64.0,"dynamicHeight":"FIXED","widgetId":"xtwlw8syfk","accentColor":"{{appsmith.theme.colors.primaryColor}}","showStepArrows":false,"minWidth":450.0,"isVisible":true,"label":"Label","version":2.0,"parentId":"m26fb9ulyh","labelAlignment":"left","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"fill","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":30.0,"maxDynamicHeight":9000.0,"iconAlign":"left","defaultText":"","minDynamicHeight":4.0}],"key":"on2pxsbe1l","detachFromLayout":true,"dynamicHeight":"AUTO_HEIGHT","widgetId":"m26fb9ulyh","containerStyle":"none","minWidth":450.0,"isVisible":true,"version":1.0,"parentId":"pi6w1ubhgt","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"fill","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":0.0,"maxDynamicHeight":9000.0,"minDynamicHeight":4.0,"flexLayers":[]}],"borderWidth":"1","positioning":"fixed","flexVerticalAlignment":"stretch","key":"bpyab5sr79","backgroundColor":"white","rightColumn":64.0,"dynamicHeight":"FIXED","widgetId":"pi6w1ubhgt","containerStyle":"card","minWidth":450.0,"isVisible":true,"version":1.0,"isListItemContainer":true,"parentId":"0ch5o045ug","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"fill","noContainerOffset":true,"disabledWidgetFeatures":["dynamicHeight"],"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":0.0,"maxDynamicHeight":9000.0,"minDynamicHeight":10.0}],"key":"on2pxsbe1l","rightColumn":313.5,"detachFromLayout":true,"dynamicHeight":"AUTO_HEIGHT","widgetId":"0ch5o045ug","containerStyle":"none","minWidth":450.0,"isVisible":true,"version":1.0,"parentId":"q6p9tdm2il","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"fill","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":0.0,"maxDynamicHeight":9000.0,"minDynamicHeight":4.0,"flexLayers":[]}],"flexVerticalAlignment":"start","key":"qh3v2nmy9z","backgroundColor":"transparent","rightColumn":57.0,"itemBackgroundColor":"#FFFFFF","widgetId":"q6p9tdm2il","accentColor":"{{appsmith.theme.colors.primaryColor}}","minWidth":450.0,"isVisible":true,"parentId":"0","hasMetaWidgets":true,"renderMode":"CANVAS","isLoading":false,"mobileTopRow":14.0,"responsiveBehavior":"fill","mainCanvasId":"0ch5o045ug","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":12.0,"additionalStaticProps":["level","levelData","prefixMetaWidgetId","metaWidgetId"],"selectedItemView":"{{{}}}"},{"resetFormOnClick":false,"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":62.0,"widgetName":"Button1","onClick":"{{JSObject1.myFun1();}}","buttonColor":"{{appsmith.theme.colors.primaryColor}}","dynamicPropertyPathList":[],"topRow":58.0,"bottomRow":62.0,"parentRowSpace":10.0,"type":"BUTTON_WIDGET","mobileRightColumn":44.0,"animateLoading":true,"parentColumnSpace":13.0625,"dynamicTriggerPathList":[{"key":"onClick"}],"leftColumn":28.0,"dynamicBindingPathList":[{"key":"buttonColor"},{"key":"borderRadius"}],"text":"Submit","isDisabled":false,"key":"negmx3xdl3","rightColumn":44.0,"isDefaultClickDisabled":true,"widgetId":"3jmu654b63","minWidth":120.0,"isVisible":true,"recaptchaType":"V3","version":1.0,"parentId":"0","renderMode":"CANVAS","isLoading":false,"mobileTopRow":58.0,"responsiveBehavior":"hug","disabledWhenInvalid":false,"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":28.0,"buttonVariant":"PRIMARY","placement":"CENTER"},{"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":35.0,"widgetName":"Modal1","isCanvas":true,"topRow":11.0,"bottomRow":251.0,"parentRowSpace":10.0,"type":"MODAL_WIDGET","shouldScrollContents":true,"mobileRightColumn":47.0,"animateLoading":true,"parentColumnSpace":13.0625,"leftColumn":23.0,"dynamicBindingPathList":[{"key":"borderRadius"}],"children":[{"needsErrorInfo":false,"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","mobileBottomRow":240.0,"widgetName":"Canvas3","topRow":0.0,"bottomRow":240.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"shouldScrollContents":false,"minHeight":240.0,"mobileRightColumn":313.5,"parentColumnSpace":1.0,"leftColumn":0.0,"dynamicBindingPathList":[{"key":"borderRadius"},{"key":"boxShadow"}],"children":[{"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":4.0,"widgetName":"IconButton1","onClick":"{{closeModal(Modal1.name);}}","buttonColor":"{{appsmith.theme.colors.primaryColor}}","topRow":0.0,"bottomRow":4.0,"type":"ICON_BUTTON_WIDGET","mobileRightColumn":64.0,"animateLoading":true,"dynamicTriggerPathList":[{"key":"onClick"}],"leftColumn":58.0,"dynamicBindingPathList":[{"key":"buttonColor"},{"key":"borderRadius"}],"iconSize":24.0,"isDisabled":false,"key":"u0zauctxb6","rightColumn":64.0,"iconName":"cross","widgetId":"bcvgad922z","minWidth":50.0,"isVisible":true,"version":1.0,"parentId":"v57uk8d79e","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"hug","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":58.0,"buttonVariant":"TERTIARY"},{"needsErrorInfo":false,"mobileBottomRow":5.0,"widgetName":"Text3","topRow":1.0,"bottomRow":5.0,"type":"TEXT_WIDGET","mobileRightColumn":41.0,"animateLoading":true,"overflow":"NONE","fontFamily":"{{appsmith.theme.fontFamily.appFont}}","leftColumn":1.0,"dynamicBindingPathList":[{"key":"truncateButtonColor"},{"key":"fontFamily"},{"key":"borderRadius"}],"shouldTruncate":false,"truncateButtonColor":"{{appsmith.theme.colors.primaryColor}}","text":"Modal Title","key":"i3zhkfk0fg","rightColumn":41.0,"textAlign":"LEFT","dynamicHeight":"AUTO_HEIGHT","widgetId":"fm3m0glkp9","minWidth":450.0,"isVisible":true,"fontStyle":"BOLD","textColor":"#231F20","version":1.0,"parentId":"v57uk8d79e","renderMode":"CANVAS","isLoading":false,"mobileTopRow":1.0,"responsiveBehavior":"fill","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":1.0,"maxDynamicHeight":9000.0,"fontSize":"1.25rem","minDynamicHeight":4.0},{"resetFormOnClick":false,"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":22.0,"widgetName":"Button2","onClick":"{{closeModal(Modal1.name);}}","buttonColor":"{{appsmith.theme.colors.primaryColor}}","topRow":18.0,"bottomRow":22.0,"type":"BUTTON_WIDGET","mobileRightColumn":47.0,"animateLoading":true,"dynamicTriggerPathList":[{"key":"onClick"}],"leftColumn":31.0,"dynamicBindingPathList":[{"key":"buttonColor"},{"key":"borderRadius"}],"text":"Close","isDisabled":false,"key":"negmx3xdl3","rightColumn":47.0,"isDefaultClickDisabled":true,"widgetId":"4t0w7edckc","buttonStyle":"PRIMARY","minWidth":120.0,"isVisible":true,"recaptchaType":"V3","version":1.0,"parentId":"v57uk8d79e","renderMode":"CANVAS","isLoading":false,"mobileTopRow":18.0,"responsiveBehavior":"hug","disabledWhenInvalid":false,"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":31.0,"buttonVariant":"SECONDARY","placement":"CENTER"},{"resetFormOnClick":false,"needsErrorInfo":false,"boxShadow":"none","mobileBottomRow":22.0,"widgetName":"Button3","buttonColor":"{{appsmith.theme.colors.primaryColor}}","topRow":18.0,"bottomRow":22.0,"type":"BUTTON_WIDGET","mobileRightColumn":63.0,"animateLoading":true,"leftColumn":47.0,"dynamicBindingPathList":[{"key":"buttonColor"},{"key":"borderRadius"}],"text":"Confirm","isDisabled":false,"key":"negmx3xdl3","rightColumn":63.0,"isDefaultClickDisabled":true,"widgetId":"6boclz1k1j","buttonStyle":"PRIMARY_BUTTON","minWidth":120.0,"isVisible":true,"recaptchaType":"V3","version":1.0,"parentId":"v57uk8d79e","renderMode":"CANVAS","isLoading":false,"mobileTopRow":18.0,"responsiveBehavior":"hug","disabledWhenInvalid":false,"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":47.0,"buttonVariant":"PRIMARY","placement":"CENTER"}],"isDisabled":false,"key":"on2pxsbe1l","rightColumn":313.5,"detachFromLayout":true,"dynamicHeight":"AUTO_HEIGHT","widgetId":"v57uk8d79e","minWidth":450.0,"isVisible":true,"version":1.0,"parentId":"sva4y7d01n","renderMode":"CANVAS","isLoading":false,"mobileTopRow":0.0,"responsiveBehavior":"fill","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":0.0,"maxDynamicHeight":9000.0,"minDynamicHeight":4.0,"flexLayers":[]}],"key":"5oj4iyqf4p","height":240.0,"rightColumn":47.0,"detachFromLayout":true,"dynamicHeight":"AUTO_HEIGHT","widgetId":"sva4y7d01n","canOutsideClickClose":true,"canEscapeKeyClose":true,"version":2.0,"parentId":"0","renderMode":"CANVAS","isLoading":false,"mobileTopRow":11.0,"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","mobileLeftColumn":23.0,"maxDynamicHeight":9000.0,"width":456.0,"minDynamicHeight":24.0}]},"layoutOnLoadActions":[],"layoutOnLoadActionErrors":[],"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policyMap":{}},"publishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":1224.0,"snapColumns":16.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":1250.0,"containerStyle":"none","snapRows":33.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":4.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[]},"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policyMap":{}},"gitSyncId":"676259a5536a20188545cfb3_1920cf1a-a5b3-450d-bb47-b304ac11f065","deleted":false}],"actionList":[{"pluginType":"JS","pluginId":"js-plugin","unpublishedAction":{"name":"myFun1","fullyQualifiedName":"JSObject1.myFun1","datasource":{"name":"UNUSED_DATASOURCE","pluginId":"js-plugin","messages":[],"isAutoGenerated":false,"deleted":false,"policyMap":{},"policies":[],"userPermissions":[]},"pageId":"Page1","collectionId":"Page1_JSObject1","actionConfiguration":{"timeoutInMillisecond":10000.0,"paginationType":"NONE","encodeParamsToggle":true,"body":"function () {\n resetWidget(\"List1\", true);\n closeModal(Modal1.name);\n Api1.run();\n}","selfReferencingDataPaths":[],"jsArguments":[]},"executeOnLoad":false,"clientSideExecution":true,"dynamicBindingPathList":[{"key":"body"}],"isValid":true,"invalids":[],"messages":[],"jsonPathKeys":["function () {\n resetWidget(\"List1\", true);\n closeModal(Modal1.name);\n Api1.run();\n}"],"userSetOnLoad":false,"confirmBeforeExecute":false,"policyMap":{},"userPermissions":[],"createdAt":"2024-12-18T05:12:19Z"},"publishedAction":{"datasource":{"messages":[],"isAutoGenerated":false,"deleted":false,"policyMap":{},"policies":[],"userPermissions":[]},"messages":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policyMap":{},"userPermissions":[],"createdAt":"2024-12-18T05:12:19Z"},"gitSyncId":"676259a5536a20188545cfb3_3fdf8419-0d1d-4125-bc66-cc9d2b9eea85","id":"Page1_JSObject1.myFun1","deleted":false},{"pluginType":"API","pluginId":"restapi-plugin","unpublishedAction":{"name":"Api1","datasource":{"name":"DEFAULT_REST_DATASOURCE","pluginId":"restapi-plugin","datasourceConfiguration":{"url":"https://docs.appsmith.com"},"invalids":[],"messages":[],"isAutoGenerated":false,"deleted":false,"policyMap":{},"policies":[],"userPermissions":[]},"pageId":"Page1","actionConfiguration":{"timeoutInMillisecond":10000.0,"paginationType":"NONE","path":"/img/replyto-logo_6yaZHFIeU.jpeg","headers":[],"autoGeneratedHeaders":[],"encodeParamsToggle":true,"queryParameters":[],"body":"","bodyFormData":[],"httpMethod":"GET","httpVersion":"HTTP11","selfReferencingDataPaths":[],"pluginSpecifiedTemplates":[{"value":true}],"formData":{"apiContentType":"none"}},"executeOnLoad":false,"dynamicBindingPathList":[],"isValid":true,"invalids":[],"messages":[],"jsonPathKeys":[],"userSetOnLoad":true,"confirmBeforeExecute":false,"policyMap":{},"userPermissions":[],"createdAt":"2024-12-18T05:12:38Z"},"publishedAction":{"datasource":{"messages":[],"isAutoGenerated":false,"deleted":false,"policyMap":{},"policies":[],"userPermissions":[]},"messages":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policyMap":{},"userPermissions":[],"createdAt":"2024-12-18T05:12:38Z"},"gitSyncId":"676259a5536a20188545cfb3_3ef30bd9-ef2c-4a18-a874-96cde5f40cc5","id":"Page1_Api1","deleted":false}],"actionCollectionList":[{"unpublishedCollection":{"name":"JSObject1","pageId":"Page1","pluginId":"js-plugin","pluginType":"JS","actions":[],"archivedActions":[],"body":"export default {\n\tmyVar1: [],\n\tmyVar2: {},\n\tmyFun1 () {\n\t\tresetWidget(\"List1\", true);\n\t\tcloseModal(Modal1.name);\n\t\tApi1.run()\n\t},\n}","variables":[{"name":"myVar1","value":"[]"},{"name":"myVar2","value":"{}"}],"userPermissions":[]},"gitSyncId":"676259a5536a20188545cfb3_200b3630-e762-4bc5-bac5-0b371a18d4b4","id":"Page1_JSObject1","deleted":false}],"editModeTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false},"publishedTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false}} \ No newline at end of file diff --git a/app/client/cypress/locators/AdminsSettings.js b/app/client/cypress/locators/AdminsSettings.js index ec2dc30b9371..fab7f3a511d3 100644 --- a/app/client/cypress/locators/AdminsSettings.js +++ b/app/client/cypress/locators/AdminsSettings.js @@ -46,4 +46,5 @@ export default { singleSessionPerUserInput: "[data-testid='singleSessionPerUserEnabled']", sessionTimeoutWrapper: ".t--admin-settings-userSessionTimeoutInMinutes", sessionTimeoutInput: "[name='userSessionTimeoutInMinutes']", + adminEmailsData: ".t--admin-settings-APPSMITH_ADMIN_EMAILS span > span", }; diff --git a/app/client/cypress/locators/QueryEditor.json b/app/client/cypress/locators/QueryEditor.json index 5bdc0186a1c4..045bfba86913 100644 --- a/app/client/cypress/locators/QueryEditor.json +++ b/app/client/cypress/locators/QueryEditor.json @@ -9,7 +9,7 @@ "addDatasource": ".t--add-datasource", "editDatasourceButton": ".t--edit-datasource", "switch": ".t--form-control-SWITCH input", - "queryResponse": "(//div[@class='table']//div[@class='tr'])[3]//div[@class='td']", + "queryResponse": "(//div[@class='table']//div[@class='tr'])[2]//div[@class='td mp-mask']", "querySelect": "//div[contains(@class, 't--template-menu')]//div[text()='Select']", "queryCreate": "//div[contains(@class, 't--template-menu')]//div[text()='Create']", "queryUpdate": "//div[contains(@class, 't--template-menu')]//div[text()='Update']", diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvas.snap.png index 25023e98beb7..1dd1c50194ce 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvasDark.snap.png index 66edaec229ff..af51a4b49503 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeploy.snap.png index 934fdb11e4d4..cd45182f3bdf 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIpad2.snap.png index 121be741e383..54b3ac537551 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIphone6.snap.png index 9118ba24c502..7fb33dc3e85e 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployMacbook13.snap.png index 98e938085d1b..9429834e1718 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetPreview.snap.png index 4b779afa39d3..c915a79b047b 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts/anvilButtonWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvas.snap.png index 5dc2f3861499..79ae3998d238 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvasDark.snap.png index 85ef8f915a88..825e2ac8c675 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeploy.snap.png index a9adb76bfc92..ae325b628bf8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIpad2.snap.png index ce552cb59281..3dfe6ca64c65 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIphone6.snap.png index 0fe8d596c38d..d95f9a5ccfd3 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployMacbook13.snap.png index aaf91616a9a0..9f24d4538906 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts/anvilCheckboxGroupWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvas.snap.png index 0f05f8d0974d..052c8f4a1b01 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvasDark.snap.png index cf32059a4cb3..be3cc5f96350 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeploy.snap.png index 99bfed718b49..6579561009b9 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIpad2.snap.png index 71e0170835e0..c50d73259359 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIphone6.snap.png index 35f2bde97ca5..e603856b8847 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployMacbook13.snap.png index 567798ad701d..be2e6eee2ef7 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetPreview.snap.png index f5fa0e7cf41b..8ca7cb430974 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxWidgetSnapshot_spec.ts/anvilCheckboxWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeploy.snap.png index 30e68c9f54ef..14304a958132 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIpad2.snap.png index f2a2277ef8cb..e6ab69e57f9a 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIphone6.snap.png index d13f6a5d69af..c9c07ca109f8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployMacbook13.snap.png index 1156fec3cd66..ec8b7dd985ad 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts/anvilCurrencyInputWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvas.snap.png index 2240a03aa2d6..f19ea7976008 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvasDark.snap.png index 9a35eee05e42..7cd35bca984f 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeploy.snap.png index 36b635e45749..8194943b7b06 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIpad2.snap.png index 42de4531cdc0..fab4ae3b67db 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIphone6.snap.png index 09eea5aff625..5054bcefd9c9 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployMacbook13.snap.png index 2c6b1c81f92d..e224fe55e15b 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetPreview.snap.png index 20221f9f8cab..a87fea2a2b2f 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilHeadingWidgetSnapshot_spec.ts/anvilHeadingWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvas.snap.png index 4883384e7233..e82784efcf44 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvasDark.snap.png index 7dca08d168e6..24dc5bee739a 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeploy.snap.png index c149c2d5a27c..bf9f46adc316 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIpad2.snap.png index 7ba16ef5bea9..abdae2b15037 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIphone6.snap.png index 612fc773e6e6..65cfd302bca2 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployMacbook13.snap.png index dfbd6cc8b021..b4c93edacbe8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetPreview.snap.png index 60b8dcb85a12..be56c47d0ce7 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts/anvilIconButtonWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvas.snap.png index 209fb85f801c..69e5cb304835 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvasDark.snap.png index afb5e42c6329..b80fb3a8dd05 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeploy.snap.png index 6dcb85b24673..eba0c9203954 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIpad2.snap.png index 1b36e211edd0..05f1b5e764a8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIphone6.snap.png index d5fbb6086f64..f520544c5d5b 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployMacbook13.snap.png index 9cfd79f79afb..f371aec728d3 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetPreview.snap.png index 5263cb3cb8b3..187139de211b 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts/anvilInlineButtonWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeploy.snap.png index fbfaa33d91c6..c8f53e432465 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIpad2.snap.png index 7492788cbc03..2c0aaa949f54 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIphone6.snap.png index 22d96e7b18e3..24fd98200ca0 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployMacbook13.snap.png index 5000bea12a5a..046201afc369 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts/anvilInputWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvas.snap.png index 2a4b7c8f83ba..e7a896cab2d1 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvasDark.snap.png index 7da01788fbc2..f2ceb8e9c9b5 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeploy.snap.png index 3660687c1aed..570578e858b4 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIpad2.snap.png index c8fd50be0da5..dd7f944fa8dc 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIphone6.snap.png index 811631dab378..40d854496575 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployMacbook13.snap.png index dcc485135125..bb599f3ce9a8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetPreview.snap.png index d085c85040cf..7eb9f9003056 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts/anvilParagraphWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeploy.snap.png index cf6755af8981..57844230e647 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIpad2.snap.png index 15937f55bcc8..82b2dbca9701 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIphone6.snap.png index 335ff2294b05..ce6e27a176be 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployMacbook13.snap.png index 1a8ccfc73e10..5fb57829dd35 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts/anvilPhoneInputWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvas.snap.png index be703ef99250..ae7a28fa7b12 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvasDark.snap.png index 7d37c87759a8..be5d3df06f92 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeploy.snap.png index f2d5f5f15c7d..f58d6a76529f 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIpad2.snap.png index 86b317d742d9..952fc71400f0 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIphone6.snap.png index 3d3b21048728..a5ae226c24b7 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployMacbook13.snap.png index afe9cee68203..eee2e7797d67 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetPreview.snap.png index e6559802ce62..f11372a07659 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilRadioGroupWidgetSnapshot_spec.ts/anvilRadioGroupWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvas.snap.png index ce9ca7be2e6e..74a81795152d 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvasDark.snap.png index 228508d8f16f..71a8bb4b5d93 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeploy.snap.png index 60d986fc3d20..0f6e343858c4 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIpad2.snap.png index d0be224e5a4e..b086a96e13e8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIphone6.snap.png index 41c2f86bf270..41a060335ad6 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployMacbook13.snap.png index 1b7c113b65c9..d956bf007bc6 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts/anvilStatsWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvas.snap.png index f0881060a3e6..c1b5e55504b8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvasDark.snap.png index f4216611960e..0cf9c7052a15 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeploy.snap.png index 2c135a3b11b7..4b85db8b528b 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIpad2.snap.png index 95f8176ff473..a77750ba28b7 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIphone6.snap.png index b72580b5b415..2ea1a7a91eb0 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployMacbook13.snap.png index bb542f34c34d..46b1c26f224c 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetPreview.snap.png index 5861230d4fbf..4a5e3fcbf77f 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts/anvilSwitchGroupWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvas.snap.png index 6ba6ce0809eb..f547452af571 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvasDark.snap.png index 727b9d824e99..faa4ff5f27d5 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeploy.snap.png index 3e9db0f73616..63bb516bb43d 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIpad2.snap.png index 33cb60aaabbd..3dc45f5ede51 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIphone6.snap.png index 42940debaff5..d9d1b2496262 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployMacbook13.snap.png index b40fcb197bbf..d241efcbc9e7 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetPreview.snap.png index f50b7d7f9cc6..e290b747f9f7 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts/anvilSwitchWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvas.snap.png index 00676699313e..49eac54e3ea5 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvasDark.snap.png index 217db7725bed..93f200ccb8db 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeploy.snap.png index 0a4be317be62..15f9e5581e6e 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIpad2.snap.png index 9ddee4015398..058697a54186 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIphone6.snap.png index 13c71918e4bc..02062784acb1 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployMacbook13.snap.png index 14ce290b579f..a515323fbf6c 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetPreview.snap.png index 5f8695cff527..59f04927dd35 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts/anvilTableWidgetPreview.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvas.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvas.snap.png index cd7137bbf69d..2c88f16c5381 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvas.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvas.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvasDark.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvasDark.snap.png index db030580e11e..e53c61d34e1d 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvasDark.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetCanvasDark.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeploy.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeploy.snap.png index f9e5ce37ea21..151d615fc2e9 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeploy.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeploy.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIpad2.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIpad2.snap.png index 2eec1d8dddfd..5eb51a533ba3 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIpad2.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIpad2.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIphone6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIphone6.snap.png index a9ca428802fd..52bd793cac97 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIphone6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployIphone6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployMacbook13.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployMacbook13.snap.png index 18ff6ccb1c2d..fd138e3e8673 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployMacbook13.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetDeployMacbook13.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetPreview.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetPreview.snap.png index c1a2674a2fe9..d760f3c013ea 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetPreview.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts/anvilToolbarButtonWidgetPreview.snap.png differ diff --git a/app/client/cypress/support/Objects/CommonLocators.ts b/app/client/cypress/support/Objects/CommonLocators.ts index 07006699a065..ebf4f547697e 100644 --- a/app/client/cypress/support/Objects/CommonLocators.ts +++ b/app/client/cypress/support/Objects/CommonLocators.ts @@ -86,7 +86,7 @@ export class CommonLocators { _anvilDnDHighlight = "[data-type=anvil-dnd-highlight]"; _editPage = "[data-testid=onboarding-tasks-datasource-text], .t--drop-target"; _crossBtn = "span.cancel-icon"; - _createNew = ".t--add-item"; + _createNew = "[data-testid='t--add-item']"; _uploadFiles = "div.uppy-Dashboard-AddFiles input"; _uploadBtn = "button.uppy-StatusBar-actionBtn--upload"; _errorTab = "[data-testid=t--tab-ERROR_TAB]"; diff --git a/app/client/cypress/support/Pages/DataSources.ts b/app/client/cypress/support/Pages/DataSources.ts index 83c001243741..ff559f6e4784 100644 --- a/app/client/cypress/support/Pages/DataSources.ts +++ b/app/client/cypress/support/Pages/DataSources.ts @@ -147,7 +147,7 @@ export class DataSources { option + "']"; _queryTableResponse = - "//div[@data-guided-tour-id='query-table-response']//div[@class='tbody']//div[@class ='td']"; + "//div[@data-guided-tour-id='query-table-response']//div[@class='tbody']//div[@class ='td mp-mask']"; _queryResponseHeader = (header: string) => "//div[@data-guided-tour-id='query-table-response']//div[@class='table']//div[@role ='columnheader']//span[text()='" + header + diff --git a/app/client/cypress/support/Pages/EditorNavigation.ts b/app/client/cypress/support/Pages/EditorNavigation.ts index b175499aab32..38fc48ad3ffe 100644 --- a/app/client/cypress/support/Pages/EditorNavigation.ts +++ b/app/client/cypress/support/Pages/EditorNavigation.ts @@ -6,11 +6,12 @@ import { LeftPane } from "./IDE/LeftPane"; import PageList from "./PageList"; export enum AppSidebarButton { - Data = "Data", + Data = "Datasources", Editor = "Editor", Libraries = "Libraries", Settings = "Settings", } + export const AppSidebar = new Sidebar(Object.values(AppSidebarButton)); export enum PagePaneSegment { @@ -19,6 +20,9 @@ export enum PagePaneSegment { JS = "JS", } +export const editorTabSelector = (name: string) => + `[data-testid='t--ide-tab-${name.toLowerCase()}']`; + export enum EditorViewMode { FullScreen = "FullScreen", SplitScreen = "SplitScreen", @@ -42,6 +46,7 @@ export enum EntityType { JSObject = "JSObject", Page = "Page", } + class EditorNavigation { public locators = { MaximizeBtn: "[data-testid='t--ide-maximize']", diff --git a/app/client/cypress/support/Pages/IDE/ListView.ts b/app/client/cypress/support/Pages/IDE/ListView.ts index 0da47d2b2623..f9f4352af532 100644 --- a/app/client/cypress/support/Pages/IDE/ListView.ts +++ b/app/client/cypress/support/Pages/IDE/ListView.ts @@ -4,7 +4,7 @@ class ListView { public locators = { list: "[data-testid='t--ide-list']", listItem: "[data-testid='t--ide-list-item']", - addItem: "button.t--add-item", + addItem: "[data-testid='t--add-item']", }; public assertListVisibility() { diff --git a/app/client/cypress/support/Pages/IDE/Sidebar.ts b/app/client/cypress/support/Pages/IDE/Sidebar.ts index 00a75a1c7ca6..6d9d93c125f4 100644 --- a/app/client/cypress/support/Pages/IDE/Sidebar.ts +++ b/app/client/cypress/support/Pages/IDE/Sidebar.ts @@ -2,7 +2,7 @@ export class Sidebar { buttons: string[]; locators = { sidebar: ".t--sidebar", - sidebarButton: (name: string) => `.t--sidebar-${name}`, + sidebarButton: (name: string) => `[data-testid='t--sidebar-${name}']`, }; constructor(buttons: string[]) { diff --git a/app/client/cypress/support/Pages/Table.ts b/app/client/cypress/support/Pages/Table.ts index 9a11bfbc3f1c..6aa08cb98917 100644 --- a/app/client/cypress/support/Pages/Table.ts +++ b/app/client/cypress/support/Pages/Table.ts @@ -855,4 +855,8 @@ export class Table { this.agHelper.GetHoverNClick(selector, 1, true); verify && cy.get(selector).eq(1).should("be.disabled"); } + + public GetTableDataSelector(rowNum: number, colNum: number): string { + return `.t--widget-tablewidgetv2 .tbody .td[data-rowindex=${rowNum}][data-colindex=${colNum}]`; + } } diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index 4de96346ecd5..75dab1611597 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -814,7 +814,7 @@ Cypress.Commands.add("ValidatePaginateResponseUrlData", (runTestCss) => { cy.wait(2000); cy.get(runTestCss).click(); cy.wait(2000); - cy.xpath("//div[@class='tr'][1]//div[@class='td'][6]//span") + cy.xpath("//div[@class='tr'][1]//div[@class='td mp-mask'][6]//span") .invoke("text") .then((valueToTest) => { // eslint-disable-next-line cypress/no-unnecessary-waiting @@ -839,7 +839,7 @@ Cypress.Commands.add("ValidatePaginateResponseUrlDataV2", (runTestCss) => { cy.wait(2000); cy.get(runTestCss).click(); cy.wait(2000); - cy.xpath("//div[@class='tr'][1]//div[@class='td'][6]//span") + cy.xpath("//div[@class='tr'][1]//div[@class='td mp-mask'][6]//span") .invoke("text") .then((valueToTest) => { // eslint-disable-next-line cypress/no-unnecessary-waiting diff --git a/app/client/package.json b/app/client/package.json index 02bd681ec3f3..7330ec7e966c 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -88,6 +88,7 @@ "@redux-saga/core": "1.1.3", "@redux-saga/types": "1.2.1", "@reduxjs/toolkit": "^2.4.0", + "@segment/analytics-next": "^1.76.0", "@sentry/react": "^6.2.4", "@shared/ast": "workspace:^", "@shared/dsl": "workspace:^", diff --git a/app/client/packages/design-system/ads-old/src/Table/index.tsx b/app/client/packages/design-system/ads-old/src/Table/index.tsx index 295922f66863..ecec66eb1ce6 100644 --- a/app/client/packages/design-system/ads-old/src/Table/index.tsx +++ b/app/client/packages/design-system/ads-old/src/Table/index.tsx @@ -1,4 +1,9 @@ -import { useTable, useSortBy, useExpanded } from "react-table"; +import { + useTable, + useSortBy, + useExpanded, + type Row as ReactTableRow, +} from "react-table"; import React from "react"; import styled from "styled-components"; import { Classes } from "../constants/classes"; @@ -141,8 +146,16 @@ export interface TableProps { isLoading?: boolean; loaderComponent?: JSX.Element; noDataComponent?: JSX.Element; + RowComponent?: React.ComponentType; } +const Row = ({ + children, + ...props +}: React.ComponentProps<"tr"> & { row: ReactTableRow }) => { + return {children}; +}; + function Table(props: TableProps) { const { columns, @@ -150,6 +163,7 @@ function Table(props: TableProps) { isLoading = false, loaderComponent, noDataComponent, + RowComponent = Row, } = props; const { getTableBodyProps, getTableProps, headerGroups, prepareRow, rows } = @@ -201,7 +215,7 @@ function Table(props: TableProps) { prepareRow(row); return ( - + {row.cells.map((cell, index) => { return ( ); })} - + ); }) ) : ( diff --git a/app/client/packages/design-system/ads/src/NumberInput/NumberInput.stories.tsx b/app/client/packages/design-system/ads/src/NumberInput/NumberInput.stories.tsx index 543d7531c0c3..350fb658ed7c 100644 --- a/app/client/packages/design-system/ads/src/NumberInput/NumberInput.stories.tsx +++ b/app/client/packages/design-system/ads/src/NumberInput/NumberInput.stories.tsx @@ -4,7 +4,7 @@ import type { NumberInputProps } from "./NumberInput.types"; import type { StoryObj } from "@storybook/react"; export default { - title: "ADS/Components/Input/NumberInput", + title: "ADS/Components/Input/Number Input", component: NumberInput, decorators: [ (Story: () => React.ReactNode) => ( diff --git a/app/client/packages/design-system/ads/src/SearchInput/SearchInput.stories.tsx b/app/client/packages/design-system/ads/src/SearchInput/SearchInput.stories.tsx index b6399f4ceb84..306e0e64a007 100644 --- a/app/client/packages/design-system/ads/src/SearchInput/SearchInput.stories.tsx +++ b/app/client/packages/design-system/ads/src/SearchInput/SearchInput.stories.tsx @@ -4,7 +4,7 @@ import type { SearchInputProps } from "./SearchInput.types"; import type { StoryObj } from "@storybook/react"; export default { - title: "ADS/Components/Input/SearchInput", + title: "ADS/Components/Input/Search Input", component: SearchInput, decorators: [ (Story: () => React.ReactNode) => ( diff --git a/app/client/packages/design-system/ads/src/SegmentedControl/SegmentedControl.styles.tsx b/app/client/packages/design-system/ads/src/SegmentedControl/SegmentedControl.styles.tsx index a93f7aa7fc9a..df71f94da913 100644 --- a/app/client/packages/design-system/ads/src/SegmentedControl/SegmentedControl.styles.tsx +++ b/app/client/packages/design-system/ads/src/SegmentedControl/SegmentedControl.styles.tsx @@ -41,6 +41,12 @@ export const StyledSegment = styled.span` & > * { color: var(--ads-v2-colors-control-segment-value-default-fg); } + + &[data-selected="true"] { + span { + font-weight: var(--ads-v2-font-weight-bold); + } + } `; export const StyledControlContainer = styled.div` @@ -81,6 +87,7 @@ export const StyledControlContainer = styled.div` /* Select all segments which is not a selected and last child */ /* seperator */ + &:not(:hover):not(:last-child):not([data-selected="true"]):not( :has(+ [data-selected="true"]) ):after { diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.mdx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.mdx new file mode 100644 index 000000000000..3eef0d1cb290 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.mdx @@ -0,0 +1,35 @@ +import { Canvas, Meta } from "@storybook/blocks"; + +import * as EmptyStateStories from "./EmptyState.stories"; + + + +# Empty State + +A placeholder for when there is no data to display. It can be used to guide users on what to do next. + +## Anatomy + +icon: The icon of the file type or the entity type that is being displayed. + +description: The details of the empty state. It should be a short and clear message. + +button: A button that can be used to trigger an action. This is optional. + +### Default implementation + +Below is the default implementation of the Empty State component. It does not have a button. + + + +### With Button + +Button kind can be supplied. If no kind is supplied, default is "secondary". + + + +### With Button but no onClick is supplied + +onClick is optional. If not supplied, the button will not be shown. + + diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.stories.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.stories.tsx new file mode 100644 index 000000000000..9b756418db5a --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.stories.tsx @@ -0,0 +1,54 @@ +/* eslint-disable no-console */ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { EmptyState, type EmptyStateProps } from "."; + +const meta: Meta = { + title: "ADS/Templates/Entity Explorer/Empty State", + component: EmptyState, +}; + +export default meta; + +const Template = (props: EmptyStateProps) => { + const { button, description, icon } = props; + + return ( + + ); +}; + +export const Basic = Template.bind({}) as StoryObj; + +Basic.args = { + description: "No data available", + icon: "folder-line", +}; + +export const WithButton = Template.bind({}) as StoryObj; + +WithButton.args = { + description: "No data available", + icon: "file-line", + button: { + text: "Add new", + onClick: () => console.log("Add clicked"), + }, +}; + +export const WithButtonWithoutOnClick = Template.bind({}) as StoryObj; + +WithButtonWithoutOnClick.args = { + description: "No data available", + icon: "file-line", + button: { + text: "Add new", + }, +}; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.tsx new file mode 100644 index 000000000000..269bc1ecdc49 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.tsx @@ -0,0 +1,48 @@ +import React from "react"; +import { Button, Flex, Icon, Text } from "../../.."; +import type { EmptyStateProps } from "./EmptyState.types"; + +const EmptyState = ({ button, description, icon }: EmptyStateProps) => { + return ( + + + + + + {description} + + {button && button.onClick ? ( + + ) : null} + + ); +}; + +export { EmptyState }; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.types.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.types.ts new file mode 100644 index 000000000000..e77047e508b9 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/EmptyState.types.ts @@ -0,0 +1,13 @@ +import { type IconNames, type ButtonKind } from "../../.."; + +export interface EmptyStateProps { + icon: IconNames; + description: string; + button?: { + text: string; + onClick?: () => void; + kind?: Extract; + className?: string; + testId?: string; + }; +} diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/index.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/index.ts new file mode 100644 index 000000000000..73c3c2eaf937 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/EmptyState/index.ts @@ -0,0 +1,2 @@ +export { EmptyState } from "./EmptyState"; +export * from "./EmptyState.types"; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.constants.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.constants.ts new file mode 100644 index 000000000000..989f72dd5497 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.constants.ts @@ -0,0 +1,4 @@ +export const ExplorerContainerBorder = { + STANDARD: "1px solid var(--ads-v2-color-border)", + NONE: "", +}; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.stories.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.stories.tsx new file mode 100644 index 000000000000..7a9560cef7a0 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.stories.tsx @@ -0,0 +1,54 @@ +/* eslint-disable no-console */ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { type ExplorerContainerProps, ExplorerContainer } from "."; + +import { SearchAndAdd } from ".."; +import { Flex } from "../../../Flex"; + +const meta: Meta = { + title: "ADS/Templates/Entity Explorer/Container", + component: ExplorerContainer, + argTypes: { + borderRight: { + options: ["STANDARD", "NONE"], + control: { type: "select" }, + }, + }, +}; + +export default meta; + +const Template = (props: ExplorerContainerProps) => { + const { borderRight, children, className, height, width } = props; + + return ( + + ); +}; + +export const Basic = Template.bind({}) as StoryObj; + +const Children = () => { + return ( + + + + ); +}; + +Basic.args = { + children: , + borderRight: "STANDARD", + height: "300px", + width: "255px", +}; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.tsx new file mode 100644 index 000000000000..2674552b4400 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.tsx @@ -0,0 +1,18 @@ +import React from "react"; +import { ExplorerContainerBorder, Flex } from "../../.."; +import type { ExplorerContainerProps } from "./ExplorerContainer.types"; + +export const ExplorerContainer = (props: ExplorerContainerProps) => { + return ( + + {props.children} + + ); +}; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.types.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.types.ts new file mode 100644 index 000000000000..b9638fc983d3 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/ExplorerContainer.types.ts @@ -0,0 +1,10 @@ +import { type ReactNode } from "react"; +import type { ExplorerContainerBorder } from "./ExplorerContainer.constants"; + +export interface ExplorerContainerProps { + children: ReactNode | ReactNode[]; + borderRight: keyof typeof ExplorerContainerBorder; + className?: string; + width?: string | number; + height?: string | number; +} diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/index.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/index.ts new file mode 100644 index 000000000000..eeb571c08c8f --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/ExplorerContainer/index.ts @@ -0,0 +1,3 @@ +export { ExplorerContainer } from "./ExplorerContainer"; +export * from "./ExplorerContainer.types"; +export { ExplorerContainerBorder } from "./ExplorerContainer.constants"; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.mdx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.mdx new file mode 100644 index 000000000000..5f817ae34caa --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.mdx @@ -0,0 +1,16 @@ +import { Canvas, Meta } from "@storybook/blocks"; + +import * as NoSearchResultStories from "./NoSearchResults.stories"; + + + +# No Search Results + +A placeholder for when there are no search results to display. It can be used to guide users on what to do next. +What you get is an ADS styled message from this component. + +### Default implementation + +Below is the default implementation + + diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.stories.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.stories.tsx new file mode 100644 index 000000000000..4110b78586a6 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.stories.tsx @@ -0,0 +1,24 @@ +/* eslint-disable no-console */ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { NoSearchResults, type NoSearchResultsProps } from "."; + +const meta: Meta = { + title: "ADS/Templates/Entity Explorer/No Search Results", + component: NoSearchResults, +}; + +export default meta; + +const Template = (props: NoSearchResultsProps) => { + const { text } = props; + + return ; +}; + +export const Basic = Template.bind({}) as StoryObj; + +Basic.args = { + text: "No files found", +}; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.tsx new file mode 100644 index 000000000000..645b4c5d1a4e --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.tsx @@ -0,0 +1,17 @@ +import React from "react"; +import { Text } from "../../.."; +import type { NoSearchResultsProps } from "./NoSearchResults.types"; + +const NoSearchResults = ({ text }: NoSearchResultsProps) => { + return ( + + {text} + + ); +}; + +export { NoSearchResults }; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.types.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.types.ts new file mode 100644 index 000000000000..74e9a3faf37d --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/NoSearchResults.types.ts @@ -0,0 +1,3 @@ +export interface NoSearchResultsProps { + text: string; +} diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/index.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/index.ts new file mode 100644 index 000000000000..d63aea8808c1 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/NoSearchResults/index.ts @@ -0,0 +1,2 @@ +export { NoSearchResults } from "./NoSearchResults"; +export * from "./NoSearchResults.types"; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.stories.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.stories.tsx new file mode 100644 index 000000000000..9d40d80145b0 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.stories.tsx @@ -0,0 +1,38 @@ +/* eslint-disable no-console */ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { SearchAndAdd, type SearchAndAddProps } from "."; + +const meta: Meta = { + title: "ADS/Templates/Entity Explorer/Search And Add", + component: SearchAndAdd, +}; + +export default meta; + +const Template = (props: SearchAndAddProps) => { + const { onAdd, onSearch, placeholder, showAddButton = true } = props; + + return ( +
+ +
+ ); +}; + +export const Basic = Template.bind({}) as StoryObj; + +Basic.args = { + onAdd: () => console.log("Add clicked"), + onSearch: (searchTerm: string) => console.log(searchTerm), + placeholder: "Search", + showAddButton: true, +}; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.styles.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.styles.tsx new file mode 100644 index 000000000000..cb734378ea67 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.styles.tsx @@ -0,0 +1,16 @@ +import styled from "styled-components"; + +import { Button } from "@appsmith/ads"; + +export const Root = styled.div` + display: flex; + gap: var(--ads-v2-spaces-3); + width: 100%; +`; + +export const SquareButton = styled(Button)` + && { + max-width: 24px; + min-width: 24px; + } +`; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.tsx b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.tsx new file mode 100644 index 000000000000..e00766fc71a5 --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.tsx @@ -0,0 +1,43 @@ +import React, { forwardRef } from "react"; + +import { SearchInput } from "@appsmith/ads"; +import * as Styles from "./SearchAndAdd.styles"; +import type { SearchAndAddProps } from "./SearchAndAdd.types"; + +export const SearchAndAdd = forwardRef( + (props, ref) => { + const { + onAdd, + onSearch, + placeholder, + searchTerm = "", + showAddButton, + } = props; + + return ( + + + {showAddButton && ( + + )} + + ); + }, +); + +SearchAndAdd.displayName = "SearchAndAdd"; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.types.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.types.ts new file mode 100644 index 000000000000..f1ab9960287b --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/SearchAndAdd.types.ts @@ -0,0 +1,12 @@ +export interface SearchAndAddProps { + /** Placeholder text for search input. */ + placeholder?: string; + /** Value for search input in controlled mode. */ + searchTerm?: string; + /** Callback to be called when add button is clicked. */ + onAdd?: () => void; + /** Callback to be called when search input value changes. */ + onSearch?: (searchTerm: string) => void; + /** Whether to show the add button. Allows to hide the button for users with insufficient access privileges. */ + showAddButton: boolean; +} diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/index.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/index.ts new file mode 100644 index 000000000000..f1bd4354942d --- /dev/null +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/SearchAndAdd/index.ts @@ -0,0 +1,2 @@ +export { SearchAndAdd } from "./SearchAndAdd"; +export * from "./SearchAndAdd.types"; diff --git a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/index.ts b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/index.ts index 95639a0663f6..5e42c9c115ba 100644 --- a/app/client/packages/design-system/ads/src/Templates/EntityExplorer/index.ts +++ b/app/client/packages/design-system/ads/src/Templates/EntityExplorer/index.ts @@ -1,3 +1,7 @@ export { ListItemContainer, ListHeaderContainer } from "./styles"; export { ListWithHeader } from "./ListWithHeader"; export { EditorSegments } from "./EditorSegments"; +export * from "./SearchAndAdd"; +export { EmptyState } from "./EmptyState"; +export { NoSearchResults } from "./NoSearchResults"; +export * from "./ExplorerContainer"; diff --git a/app/client/packages/design-system/ads/src/Templates/IDEHeader/IDEHeader.stories.tsx b/app/client/packages/design-system/ads/src/Templates/IDEHeader/IDEHeader.stories.tsx index 6c709080dd52..c24b5e8eafda 100644 --- a/app/client/packages/design-system/ads/src/Templates/IDEHeader/IDEHeader.stories.tsx +++ b/app/client/packages/design-system/ads/src/Templates/IDEHeader/IDEHeader.stories.tsx @@ -12,7 +12,7 @@ import { Text } from "../../Text"; import { ListHeaderContainer } from "../EntityExplorer/styles"; const meta: Meta = { - title: "ADS/Templates/IDEHeader", + title: "ADS/Templates/IDE Header", component: IDEHeader, parameters: { layout: "fullscreen", diff --git a/app/client/packages/design-system/ads/src/__assets__/icons/ads/dashboard-line.svg b/app/client/packages/design-system/ads/src/__assets__/icons/ads/dashboard-line.svg index c0a187a04d2a..cadb81355910 100644 --- a/app/client/packages/design-system/ads/src/__assets__/icons/ads/dashboard-line.svg +++ b/app/client/packages/design-system/ads/src/__assets__/icons/ads/dashboard-line.svg @@ -1,3 +1,6 @@ - - + + + diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx index 738432dd4b3e..44587284907d 100644 --- a/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx @@ -4,10 +4,13 @@ import { FieldLabel, FieldError, inputFieldStyles, + useRootContainer, + POPOVER_LIST_BOX_MAX_HEIGHT, } from "@appsmith/wds"; import React from "react"; import { ComboBox as HeadlessCombobox } from "react-aria-components"; +import styles from "./styles.module.css"; import type { ComboBoxProps } from "./types"; import { ComboBoxTrigger } from "./ComboBoxTrigger"; @@ -24,9 +27,7 @@ export const ComboBox = (props: ComboBoxProps) => { size = "medium", ...rest } = props; - const root = document.body.querySelector( - "[data-theme-provider]", - ) as HTMLButtonElement; + const root = useRootContainer(); return ( { size={size} /> {errorMessage} - + {children} diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBoxTrigger.tsx b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBoxTrigger.tsx index c17bcb4cca89..bf5b8bae0b90 100644 --- a/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBoxTrigger.tsx +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBoxTrigger.tsx @@ -1,7 +1,5 @@ -import clsx from "clsx"; import React, { useMemo } from "react"; -import { getTypographyClassName } from "@appsmith/wds-theming"; -import { Spinner, textInputStyles, Input, IconButton } from "@appsmith/wds"; +import { Spinner, Input, IconButton } from "@appsmith/wds"; import type { ComboBoxProps } from "./types"; @@ -27,12 +25,5 @@ export const ComboBoxTrigger: React.FC = (props) => { ); }, [isLoading, size, isDisabled]); - return ( - - ); + return ; }; diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/ComboBox/src/styles.module.css new file mode 100644 index 000000000000..5a98e2049876 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/styles.module.css @@ -0,0 +1,4 @@ +.comboboxPopover { + width: calc(var(--trigger-width) + var(--inner-spacing-2) * 2); + transform: translateX(calc(-1 * var(--inner-spacing-1))); +} diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx b/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx index 5f01ae804ca7..36a64aa1c2d8 100644 --- a/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx @@ -6,7 +6,7 @@ import { ComboBox, ListBoxItem, Flex, Button } from "@appsmith/wds"; import { items } from "./items"; const meta: Meta = { - title: "WDS/Widgets/ComboBox", + title: "WDS/Widgets/Combo Box", component: ComboBox, tags: ["autodocs"], args: { diff --git a/app/client/packages/design-system/widgets/src/components/Datepicker/src/Datepicker.tsx b/app/client/packages/design-system/widgets/src/components/Datepicker/src/Datepicker.tsx index 3d98fb0b3175..f62f5dd69fb7 100644 --- a/app/client/packages/design-system/widgets/src/components/Datepicker/src/Datepicker.tsx +++ b/app/client/packages/design-system/widgets/src/components/Datepicker/src/Datepicker.tsx @@ -5,6 +5,7 @@ import { Calendar, inputFieldStyles, TimeField, + useRootContainer, } from "@appsmith/wds"; import clsx from "clsx"; import React from "react"; @@ -44,6 +45,7 @@ export const DatePicker = (props: DatePickerProps) => { const timeMaxValue = ( props.maxValue && "hour" in props.maxValue ? props.maxValue : null ) as TimeValue; + const root = useRootContainer(); return ( (props: DatePickerProps) => { {...rest} > {({ state }) => { - const root = document.body.querySelector( - "[data-theme-provider]", - ) as HTMLButtonElement; const timeGranularity = state.granularity === "hour" || state.granularity === "minute" || diff --git a/app/client/packages/design-system/widgets/src/components/Datepicker/stories/Datepicker.stories.tsx b/app/client/packages/design-system/widgets/src/components/Datepicker/stories/Datepicker.stories.tsx index bfb042895983..37137ed02297 100644 --- a/app/client/packages/design-system/widgets/src/components/Datepicker/stories/Datepicker.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/Datepicker/stories/Datepicker.stories.tsx @@ -10,7 +10,7 @@ import { DatePicker } from "../src"; */ const meta: Meta = { component: DatePicker, - title: "WDS/Widgets/DatePicker", + title: "WDS/Widgets/Date Picker", }; export default meta; diff --git a/app/client/packages/design-system/widgets/src/components/IconButton/stories/IconButton.stories.tsx b/app/client/packages/design-system/widgets/src/components/IconButton/stories/IconButton.stories.tsx index 96fdcf0343dc..a5241ff2ca7f 100644 --- a/app/client/packages/design-system/widgets/src/components/IconButton/stories/IconButton.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/IconButton/stories/IconButton.stories.tsx @@ -14,7 +14,7 @@ import { objectKeys } from "@appsmith/utils"; */ const meta: Meta = { component: IconButton, - title: "WDS/Widgets/IconButton", + title: "WDS/Widgets/Icon Button", }; export default meta; diff --git a/app/client/packages/design-system/widgets/src/components/InlineButtons/stories/InlineButtons.stories.tsx b/app/client/packages/design-system/widgets/src/components/InlineButtons/stories/InlineButtons.stories.tsx index 44a274739d78..c30b43e51a2a 100644 --- a/app/client/packages/design-system/widgets/src/components/InlineButtons/stories/InlineButtons.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/InlineButtons/stories/InlineButtons.stories.tsx @@ -21,7 +21,7 @@ import { */ const meta: Meta = { component: InlineButtons, - title: "WDS/Widgets/InlineButtons", + title: "WDS/Widgets/Inline Buttons", }; export default meta; diff --git a/app/client/packages/design-system/widgets/src/components/Input/src/Input.tsx b/app/client/packages/design-system/widgets/src/components/Input/src/Input.tsx index 3472e2b53ac7..64e03bc95d66 100644 --- a/app/client/packages/design-system/widgets/src/components/Input/src/Input.tsx +++ b/app/client/packages/design-system/widgets/src/components/Input/src/Input.tsx @@ -1,5 +1,6 @@ import clsx from "clsx"; -import React, { forwardRef, useState } from "react"; +import { mergeRefs } from "@react-aria/utils"; +import React, { forwardRef, useRef, useState } from "react"; import { getTypographyClassName } from "@appsmith/wds-theming"; import { IconButton, Spinner, type IconProps } from "@appsmith/wds"; import { Group, Input as HeadlessInput } from "react-aria-components"; @@ -9,6 +10,7 @@ import type { InputProps } from "./types"; function _Input(props: InputProps, ref: React.Ref) { const { + className, defaultValue, isLoading, isReadOnly, @@ -19,6 +21,8 @@ function _Input(props: InputProps, ref: React.Ref) { value, ...rest } = props; + const localRef = useRef(null); + const mergedRef = mergeRefs(ref, localRef); const [showPassword, setShowPassword] = useState(false); const togglePasswordVisibility = () => setShowPassword((prev) => !prev); const isEmpty = !Boolean(value) && !Boolean(defaultValue); @@ -46,18 +50,30 @@ function _Input(props: InputProps, ref: React.Ref) { return ( + {Boolean(prefix) && ( + localRef.current?.focus()}> + {prefix} + + )} - {Boolean(prefix) && {prefix}} - {Boolean(suffix) && {suffix}} + {Boolean(suffix) && ( + localRef.current?.focus()}> + {suffix} + + )} ); } diff --git a/app/client/packages/design-system/widgets/src/components/Input/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Input/src/styles.module.css index e36ba4a53650..63a0d04a895c 100644 --- a/app/client/packages/design-system/widgets/src/components/Input/src/styles.module.css +++ b/app/client/packages/design-system/widgets/src/components/Input/src/styles.module.css @@ -6,15 +6,8 @@ width: 100%; } -.input { - position: relative; - display: flex; - flex: 1; - align-items: center; - box-sizing: content-box; +.inputGroup { max-inline-size: 100%; - padding-block: var(--inner-spacing-1); - padding-inline: var(--inner-spacing-2); gap: var(--inner-spacing-1); border: 0; border-radius: var(--border-radius-elevation-3); @@ -25,8 +18,23 @@ overflow: hidden; } -.input:has(> [data-select-text]) { - block-size: var(--body-line-height); +.input { + border: none; + outline: none; + background-color: transparent; + flex: 1; + padding: 0; + padding-block: var(--inner-spacing-1); + padding-inline: var(--inner-spacing-2); + box-sizing: content-box; +} + +.inputGroup:has([data-input-prefix]) .input { + padding-inline-start: 0; +} + +.inputGroup:has([data-input-suffix]) .input { + padding-inline-end: 0; } .input:is(textarea) { @@ -51,44 +59,18 @@ * SUFFIX and PREFIX * ---------------------------------------------------------------------------- */ -.inputGroup :is([data-input-suffix], [data-input-prefix]) button { - border-radius: calc( - var(--border-radius-elevation-3) - var(--inner-spacing-1) - ); -} - -.inputGroup:has(> [data-input-prefix]) .input { - padding-left: var(--sizing-8); -} - -.inputGroup:has(> [data-input-prefix]) .input[data-size="large"] { - padding-left: var(--sizing-12); -} - -.inputGroup:has(> [data-input-prefix]) .input[data-size="small"] { - padding-left: var(--sizing-6); -} - -.inputGroup:has(> [data-input-prefix]) [data-input-prefix] { - left: var(--inner-spacing-1); - position: absolute; -} - -.inputGroup:has(> [data-input-suffix]) .input { - padding-right: var(--sizing-8); -} - -.inputGroup:has(> [data-input-suffix]) .input[data-size="large"] { - padding-right: var(--sizing-12); +.inputGroup [data-input-prefix] { + margin-inline-start: var(--inner-spacing-2); } -.inputGroup:has(> [data-input-suffix]) .input[data-size="small"] { - padding-right: var(--sizing-6); +.inputGroup [data-input-suffix] { + margin-inline-end: var(--inner-spacing-2); } -.inputGroup:has(> [data-input-suffix]) [data-input-suffix] { - right: var(--inner-spacing-1); - position: absolute; +.inputGroup :is([data-input-suffix], [data-input-prefix]) button { + border-radius: calc( + var(--border-radius-elevation-3) - var(--inner-spacing-1) + ); } .inputGroup :is([data-input-suffix], [data-input-prefix]) { @@ -102,14 +84,15 @@ * HOVERED * ---------------------------------------------------------------------------- */ -.inputGroup[data-hovered] - .input:not( - :is( - [data-focused], - [data-readonly], - [data-disabled], - [data-focus-within], - :has(~ input[data-disabled="true"]) +.inputGroup[data-hovered]:has( + > .input:not( + :is( + [data-focused], + [data-readonly], + [data-disabled], + [data-focus-within], + :has(~ input[data-disabled="true"]) + ) ) ) { background-color: var(--color-bg-neutral-subtle-hover); @@ -121,9 +104,12 @@ * READONLY * ---------------------------------------------------------------------------- */ -.input[data-readonly] { +.inputGroup:has(> .input[data-readonly]) { background-color: transparent; box-shadow: none; +} + +.inputGroup input[data-readonly] { padding-inline: 0; } @@ -157,8 +143,8 @@ * DISABLED * ---------------------------------------------------------------------------- */ -.input[data-disabled], -.input:has(~ input[data-disabled]) { +.inputGroup:has(> .input[data-disabled]), +.inputGroup:has(> .input:has(~ input[data-disabled])) { cursor: not-allowed; box-shadow: none; } @@ -168,13 +154,14 @@ * INVALID * ---------------------------------------------------------------------------- */ -.input[data-invalid] { +.inputGroup:has(> .input[data-invalid]) { box-shadow: 0 0 0 1px var(--color-bd-negative); } -.inputGroup[data-hovered] - .input[data-invalid]:not( - :is([data-focused], [data-readonly], [data-disabled]) +.inputGroup[data-hovered]:has( + > .input[data-invalid]:not( + :is([data-focused], [data-readonly], [data-disabled]) + ) ) { box-shadow: 0 0 0 1px var(--color-bd-negative-hover); } @@ -184,7 +171,9 @@ * FOCUSSED * ---------------------------------------------------------------------------- */ -.input:is([data-focused], [data-focus-within]):not([data-readonly]) { +.inputGroup:has( + > .input:is([data-focused], [data-focus-within]):not([data-readonly]) + ) { background-color: transparent; box-shadow: 0 0 0 2px var(--color-bd-focus); } @@ -194,31 +183,17 @@ * SIZE * ---------------------------------------------------------------------------- */ -.input[data-size="small"] { - block-size: calc( - var(--body-line-height) + var(--body-margin-start) + var(--body-margin-end) - ); - padding-block: var(--inner-spacing-2); +.inputGroup .input { + block-size: var(--body-line-height); } -.input[data-size="large"] { +.inputGroup .input[data-size="small"] { block-size: calc( var(--body-line-height) + var(--body-margin-start) + var(--body-margin-end) ); - padding-block: var(--inner-spacing-3); - padding-inline: var(--inner-spacing-3); -} - -/** - * ---------------------------------------------------------------------------- - * SELECT BUTTON's TEXT - * ---------------------------------------------------------------------------- - */ -.input [data-select-text] { - display: flex; - align-items: center; + padding: var(--inner-spacing-2); } -.input [data-select-text] [data-icon] { - margin-inline-end: var(--inner-spacing-1); +.inputGroup .input[data-size="large"] { + padding: var(--inner-spacing-3); } diff --git a/app/client/packages/design-system/widgets/src/components/Menu/src/Menu.tsx b/app/client/packages/design-system/widgets/src/components/Menu/src/Menu.tsx index 223ed03d7c17..77cc1f6db4ab 100644 --- a/app/client/packages/design-system/widgets/src/components/Menu/src/Menu.tsx +++ b/app/client/packages/design-system/widgets/src/components/Menu/src/Menu.tsx @@ -1,16 +1,20 @@ +import { + Popover, + listStyles, + useRootContainer, + POPOVER_LIST_BOX_MAX_HEIGHT, +} from "@appsmith/wds"; import React, { createContext, useContext } from "react"; -import { listStyles, Popover } from "@appsmith/wds"; import { Menu as HeadlessMenu } from "react-aria-components"; import type { MenuProps } from "./types"; +import clsx from "clsx"; const MenuNestingContext = createContext(0); export const Menu = (props: MenuProps) => { - const { children } = props; - const root = document.body.querySelector( - "[data-theme-provider]", - ) as HTMLButtonElement; + const { children, className, ...rest } = props; + const root = useRootContainer(); const nestingLevel = useContext(MenuNestingContext); const isRootMenu = nestingLevel === 0; @@ -18,8 +22,11 @@ export const Menu = (props: MenuProps) => { return ( {/* Only the parent Popover should be placed in the root. Placing child popoves in root would cause the menu to function incorrectly */} - - + + {children} diff --git a/app/client/packages/design-system/widgets/src/components/Menu/src/types.ts b/app/client/packages/design-system/widgets/src/components/Menu/src/types.ts index 4c7b10e72f2d..4f514c44c3a1 100644 --- a/app/client/packages/design-system/widgets/src/components/Menu/src/types.ts +++ b/app/client/packages/design-system/widgets/src/components/Menu/src/types.ts @@ -1,7 +1,3 @@ import type { MenuProps as AriaMenuProps } from "react-aria-components"; -export interface MenuProps - extends Omit< - AriaMenuProps, - "slot" | "selectionMode" | "selectedKeys" - > {} +export interface MenuProps extends Omit, "slot"> {} diff --git a/app/client/packages/design-system/widgets/src/components/MenuItem/src/MenuItem.tsx b/app/client/packages/design-system/widgets/src/components/MenuItem/src/MenuItem.tsx index edd690856695..d2ae90291990 100644 --- a/app/client/packages/design-system/widgets/src/components/MenuItem/src/MenuItem.tsx +++ b/app/client/packages/design-system/widgets/src/components/MenuItem/src/MenuItem.tsx @@ -6,12 +6,16 @@ import { import { Icon, Text, listBoxItemStyles } from "@appsmith/wds"; import type { MenuItemProps } from "./types"; +import clsx from "clsx"; export function MenuItem(props: MenuItemProps) { - const { children, icon, ...rest } = props; + const { children, className, icon, ...rest } = props; return ( - + {composeRenderProps(children, (children, { hasSubmenu }) => ( <> {icon && } diff --git a/app/client/packages/design-system/widgets/src/components/Popover/src/constants.ts b/app/client/packages/design-system/widgets/src/components/Popover/src/constants.ts new file mode 100644 index 000000000000..83bab6a45400 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/Popover/src/constants.ts @@ -0,0 +1 @@ +export const POPOVER_LIST_BOX_MAX_HEIGHT = 400; diff --git a/app/client/packages/design-system/widgets/src/components/Popover/src/index.ts b/app/client/packages/design-system/widgets/src/components/Popover/src/index.ts index 72f124f6d38e..cb430550012a 100644 --- a/app/client/packages/design-system/widgets/src/components/Popover/src/index.ts +++ b/app/client/packages/design-system/widgets/src/components/Popover/src/index.ts @@ -1 +1,3 @@ export * from "./Popover"; +export * from "./useRootContainer"; +export * from "./constants"; diff --git a/app/client/packages/design-system/widgets/src/components/Popover/src/useRootContainer.ts b/app/client/packages/design-system/widgets/src/components/Popover/src/useRootContainer.ts new file mode 100644 index 000000000000..d1506d822d5b --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/Popover/src/useRootContainer.ts @@ -0,0 +1,17 @@ +import { useEffect } from "react"; + +import { useState } from "react"; + +export const useRootContainer = () => { + const [root, setRoot] = useState( + document.body.querySelector("[data-theme-provider]") as Element, + ); + + useEffect(() => { + if (!root) { + setRoot(document.body.querySelector("[data-theme-provider]") as Element); + } + }, []); + + return root; +}; diff --git a/app/client/packages/design-system/widgets/src/components/RadioGroup/chromatic/RadioGroup.chromatic.stories.tsx b/app/client/packages/design-system/widgets/src/components/RadioGroup/chromatic/RadioGroup.chromatic.stories.tsx index 2225cc3f1e01..86e63c2f8c87 100644 --- a/app/client/packages/design-system/widgets/src/components/RadioGroup/chromatic/RadioGroup.chromatic.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/RadioGroup/chromatic/RadioGroup.chromatic.stories.tsx @@ -6,7 +6,7 @@ import { StoryGrid, DataAttrWrapper } from "@design-system/storybook"; const meta: Meta = { component: RadioGroup, - title: "Design System/Widgets/RadioGroup", + title: "Design System/Widgets/Radio Group", }; export default meta; diff --git a/app/client/packages/design-system/widgets/src/components/RadioGroup/stories/RadioGroup.stories.tsx b/app/client/packages/design-system/widgets/src/components/RadioGroup/stories/RadioGroup.stories.tsx index e16fdfbc1874..9ed7e7417f02 100644 --- a/app/client/packages/design-system/widgets/src/components/RadioGroup/stories/RadioGroup.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/RadioGroup/stories/RadioGroup.stories.tsx @@ -8,7 +8,7 @@ const items = [ ]; const meta: Meta = { - title: "WDS/Widgets/RadioGroup", + title: "WDS/Widgets/Radio Group", component: RadioGroup, tags: ["autodocs"], args: { diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx b/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx index 0337fd709ad9..2f1ac356ded2 100644 --- a/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx +++ b/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx @@ -1,10 +1,12 @@ import React from "react"; import { - FieldError, - FieldLabel, ListBox, - inputFieldStyles, Popover, + FieldLabel, + FieldError, + inputFieldStyles, + useRootContainer, + POPOVER_LIST_BOX_MAX_HEIGHT, } from "@appsmith/wds"; import { Select as HeadlessSelect } from "react-aria-components"; @@ -24,9 +26,7 @@ export const Select = (props: SelectProps) => { size = "medium", ...rest } = props; - const root = document.body.querySelector( - "[data-theme-provider]", - ) as HTMLButtonElement; + const root = useRootContainer(); return ( { size={size} /> {errorMessage} - + {children} diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/SelectTrigger.tsx b/app/client/packages/design-system/widgets/src/components/Select/src/SelectTrigger.tsx index 5fcd5ca50f4d..0458df47bacd 100644 --- a/app/client/packages/design-system/widgets/src/components/Select/src/SelectTrigger.tsx +++ b/app/client/packages/design-system/widgets/src/components/Select/src/SelectTrigger.tsx @@ -1,8 +1,10 @@ +import clsx from "clsx"; import React from "react"; import { Icon, Spinner, textInputStyles } from "@appsmith/wds"; import { getTypographyClassName } from "@appsmith/wds-theming"; import { Button, Group, SelectValue } from "react-aria-components"; +import styles from "./styles.module.css"; import type { SelectProps } from "./types"; interface SelectTriggerProps { @@ -17,9 +19,11 @@ export const SelectTrigger: React.FC = (props) => { const { isDisabled, isInvalid, isLoading, placeholder, size } = props; return ( - + - - {Boolean(isLoading) ? : } - ); }; diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css new file mode 100644 index 000000000000..e4a05fbffd47 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css @@ -0,0 +1,25 @@ +/** + * Reason for using div.selectInputGroup instead of just .selectInputGroup is to increase the specificity of the selector + * Also, we are removing the padding-inline from selectInputGroup and adding it to selectTriggerButton + * This is done to ensure that width of the select popover is same as the width of the select trigger button. Otherwise, + * the width of the popover will be less than the width of the trigger button because of the padding-inline by .inputGroup . + */ +div.selectInputGroup { + padding-inline: 0; +} + +button.selectTriggerButton { + display: flex; + align-items: center; + padding-inline: var(--inner-spacing-2); +} + +.selectTriggerButton:has(> [data-select-text]) { + block-size: var(--body-line-height); +} + +.selectTriggerButton [data-select-text] { + display: flex; + align-items: center; + flex: 1; +} diff --git a/app/client/packages/design-system/widgets/src/components/TagGroup/stories/TagGroup.stories.tsx b/app/client/packages/design-system/widgets/src/components/TagGroup/stories/TagGroup.stories.tsx index 2325e2b81e27..0fa6d3d77803 100644 --- a/app/client/packages/design-system/widgets/src/components/TagGroup/stories/TagGroup.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/TagGroup/stories/TagGroup.stories.tsx @@ -8,7 +8,7 @@ import type { TagGroupProps } from "../src/TagGroup"; */ const meta: Meta = { component: TagGroup, - title: "WDS/Widgets/TagGroup", + title: "WDS/Widgets/Tag Group", subcomponents: { Tag, }, diff --git a/app/client/packages/design-system/widgets/src/components/TextArea/src/TextArea.tsx b/app/client/packages/design-system/widgets/src/components/TextArea/src/TextArea.tsx index 042e54a1c35c..d004f2d79755 100644 --- a/app/client/packages/design-system/widgets/src/components/TextArea/src/TextArea.tsx +++ b/app/client/packages/design-system/widgets/src/components/TextArea/src/TextArea.tsx @@ -76,16 +76,12 @@ export function TextArea(props: TextAreaProps) { input.style.height = `${ // subtract comptued padding and border to get the actual content height - input.scrollHeight - - paddingTop - - paddingBottom + - // Also, adding 1px to fix a bug in browser where there is a scrolllbar on certain heights - 1 + input.scrollHeight - paddingTop - paddingBottom }px`; input.style.overflow = prevOverflow; input.style.alignSelf = prevAlignment; } - }, [inputRef.current, props.height]); + }, [props.height]); useLayoutEffect(() => { if (inputRef.current) { diff --git a/app/client/packages/design-system/widgets/src/components/TextArea/stories/TextArea.stories.tsx b/app/client/packages/design-system/widgets/src/components/TextArea/stories/TextArea.stories.tsx index b2b66dc45ae1..7cbd9126b494 100644 --- a/app/client/packages/design-system/widgets/src/components/TextArea/stories/TextArea.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/TextArea/stories/TextArea.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from "@storybook/react"; import { Flex, TextArea, Button } from "@appsmith/wds"; const meta: Meta = { - title: "WDS/Widgets/TextArea", + title: "WDS/Widgets/Text Area", component: TextArea, tags: ["autodocs"], args: { diff --git a/app/client/packages/design-system/widgets/src/components/TextField/stories/TextField.stories.tsx b/app/client/packages/design-system/widgets/src/components/TextField/stories/TextField.stories.tsx index 8e44d7ce549c..f623264448d1 100644 --- a/app/client/packages/design-system/widgets/src/components/TextField/stories/TextField.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/TextField/stories/TextField.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from "@storybook/react"; import { Flex, Icon, TextField, Button } from "@appsmith/wds"; const meta: Meta = { - title: "WDS/Widgets/TextField", + title: "WDS/Widgets/Text Field", component: TextField, tags: ["autodocs"], args: { @@ -44,6 +44,13 @@ export const WithPrefixAndSuffix: Story = { prefix={} suffix={} /> + + +011 + + } + /> ), }; diff --git a/app/client/packages/design-system/widgets/src/components/TimeField/stories/TimeField.stories.tsx b/app/client/packages/design-system/widgets/src/components/TimeField/stories/TimeField.stories.tsx index a498cd5826fd..3c1b13b70b16 100644 --- a/app/client/packages/design-system/widgets/src/components/TimeField/stories/TimeField.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/TimeField/stories/TimeField.stories.tsx @@ -4,7 +4,7 @@ import { TimeField } from "../src"; import { Time } from "@internationalized/date"; const meta: Meta = { - title: "WDS/Widgets/TimeField", + title: "WDS/Widgets/Time Field", component: TimeField, parameters: { docs: { diff --git a/app/client/packages/design-system/widgets/src/components/ToggleGroup/stories/ToggleGroup.stories.tsx b/app/client/packages/design-system/widgets/src/components/ToggleGroup/stories/ToggleGroup.stories.tsx index 5db40b210272..995ed35bd5a4 100644 --- a/app/client/packages/design-system/widgets/src/components/ToggleGroup/stories/ToggleGroup.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/ToggleGroup/stories/ToggleGroup.stories.tsx @@ -8,7 +8,7 @@ const items = [ ]; const meta: Meta = { - title: "WDS/Widgets/ToggleGroup", + title: "WDS/Widgets/Toggle Group", component: ToggleGroup, tags: ["autodocs"], args: { diff --git a/app/client/packages/design-system/widgets/src/components/ToolbarButtons/stories/ToolbarButtons.stories.tsx b/app/client/packages/design-system/widgets/src/components/ToolbarButtons/stories/ToolbarButtons.stories.tsx index 917338e6b3cb..2fdeaa192ba7 100644 --- a/app/client/packages/design-system/widgets/src/components/ToolbarButtons/stories/ToolbarButtons.stories.tsx +++ b/app/client/packages/design-system/widgets/src/components/ToolbarButtons/stories/ToolbarButtons.stories.tsx @@ -21,7 +21,7 @@ import { */ const meta: Meta = { component: ToolbarButtons, - title: "WDS/Widgets/ToolbarButtons", + title: "WDS/Widgets/Toolbar Buttons", }; export default meta; diff --git a/app/client/packages/design-system/widgets/src/testing/ColorGrid.stories.tsx b/app/client/packages/design-system/widgets/src/testing/ColorGrid.stories.tsx index d67a774feb21..977f95427f84 100644 --- a/app/client/packages/design-system/widgets/src/testing/ColorGrid.stories.tsx +++ b/app/client/packages/design-system/widgets/src/testing/ColorGrid.stories.tsx @@ -4,7 +4,7 @@ import { ColorGrid } from "./ColorGrid"; const meta: Meta = { component: ColorGrid, - title: "WDS/Testing/ColorGrid", + title: "WDS/Testing/Color Grid", args: { source: "oklch", size: "small", diff --git a/app/client/packages/eslint-plugin/src/consistent-storybook-title/rule.test.ts b/app/client/packages/eslint-plugin/src/consistent-storybook-title/rule.test.ts new file mode 100644 index 000000000000..b55b7948a244 --- /dev/null +++ b/app/client/packages/eslint-plugin/src/consistent-storybook-title/rule.test.ts @@ -0,0 +1,103 @@ +import { TSESLint } from "@typescript-eslint/utils"; +import { consistentStorybookTitle } from "./rule"; + +const ruleTester = new TSESLint.RuleTester({ + parser: require.resolve("@typescript-eslint/parser"), + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + }, +}); + +ruleTester.run("storybook-title-case", consistentStorybookTitle, { + valid: [ + { + code: `export default { title: "ADS/Templates/IDE Header" };`, + filename: "example.stories.tsx", + }, + { + code: `export default { title: "ADS/Components/Input/IDE Search Input" };`, + filename: "example.stories.tsx", + }, + { + code: `export default { title: "ADS/Components/Input/AAA Number Input" };`, + filename: "example.stories.tsx", + }, + { + code: `const meta = { title: "WDS/Widgets/Button" };`, + filename: "example.stories.tsx", + }, + ], + invalid: [ + { + code: `export default { title: "ADS/Templates/IDEHeader" };`, + filename: "example.stories.tsx", + errors: [ + { + messageId: "invalidTitle", + data: { + title: "ADS/Templates/IDEHeader", + suggestedTitle: "ADS/Templates/IDE Header", + }, + }, + ], + output: `export default { title: "ADS/Templates/IDE Header" };`, + }, + { + code: `export default { title: "ADS/Components/Input/IDESearch Input" };`, + filename: "example.stories.tsx", + errors: [ + { + messageId: "invalidTitle", + data: { + title: "ADS/Components/Input/IDESearch Input", + suggestedTitle: "ADS/Components/Input/IDE Search Input", + }, + }, + ], + output: `export default { title: "ADS/Components/Input/IDE Search Input" };`, + }, + { + code: `export default { title: "ADS/Components/Input/IDESearchInput" };`, + filename: "example.stories.tsx", + errors: [ + { + messageId: "invalidTitle", + data: { + title: "ADS/Components/Input/IDESearchInput", + suggestedTitle: "ADS/Components/Input/IDE Search Input", + }, + }, + ], + output: `export default { title: "ADS/Components/Input/IDE Search Input" };`, + }, + { + code: `export default { title: "ADS/Components/Input/AAANumber Input" };`, + filename: "example.stories.tsx", + errors: [ + { + messageId: "invalidTitle", + data: { + title: "ADS/Components/Input/AAANumber Input", + suggestedTitle: "ADS/Components/Input/AAA Number Input", + }, + }, + ], + output: `export default { title: "ADS/Components/Input/AAA Number Input" };`, + }, + { + code: `export default { title: "WDS/Widgets/button" };`, + filename: "example.stories.tsx", + errors: [ + { + messageId: "invalidTitle", + data: { + title: "WDS/Widgets/button", + suggestedTitle: "WDS/Widgets/Button", + }, + }, + ], + output: `export default { title: "WDS/Widgets/Button" };`, + }, + ], +}); diff --git a/app/client/packages/eslint-plugin/src/consistent-storybook-title/rule.ts b/app/client/packages/eslint-plugin/src/consistent-storybook-title/rule.ts new file mode 100644 index 000000000000..aed34b0eb2f2 --- /dev/null +++ b/app/client/packages/eslint-plugin/src/consistent-storybook-title/rule.ts @@ -0,0 +1,117 @@ +import type { TSESLint, TSESTree } from "@typescript-eslint/utils"; + +const titleCase = (str: string): string => { + return str + .split("/") + .map( + (segment) => + segment + .replace(/([A-Z]+)([A-Z][a-z0-9])/g, "$1 $2") // Acronyms followed by words + .replace(/([a-z0-9])([A-Z])/g, "$1 $2") // Lowercase followed by uppercase + .replace(/\b\w/g, (char) => char.toUpperCase()), // Capitalize first letter + ) + .join("/"); +}; + +export const consistentStorybookTitle: TSESLint.RuleModule<"invalidTitle", []> = + { + defaultOptions: [], + meta: { + type: "problem", + docs: { + description: + "Ensure Storybook titles in `export default` or meta objects are in Title Case", + recommended: "error", + }, + messages: { + invalidTitle: + 'The Storybook title "{{ title }}" is not in Title Case. Suggested: "{{ suggestedTitle }}".', + }, + schema: [], // No options + fixable: "code", // Allows auto-fixing + }, + + create(context) { + const filename = context.getFilename(); + const isStoryFile = filename.endsWith(".stories.tsx"); // Apply only to *.stories.tsx files + + if (!isStoryFile) { + return {}; // No-op for non-story files + } + + const validateTitle = (title: string, node: TSESTree.Node) => { + const expectedTitle = titleCase(title); + + if (title !== expectedTitle) { + context.report({ + node, + messageId: "invalidTitle", + data: { + title, + suggestedTitle: expectedTitle, + }, + fix: (fixer) => fixer.replaceText(node, `"${expectedTitle}"`), // Use double quotes + }); + } + }; + + return { + ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration) { + if ( + node.declaration.type === "ObjectExpression" && + node.declaration.properties.some( + (prop) => + prop.type === "Property" && + prop.key.type === "Identifier" && + prop.key.name === "title" && + prop.value.type === "Literal" && + typeof prop.value.value === "string", + ) + ) { + const titleProperty = node.declaration.properties.find( + (prop) => + prop.type === "Property" && + prop.key.type === "Identifier" && + prop.key.name === "title", + ) as TSESTree.Property; + + const titleValue = titleProperty.value as TSESTree.Literal; + + if (typeof titleValue.value === "string") { + validateTitle(titleValue.value, titleValue); + } + } + }, + + VariableDeclaration(node: TSESTree.VariableDeclaration) { + node.declarations.forEach((declaration) => { + if ( + declaration.init && + declaration.init.type === "ObjectExpression" && + declaration.init.properties.some( + (prop) => + prop.type === "Property" && + prop.key.type === "Identifier" && + prop.key.name === "title" && + prop.value.type === "Literal" && + typeof prop.value.value === "string", + ) + ) { + const titleProperty = declaration.init.properties.find( + (prop) => + prop.type === "Property" && + prop.key.type === "Identifier" && + prop.key.name === "title", + ) as TSESTree.Property; + + const titleValue = titleProperty.value as TSESTree.Literal; + + if (typeof titleValue.value === "string") { + validateTitle(titleValue.value, titleValue); + } + } + }); + }, + }; + }, + }; diff --git a/app/client/packages/eslint-plugin/src/index.ts b/app/client/packages/eslint-plugin/src/index.ts index eda6deb6d349..49fb2417f454 100644 --- a/app/client/packages/eslint-plugin/src/index.ts +++ b/app/client/packages/eslint-plugin/src/index.ts @@ -1,16 +1,19 @@ import { objectKeysRule } from "./object-keys/rule"; import { namedUseEffectRule } from "./named-use-effect/rule"; +import { consistentStorybookTitle } from "./consistent-storybook-title/rule"; const plugin = { rules: { "object-keys": objectKeysRule, "named-use-effect": namedUseEffectRule, + "consistent-storybook-title": consistentStorybookTitle, }, configs: { recommended: { rules: { "@appsmith/object-keys": "warn", "@appsmith/named-use-effect": "warn", + "@appsmith/consistent-storybook-title": "error", }, }, }, diff --git a/app/client/public/index.html b/app/client/public/index.html index 1bd179b00a00..dc9ca3ddc494 100755 --- a/app/client/public/index.html +++ b/app/client/public/index.html @@ -39,7 +39,6 @@ return result; }; const CLOUD_HOSTING = parseConfig('{{env "APPSMITH_CLOUD_HOSTING"}}'); - const ZIPY_KEY = parseConfig('{{env "APPSMITH_ZIPY_SDK_KEY"}}'); const AIRGAPPED = parseConfig('{{env "APPSMITH_AIRGAP_ENABLED"}}'); const REO_CLIENT_ID = parseConfig('{{env "APPSMITH_REO_CLIENT_ID"}}'); @@ -64,21 +63,6 @@ })() %> -