Skip to content

Commit

Permalink
fix: Tab navigation issue in multi page apps (appsmithorg#38272)
Browse files Browse the repository at this point in the history
  • Loading branch information
hetunandu authored Dec 20, 2024
1 parent 9c054f4 commit 6ea8133
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 5 deletions.
148 changes: 148 additions & 0 deletions cypress/e2e/Regression/ClientSide/IDE/Tabs_Navigation_spec.ts
Original file line number Diff line number Diff line change
@@ -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");
});
});
});
3 changes: 3 additions & 0 deletions cypress/support/Pages/EditorNavigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,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",
Expand Down
13 changes: 8 additions & 5 deletions src/pages/Editor/IDE/EditorTabs/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useEffect } from "react";
import React, { useCallback, useEffect } from "react";
import { shallowEqual, useDispatch, useSelector } from "react-redux";
import { Flex, ScrollArea, ToggleButton } from "@appsmith/ads";
import {
Expand Down Expand Up @@ -86,10 +86,13 @@ const EditorTabs = () => {
});

// TODO: this returns a new function every time, needs to be recomposed
const handleTabClick = useEventCallback((tab: EntityItem) => () => {
dispatch(setListViewActiveState(false));
tabClickHandler(tab);
});
const handleTabClick = useCallback(
(tab: EntityItem) => () => {
dispatch(setListViewActiveState(false));
tabClickHandler(tab);
},
[dispatch, tabClickHandler],
);

const handleNewTabClick = useEventCallback(() => {
dispatch(setListViewActiveState(false));
Expand Down

0 comments on commit 6ea8133

Please sign in to comment.