2022-05-18 10:39:42 +00:00
|
|
|
|
import "cypress-wait-until";
|
2023-06-15 13:21:11 +00:00
|
|
|
|
import { v4 as uuidv4 } from "uuid";
|
2022-05-18 10:39:42 +00:00
|
|
|
|
import { ObjectsRegistry } from "../Objects/Registry";
|
2023-05-11 05:26:03 +00:00
|
|
|
|
import type CodeMirror from "codemirror";
|
2023-06-15 13:21:11 +00:00
|
|
|
|
import { ReusableHelper } from "../Objects/ReusableHelper";
|
2023-06-16 18:40:10 +00:00
|
|
|
|
import type { EntityItemsType } from "./AssertHelper";
|
2023-06-15 13:21:11 +00:00
|
|
|
|
import { EntityItems } from "./AssertHelper";
|
2022-04-06 07:22:18 +00:00
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
type ElementType = string | JQuery<HTMLElement>;
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
interface DeleteParams {
|
|
|
|
|
|
action: "Copy to page" | "Move to page" | "Delete" | "Prettify code";
|
|
|
|
|
|
subAction?: string;
|
2023-06-16 18:40:10 +00:00
|
|
|
|
entityType?: EntityItemsType;
|
2023-06-15 13:21:11 +00:00
|
|
|
|
toastToValidate?: string;
|
|
|
|
|
|
}
|
|
|
|
|
|
interface SubActionParams {
|
|
|
|
|
|
subAction: string;
|
|
|
|
|
|
index?: number;
|
|
|
|
|
|
force?: boolean;
|
|
|
|
|
|
toastToValidate?: string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:01:22 +00:00
|
|
|
|
let LOCAL_STORAGE_MEMORY: any = {};
|
2022-06-06 05:59:15 +00:00
|
|
|
|
export interface IEnterValue {
|
|
|
|
|
|
propFieldName: string;
|
|
|
|
|
|
directInput: boolean;
|
|
|
|
|
|
inputFieldName: string;
|
2023-08-10 07:06:03 +00:00
|
|
|
|
apiOrQuery?: "api" | "query";
|
2022-06-06 05:59:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const DEFAULT_ENTERVALUE_OPTIONS = {
|
|
|
|
|
|
propFieldName: "",
|
|
|
|
|
|
directInput: false,
|
|
|
|
|
|
inputFieldName: "",
|
|
|
|
|
|
};
|
2023-06-15 13:21:11 +00:00
|
|
|
|
|
|
|
|
|
|
export class AggregateHelper extends ReusableHelper {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
private locator = ObjectsRegistry.CommonLocators;
|
2023-05-19 18:37:06 +00:00
|
|
|
|
public _modifierKey = Cypress.platform === "darwin" ? "meta" : "ctrl";
|
2023-06-15 13:21:11 +00:00
|
|
|
|
private assertHelper = ObjectsRegistry.AssertHelper;
|
2023-05-19 18:37:06 +00:00
|
|
|
|
|
2023-01-06 11:57:53 +00:00
|
|
|
|
public isMac = Cypress.platform === "darwin";
|
2022-10-17 15:16:38 +00:00
|
|
|
|
private selectLine = `${
|
|
|
|
|
|
this.isMac ? "{cmd}{shift}{leftArrow}" : "{shift}{home}"
|
2022-08-24 14:23:41 +00:00
|
|
|
|
}`;
|
2022-10-17 15:16:38 +00:00
|
|
|
|
private removeLine = "{backspace}";
|
2022-09-19 05:32:06 +00:00
|
|
|
|
private selectAll = `${this.isMac ? "{cmd}{a}" : "{ctrl}{a}"}`;
|
2023-05-11 05:26:03 +00:00
|
|
|
|
private lazyCodeEditorFallback = ".t--lazyCodeEditor-fallback";
|
|
|
|
|
|
private lazyCodeEditorRendered = ".t--lazyCodeEditor-editor";
|
2023-07-24 08:54:17 +00:00
|
|
|
|
private toolTipSpan = ".rc-tooltip-inner span";
|
2022-08-24 14:23:41 +00:00
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
private selectChars = (noOfChars: number) =>
|
|
|
|
|
|
`${"{leftArrow}".repeat(noOfChars) + "{shift}{cmd}{leftArrow}{backspace}"}`;
|
|
|
|
|
|
|
2022-12-26 05:11:33 +00:00
|
|
|
|
// Chrome asks for permission to add text to clipboard on cypress, we grant it here.
|
|
|
|
|
|
public GiveChromeCopyPermission() {
|
|
|
|
|
|
cy.wrap(
|
|
|
|
|
|
Cypress.automation("remote:debugger:protocol", {
|
|
|
|
|
|
command: "Browser.grantPermissions",
|
|
|
|
|
|
params: {
|
|
|
|
|
|
permissions: ["clipboardReadWrite", "clipboardSanitizedWrite"],
|
|
|
|
|
|
origin: window.location.origin,
|
|
|
|
|
|
},
|
|
|
|
|
|
}),
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-17 06:12:18 +00:00
|
|
|
|
public SaveLocalStorageCache() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
Object.keys(localStorage).forEach((key) => {
|
|
|
|
|
|
LOCAL_STORAGE_MEMORY[key] = localStorage[key];
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-17 06:12:18 +00:00
|
|
|
|
public RestoreLocalStorageCache() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
Object.keys(LOCAL_STORAGE_MEMORY).forEach((key) => {
|
|
|
|
|
|
localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-17 06:12:18 +00:00
|
|
|
|
public ClearLocalStorageCache() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
localStorage.clear();
|
|
|
|
|
|
LOCAL_STORAGE_MEMORY = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-21 11:22:55 +00:00
|
|
|
|
public TypeTab(shiftKey = false, ctrlKey = false) {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.focused().trigger("keydown", {
|
|
|
|
|
|
keyCode: 9,
|
|
|
|
|
|
which: 9,
|
|
|
|
|
|
shiftKey: shiftKey,
|
|
|
|
|
|
ctrlKey: ctrlKey,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AddDsl(
|
2023-07-04 16:33:31 +00:00
|
|
|
|
dslFile: string,
|
2023-07-20 13:15:27 +00:00
|
|
|
|
elementToCheckPresenceaftDslLoad: string | "" = "", // reloadWithoutCache = true,
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2022-11-03 09:23:15 +00:00
|
|
|
|
let pageid: string, layoutId;
|
2023-06-09 14:40:12 +00:00
|
|
|
|
let appId: string | null;
|
2023-07-04 16:33:31 +00:00
|
|
|
|
cy.fixture(dslFile).then((val) => {
|
|
|
|
|
|
cy.url().then((url) => {
|
|
|
|
|
|
pageid = url.split("/")[5]?.split("-").pop() as string;
|
|
|
|
|
|
cy.log(pageid + "page id");
|
|
|
|
|
|
//Fetch the layout id
|
|
|
|
|
|
cy.request("GET", "api/v1/pages/" + pageid).then((response: any) => {
|
|
|
|
|
|
const respBody = JSON.stringify(response.body);
|
|
|
|
|
|
const parsedData = JSON.parse(respBody).data;
|
|
|
|
|
|
layoutId = parsedData.layouts[0].id;
|
|
|
|
|
|
appId = parsedData.applicationId;
|
|
|
|
|
|
// Dumping the DSL to the created page
|
|
|
|
|
|
cy.request({
|
|
|
|
|
|
method: "PUT",
|
|
|
|
|
|
url:
|
|
|
|
|
|
"api/v1/layouts/" +
|
|
|
|
|
|
layoutId +
|
|
|
|
|
|
"/pages/" +
|
|
|
|
|
|
pageid +
|
|
|
|
|
|
"?applicationId=" +
|
|
|
|
|
|
appId,
|
|
|
|
|
|
body: val,
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
"X-Requested-By": "Appsmith",
|
|
|
|
|
|
},
|
|
|
|
|
|
}).then((dslDumpResp) => {
|
|
|
|
|
|
//cy.log("Pages resposne is : " + dslDumpResp.body);
|
|
|
|
|
|
expect(dslDumpResp.status).equal(200);
|
|
|
|
|
|
this.Sleep(3000); //for dsl to settle in layouts api & then refresh
|
2023-07-20 13:15:27 +00:00
|
|
|
|
this.RefreshPage();
|
2023-07-04 16:33:31 +00:00
|
|
|
|
if (elementToCheckPresenceaftDslLoad)
|
|
|
|
|
|
this.WaitUntilEleAppear(elementToCheckPresenceaftDslLoad);
|
|
|
|
|
|
this.Sleep(2000); //settling time for dsl
|
|
|
|
|
|
this.AssertElementAbsence(this.locator._loading); //Checks the spinner is gone & dsl loaded!
|
|
|
|
|
|
this.AssertElementAbsence(this.locator._animationSpnner, 20000); //Checks page is loaded with dsl!
|
|
|
|
|
|
});
|
2022-03-25 11:14:12 +00:00
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-31 05:33:59 +00:00
|
|
|
|
public StartRoutes() {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.intercept("POST", "/api/v1/actions").as("createNewApi");
|
|
|
|
|
|
cy.intercept("PUT", "/api/v1/actions/*").as("saveAction");
|
|
|
|
|
|
//cy.intercept("POST", "/api/v1/users/invite", (req) => { req.headers["origin"] = "Cypress";}).as("mockPostInvite");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-08 06:46:48 +00:00
|
|
|
|
public AssertPopoverTooltip(expectedText: string) {
|
|
|
|
|
|
this.GetText(this.locator._popoverToolTip, "text").then(($tooltiptxt) =>
|
|
|
|
|
|
expect($tooltiptxt).to.eq(expectedText),
|
2023-06-15 13:21:11 +00:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 08:54:17 +00:00
|
|
|
|
/**
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param selector
|
|
|
|
|
|
* @param index
|
|
|
|
|
|
* Checks if the given selector has class with disabled in the class name
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
*/
|
|
|
|
|
|
public AssertElementClassContainsDisabled(selector: string, index = 0) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should(($element) => {
|
|
|
|
|
|
const elementClass = $element.attr("class");
|
|
|
|
|
|
expect(elementClass).to.include("disabled");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-05 03:22:42 +00:00
|
|
|
|
public RenameWithInPane(renameVal: string, IsQuery = true) {
|
|
|
|
|
|
const name = IsQuery ? this.locator._queryName : this.locator._dsName;
|
|
|
|
|
|
const text = IsQuery ? this.locator._queryNameTxt : this.locator._dsNameTxt;
|
2023-05-19 18:37:06 +00:00
|
|
|
|
this.Sleep(300); //for default query name to load
|
2022-12-09 05:06:52 +00:00
|
|
|
|
this.GetNClick(name, 0, true);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.get(text)
|
|
|
|
|
|
.clear({ force: true })
|
2023-03-11 07:01:39 +00:00
|
|
|
|
.type(renameVal, { force: true, delay: 0 })
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.should("have.value", renameVal)
|
|
|
|
|
|
.blur();
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.PressEnter();
|
2023-08-10 07:06:03 +00:00
|
|
|
|
this.AssertElementVisibility(this.locator._editIcon);
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.Sleep(300); //allow lil more time for new name to settle
|
2022-09-07 18:25:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-18 09:24:15 +00:00
|
|
|
|
public CheckForPageSaveError() {
|
|
|
|
|
|
// Wait for "saving" status to disappear
|
2023-02-23 17:59:05 +00:00
|
|
|
|
this.GetElement(this.locator._statusSaving, 30000).should("not.exist");
|
2023-01-18 09:24:15 +00:00
|
|
|
|
// Check for page save error
|
|
|
|
|
|
cy.get("body").then(($ele) => {
|
|
|
|
|
|
if ($ele.find(this.locator._saveStatusError).length) {
|
|
|
|
|
|
this.RefreshPage();
|
2023-03-18 19:42:01 +00:00
|
|
|
|
return false;
|
2023-01-18 09:24:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
});
|
2023-03-18 19:42:01 +00:00
|
|
|
|
return true;
|
2023-01-18 09:24:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public AssertAutoSave() {
|
2023-03-18 19:42:01 +00:00
|
|
|
|
let saveStatus = this.CheckForPageSaveError();
|
2022-05-18 10:39:42 +00:00
|
|
|
|
// wait for save query to trigger & n/w call to finish occuring
|
2023-03-18 19:42:01 +00:00
|
|
|
|
if (!saveStatus)
|
|
|
|
|
|
cy.get(this.locator._saveStatusContainer, { timeout: 30000 }).should(
|
|
|
|
|
|
"not.exist",
|
|
|
|
|
|
); //adding timeout since waiting more time is not worth it!
|
2023-02-06 07:37:01 +00:00
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
//this.AssertNetworkStatus("@sucessSave", 200);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-24 12:30:39 +00:00
|
|
|
|
public PopupClose(popUpName: string) {
|
|
|
|
|
|
this.GetNClick(this.locator._popUpCloseBtn(popUpName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public ValidateCodeEditorContent(selector: string, contentToValidate: any) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
// cy.get(selector).each(($ele) => {
|
|
|
|
|
|
// cy.wrap($ele).within(() => {
|
|
|
|
|
|
// cy.get(this.locator._codeMirrorCode).should(
|
|
|
|
|
|
// "include.text",
|
|
|
|
|
|
// contentToValidate,
|
|
|
|
|
|
// );
|
|
|
|
|
|
// });
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
let isTextContained = false;
|
|
|
|
|
|
|
|
|
|
|
|
cy.get(selector)
|
|
|
|
|
|
.each(($ele) => {
|
|
|
|
|
|
cy.wrap($ele).within(() => {
|
|
|
|
|
|
cy.get(this.locator._codeMirrorCode)
|
|
|
|
|
|
.invoke("text")
|
|
|
|
|
|
.then((text) => {
|
|
|
|
|
|
if (contentToValidate.includes(text)) {
|
|
|
|
|
|
isTextContained = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
})
|
|
|
|
|
|
.then(() => {
|
|
|
|
|
|
expect(isTextContained).to.be.true;
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public GetElement(selector: ElementType, timeout = 20000) {
|
|
|
|
|
|
let locator;
|
|
|
|
|
|
if (typeof selector == "string") {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
//cy.log(selector, "selector");
|
2022-10-13 07:24:09 +00:00
|
|
|
|
locator =
|
|
|
|
|
|
selector.startsWith("//") || selector.startsWith("(//")
|
2023-06-20 08:58:06 +00:00
|
|
|
|
? cy.xpath(selector, {
|
|
|
|
|
|
timeout: timeout,
|
|
|
|
|
|
})
|
|
|
|
|
|
: cy.get(selector, {
|
|
|
|
|
|
timeout: timeout,
|
|
|
|
|
|
});
|
2022-08-27 12:40:11 +00:00
|
|
|
|
} else locator = cy.wrap(selector);
|
|
|
|
|
|
return locator;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 14:23:41 +00:00
|
|
|
|
public GetNAssertElementText(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
text: string,
|
2023-06-22 05:00:24 +00:00
|
|
|
|
textPresence:
|
|
|
|
|
|
| "have.text"
|
|
|
|
|
|
| "not.have.text"
|
|
|
|
|
|
| "contain.text"
|
|
|
|
|
|
| "not.contain.text" = "have.text",
|
2022-08-24 14:23:41 +00:00
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
2022-09-02 01:05:45 +00:00
|
|
|
|
if (index >= 0)
|
2023-08-21 07:49:28 +00:00
|
|
|
|
this.ScrollIntoView(selector, index).should(textPresence, text);
|
2022-09-02 01:05:45 +00:00
|
|
|
|
else this.GetElement(selector).should(textPresence, text);
|
2022-08-04 04:48:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-30 18:46:57 +00:00
|
|
|
|
public GetElementsNAssertTextPresence(selector: string, text: string) {
|
|
|
|
|
|
this.GetElement(selector).then(($elements: any) => {
|
|
|
|
|
|
let found = false;
|
|
|
|
|
|
cy.log("elements length is" + $elements.length);
|
|
|
|
|
|
$elements.each((index: any, element: any) => {
|
|
|
|
|
|
const eleText = Cypress.$(element).text().trim();
|
|
|
|
|
|
if (eleText === text) {
|
|
|
|
|
|
found = true;
|
|
|
|
|
|
return false; // Exit the loop if the expected text is found
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
expect(found).to.be.true;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-07-01 05:26:57 +00:00
|
|
|
|
public ValidateToastMessage(text: string, index = 0, length = 1) {
|
2023-08-08 09:14:46 +00:00
|
|
|
|
if (index != 0) {
|
|
|
|
|
|
this.GetElement(this.locator._toastMsg)
|
|
|
|
|
|
.should("have.length.at.least", length)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("contain.text", text);
|
|
|
|
|
|
} else this.GetNAssertContains(this.locator._toastMsg, text);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public RemoveTooltip(toolTip: string) {
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(this.locator._appLeveltooltip(toolTip)).length > 0) {
|
|
|
|
|
|
this.GetElement(this.locator._appLeveltooltip(toolTip))
|
|
|
|
|
|
.parents("div.rc-tooltip")
|
|
|
|
|
|
.then(($tooltipElement) => {
|
|
|
|
|
|
$tooltipElement.remove();
|
|
|
|
|
|
cy.log(toolTip + " tooltip removed");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 08:54:17 +00:00
|
|
|
|
public AssertTooltip(toolTipText: string) {
|
|
|
|
|
|
this.GetNAssertContains(this.toolTipSpan, toolTipText);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public RemoveEvaluatedPopUp() {
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(this.locator._evalPopup).length > 0) {
|
|
|
|
|
|
this.GetElement(this.locator._evalPopup).then(($evalPopUp) => {
|
|
|
|
|
|
$evalPopUp.remove();
|
|
|
|
|
|
cy.log("Eval pop up removed");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-11 07:01:39 +00:00
|
|
|
|
public ClickButton(
|
|
|
|
|
|
btnVisibleText: string,
|
2023-08-21 07:49:28 +00:00
|
|
|
|
indexOrOptions:
|
|
|
|
|
|
| number
|
|
|
|
|
|
| Partial<{
|
|
|
|
|
|
index: number;
|
|
|
|
|
|
force: boolean;
|
|
|
|
|
|
waitAfterClick: boolean;
|
|
|
|
|
|
sleepTime: number;
|
|
|
|
|
|
}> = 0,
|
2023-03-11 07:01:39 +00:00
|
|
|
|
) {
|
2023-08-21 07:49:28 +00:00
|
|
|
|
const button = this.locator._buttonByText(btnVisibleText);
|
|
|
|
|
|
let index: number,
|
|
|
|
|
|
force = true,
|
|
|
|
|
|
waitAfterClick = true,
|
|
|
|
|
|
waitTime = 1000;
|
|
|
|
|
|
|
|
|
|
|
|
if (typeof indexOrOptions === "number") {
|
|
|
|
|
|
index = indexOrOptions;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
index = indexOrOptions.index || 0;
|
|
|
|
|
|
force =
|
|
|
|
|
|
typeof indexOrOptions.force !== "undefined"
|
|
|
|
|
|
? indexOrOptions.force
|
|
|
|
|
|
: true;
|
|
|
|
|
|
// waitAfterClick = indexOrOptions.waitAfterClick || false;
|
|
|
|
|
|
// Check if waitAfterClick is explicitly set, otherwise default to true
|
|
|
|
|
|
waitAfterClick =
|
|
|
|
|
|
typeof indexOrOptions.waitAfterClick !== "undefined"
|
|
|
|
|
|
? indexOrOptions.waitAfterClick
|
|
|
|
|
|
: true;
|
|
|
|
|
|
waitTime = indexOrOptions.sleepTime || 1000;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return this.ScrollIntoView(button, index)
|
|
|
|
|
|
.click({ force })
|
|
|
|
|
|
.then(() => {
|
|
|
|
|
|
if (waitAfterClick) {
|
|
|
|
|
|
return this.Sleep(waitTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public clickMultipleButtons(btnVisibleText: string, waitAfterClick = true) {
|
|
|
|
|
|
cy.xpath(this.locator._buttonByText(btnVisibleText)).each(($el) => {
|
2023-03-04 07:25:54 +00:00
|
|
|
|
$el.trigger("click", { force: true });
|
|
|
|
|
|
cy.wait(200);
|
|
|
|
|
|
});
|
2023-08-21 07:49:28 +00:00
|
|
|
|
waitAfterClick && this.Sleep();
|
2023-03-04 07:25:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public Paste(selector: any, pastePayload: string) {
|
|
|
|
|
|
cy.wrap(selector).then(($destination) => {
|
|
|
|
|
|
const pasteEvent = Object.assign(
|
|
|
|
|
|
new Event("paste", { bubbles: true, cancelable: true }),
|
|
|
|
|
|
{
|
|
|
|
|
|
clipboardData: {
|
|
|
|
|
|
getData: () => pastePayload,
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
$destination[0].dispatchEvent(pasteEvent);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-07-06 05:54:00 +00:00
|
|
|
|
public WaitUntilToastDisappear(
|
|
|
|
|
|
msgToCheckforDisappearance: string | "",
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
length = 1,
|
|
|
|
|
|
) {
|
2022-07-01 05:26:57 +00:00
|
|
|
|
this.ValidateToastMessage(msgToCheckforDisappearance, index, length);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.waitUntil(() => cy.get(this.locator._toastMsg), {
|
|
|
|
|
|
errorMsg: msgToCheckforDisappearance + " did not disappear",
|
|
|
|
|
|
timeout: 5000,
|
|
|
|
|
|
interval: 1000,
|
|
|
|
|
|
}).then(($ele) => {
|
|
|
|
|
|
cy.wrap($ele)
|
2023-06-15 13:21:11 +00:00
|
|
|
|
//.contains(msgToCheckforDisappearance)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.should("have.length", 0);
|
|
|
|
|
|
this.Sleep();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public WaitUntilEleDisappear(selector: string) {
|
2022-09-19 05:32:06 +00:00
|
|
|
|
const locator = selector.includes("//")
|
2022-08-27 12:40:11 +00:00
|
|
|
|
? cy.xpath(selector)
|
|
|
|
|
|
: cy.get(selector);
|
|
|
|
|
|
locator.waitUntil(($ele) => cy.wrap($ele).should("have.length", 0), {
|
|
|
|
|
|
errorMsg: "Element did not disappear even after 10 seconds",
|
2023-06-15 13:21:11 +00:00
|
|
|
|
timeout: 20000,
|
2022-08-27 12:40:11 +00:00
|
|
|
|
interval: 1000,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public WaitUntilAllToastsDisappear() {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(this.locator._toastContainer).length > 0) {
|
|
|
|
|
|
this.GetElement(this.locator._toastContainer).waitUntil(
|
|
|
|
|
|
($ele) => cy.wrap($ele).should("have.length", 0),
|
|
|
|
|
|
{
|
|
|
|
|
|
errorMsg: "Toasts did not disappear even after 10 seconds",
|
|
|
|
|
|
timeout: 10000,
|
|
|
|
|
|
interval: 1000,
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public WaitUntilEleAppear(selector: string) {
|
2022-09-19 05:32:06 +00:00
|
|
|
|
const locator = selector.includes("//")
|
2022-08-27 12:40:11 +00:00
|
|
|
|
? cy.xpath(selector)
|
|
|
|
|
|
: cy.get(selector);
|
2023-08-01 09:34:15 +00:00
|
|
|
|
locator.waitUntil(
|
|
|
|
|
|
($ele) =>
|
|
|
|
|
|
cy
|
|
|
|
|
|
.wrap($ele)
|
|
|
|
|
|
.should("exist")
|
|
|
|
|
|
.should("be.visible")
|
|
|
|
|
|
.its("length")
|
|
|
|
|
|
.should("be.gte", 1),
|
|
|
|
|
|
{
|
|
|
|
|
|
errorMsg: "Element did not appear even after 10 seconds",
|
|
|
|
|
|
timeout: 10000,
|
|
|
|
|
|
interval: 1000,
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
|
|
|
|
|
|
//Below can be tried if above starts being flaky:
|
|
|
|
|
|
// cy.waitUntil(() => cy.get(selector, { timeout: 50000 }).should("have.length.greaterThan", 0)
|
|
|
|
|
|
//or
|
|
|
|
|
|
// cy.waitUntil(()) => (selector.includes("//") ? cy.xpath(selector) : cy.get(selector))).then(($ele) => { cy.wrap($ele).eq(0).should("be.visible");});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public AssertNetworkDataSuccess(aliasName: string, expectedRes = true) {
|
|
|
|
|
|
cy.wait(1000).wait(aliasName); //Wait a bit for call to finish!
|
|
|
|
|
|
cy.get(aliasName)
|
|
|
|
|
|
.its("response.body.data.success")
|
|
|
|
|
|
.should("eq", expectedRes);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public AssertNetworkDataNestedProperty(
|
2022-09-09 15:59:47 +00:00
|
|
|
|
aliasName: string,
|
|
|
|
|
|
expectedPath: string,
|
|
|
|
|
|
expectedRes: any,
|
|
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
cy.wait(1000).wait(aliasName); //Wait a bit for call to finish!
|
|
|
|
|
|
cy.get(aliasName).should("have.nested.property", expectedPath, expectedRes);
|
2022-09-09 15:59:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-25 05:30:54 +00:00
|
|
|
|
public SelectDropDown(dropdownOption: string, endpoint = "selectwidget") {
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const mode = window.localStorage.getItem("inDeployedMode");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
if (mode == "false") {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.GetNClick(this.locator._selectWidgetDropdown(endpoint));
|
2022-05-18 10:39:42 +00:00
|
|
|
|
} else {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.GetNClick(this.locator._selectWidgetDropdownInDeployed(endpoint));
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
2022-06-23 15:13:15 +00:00
|
|
|
|
if (endpoint == "selectwidget")
|
2022-06-25 05:30:54 +00:00
|
|
|
|
cy.get(this.locator._selectOptionValue(dropdownOption)).click({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
else
|
|
|
|
|
|
cy.get(this.locator._dropDownValue(dropdownOption)).click({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
|
|
|
|
|
this.Sleep(); //for selected value to reflect!
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-13 07:24:09 +00:00
|
|
|
|
public SelectFromMutliTree(dropdownOption: string) {
|
|
|
|
|
|
this.GetNClick(this.locator._dropDownMultiTreeSelect);
|
|
|
|
|
|
this.GetNClick(this.locator._dropDownMultiTreeValue(dropdownOption));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public SelectFromDropDown(
|
2022-06-25 05:30:54 +00:00
|
|
|
|
dropdownOption: string,
|
2022-06-21 11:22:55 +00:00
|
|
|
|
insideParent = "",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
index = 0,
|
2022-06-25 05:30:54 +00:00
|
|
|
|
endpoint = "dropdownwidget",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const mode = window.localStorage.getItem("inDeployedMode");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
//cy.log("mode frm deployed is:" + mode)
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const modeSelector =
|
2022-05-18 10:39:42 +00:00
|
|
|
|
mode == "true"
|
2022-06-23 15:13:15 +00:00
|
|
|
|
? this.locator._selectWidgetDropdownInDeployed(endpoint)
|
|
|
|
|
|
: this.locator._selectWidgetDropdown(endpoint);
|
2022-06-21 11:22:55 +00:00
|
|
|
|
const finalSelector = insideParent
|
2022-05-18 10:39:42 +00:00
|
|
|
|
? this.locator._divWithClass(insideParent) + modeSelector
|
|
|
|
|
|
: modeSelector;
|
|
|
|
|
|
cy.log(finalSelector);
|
2023-06-20 08:58:06 +00:00
|
|
|
|
|
|
|
|
|
|
this.GetNClick(finalSelector, index);
|
2022-06-25 05:30:54 +00:00
|
|
|
|
cy.get(this.locator._dropDownValue(dropdownOption)).click({ force: true });
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.Sleep(); //for selected value to reflect!
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-25 05:30:54 +00:00
|
|
|
|
public SelectDropdownList(ddName: string, dropdownOption: string) {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.GetNClick(this.locator._existingFieldTextByName(ddName));
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
cy.get(this.locator._dropdownText).contains(dropdownOption).click();
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public SelectFromMultiSelect(
|
|
|
|
|
|
options: string[],
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
check = true,
|
2022-06-25 05:30:54 +00:00
|
|
|
|
endpoint = "multiselectwidgetv2",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.ScrollIntoView(
|
|
|
|
|
|
this.locator._widgetInDeployed(endpoint) + " div.rc-select-selector",
|
|
|
|
|
|
index,
|
|
|
|
|
|
)
|
2022-06-25 05:30:54 +00:00
|
|
|
|
.then(($element: any) => {
|
|
|
|
|
|
// here, we try to click on downArrow in dropdown of multiSelect.
|
|
|
|
|
|
// the position is calculated from top left of the element
|
|
|
|
|
|
const dropdownCenterPosition = +$element.height / 2;
|
|
|
|
|
|
const dropdownArrowApproxPosition = +$element.width - 10;
|
|
|
|
|
|
cy.get($element).click(
|
|
|
|
|
|
dropdownArrowApproxPosition,
|
|
|
|
|
|
dropdownCenterPosition,
|
|
|
|
|
|
{
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
2023-06-15 13:21:11 +00:00
|
|
|
|
})
|
|
|
|
|
|
.wait(500); //for dropdown options to settle
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
|
|
|
|
|
if (check) {
|
|
|
|
|
|
options.forEach(($each) => {
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each))
|
|
|
|
|
|
.check({ force: true })
|
2022-09-02 01:05:45 +00:00
|
|
|
|
.wait(1000);
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each)).should("be.checked");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
options.forEach(($each) => {
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each))
|
|
|
|
|
|
.uncheck({ force: true })
|
2022-09-02 01:05:45 +00:00
|
|
|
|
.wait(1000);
|
|
|
|
|
|
cy.get(this.locator._multiSelectOptions($each)).should(
|
|
|
|
|
|
"not.be.checked",
|
|
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// //closing multiselect dropdown
|
2022-08-27 12:40:11 +00:00
|
|
|
|
this.PressEscape();
|
2022-06-23 15:13:15 +00:00
|
|
|
|
// cy.get(this.locator._widgetInDeployed(endpoint))
|
2022-05-18 10:39:42 +00:00
|
|
|
|
// .eq(index)
|
|
|
|
|
|
// .click()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public PressEscape() {
|
2022-07-21 13:01:23 +00:00
|
|
|
|
cy.get("body").type("{esc}");
|
2022-07-06 15:22:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-20 07:09:42 +00:00
|
|
|
|
public PressEnter() {
|
|
|
|
|
|
cy.get("body").type("{enter}");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public PressDelete() {
|
|
|
|
|
|
cy.get("body").type(`{del}`, { force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-30 02:40:13 +00:00
|
|
|
|
public SelectAllWidgets(parentWidget = ".appsmith_widget_0") {
|
|
|
|
|
|
cy.get(parentWidget).type(this.isMac ? "{meta}A" : "{ctrl}A");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public SetCanvasViewportWidth(width: number) {
|
|
|
|
|
|
cy.get(this.locator._canvasViewport).invoke("width", `${width}px`);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-19 18:37:06 +00:00
|
|
|
|
public ClickOutside() {
|
|
|
|
|
|
cy.get("body").click(0, 0, { force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public RemoveMultiSelectItems(items: string[]) {
|
|
|
|
|
|
items.forEach(($each) => {
|
|
|
|
|
|
cy.xpath(this.locator._multiSelectItem($each))
|
|
|
|
|
|
.eq(0)
|
2023-02-14 16:07:31 +00:00
|
|
|
|
.click({ force: true })
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.wait(1000);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ReadSelectedDropDownValue() {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return cy.xpath(this.locator._selectedDropdownValue).first().invoke("text");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-23 10:32:35 +00:00
|
|
|
|
public EnterActionValue(
|
|
|
|
|
|
actionName: string,
|
|
|
|
|
|
value: string,
|
|
|
|
|
|
paste = true,
|
|
|
|
|
|
index = 0,
|
2023-04-06 16:49:12 +00:00
|
|
|
|
parseSpecialCharacters = false,
|
2022-11-23 10:32:35 +00:00
|
|
|
|
) {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.ScrollIntoView(this.locator._actionTextArea(actionName), index)
|
2023-04-10 19:54:10 +00:00
|
|
|
|
.parents(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.setValue("");
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
//Not working consistenly, hence commenting
|
|
|
|
|
|
// .focus()
|
|
|
|
|
|
// .type("{uparrow}", { force: true })
|
|
|
|
|
|
// .type("{ctrl}{shift}{downarrow}{del}", { force: true });
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.focused().then(($cm: any) => {
|
|
|
|
|
|
if ($cm.contents != "") {
|
|
|
|
|
|
cy.log("The field is not empty");
|
2023-06-20 08:58:06 +00:00
|
|
|
|
this.ScrollIntoView(this.locator._actionTextArea(actionName), index)
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.click({ force: true })
|
|
|
|
|
|
.focused()
|
|
|
|
|
|
.clear({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
this.Sleep();
|
2023-06-20 08:58:06 +00:00
|
|
|
|
|
|
|
|
|
|
this.ScrollIntoView(this.locator._actionTextArea(actionName), index).then(
|
|
|
|
|
|
(el: any) => {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
if (paste) {
|
|
|
|
|
|
//input.invoke("val", value);
|
|
|
|
|
|
this.Paste(el, value);
|
|
|
|
|
|
} else {
|
2022-07-22 20:31:08 +00:00
|
|
|
|
cy.get(el).type(value, {
|
2023-04-06 16:49:12 +00:00
|
|
|
|
parseSpecialCharSequences: parseSpecialCharacters,
|
2022-03-25 11:14:12 +00:00
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
2023-06-20 08:58:06 +00:00
|
|
|
|
},
|
|
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.AssertAutoSave();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2023-02-02 07:59:24 +00:00
|
|
|
|
|
|
|
|
|
|
public VerifyCallCount(alias: string, expectedNumberOfCalls: number) {
|
|
|
|
|
|
cy.wait(alias);
|
|
|
|
|
|
cy.get(`${alias}.all`).should("have.length", expectedNumberOfCalls);
|
|
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
|
2023-07-21 05:53:17 +00:00
|
|
|
|
public GetNClickIfPresent(selector: string) {
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(selector).length > 0) {
|
|
|
|
|
|
cy.get(selector).click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-29 12:17:14 +00:00
|
|
|
|
public GetNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
2023-06-09 14:40:12 +00:00
|
|
|
|
ctrlKey = false,
|
2022-06-29 12:17:14 +00:00
|
|
|
|
) {
|
2023-06-20 08:58:06 +00:00
|
|
|
|
return this.ScrollIntoView(selector, index)
|
2023-06-09 14:40:12 +00:00
|
|
|
|
.click({ force: force, ctrlKey: ctrlKey })
|
2022-06-29 12:17:14 +00:00
|
|
|
|
.wait(waitTimeInterval);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-07 06:52:06 +00:00
|
|
|
|
public GetClosestNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
closestSelector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
ctrlKey = false,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.ScrollIntoView(selector, index)
|
|
|
|
|
|
.closest(closestSelector)
|
|
|
|
|
|
.click({ force: force, ctrlKey: ctrlKey })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public GetHoverNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
) {
|
2023-08-01 09:34:15 +00:00
|
|
|
|
return (this.ScrollIntoView(selector, index) as any)
|
2023-06-15 13:21:11 +00:00
|
|
|
|
.realHover()
|
|
|
|
|
|
.click({ force: force })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-26 08:56:36 +00:00
|
|
|
|
public HoverElement(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
realTouch = true,
|
|
|
|
|
|
waitTimeInterval = 100,
|
|
|
|
|
|
) {
|
|
|
|
|
|
let chain = this.ScrollIntoView(selector, index);
|
|
|
|
|
|
if (realTouch) {
|
2023-08-01 09:34:15 +00:00
|
|
|
|
chain = (chain as any)
|
2023-06-16 18:40:10 +00:00
|
|
|
|
.realTouch({ position: "center" })
|
2023-07-26 08:56:36 +00:00
|
|
|
|
.realHover({ pointer: "mouse" });
|
|
|
|
|
|
}
|
|
|
|
|
|
return (
|
|
|
|
|
|
chain
|
2023-06-16 18:40:10 +00:00
|
|
|
|
//.trigger("mousemove", { eventConstructor: "MouseEvent" })
|
|
|
|
|
|
.wait(waitTimeInterval)
|
|
|
|
|
|
);
|
2023-06-15 13:21:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-02 05:49:51 +00:00
|
|
|
|
public GetSiblingNClick(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
siblingSelector: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.siblings(siblingSelector)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.eq(index)
|
2023-06-20 08:58:06 +00:00
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
Cypress.$("body").find($element).length &&
|
|
|
|
|
|
$element[0].offsetParent !== null
|
|
|
|
|
|
) {
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$element[0].scrollIntoView();
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2022-12-02 05:49:51 +00:00
|
|
|
|
.click({ force: force })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GoBack() {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
this.GetNClick(this.locator._goBack);
|
2022-11-30 05:59:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 09:49:32 +00:00
|
|
|
|
public SelectAllAndType(selector: string, text: string) {
|
|
|
|
|
|
this.GetElement(selector).type("{selectall}" + text);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-24 14:23:41 +00:00
|
|
|
|
public SelectNRemoveLineText(selector: string) {
|
2023-07-03 05:08:01 +00:00
|
|
|
|
this.GetElement(selector).type(this.selectLine);
|
|
|
|
|
|
return this.GetElement(selector).type(this.removeLine);
|
2022-08-24 14:23:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-01 20:58:48 +00:00
|
|
|
|
public SelectAllRemoveCodeText(selector: string) {
|
2023-07-03 05:08:01 +00:00
|
|
|
|
return this.GetElement(selector).type(this.selectAll + "{del}");
|
2023-03-01 20:58:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-11 08:32:01 +00:00
|
|
|
|
public RemoveCharsNType(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
charCount = 0,
|
|
|
|
|
|
totype: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
2022-08-27 12:40:11 +00:00
|
|
|
|
if (charCount > 0)
|
|
|
|
|
|
this.GetElement(selector)
|
2023-08-11 08:32:01 +00:00
|
|
|
|
.eq(index)
|
2022-08-27 12:40:11 +00:00
|
|
|
|
.focus()
|
|
|
|
|
|
.type("{backspace}".repeat(charCount), { timeout: 2, force: true })
|
|
|
|
|
|
.wait(50)
|
|
|
|
|
|
.type(totype);
|
|
|
|
|
|
else {
|
2023-08-11 08:32:01 +00:00
|
|
|
|
if (charCount == -1) this.GetElement(selector).eq(index).clear();
|
|
|
|
|
|
this.TypeText(selector, totype, index);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public ClearTextField(selector: string, force = false, index = 0) {
|
|
|
|
|
|
this.GetElement(selector).eq(index).clear({ force });
|
2023-08-08 09:14:46 +00:00
|
|
|
|
this.Sleep(500); //for text to clear for CI runs
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public ClearNType(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
totype: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
) {
|
|
|
|
|
|
this.ClearTextField(selector, force, index);
|
|
|
|
|
|
this.TypeText(selector, totype, index);
|
2022-12-02 05:49:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-09 05:06:52 +00:00
|
|
|
|
public TypeText(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
value: string,
|
2023-08-03 19:25:03 +00:00
|
|
|
|
indexOrOptions:
|
|
|
|
|
|
| number
|
|
|
|
|
|
| Partial<{
|
|
|
|
|
|
index: number;
|
|
|
|
|
|
parseSpecialCharSeq: boolean;
|
|
|
|
|
|
shouldFocus: boolean;
|
2023-08-21 12:09:26 +00:00
|
|
|
|
delay: number;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
}> = 0,
|
2022-12-09 05:06:52 +00:00
|
|
|
|
) {
|
2023-08-03 19:25:03 +00:00
|
|
|
|
let index: number;
|
|
|
|
|
|
let shouldFocus = true;
|
|
|
|
|
|
let parseSpecialCharSeq = false;
|
2023-08-21 12:09:26 +00:00
|
|
|
|
let delay = 5;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
|
|
|
|
|
|
if (typeof indexOrOptions === "number") {
|
|
|
|
|
|
index = indexOrOptions;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
index = indexOrOptions.index || 0;
|
|
|
|
|
|
parseSpecialCharSeq = indexOrOptions.parseSpecialCharSeq || false;
|
2023-08-21 12:09:26 +00:00
|
|
|
|
delay = indexOrOptions.delay || 5;
|
2023-08-03 19:25:03 +00:00
|
|
|
|
shouldFocus =
|
|
|
|
|
|
indexOrOptions.shouldFocus !== undefined
|
|
|
|
|
|
? indexOrOptions.shouldFocus
|
|
|
|
|
|
: true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const element = this.GetElement(selector).eq(index);
|
|
|
|
|
|
|
|
|
|
|
|
if (shouldFocus) {
|
|
|
|
|
|
element.focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return element.wait(100).type(value, {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
parseSpecialCharSequences: parseSpecialCharSeq,
|
2023-08-21 12:09:26 +00:00
|
|
|
|
delay: delay,
|
2023-04-06 16:49:12 +00:00
|
|
|
|
force: true,
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
});
|
2022-08-24 14:23:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-18 06:30:28 +00:00
|
|
|
|
public ContainsNClick(
|
|
|
|
|
|
text: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
waitTimeInterval = 500,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return cy
|
|
|
|
|
|
.contains(text)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.click({ force: force })
|
|
|
|
|
|
.wait(waitTimeInterval);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-23 05:20:27 +00:00
|
|
|
|
public GetNClickByContains(
|
|
|
|
|
|
selector: string,
|
2023-08-01 11:12:44 +00:00
|
|
|
|
containsText: string | RegExp,
|
2022-05-23 05:20:27 +00:00
|
|
|
|
index = 0,
|
2023-06-15 13:21:11 +00:00
|
|
|
|
force = true,
|
2023-06-30 18:46:57 +00:00
|
|
|
|
waitTimeInterval = 500,
|
2022-05-23 05:20:27 +00:00
|
|
|
|
) {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
return cy
|
|
|
|
|
|
.get(selector)
|
2022-05-23 05:20:27 +00:00
|
|
|
|
.contains(containsText)
|
|
|
|
|
|
.eq(index)
|
2023-06-15 13:21:11 +00:00
|
|
|
|
.click({ force: force })
|
2023-06-30 18:46:57 +00:00
|
|
|
|
.wait(waitTimeInterval);
|
2022-05-23 05:20:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public CheckUncheck(selector: string, check = true) {
|
|
|
|
|
|
if (check) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
this.GetElement(selector).check({ force: true }).should("be.checked");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
} else {
|
2022-12-09 05:06:52 +00:00
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.uncheck({ force: true })
|
|
|
|
|
|
.should("not.be.checked");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
this.Sleep();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AssertExistingToggleState(
|
|
|
|
|
|
propertyName: string,
|
2023-05-19 18:37:06 +00:00
|
|
|
|
toggle: "true" | "false",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
) {
|
2023-08-30 10:54:37 +00:00
|
|
|
|
this.GetElement(this.locator._propertyToggleValue(propertyName))
|
|
|
|
|
|
.invoke("attr", "data-checked")
|
|
|
|
|
|
.then((classes) => {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
expect(classes).includes(toggle);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public AssertExistingCheckedState(selector: string, toggle = "true") {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.invoke("attr", "data-selected-value")
|
|
|
|
|
|
.then((dataSelectedValue) => {
|
|
|
|
|
|
cy.log("dataSelectedValue:" + dataSelectedValue);
|
|
|
|
|
|
if (dataSelectedValue !== undefined) {
|
|
|
|
|
|
this.GetElement(selector).should(
|
|
|
|
|
|
"have.attr",
|
|
|
|
|
|
"data-selected-value",
|
|
|
|
|
|
toggle,
|
|
|
|
|
|
);
|
|
|
|
|
|
} else
|
|
|
|
|
|
this.GetElement(selector).should(
|
|
|
|
|
|
toggle == "true" ? "be.checked" : "not.be.checked",
|
|
|
|
|
|
);
|
|
|
|
|
|
});
|
2023-05-19 18:37:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AssertSelectedTab(propertyName: string, value: "true" | "false") {
|
|
|
|
|
|
let locator;
|
|
|
|
|
|
if (propertyName.startsWith("//")) {
|
|
|
|
|
|
locator = cy.xpath(propertyName);
|
|
|
|
|
|
locator.should("have.attr", "aria-checked", value);
|
|
|
|
|
|
} else if (propertyName.includes(" ")) {
|
|
|
|
|
|
locator = cy.get(propertyName);
|
|
|
|
|
|
locator.should("have.attr", "aria-checked", value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-09 05:06:52 +00:00
|
|
|
|
public AssertAttribute(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
attribName: string,
|
2023-09-07 18:18:33 +00:00
|
|
|
|
attribValue: any,
|
2023-06-15 13:21:11 +00:00
|
|
|
|
index = 0,
|
2022-12-09 05:06:52 +00:00
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.attr", attribName, attribValue);
|
2022-12-09 05:06:52 +00:00
|
|
|
|
}
|
2023-08-28 07:13:07 +00:00
|
|
|
|
|
|
|
|
|
|
public AssertProperty(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
propName: string,
|
2023-09-07 18:18:33 +00:00
|
|
|
|
propValue: any,
|
2023-08-28 07:13:07 +00:00
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.prop", propName, propValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-03 06:33:27 +00:00
|
|
|
|
public AssertCSS(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
cssName: string,
|
|
|
|
|
|
cssValue: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should("have.css", cssName, cssValue);
|
|
|
|
|
|
}
|
2022-12-09 05:06:52 +00:00
|
|
|
|
|
2022-06-24 08:22:29 +00:00
|
|
|
|
public ToggleSwitch(
|
|
|
|
|
|
switchName: string,
|
|
|
|
|
|
toggle: "check" | "uncheck" = "check",
|
2022-07-06 05:54:00 +00:00
|
|
|
|
jsonSwitch = false,
|
2022-06-24 08:22:29 +00:00
|
|
|
|
) {
|
2022-07-06 05:54:00 +00:00
|
|
|
|
const locator = jsonSwitch
|
|
|
|
|
|
? cy.xpath(this.locator._jsonToggle(switchName))
|
|
|
|
|
|
: cy.xpath(this.locator._switchToggle(switchName));
|
2022-06-29 12:17:14 +00:00
|
|
|
|
const parentLoc = locator.parent("label");
|
2022-06-24 08:22:29 +00:00
|
|
|
|
if (toggle == "check")
|
|
|
|
|
|
parentLoc.then(($parent) => {
|
|
|
|
|
|
if (!$parent.hasClass("t--switch-widget-active")) {
|
|
|
|
|
|
locator.click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
else
|
|
|
|
|
|
parentLoc.then(($parent) => {
|
|
|
|
|
|
if (!$parent.hasClass("t--switch-widget-inactive")) {
|
|
|
|
|
|
locator.click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public GenerateUUID() {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
let id = uuidv4();
|
|
|
|
|
|
id = "Cy" + id.split("-")[0];
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.wrap(id).as("guid");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GetObjectName() {
|
|
|
|
|
|
//cy.get(this.locator._queryName).invoke("text").then((text) => cy.wrap(text).as("queryName")); or below syntax
|
|
|
|
|
|
return cy.get(this.locator._queryName).invoke("text");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-31 05:33:59 +00:00
|
|
|
|
public GetElementLength(selector: string) {
|
2023-06-21 17:37:21 +00:00
|
|
|
|
return this.GetElement(selector).its("length");
|
2022-05-31 05:33:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public Sleep(timeout = 1000) {
|
2023-07-03 06:33:27 +00:00
|
|
|
|
return cy.wait(timeout);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-29 06:22:05 +00:00
|
|
|
|
public RefreshPage(
|
2023-07-20 13:15:27 +00:00
|
|
|
|
networkCallAlias = "getWorkspace", // reloadWithoutCache = true,
|
2023-06-29 06:22:05 +00:00
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.Sleep(2000);
|
|
|
|
|
|
this.assertHelper.AssertDocumentReady();
|
2023-07-06 05:13:15 +00:00
|
|
|
|
// // cy.window()
|
|
|
|
|
|
// // .then((win) => {
|
|
|
|
|
|
// // win.location.reload();
|
|
|
|
|
|
// // })
|
|
|
|
|
|
// cy.reload(reloadWithoutCache).then(() => {
|
|
|
|
|
|
// this.assertHelper.AssertDocumentReady();
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
cy.url().then((url) => {
|
|
|
|
|
|
cy.window({ timeout: 60000 }).then((win) => {
|
|
|
|
|
|
win.location.href = url;
|
|
|
|
|
|
});
|
2023-06-15 13:21:11 +00:00
|
|
|
|
});
|
2023-07-06 05:13:15 +00:00
|
|
|
|
this.assertHelper.AssertDocumentReady();
|
2022-06-06 05:59:15 +00:00
|
|
|
|
this.Sleep(2000);
|
2023-08-18 05:18:35 +00:00
|
|
|
|
networkCallAlias &&
|
|
|
|
|
|
this.assertHelper.AssertNetworkStatus("@" + networkCallAlias); //getWorkspace for Edit page!
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public ActionContextMenuWithInPane({
|
|
|
|
|
|
action = "Delete",
|
2022-05-18 10:39:42 +00:00
|
|
|
|
subAction = "",
|
2023-06-15 13:21:11 +00:00
|
|
|
|
entityType = EntityItems.JSObject,
|
|
|
|
|
|
toastToValidate = "",
|
|
|
|
|
|
}: DeleteParams) {
|
2022-05-18 10:39:42 +00:00
|
|
|
|
cy.get(this.locator._contextMenuInPane).click();
|
2023-05-19 18:37:06 +00:00
|
|
|
|
this.GetNClick(this.locator._contextMenuItem(action));
|
2022-05-18 10:39:42 +00:00
|
|
|
|
if (action == "Delete") {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.DeleteEntityNAssert(entityType);
|
|
|
|
|
|
} else if (subAction) {
|
|
|
|
|
|
this.ActionContextMenuSubItem({
|
|
|
|
|
|
subAction: subAction,
|
|
|
|
|
|
toastToValidate: toastToValidate,
|
|
|
|
|
|
});
|
|
|
|
|
|
toastToValidate && this.AssertContains(toastToValidate);
|
2022-06-10 13:30:59 +00:00
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-16 18:40:10 +00:00
|
|
|
|
public DeleteEntityNAssert(
|
|
|
|
|
|
entityType: EntityItemsType,
|
|
|
|
|
|
toAssertAction = true,
|
|
|
|
|
|
) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
if (entityType != EntityItems.Widget)
|
|
|
|
|
|
this.GetNClick(this.locator._contextMenuItem("Are you sure?"));
|
2023-08-21 07:49:28 +00:00
|
|
|
|
this.Sleep();
|
2023-06-15 13:21:11 +00:00
|
|
|
|
toAssertAction && this.assertHelper.AssertDelete(entityType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ActionContextMenuSubItem({
|
|
|
|
|
|
force = false,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
subAction,
|
|
|
|
|
|
toastToValidate = "",
|
|
|
|
|
|
}: SubActionParams) {
|
|
|
|
|
|
this.GetNClick(this.locator._contextMenuItem(subAction), index, force);
|
|
|
|
|
|
this.Sleep(500);
|
|
|
|
|
|
toastToValidate && this.AssertContains(toastToValidate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-04 04:48:15 +00:00
|
|
|
|
public EnterValueNValidate(valueToType: string, fieldName = "") {
|
2022-06-06 05:59:15 +00:00
|
|
|
|
this.EnterValue(valueToType, {
|
|
|
|
|
|
propFieldName: fieldName,
|
|
|
|
|
|
directInput: false,
|
|
|
|
|
|
inputFieldName: "",
|
|
|
|
|
|
});
|
2022-05-18 10:39:42 +00:00
|
|
|
|
this.VerifyEvaluatedValue(valueToType);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
// by dynamic input value we mean QUERY_DYNAMIC_INPUT_TEXT formControls.
|
2023-02-09 11:09:54 +00:00
|
|
|
|
public TypeDynamicInputValueNValidate(
|
|
|
|
|
|
valueToType: string,
|
|
|
|
|
|
fieldName = "",
|
|
|
|
|
|
isDynamicValue = false,
|
|
|
|
|
|
evaluatedValue = valueToType,
|
|
|
|
|
|
) {
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
this.EnterValue(valueToType, {
|
|
|
|
|
|
propFieldName: fieldName,
|
|
|
|
|
|
directInput: true,
|
|
|
|
|
|
inputFieldName: "",
|
|
|
|
|
|
});
|
2023-02-09 11:09:54 +00:00
|
|
|
|
if (!isDynamicValue) {
|
|
|
|
|
|
this.AssertElementAbsence(this.locator._evaluatedCurrentValue);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.VerifyEvaluatedValue(evaluatedValue);
|
|
|
|
|
|
}
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-06 05:59:15 +00:00
|
|
|
|
public EnterValue(
|
|
|
|
|
|
valueToEnter: string,
|
|
|
|
|
|
options: IEnterValue = DEFAULT_ENTERVALUE_OPTIONS,
|
|
|
|
|
|
) {
|
2023-08-10 07:06:03 +00:00
|
|
|
|
const { apiOrQuery, directInput, inputFieldName, propFieldName } = options;
|
2022-07-01 05:26:57 +00:00
|
|
|
|
if (propFieldName && directInput && !inputFieldName) {
|
2023-08-10 07:06:03 +00:00
|
|
|
|
this.UpdateCodeInput(propFieldName, valueToEnter, apiOrQuery);
|
2022-06-06 05:59:15 +00:00
|
|
|
|
} else if (inputFieldName && !propFieldName && !directInput) {
|
2023-05-11 05:26:03 +00:00
|
|
|
|
this.UpdateCodeInput(
|
|
|
|
|
|
this.locator._inputFieldByName(inputFieldName),
|
|
|
|
|
|
valueToEnter,
|
2022-06-06 05:59:15 +00:00
|
|
|
|
);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
this.AssertAutoSave();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
public VerifyCodeInputValue(propFieldName: string, value: string) {
|
|
|
|
|
|
cy.get(propFieldName).then(($field: any) => {
|
|
|
|
|
|
this.CheckCodeInputValue($field, value);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public BlurInput(propFieldName: string) {
|
|
|
|
|
|
cy.get(propFieldName).then(($field: any) => {
|
|
|
|
|
|
this.BlurCodeInput($field);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-21 11:22:55 +00:00
|
|
|
|
public EnterInputText(
|
|
|
|
|
|
name: string,
|
|
|
|
|
|
input: string,
|
|
|
|
|
|
toClear = false,
|
|
|
|
|
|
isInput = true,
|
|
|
|
|
|
) {
|
|
|
|
|
|
toClear && this.ClearInputText(name);
|
2022-06-16 06:50:02 +00:00
|
|
|
|
cy.xpath(this.locator._inputWidgetValueField(name, isInput))
|
2022-06-21 11:22:55 +00:00
|
|
|
|
.trigger("click")
|
2022-09-16 06:21:25 +00:00
|
|
|
|
.type(input, { parseSpecialCharSequences: false });
|
2022-06-16 06:50:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ClearInputText(name: string, isInput = true) {
|
2023-05-19 18:37:06 +00:00
|
|
|
|
cy.xpath(this.locator._inputWidgetValueField(name, isInput)).clear({
|
|
|
|
|
|
force: true,
|
|
|
|
|
|
});
|
2022-06-16 06:50:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-10 07:06:03 +00:00
|
|
|
|
public UpdateCodeInput(
|
|
|
|
|
|
selector: string,
|
|
|
|
|
|
value: string,
|
|
|
|
|
|
apiOrQuery: "api" | "query" = "query",
|
|
|
|
|
|
) {
|
2023-05-11 05:26:03 +00:00
|
|
|
|
this.EnableAllCodeEditors();
|
|
|
|
|
|
|
|
|
|
|
|
const isXPathSelector =
|
|
|
|
|
|
selector.startsWith("//") || selector.startsWith("(//");
|
|
|
|
|
|
// A previous version of this code used a more simple `this.GetElement(xPathOrCssSelector).find(".CodeMirror")` command.
|
|
|
|
|
|
// However, occasionally, this would lead to a race condition: React would re-render between calls to `this.GetElement()`
|
|
|
|
|
|
// and `.find(".CodeMirror")`, causing the element from the first call to be detached from the DOM.
|
|
|
|
|
|
// Relevant docs: http://web.archive.org/web/20210618235924/https://docs.cypress.io/guides/core-concepts/retry-ability#Only-the-last-command-is-retried
|
|
|
|
|
|
//
|
|
|
|
|
|
// This was fixed in Cypress 12 (https://github.com/cypress-io/cypress/issues/7306), which started to retry
|
|
|
|
|
|
// the entire query chain (https://docs.cypress.io/guides/core-concepts/retry-ability#Only-queries-are-retried),
|
|
|
|
|
|
// but until we’ve upgraded to v12, we can’t rely on that and have to fit everything into a single query.
|
|
|
|
|
|
const codeMirrorSelector = isXPathSelector
|
|
|
|
|
|
? selector +
|
|
|
|
|
|
"//*[contains(concat(' ', normalize-space(@class), ' '), ' CodeMirror ')]"
|
|
|
|
|
|
: selector + " .CodeMirror";
|
|
|
|
|
|
this.GetElement(codeMirrorSelector)
|
2022-08-18 06:30:28 +00:00
|
|
|
|
.find("textarea")
|
|
|
|
|
|
.parents(".CodeMirror")
|
2022-05-18 10:39:42 +00:00
|
|
|
|
.first()
|
2023-05-11 05:26:03 +00:00
|
|
|
|
.then((ins) => {
|
|
|
|
|
|
const input = (ins[0] as any).CodeMirror as CodeMirror.Editor;
|
2023-08-10 07:06:03 +00:00
|
|
|
|
if (apiOrQuery === "api") {
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
input.setValue(value);
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
// Move cursor to the end of the line
|
|
|
|
|
|
input.execCommand("goLineEnd");
|
|
|
|
|
|
}, 300);
|
|
|
|
|
|
}, 300);
|
|
|
|
|
|
}, 300);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.setValue(value);
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.execCommand("goLineEnd");
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
}
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
2023-03-20 17:20:44 +00:00
|
|
|
|
this.Sleep(500); //for value set to settle
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-20 08:58:06 +00:00
|
|
|
|
public UpdateFieldInput(selector: string, value: string) {
|
2023-04-04 15:56:57 +00:00
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.find("input")
|
|
|
|
|
|
.invoke("attr", "value", value)
|
|
|
|
|
|
.trigger("input");
|
|
|
|
|
|
this.Sleep(); //for value set to settle
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-24 10:29:05 +00:00
|
|
|
|
public ValidateFieldInputValue(selector: string, value: string) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.closest("input")
|
|
|
|
|
|
.scrollIntoView({ easing: "linear" })
|
|
|
|
|
|
.invoke("val")
|
|
|
|
|
|
.then((inputValue) => {
|
|
|
|
|
|
expect(inputValue).to.equal(value);
|
|
|
|
|
|
});
|
|
|
|
|
|
this.Sleep(); //for value set to settle
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-28 20:07:07 +00:00
|
|
|
|
public UpdateTextArea(selector: string, value: string) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.find("textarea")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.invoke("val", value)
|
|
|
|
|
|
.trigger("input");
|
|
|
|
|
|
this.Sleep(500); //for value set to settle
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-06 04:07:04 +00:00
|
|
|
|
public TypeIntoTextArea(selector: string, value: string) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.find("textarea")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.type(value, { delay: 0, force: true, parseSpecialCharSequences: false });
|
|
|
|
|
|
this.Sleep(500); //for value set to settle
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-06 08:20:58 +00:00
|
|
|
|
public UpdateInputValue(selector: string, value: string, force = false) {
|
2023-03-15 05:03:34 +00:00
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.closest("input")
|
2023-06-20 08:58:06 +00:00
|
|
|
|
.scrollIntoView({ easing: "linear" })
|
2023-07-06 08:20:58 +00:00
|
|
|
|
.clear({ force })
|
2023-06-20 08:58:06 +00:00
|
|
|
|
.then(($input: any) => {
|
|
|
|
|
|
if (value !== "") {
|
|
|
|
|
|
cy.wrap($input).type(value, { delay: 3 });
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2023-03-15 05:03:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
public BlurCodeInput(selector: string) {
|
|
|
|
|
|
cy.wrap(selector)
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
input.display.input.blur();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-09 11:09:54 +00:00
|
|
|
|
public FocusCodeInput(selector: string) {
|
|
|
|
|
|
cy.wrap(selector)
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
input.focus();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
// input.display.input.blur();
|
|
|
|
|
|
// this.Sleep(200);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DragEvaluatedValuePopUp(x: number, y: number) {
|
2023-08-01 09:34:15 +00:00
|
|
|
|
(
|
|
|
|
|
|
cy
|
|
|
|
|
|
.get(this.locator._evaluatedCurrentValue)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.should("be.visible") as any
|
|
|
|
|
|
).realHover({ pointer: "mouse" });
|
2023-02-09 11:09:54 +00:00
|
|
|
|
cy.get(this.locator._evaluatedValuePopDragHandler)
|
|
|
|
|
|
.trigger("mousedown", { which: 1 })
|
|
|
|
|
|
.trigger("mousemove", { clientX: x, clientY: y })
|
|
|
|
|
|
.trigger("mouseup", { force: true });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public FocusAndDragEvaluatedValuePopUp(
|
|
|
|
|
|
options: IEnterValue = DEFAULT_ENTERVALUE_OPTIONS,
|
|
|
|
|
|
x = 0,
|
|
|
|
|
|
y = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
const { directInput, inputFieldName, propFieldName } = options;
|
|
|
|
|
|
if (propFieldName && directInput && !inputFieldName) {
|
|
|
|
|
|
cy.get(propFieldName).then(($field: any) => {
|
|
|
|
|
|
this.FocusCodeInput($field);
|
|
|
|
|
|
this.DragEvaluatedValuePopUp(x, y);
|
|
|
|
|
|
});
|
|
|
|
|
|
} else if (inputFieldName && !propFieldName && !directInput) {
|
|
|
|
|
|
cy.xpath(this.locator._inputFieldByName(inputFieldName)).then(
|
|
|
|
|
|
($field: any) => {
|
|
|
|
|
|
this.FocusCodeInput($field);
|
|
|
|
|
|
this.DragEvaluatedValuePopUp(x, y);
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
public CheckCodeInputValue(selector: string, expectedValue: string) {
|
|
|
|
|
|
cy.wrap(selector)
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins: any) => {
|
|
|
|
|
|
const input = ins[0].CodeMirror;
|
|
|
|
|
|
const inputVal = input.getValue();
|
|
|
|
|
|
this.Sleep(200);
|
|
|
|
|
|
expect(inputVal).to.eq(expectedValue);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-09 11:09:54 +00:00
|
|
|
|
public ReturnCodeInputValue(selector: string) {
|
|
|
|
|
|
let inputVal = "";
|
|
|
|
|
|
this.GetElement(selector).then(($field) => {
|
|
|
|
|
|
cy.wrap($field)
|
|
|
|
|
|
.find(".CodeMirror-code span")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.invoke("text")
|
|
|
|
|
|
.then((text1) => {
|
|
|
|
|
|
inputVal = text1;
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
//if (currentValue) expect(val).to.eq(currentValue);
|
|
|
|
|
|
// to be chained with another cy command.
|
|
|
|
|
|
return cy.wrap(inputVal);
|
|
|
|
|
|
|
|
|
|
|
|
// cy.xpath(this.locator._existingFieldValueByName(selector)).then(
|
|
|
|
|
|
// ($field: any) => {
|
|
|
|
|
|
// cy.wrap($field)
|
|
|
|
|
|
// .find(".CodeMirror")
|
|
|
|
|
|
// .first()
|
|
|
|
|
|
// .then((ins: any) => {
|
|
|
|
|
|
// const input = ins[0].CodeMirror;
|
|
|
|
|
|
// inputVal = input.getValue();
|
|
|
|
|
|
// this.Sleep(200);
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
// // to be chained with another cy command.
|
|
|
|
|
|
// return inputVal;
|
|
|
|
|
|
// },
|
|
|
|
|
|
// );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-21 10:25:41 +00:00
|
|
|
|
public VerifyEvaluatedErrorMessage(errorMessage: string) {
|
|
|
|
|
|
cy.get(this.locator._evaluatedErrorMessage)
|
|
|
|
|
|
.should("be.visible")
|
|
|
|
|
|
.should("have.text", errorMessage);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-09 11:09:54 +00:00
|
|
|
|
// this should only be used when we want to verify the evaluated value of dynamic bindings for example {{Api1.data}} or {{"asa"}}
|
|
|
|
|
|
// and should not be called for plain strings
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public VerifyEvaluatedValue(currentValue: string) {
|
|
|
|
|
|
this.Sleep(3000);
|
|
|
|
|
|
cy.get(this.locator._evaluatedCurrentValue)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.should("be.visible")
|
|
|
|
|
|
.should("not.have.text", "undefined");
|
|
|
|
|
|
cy.get(this.locator._evaluatedCurrentValue)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.click({ force: true })
|
|
|
|
|
|
.then(($text) => {
|
|
|
|
|
|
if ($text.text()) expect($text.text()).to.eq(currentValue);
|
feat: Simplified Google Sheets queries (#14869)
* Client changes 1
* add DSL functionality
* Temp commit for refactoring changes
* Do I even know what I'm doing here?
* chore: Second GS layout
* Update: Visibility conditional outputs for schemas
- Added the output from conditional outputs for schema children too
* Update: Entity selector visibility control
- Added logic for controlling visibility of sub components via the JS expressions system
* Update: Passing disabled prop to toggle button
* Update: Passing disabled prop to toggle btn
* Update: Styled component for toggle button
- Added disabled styles based on the disabled prop sent to the toggle form view JSON button
* Update: configProperty role in Entity Selector
- Removed dependance of the configProperty of the entity selector children to it's parent component
* Update: type of placeholder key
- Made placeholder key from form config JSON to accept either string or an object
- Earlier only string was accepted
- This is for pagination component
* Update: Added placeholder control for pagination
* Client changes 1
* add DSL functionality
* Do I even know what I'm doing here?
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* temp triggers
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design (#12395)
* fix: updated uqi forms ui, clubbed JS switch button to ads, updated tooltip design
* fix: updated tooltip component for wrong ui on entity explore
* fix: updated tooltip ui, where condition placement, sort by ui
* temp form data access logic
* fix: updated sorting type width ui
* fix: updated ui for spacing, width and text issues
* Update: Type for tooltip of UQI forms
- Added option to send an object to the tooltipText object.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: tooltip for pagination component
- Added handling to parse the tooltip for multiple components.
- This allows for composite components like pagination to have tooltips for each sub component
* Update: Type cast for tooltip component
- Made the content passed to tooltip component as a string only
* Update: Fixed tooltip component CSS
* Update: Dropdown option component
- Added a tooltip wrapper to each option
- This is to show on hover text like disabled state
* fix: updated ẇhere clause broken ui for condition
* Add: functions to check and extract expressions
- Loop through the formConfig and find any keys that have a value that is bindable
- Used pre defined regex to check if value is a moustache binding
* Add: Types for evaluated form configs
- Added types for the form configs to be evaluated and their output post eval
* Add: Flow to run the form config
- Run the form config and update the result to the redux state
* Update: Name of the type for formconfigs
- Updated since it was clashing with a component of the same name
* Add: Function to enforce config type checks
- This is done so that the improper configs can be weeded out and the rest of the form can be shown
* Add: Function to update evaluated config
- Added option to update the config if it's values needed evaluation
* Add: Type check for schema sections
* Update: Error handling for invalid control type
- We were throwing an exception till now, changed it to a warning text
* Add: Exposed tooltip for dropdown option disabled state
* Update: switch to json mode functionality
- Added logic to convert data to a string rather than an object when the first switch to JSON mode happens
* Update: Added key to tooltip for dropdown options
* Trigger API modification
* Add: function to fetch default trigger URL
* Update: Made URL optional in dynamic trigger config
* Update: Dynamic trigger API call
- Made the API call for dynamic triggers have URL as optional field
- Added type check to the response of the API call
* Update: resp type for trigger APIs
* Update: Moved code to utils folder
- Moved functions for UQI form eval processing to utils file
* Update: passing original controltype to JS switch
* Update: config for JSON editor mode
- Updated the config to have different options for JSON mode depending on the original control type
* Update: Connected line numbers flag to config
* Revert: CSS changes for tooltip
* Refactor: Removed consle
* Add: type for the config of dynamic values
* Add: Feature to evaluate config for triggers
* Refactor: fix type check errors
* fix: dropdown ui width with text alignment
* Update: fixed selector for dynamic values
* Update: selector call for fetchDynamicValues
* Add table header index prop for columns selector
* migration partial commit
* migration partial commit
* Refactor: removed unused import
* Update: reused function for checking dynamic value
* Update: removed unused import
* Fix format JSON issues
* Retrieve binding paths from entity selector components
* Fixes 6 remaining issues with UQI implementation
* Fix dropdown issues
* Fix dropdown height issues and fixes triggering of APIs when option is deselected
* Migration changes
* Fix QA generated UQI issues
* Fix projection component height and route change logic
* Fix multi select dropdown placeholder text issue and json stringify issue with switching view types
* Reset entity type value when command value changes
* Test changes
* Review comments
* Moved migrations around
* Corrected import statement
* Added JSON schema migration
* Updated schema version
* perf improvements and filter dropdown options feature
* Fix Code mirror component config for toggleComponentToJson input fields.
* Fix prettier issues
* fix prettier issues
* Fix style issues as a result of the merged conflicts
* Fix failing test case
* Fixed a few other flows (#14225)
* Fixed a few other flows
* Review comments
* Fix generate CRUD, fix evaluation of dynamic bindings and fix various styling issues.
* More fixes (#14367)
* Factor in the root formconfig parent key.
* Fix flickering issues, and evaluatedFormConfig issues
* fix: Teeny bugs (#14455)
* Teeny bugs
* Added previous functionality as is
* Improvements in the way we fetch dynamic values
* Fix stringiification issue and cyclic dependency issues
* Resolve projection component values deletion
* Resolve merge conflicts and fix prettier issues
* fix: Tsc issues
* Fix property pane connection navigation
* updating ee locator
* updating inputfield locator
* dropdown locator update
* Merge conflict not properly resolved.
* Fix s3 spec
* Fix Mongo Spec
* Fix some more tests
* fix: prevent cyclic dependency when switching to js mode (#14668)
* add delete events for change from array to string in diff
* add test to assert absence of cyclic dependency error when switching to js in switchgroup widget
* Assert that evaluation is not disabled when no cyclic dependency happens
* Cypress test preparations for google sheets and form controls
* Fixed a few test errors (#14874)
* Add: unit tests for uqi UI updates
- view type tests
- conditional output extraction
- processing conditional output to handle view/enabled state of the component
* Add: completed isValidFormConfig test
* Update: improved tests for update config
- These tests cover the functionality to update a section config after it's components are done evaluating
* Fix failing cypress tests and cyclic dependency issue
* Fixes some more tests
* Fixed migration of row objects (#14896)
* Bumped the version of design system package
* Update: reverted change to EE selector
* Fix deletion pointer
* Update: selector for js on load spec
- Synced with changes related to ADS dropdown
* Fix mongoDBShoppingCart spec
* Remove comments
* Fix: mongo shopping cart test failures
* fix: mongo shopping cart spec
* Dummy push to retrigger vercel
* fix: mongo shopping cart spec
* Update MongoDBShoppingCart_spec.js
* fix: removed unused click away
* dummy commit
* Update: moved helper functions to separate file
* Add: added tests for saga functions
- Worked on testing for
- extractFetchDynamicValueFormConfigs
- extractQueueOfValuesToBeFetched
* Add if check for queueOfValuesToBeFetched
* Resolve review comments
* Empty-Commit
Co-authored-by: Irongade <adeoluayangade@yahoo.com>
Co-authored-by: Ayush Pahwa <ayush@appsmith.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Ayangade Adeoluwa <37867493+Irongade@users.noreply.github.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Favour Ohanekwu <fohanekwu@gmail.com>
Co-authored-by: Albin <albin@appsmith.com>
2022-07-04 05:43:27 +00:00
|
|
|
|
})
|
|
|
|
|
|
.trigger("mouseout")
|
|
|
|
|
|
.then(() => {
|
|
|
|
|
|
cy.wait(2000);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-21 07:49:28 +00:00
|
|
|
|
public UploadFile(fixtureName: string, toClickUpload = true, index = 0) {
|
2023-05-24 12:30:39 +00:00
|
|
|
|
//cy.fixture(fixtureName).as("selectFileFixture");//giving issue, hence using directly as below
|
|
|
|
|
|
cy.get(this.locator._uploadFiles)
|
2023-08-21 07:49:28 +00:00
|
|
|
|
.eq(index)
|
2023-05-24 12:30:39 +00:00
|
|
|
|
.selectFile("cypress/fixtures/" + fixtureName, { force: true })
|
|
|
|
|
|
.wait(3000);
|
2022-09-07 18:25:55 +00:00
|
|
|
|
toClickUpload && this.GetNClick(this.locator._uploadBtn, 0, false);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-02 01:05:45 +00:00
|
|
|
|
public AssertElementAbsence(selector: ElementType, timeout = 0) {
|
2022-06-06 05:59:15 +00:00
|
|
|
|
//Should not exists - cannot take indexes
|
2022-09-02 01:05:45 +00:00
|
|
|
|
return this.GetElement(selector, timeout).should("not.exist");
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-23 05:20:27 +00:00
|
|
|
|
public GetText(
|
2022-08-27 12:40:11 +00:00
|
|
|
|
selector: ElementType,
|
2022-05-23 05:20:27 +00:00
|
|
|
|
textOrValue: "text" | "val" = "text",
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return this.GetElement(selector).eq(index).invoke(textOrValue);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-20 12:08:48 +00:00
|
|
|
|
AssertHeight(selector: ElementType, height: number) {
|
|
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.invoke("height")
|
2023-04-20 15:12:35 +00:00
|
|
|
|
.should("be.closeTo", height, 1);
|
2022-10-20 12:08:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-02 01:05:45 +00:00
|
|
|
|
public AssertText(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
textOrValue: "text" | "val" = "text",
|
|
|
|
|
|
expectedData: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.invoke(textOrValue)
|
|
|
|
|
|
.should("deep.equal", expectedData);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-11 14:42:32 +00:00
|
|
|
|
public AssertElementFocus(selector: ElementType, isFocused = true) {
|
|
|
|
|
|
if (isFocused) return this.GetElement(selector).should("be.focused");
|
|
|
|
|
|
return this.GetElement(selector).should("not.be.focused");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-10 07:06:03 +00:00
|
|
|
|
public AssertElementVisibility(
|
2023-04-11 19:04:32 +00:00
|
|
|
|
selector: ElementType,
|
2023-08-10 07:06:03 +00:00
|
|
|
|
visibility = true,
|
2023-04-11 19:04:32 +00:00
|
|
|
|
index = 0,
|
|
|
|
|
|
timeout = 20000,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(selector, timeout)
|
2022-06-10 13:30:59 +00:00
|
|
|
|
.eq(index)
|
|
|
|
|
|
.scrollIntoView()
|
2023-08-10 07:06:03 +00:00
|
|
|
|
.should(visibility == true ? "be.visible" : "not.be.visible");
|
2023-08-08 18:10:22 +00:00
|
|
|
|
//return this.ScrollIntoView(selector, index, timeout).should("be.visible");//to find out why this is failing.
|
2023-08-01 04:02:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-18 09:24:15 +00:00
|
|
|
|
public CheckForErrorToast(error: string) {
|
|
|
|
|
|
cy.get("body").then(($ele) => {
|
|
|
|
|
|
if ($ele.find(this.locator._toastMsg).length) {
|
|
|
|
|
|
if ($ele.find(this.locator._specificToast(error)).length) {
|
|
|
|
|
|
throw new Error("Error Toast from Application:" + error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-02 10:48:35 +00:00
|
|
|
|
public AssertElementExist(selector: ElementType, index = 0, timeout = 20000) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return this.GetElement(selector, timeout).eq(index).should("exist");
|
2022-05-31 05:33:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-20 08:58:06 +00:00
|
|
|
|
public ScrollIntoView(selector: ElementType, index = 0, timeout = 20000) {
|
|
|
|
|
|
return this.GetElement(selector, timeout)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.then(($element) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
Cypress.$("body").find($element).length &&
|
|
|
|
|
|
$element[0].offsetParent !== null
|
|
|
|
|
|
) {
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$element[0].scrollIntoView();
|
|
|
|
|
|
return $element;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
public AssertElementLength(
|
2022-08-27 12:40:11 +00:00
|
|
|
|
selector: ElementType,
|
2022-05-18 10:39:42 +00:00
|
|
|
|
length: number,
|
|
|
|
|
|
index: number | null = null,
|
|
|
|
|
|
) {
|
2022-08-27 12:40:11 +00:00
|
|
|
|
if (index)
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return this.GetElement(selector).eq(index).should("have.length", length);
|
2022-08-27 12:40:11 +00:00
|
|
|
|
else return this.GetElement(selector).should("have.length", length);
|
2022-05-18 10:39:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public FocusElement(selector: ElementType) {
|
|
|
|
|
|
this.GetElement(selector).focus();
|
2022-07-29 08:48:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public AssertContains(
|
|
|
|
|
|
text: string | RegExp,
|
2023-02-24 12:18:48 +00:00
|
|
|
|
exists: "exist" | "not.exist" | "be.visible" = "exist",
|
2022-10-17 15:16:38 +00:00
|
|
|
|
selector?: string,
|
2022-08-27 12:40:11 +00:00
|
|
|
|
) {
|
2022-10-17 15:16:38 +00:00
|
|
|
|
if (selector) {
|
|
|
|
|
|
return cy.contains(selector, text).should(exists);
|
|
|
|
|
|
}
|
2022-07-21 13:01:23 +00:00
|
|
|
|
return cy.contains(text).should(exists);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-27 12:40:11 +00:00
|
|
|
|
public GetNAssertContains(
|
|
|
|
|
|
selector: ElementType,
|
2022-10-20 12:08:48 +00:00
|
|
|
|
text: string | number | RegExp,
|
2022-08-27 12:40:11 +00:00
|
|
|
|
exists: "exist" | "not.exist" = "exist",
|
|
|
|
|
|
) {
|
2023-08-21 07:49:28 +00:00
|
|
|
|
return this.GetElement(selector).contains(text).should(exists);
|
2022-08-04 04:48:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-15 13:21:11 +00:00
|
|
|
|
public AssertURL(url: string) {
|
2022-12-09 05:06:52 +00:00
|
|
|
|
cy.url().should("include", url);
|
2023-08-08 09:14:46 +00:00
|
|
|
|
this.Sleep(); //settle time for new url!
|
2022-12-09 05:06:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-18 06:30:28 +00:00
|
|
|
|
public ScrollTo(
|
2022-08-27 12:40:11 +00:00
|
|
|
|
selector: ElementType,
|
2022-08-18 06:30:28 +00:00
|
|
|
|
position:
|
|
|
|
|
|
| "topLeft"
|
|
|
|
|
|
| "top"
|
|
|
|
|
|
| "topRight"
|
|
|
|
|
|
| "left"
|
|
|
|
|
|
| "center"
|
|
|
|
|
|
| "right"
|
|
|
|
|
|
| "bottomLeft"
|
|
|
|
|
|
| "bottom"
|
|
|
|
|
|
| "bottomRight",
|
|
|
|
|
|
) {
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
|
return this.GetElement(selector).scrollTo(position).wait(2000);
|
2022-08-18 06:30:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-16 18:40:10 +00:00
|
|
|
|
public GetWidth(widgetSelector: string) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.GetElement(widgetSelector).then(($element) => {
|
2023-06-16 18:40:10 +00:00
|
|
|
|
cy.wrap(Number($element.width())).as("eleWidth");
|
2023-06-15 13:21:11 +00:00
|
|
|
|
});
|
2023-05-30 02:40:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-16 18:40:10 +00:00
|
|
|
|
public GetHeight(widgetSelector: string) {
|
2023-06-15 13:21:11 +00:00
|
|
|
|
this.GetElement(widgetSelector).then(($element) => {
|
2023-06-16 18:40:10 +00:00
|
|
|
|
cy.wrap(Number($element.height())).as("eleHeight");
|
2023-06-15 13:21:11 +00:00
|
|
|
|
});
|
2023-05-30 02:40:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-07 06:52:06 +00:00
|
|
|
|
public GetWidgetCSSHeight(widgetSelector: string, index = 0) {
|
|
|
|
|
|
return this.GetElement(widgetSelector).eq(index).invoke("css", "height");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GetWidgetCSSFrAttribute(
|
|
|
|
|
|
widgetSelector: string,
|
|
|
|
|
|
attribute: string,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return this.GetElement(widgetSelector).eq(index).invoke("css", attribute);
|
2023-06-09 14:40:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-30 02:40:13 +00:00
|
|
|
|
GetWidgetByName(widgetName: string) {
|
|
|
|
|
|
return this.GetElement(this.locator._widgetByName(widgetName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-07-20 09:26:12 +00:00
|
|
|
|
public EnableAllEditors() {
|
2022-07-21 13:01:23 +00:00
|
|
|
|
this.Sleep(2000);
|
2022-07-20 09:26:12 +00:00
|
|
|
|
cy.get("body").then(($body: any) => {
|
|
|
|
|
|
if ($body.get(this.locator._codeEditorWrapper)?.length > 0) {
|
|
|
|
|
|
let count = $body.get(this.locator._codeEditorWrapper)?.length || 0;
|
|
|
|
|
|
while (count) {
|
|
|
|
|
|
$body
|
|
|
|
|
|
.get(this.locator._codeEditorWrapper)
|
|
|
|
|
|
?.eq(0)
|
|
|
|
|
|
.then(($el: any) => $el.click({ force: true }).wait(100));
|
|
|
|
|
|
count = $body.find(this.locator._codeEditorWrapper)?.length || 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-07-21 13:01:23 +00:00
|
|
|
|
this.Sleep();
|
2022-07-20 09:26:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-13 11:40:58 +00:00
|
|
|
|
public AssertElementEnabledDisabled(
|
|
|
|
|
|
selector: ElementType,
|
|
|
|
|
|
index = 0,
|
|
|
|
|
|
disabled = true,
|
|
|
|
|
|
) {
|
2023-08-21 07:49:28 +00:00
|
|
|
|
return this.GetElement(selector)
|
|
|
|
|
|
.eq(index)
|
|
|
|
|
|
.should(disabled ? "have.attr" : "not.have.attr", "disabled");
|
2023-01-13 11:40:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-11 05:26:03 +00:00
|
|
|
|
// Waits until all LazyCodeEditor wrappers finished loading the actual code editor.
|
|
|
|
|
|
// Called “EnableAllCodeEditors” to match the command in the JS part of the Cypress codebase
|
|
|
|
|
|
// with the same name.
|
|
|
|
|
|
public EnableAllCodeEditors() {
|
|
|
|
|
|
cy.get(this.lazyCodeEditorFallback, { timeout: 60000 }).should("not.exist");
|
2023-05-30 04:32:47 +00:00
|
|
|
|
// Code editors might not always be present on the page, so we need to check for their existence first
|
|
|
|
|
|
// (https://docs.cypress.io/guides/core-concepts/conditional-testing#Element-existence)
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
|
if ($body.find(this.lazyCodeEditorRendered).length === 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
return cy.get(this.lazyCodeEditorRendered).each(($el) => {
|
|
|
|
|
|
cy.wrap($el).find(".CodeMirror").should("exist");
|
|
|
|
|
|
});
|
2023-05-11 05:26:03 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-26 16:03:13 +00:00
|
|
|
|
public AssertNewTabOpened(openTabFunc: () => void) {
|
|
|
|
|
|
cy.window().then((win) => {
|
|
|
|
|
|
cy.spy(win, "open").as("windowOpen");
|
|
|
|
|
|
openTabFunc();
|
2023-06-30 18:46:57 +00:00
|
|
|
|
cy.get("@windowOpen").should("be.called");
|
2023-04-26 16:03:13 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-10 07:06:03 +00:00
|
|
|
|
public VisitNAssert(url: string, apiToValidate = "", waitTime = 3000) {
|
2023-06-16 18:40:10 +00:00
|
|
|
|
cy.visit(url, { timeout: 60000 });
|
2023-08-10 07:06:03 +00:00
|
|
|
|
// cy.window({ timeout: 60000 }).then((win) => {
|
|
|
|
|
|
// win.location.href = url;
|
|
|
|
|
|
// });
|
2023-08-08 09:14:46 +00:00
|
|
|
|
this.Sleep(waitTime); //for new url to settle
|
2023-06-15 13:21:11 +00:00
|
|
|
|
if (apiToValidate.includes("getReleaseItems") && Cypress.env("AIRGAPPED")) {
|
|
|
|
|
|
this.Sleep(2000);
|
2023-06-18 04:55:16 +00:00
|
|
|
|
} else
|
|
|
|
|
|
apiToValidate && this.assertHelper.AssertNetworkStatus(apiToValidate);
|
2023-05-31 06:39:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-10 04:32:42 +00:00
|
|
|
|
public GetDropTargetId(widgetName: string) {
|
|
|
|
|
|
return this.GetWidgetByName(widgetName).invoke("attr", "id");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public GetModalDropTargetId() {
|
|
|
|
|
|
return this.GetElement(this.locator._modal).invoke("attr", "id");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-19 09:05:31 +00:00
|
|
|
|
public BrowserNavigation(direction: number) {
|
|
|
|
|
|
//passing 1 works as browser back
|
|
|
|
|
|
//passing -1 works as browser forward
|
|
|
|
|
|
cy.go(direction);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-17 13:47:56 +00:00
|
|
|
|
public AssertCursorInput($selector: string, cursor = { ch: 0, line: 0 }) {
|
|
|
|
|
|
this.EnableAllCodeEditors();
|
|
|
|
|
|
cy.get($selector)
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.find(".CodeMirror")
|
|
|
|
|
|
.first()
|
|
|
|
|
|
.then((ins) => {
|
|
|
|
|
|
const input = (ins[0] as any).CodeMirror;
|
|
|
|
|
|
// The input gets focused with a slight delay so we need to wait for it
|
|
|
|
|
|
cy.waitUntil(() => input.hasFocus()).then(() => {
|
|
|
|
|
|
const editorCursor = input.getCursor();
|
|
|
|
|
|
expect(editorCursor.ch).to.equal(cursor.ch);
|
|
|
|
|
|
expect(editorCursor.line).to.equal(cursor.line);
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-01 14:50:47 +00:00
|
|
|
|
public GetAttribute(selector: string, attribName: string, index = 0) {
|
|
|
|
|
|
return this.GetElement(selector).eq(index).invoke("attr", attribName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
fix: entity explorer issue with datasources is fixed (#26770)
## Description
This PR fixes issue with datasource not getting highlighted in entity
explorer:
Suppose we have 3 datasources in our applications: Users, Movies, and
one Postgres or MySQL datasource. Once we create these datasources, we
can see them getting populated in entity explorer -> datasource section.
So there were two issues here:
- If I select Users, I am able to see the Users datasource info on the
right pane but its not active in the entity explorer, Similarly If I
switch to movies, right pane gets updated with movies info but in the
entity explorer, we cannot see movies getting highlighted as thats the
active selection
- If I am on Users datasource review page, I reload the page, now I can
see active selection of Users being highlighted in the entity explorer,
but now if we switch to Movies, right pane gets updated but in entity
explorer Users is highlighted, which is incorrect
This issue occurred because we have used useMemo for
`datasourceElements`, two dependency passed are appWideDS and pageId,
whenever we switch between datasources, `activeDatasourceId` gets
updated but since we have cached the whole datasource listing component
without the dependency of `activeDatasourceId`, it does not recompute
and shows the same state as before.
To fix the issue, `activeDatasourceId` needs to be passed in the
dependency array. After adding this new dependency, another issue
occurred with respect to entity explorer, The order of suggested
datasources would change in entity explorer, This PR addresses that
issue as well.
#### PR fixes following issue(s)
Fixes #26716
> if no issue exists, please create an issue and ask the maintainers
about this first
>
>
#### Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video
>
>
#### Type of change
- Bug fix (non-breaking change which fixes an issue)
>
>
>
## Testing
>
#### How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Also
list any relevant details for your test configuration.
> Delete anything that is not relevant
- [x] Manual
- [ ] JUnit
- [x] Jest
- [ ] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
>
>
## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [x] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
---------
Co-authored-by: “sneha122” <“sneha@appsmith.com”>
2023-09-01 07:56:34 +00:00
|
|
|
|
public AssertClassExists(selector: string, className: string) {
|
2023-09-07 18:18:33 +00:00
|
|
|
|
this.GetElement(selector).should("have.class", className);
|
fix: entity explorer issue with datasources is fixed (#26770)
## Description
This PR fixes issue with datasource not getting highlighted in entity
explorer:
Suppose we have 3 datasources in our applications: Users, Movies, and
one Postgres or MySQL datasource. Once we create these datasources, we
can see them getting populated in entity explorer -> datasource section.
So there were two issues here:
- If I select Users, I am able to see the Users datasource info on the
right pane but its not active in the entity explorer, Similarly If I
switch to movies, right pane gets updated with movies info but in the
entity explorer, we cannot see movies getting highlighted as thats the
active selection
- If I am on Users datasource review page, I reload the page, now I can
see active selection of Users being highlighted in the entity explorer,
but now if we switch to Movies, right pane gets updated but in entity
explorer Users is highlighted, which is incorrect
This issue occurred because we have used useMemo for
`datasourceElements`, two dependency passed are appWideDS and pageId,
whenever we switch between datasources, `activeDatasourceId` gets
updated but since we have cached the whole datasource listing component
without the dependency of `activeDatasourceId`, it does not recompute
and shows the same state as before.
To fix the issue, `activeDatasourceId` needs to be passed in the
dependency array. After adding this new dependency, another issue
occurred with respect to entity explorer, The order of suggested
datasources would change in entity explorer, This PR addresses that
issue as well.
#### PR fixes following issue(s)
Fixes #26716
> if no issue exists, please create an issue and ask the maintainers
about this first
>
>
#### Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video
>
>
#### Type of change
- Bug fix (non-breaking change which fixes an issue)
>
>
>
## Testing
>
#### How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Also
list any relevant details for your test configuration.
> Delete anything that is not relevant
- [x] Manual
- [ ] JUnit
- [x] Jest
- [ ] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
>
>
## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [ ] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [x] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [ ] Cypress test cases have been added and approved by SDET/manual QA
- [ ] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
---------
Co-authored-by: “sneha122” <“sneha@appsmith.com”>
2023-09-01 07:56:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-18 10:39:42 +00:00
|
|
|
|
//Not used:
|
|
|
|
|
|
// private xPathToCss(xpath: string) {
|
|
|
|
|
|
// return xpath
|
|
|
|
|
|
// .replace(/\[(\d+?)\]/g, function (s, m1) { return '[' + (m1 - 1) + ']'; })
|
|
|
|
|
|
// .replace(/\/{2}/g, '')
|
|
|
|
|
|
// .replace(/\/+/g, ' > ')
|
|
|
|
|
|
// .replace(/@/g, '')
|
|
|
|
|
|
// .replace(/\[(\d+)\]/g, ':eq($1)')
|
|
|
|
|
|
// .replace(/^\s+/, '');
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// Cypress.Commands.add("byXpath", (xpath) => {
|
|
|
|
|
|
// const iterator = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null)
|
|
|
|
|
|
// const items = [];
|
|
|
|
|
|
// let item = iterator.iterateNext();
|
|
|
|
|
|
// while (item) {
|
|
|
|
|
|
// items.push(item);
|
|
|
|
|
|
// item = iterator.iterateNext();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return items;
|
|
|
|
|
|
// }, { timeout: 5000 });
|
|
|
|
|
|
}
|