mirror of
https://github.com/ToolJet/ToolJet
synced 2026-04-25 15:37:37 +00:00
* added app_versions fields * added data migration for backward compatibility * added ce specific logic * fixed ce migration (need to dev-test) * moved to data migration * migration changes * added endpoint to create draft version * backend changes * added draft to app_import scenario * added version description * minor changes (needs improvement) * fixed breaking dropdown in editor * updated submodule commits * revert package.json * revert ui not used changes * submodule changes * reverting non used files * ui changes * ui changes * ui changes * ui changes * ui changes * copywriting changes * ui changes * ui changes * edit version modal changes * ui integration changes * added button solid and removed unused css * removed commented code from create version modal * updated button size to use large * ui changes * draft version modal changes * added sub-module commits to main * draft version endpoint changes * ui changes for draft version modal * fix breaking ui * ui changes for banner * minor ui changes * remove scss changes from themes file * removed unused components (cleanup) * removed unused components (pr cleanup) * draft version changes * create version modal changes * canvas banner fixes * comment creation logic * refactor: version dropdown * update endpoint changes * fix: promote logic * update submodule * fix: released version and create version modal * fix draft version creation * minor ui changes * minor backend fixes * tooltip changes * added all components in same folder * added minor comments * import fixes * refactor files * fix: overlay issues * fix: on version creation * fix ce bugs * bug fixes * bug fixes * bug fixes * bug fixes * base merge * feat: draft versioning support with UI enhancements and backend adjustments - Updated AppCanvas to conditionally render AppCanvasBanner based on edit mode. - Enhanced CreateDraftVersionModal to handle version selection and creation logic. - Modified CreateVersionModal to streamline version creation process and handle commits. - Improved ReleaseConfirmation to include development versions in release context. - Refactored CreateDraftButton and VersionDropdownItem for better UI consistency and dark mode support. - Updated VersionManagerDropdown to manage draft versions and improve version selection logic. - Enhanced version switcher and promote/release buttons with dark mode styling. - Adjusted server-side features and constants to support new draft versioning capabilities. - Updated styles across components for better visual consistency and responsiveness. * minor fixes * rebase * merge base * update submodule * Add data-cy attribute for draft version components * Update cypress test cases for draft version feature * Update failing test cases * Update draft version test cases * Skip older flow * migration changes * migration fixes * Update the failed test cases * removed multiple api calls * fix: version set on draft creation * fixes * fix: version update on save version * fixes * name fix * fix version lock banner styling * bump version to 3.20.50-lts across all components --------- Co-authored-by: Vijaykant Yadav <[email protected]> Co-authored-by: ajith-k-v <[email protected]> Co-authored-by: gsmithun4 <[email protected]>
276 lines
8.9 KiB
JavaScript
276 lines
8.9 KiB
JavaScript
import moment from "moment";
|
|
import {
|
|
commonSelectors,
|
|
commonWidgetSelector,
|
|
cyParamName,
|
|
} from "Selectors/common";
|
|
import { commonEeSelectors, multiEnvSelector } from "Selectors/eeCommon";
|
|
import { profileSelector } from "Selectors/profile";
|
|
import { appPromote } from "Support/utils/platform/multiEnv";
|
|
import { commonText, path } from "Texts/common";
|
|
|
|
export const navigateToProfile = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonSelectors.profileSettings).click();
|
|
cy.url().should("include", "settings");
|
|
};
|
|
|
|
export const logout = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonSelectors.logoutLink).click();
|
|
cy.wait(1000);
|
|
};
|
|
|
|
export const navigateToManageUsers = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonSelectors.workspaceSettings).click();
|
|
cy.get(commonSelectors.manageUsersOption).click({ force: true });
|
|
};
|
|
|
|
export const navigateToManageGroups = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonSelectors.workspaceSettings).click();
|
|
cy.get(commonSelectors.manageGroupsOption).click();
|
|
};
|
|
|
|
export const navigateToWorkspaceVariable = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonSelectors.workspaceSettings).click();
|
|
cy.get(commonSelectors.workspaceVariableOption).click();
|
|
};
|
|
|
|
export const navigateToManageSSO = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonSelectors.workspaceSettings).click();
|
|
cy.get(commonSelectors.manageSSOOption).click();
|
|
};
|
|
|
|
export const randomDateOrTime = (format = "DD/MM/YYYY") => {
|
|
let endDate = new Date();
|
|
let startDate = new Date(2018, 0, 1);
|
|
startDate = new Date(
|
|
startDate.getTime() +
|
|
Math.random() * (endDate.getTime() - startDate.getTime())
|
|
);
|
|
return moment(startDate).format(format);
|
|
};
|
|
|
|
export const createFolder = (folderName) => {
|
|
cy.intercept("POST", "/api/folders").as("folderCreated");
|
|
cy.get(commonSelectors.createNewFolderButton).click();
|
|
cy.clearAndType(commonSelectors.folderNameInput, folderName);
|
|
cy.get(commonSelectors.buttonSelector(commonText.createFolderButton)).click();
|
|
cy.wait("@folderCreated");
|
|
cy.verifyToastMessage(
|
|
commonSelectors.toastMessage,
|
|
commonText.folderCreatedToast
|
|
);
|
|
};
|
|
|
|
export const deleteFolder = (folderName) => {
|
|
viewFolderCardOptions(folderName);
|
|
cy.get(commonSelectors.deleteFolderOption(folderName)).click();
|
|
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton)).click();
|
|
cy.wait("@folderDeleted");
|
|
cy.verifyToastMessage(
|
|
commonSelectors.toastMessage,
|
|
commonText.folderDeletedToast
|
|
);
|
|
};
|
|
|
|
export const deleteDownloadsFolder = () => {
|
|
cy.exec("cd ./cypress/downloads/ && rm -rf *", {
|
|
failOnNonZeroExit: false,
|
|
});
|
|
};
|
|
|
|
export const navigateToAppEditor = (appName) => {
|
|
cy.get(commonSelectors.appCard(appName))
|
|
.trigger("mousehover")
|
|
.trigger("mouseenter")
|
|
.find(commonSelectors.editButton)
|
|
.click({ force: true });
|
|
if (Cypress.env("environment") === "Community") {
|
|
cy.intercept("GET", "/api/data-sources").as("appDs");
|
|
cy.wait("@appDs", { timeout: 15000 });
|
|
cy.skipEditorPopover();
|
|
} else {
|
|
cy.intercept("GET", "/api/app-environments/**").as("appDs");
|
|
cy.wait("@appDs", { timeout: 15000 });
|
|
cy.skipEditorPopover();
|
|
}
|
|
};
|
|
|
|
export const viewAppCardOptions = (appName) => {
|
|
if (Cypress.env("environment") !== "Community") {
|
|
cy.waitForElement('[data-cy="ai-icon"]');
|
|
}
|
|
cy.contains(".homepage-app-card", appName, { timeout: 20000 }).within(() => {
|
|
cy.get(`[data-cy="${appName.toLowerCase()}-card"]`).parent().realHover();
|
|
cy.get('[data-cy="app-card-menu-icon"]')
|
|
.should("be.visible")
|
|
.should("not.be.disabled");
|
|
// .click({ timeout: 10000 });
|
|
cy.get(`[data-cy="${appName.toLowerCase()}-card"]`).click().realHover();
|
|
cy.get('[data-cy="app-card-menu-icon"]').click();
|
|
});
|
|
};
|
|
|
|
export const viewFolderCardOptions = (folderName) => {
|
|
cy.get(commonSelectors.folderListcard(folderName))
|
|
.parent()
|
|
.within(() => {
|
|
cy.get(commonSelectors.folderCardOptions(folderName)).invoke("click");
|
|
});
|
|
};
|
|
|
|
export const verifyModal = (title, buttonText, inputFiledSelector) => {
|
|
cy.get(commonSelectors.modalComponent).should("be.visible");
|
|
cy.get(commonSelectors.modalTitle(title))
|
|
.should("be.visible")
|
|
.and("have.text", title);
|
|
cy.get(commonSelectors.buttonSelector(commonText.closeButton)).should(
|
|
"be.visible"
|
|
);
|
|
cy.get(commonSelectors.buttonSelector(commonText.cancelButton))
|
|
.should("be.visible")
|
|
.and("have.text", commonText.cancelButton);
|
|
cy.get(commonSelectors.buttonSelector(buttonText))
|
|
.first()
|
|
.should("be.visible")
|
|
.and("have.text", buttonText);
|
|
|
|
if (inputFiledSelector) {
|
|
cy.get(inputFiledSelector).should("be.visible");
|
|
}
|
|
};
|
|
|
|
export const verifyConfirmationModal = (messagse) => {
|
|
cy.get(commonSelectors.modalComponent).should("be.visible");
|
|
cy.get(commonSelectors.modalMessage)
|
|
.should("be.visible")
|
|
.and("have.text", messagse);
|
|
cy.get(commonSelectors.buttonSelector(commonText.cancelButton))
|
|
.should("be.visible")
|
|
.and("have.text", commonText.cancelButton);
|
|
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton))
|
|
.should("be.visible")
|
|
.and("have.text", commonText.modalYesButton);
|
|
};
|
|
|
|
export const closeModal = (buttonText) => {
|
|
cy.get(commonSelectors.buttonSelector(buttonText)).click();
|
|
cy.get(commonSelectors.modalComponent).should("not.exist");
|
|
};
|
|
|
|
export const cancelModal = (buttonText) => {
|
|
cy.get(commonSelectors.buttonSelector(buttonText)).click();
|
|
cy.get(commonSelectors.modalComponent).should("not.exist");
|
|
};
|
|
|
|
export const navigateToAuditLogsPage = () => {
|
|
cy.get(profileSelector.profileDropdown).invoke("show");
|
|
cy.contains("Audit Logs").click();
|
|
cy.url().should("include", path.auditLogsPath, { timeout: 1000 });
|
|
};
|
|
|
|
export const manageUsersPagination = (email) => {
|
|
cy.wait(200);
|
|
cy.get("body").then(($email) => {
|
|
if ($email.text().includes(email)) {
|
|
cy.log("First page");
|
|
} else {
|
|
cy.get(commonSelectors.nextPageArrow).click();
|
|
manageUsersPagination(email);
|
|
}
|
|
});
|
|
};
|
|
|
|
export const searchUser = (email) => {
|
|
cy.clearAndType(commonSelectors.inputUserSearch, email);
|
|
cy.wait(1000);
|
|
};
|
|
|
|
export const selectAppCardOption = (appName, appCardOption) => {
|
|
viewAppCardOptions(appName);
|
|
cy.get(appCardOption).should("be.visible").click();
|
|
};
|
|
|
|
export const navigateToDatabase = () => {
|
|
cy.get(commonSelectors.databaseIcon).click();
|
|
cy.url().should("include", path.database);
|
|
};
|
|
export const randomValue = () => {
|
|
return Math.floor(Math.random() * (1000 - 100) + 100) / 100;
|
|
};
|
|
|
|
export const verifyTooltip = (selector, message) => {
|
|
cy.get(selector)
|
|
.trigger("mouseover", { timeout: 2000 })
|
|
.trigger("mouseover")
|
|
.then(() => {
|
|
cy.get(".tooltip-inner").last().should("have.text", message);
|
|
});
|
|
};
|
|
|
|
export const pinInspector = () => {
|
|
cy.get(commonWidgetSelector.sidebarinspector).click();
|
|
cy.get(commonSelectors.inspectorPinIcon).click();
|
|
cy.wait(500);
|
|
|
|
cy.get("body").then(($body) => {
|
|
if (!$body.find(commonSelectors.inspectorPinIcon).length > 0) {
|
|
cy.get(commonWidgetSelector.sidebarinspector).click();
|
|
cy.get(commonSelectors.inspectorPinIcon).click();
|
|
}
|
|
});
|
|
cy.hideTooltip();
|
|
};
|
|
|
|
export const navigateToworkspaceConstants = () => {
|
|
cy.get(commonSelectors.workspaceSettingsIcon).click();
|
|
cy.get(commonSelectors.workspaceConstantsOption).click();
|
|
};
|
|
|
|
export const releaseApp = () => {
|
|
cy.ifEnv("Enterprise", () => {
|
|
appPromote("development", "production");
|
|
cy.waitForElement(multiEnvSelector.environmentsTag("production"));
|
|
cy.get(multiEnvSelector.environmentsTag("production")).click();
|
|
});
|
|
cy.ifEnv("Community", () => {
|
|
cy.waitForElement(multiEnvSelector.environmentsTag("development"));
|
|
cy.get(multiEnvSelector.environmentsTag("development")).click();
|
|
});
|
|
|
|
cy.waitForElement(commonSelectors.releaseButton);
|
|
cy.get(commonSelectors.releaseButton).click();
|
|
cy.get(commonSelectors.yesButton).click();
|
|
cy.verifyToastMessage(commonSelectors.toastMessage, "Version v1 released");
|
|
cy.wait(1000);
|
|
};
|
|
|
|
export const verifyTooltipDisabled = (selector, message) => {
|
|
cy.get(selector)
|
|
.trigger("mouseover", { force: true })
|
|
.then(() => {
|
|
cy.get(".tooltip-inner").last().should("have.text", message);
|
|
});
|
|
};
|
|
|
|
export const fillInputField = (data) => {
|
|
Object.entries(data).forEach(([key, value]) => {
|
|
const labelSelector = `[data-cy="${cyParamName(key)}-label"]`;
|
|
const inputSelector = `[data-cy="${cyParamName(key)}-input"]`;
|
|
cy.get(labelSelector).should("contain", key);
|
|
cy.get(inputSelector).type(`{selectall}{backspace}${value}`);
|
|
});
|
|
};
|
|
|
|
export const navigateToSettingPage = () => {
|
|
cy.get(commonSelectors.settingsIcon).click();
|
|
cy.get(commonEeSelectors.instanceSettingIcon).click();
|
|
cy.get(commonSelectors.pageSectionHeader).should("be.visible");
|
|
};
|
|
|
|
export const sanitize = (str) => str.toLowerCase().replace(/[^A-Za-z]/g, "");
|