mirror of
https://github.com/ToolJet/ToolJet
synced 2026-04-21 21:47:17 +00:00
* global store init * Moved query data to new component * Removed unwanted code * Removed data queries prop drilling * Moved query state out of editor * Added unsafe to componentWillReceiveProps * Selected first query when the version is changed * Fixed bug on renaming query * Fixed issue on dark theme * Fixed running query on page load in viewer * Query manager refactor init * Added global data source in store * Disabled devtools on production * Fixed bug on selecting query after deletion * Reset store when editor is loaded * Moved query manager to functional component * Fixed conflict issues * Fixed infinite loop on tooljetDB * Set the store name and updated devtools logic * Fixed issue on displaying draft query from data sources * Updated comments on the store * Fixed bug on changing data source and creating query from data source * Fixed bug on showing unsaved changes popup * Fixed issue on showing confirmation modal everytime without any changes * feat: autosave data query functionality * feat: show publish button only when the status in draft state * Fixed issues on query renaming * feat: removed discard popup for data query create/edit widget * stye: reduced autosave api call timeout and added draft tag * feat: added minor style changes * feat: fixed issues with restapi plugin, removed unused api calls * fix: fixed issue that breaks restapi creation * fix: reload selected query details after update query * perf: reduced debounce time for data query update apis * feat: removed full reloading of query list on query renaming * feat: duplicate data query feature added * Fixed issue on creating restAPI query * fix: fixed issue in transforming response from update queyr api * fix: refresh selected query details when the selected query is updated * fix: rename query on click enter * fix: full refresh of query list on update * fix: style changes * fix: subscribing to state to autsave * feat: updated the query manager styles to new design * feat: revamped the querypane header buttons * fix: fixed the padding for query panel maximize button * feat: updated search box style * refactor: moved function to render data source icon to its own component * fix: fixed querymanager widget breaking issue * merged with feat/query-manager-autosave * refactor: removed unused consoles * refactor: removed unused consoles * refactor: removed unused consoles * fix: removed commented code * fix: removed unused code * refactor: removed unused comments * fix: show change datasource select only if valid ds available * Update frontend/src/Editor/Inspector/EventManager.jsx Co-authored-by: Kavin Venkatachalam <[email protected]> * Update frontend/src/Editor/QueryManager/Components/DataSourceLister.jsx Co-authored-by: Kavin Venkatachalam <[email protected]> * Update frontend/src/Editor/QueryManager/Components/DataSourceLister.jsx Co-authored-by: Kavin Venkatachalam <[email protected]> * Update frontend/src/Editor/QueryManager/Components/QueryManagerBody.jsx Co-authored-by: Kavin Venkatachalam <[email protected]> * feat: modify behaviour of search icon in query panel * fix: fixed theme color mismatch in query manager * refactor: remove dead code * refactor: updated theme for data source listner * fix: theming in filter and sort popup * refactor: remove unused variables * fix: removed draftQuery logic from query manager * refactor: removed unused varibales * Update frontend/src/Editor/QueryManager/QueryEditors/Restapi/TabParams.jsx Co-authored-by: Kavin Venkatachalam <[email protected]> * Update frontend/src/Editor/QueryPanel/QueryCard.jsx Co-authored-by: Kavin Venkatachalam <[email protected]> * feat: diable preview for draft queries * fix: added tooltip for query panel button * fix: fixed issues in saving query manager events * fix: moved query save subscriber to QuerPanel component * feat: converted query run api to save and run * fix: made varibale an optional param in updateDataQuery dto * refactor: cleanup update dataquery status api response * refactor: moved query status to constants file * feat: prompt for queryname when creating new query * fix: store new queryname in state on create query pageload * fix: fixed alignment of Tooljet db component form * fix: correct translation and format file * refactor: removed consoles * merge: merge appbuilder-1.2 * style: updated rename input/button UX * style: revamped dataquery create widget styles * style: revamped data source selector styles * fix: removed code added for debugging * style: updated data query filter design * style: Add prop to control visibility of clear button in search box * style: implement new style for query filter * merge appbuilder-1.2 to feat/query-manager-sort-filter * refactor: remove unintended file change * fix: set default value for method in respapi * style: updated copilot info popup style * style: updated quer panel header icons * style: updated button styles * style: fixed query manager button styles * style: smoothened query preview modal view * fix: correct import for some funs * fix: fixed minor UX bugs * style: fixed styling of REST api GDS * style: fixed styleing of sort and filter popup * style: improved data queries sort filter UI/UX * fix: remove click listner when overlay is closed * fix: moved component declaration out of parent component * fix: set selected datasource for default sources * fix: filter DS based on saerch in create dropdown * fix: restrict draft query running to preview mode * fix: query renamed on input change in create screen * fix: set name to state as soon as user renames query * fix: make query notification message consistent * style: correct s3 bucket plugin layout config * fix: fixed issues with cloning of Static DS queries * fix: made change so that newly created query is reflected immediatly * style: updated spacing for query manager components * fix: hide rename input when no query selected * fix: check bothe selected query and DS before rendering query manager * fix: set isSaving to true only for api calls in querymanager * fix: added success message form in qm * fix: filter out draft queries from viewer on running * fix: fixed inconsistent gutter for runpy and runjs editors * fix: reload dataqueris on LDS deletion * fix: redesigned filter/sort popup * fix: fixed issue that resets filter on search * fix: fixed query manager breaking on plugin select * fix: diable json preview for text output * fix: reset to filter and sort main menu on close filter popup * refactor: rename varibales * stye: redesigned query create panel * feat: revert data query status column from backend * style: redesign query picker section * refactor: removed dead code * style: querypanel expand/collapse btn style * style: add query select and query filter popup style redesign * style: updated filter popup style * feat: removed draft query checks everywhere * style: empty dataqueries style changed * style: updated query selector popup and rest options styles * style: removed 100% height to query option remove btn * feat: added the query runnable status check * style: updated query manager footer style * feat: changed DS filter from kind to DS ID * style: minor ui tweaks in filter popup * style: disable DS filter if no DQs created * style: minor ui change * fix: rerender filter popup post DS api call. fixed rest api copy feature * fix: add local DS to filter popup * refactor: removed dead code/comments * add new row is crashing when no data is fed to table (#7102) * fix: fixed condition that blocked GDS run on load * fix: revert name back to og name if update fails in rename query * feat: added tooltip for show query btn * fix: added click interaction for pill btn as well * fix: minor UI tweaks to make UX better * style: fixed the styling of filter popup * style: minor UI tweaks in query filter popup * fix: fixed minor css issue in ds picker * style: wrap overflowing text in queryname * fix: update updated_at after query update api call success * fix: update remove the caller query from event query dropdown * style: minor ui spacing tweaks * fix: fix issue that cuased app crash when tjdb opened * fix: fixed update row styles * fix: fixed info popup dark theme bg * fix: fixed headers styling according to general QM styles * style: fixed stripe QM UI * fix: added tooltip for quernames * feat: add tooltip for select ds options * added consoles to debug debugger issue * fix: fixed :active style of ds select dropdown in QM * fix: fixed DS kind name in data source selector in QM * fix: fixed border color mismatch for ds select dd * fix: change tooltip msg for maximize/minize QM * Fix automation for query manager revamp. (#7223) * Add data-cy to support modified specs * Fix event handler * Fix RunPy and RunJS specs * Fix event handler label * Fix basic components spec * Fix basic components failure * Fix tabel spec failure. * Fix runjs and runpy actions * Fix table column options * Add data-cy * version: version updated to 2.13.0 * Version bump --------- Co-authored-by: Kavin Venkatachalam <[email protected]> Co-authored-by: Kavin Venkatachalam <[email protected]> Co-authored-by: Manish Kushare <[email protected]> Co-authored-by: Midhun Kumar E <[email protected]>
408 lines
11 KiB
JavaScript
408 lines
11 KiB
JavaScript
import { faker } from "@faker-js/faker";
|
|
import { commonSelectors, commonWidgetSelector } from "Selectors/common";
|
|
import {
|
|
commonWidgetText,
|
|
commonText,
|
|
codeMirrorInputLabel,
|
|
} from "Texts/common";
|
|
|
|
export const openAccordion = (
|
|
accordionName,
|
|
acordionToBeClosed,
|
|
index = "0"
|
|
) => {
|
|
closeAccordions(acordionToBeClosed);
|
|
cy.get(commonWidgetSelector.accordion(accordionName, index))
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.and("have.text", accordionName)
|
|
.then(($accordion) => {
|
|
if ($accordion.hasClass("collapsed")) {
|
|
cy.get(commonWidgetSelector.accordion(accordionName, index)).click();
|
|
}
|
|
});
|
|
};
|
|
|
|
export const verifyAndModifyParameter = (paramName, value) => {
|
|
cy.get(commonWidgetSelector.parameterLabel(paramName))
|
|
.scrollIntoView()
|
|
.should("have.text", paramName);
|
|
cy.get(
|
|
commonWidgetSelector.parameterInputField(paramName)
|
|
).clearAndTypeOnCodeMirror(value);
|
|
};
|
|
|
|
export const openEditorSidebar = (widgetName = "") => {
|
|
cy.get(`${commonWidgetSelector.draggableWidget(widgetName)}:eq(0)`).trigger(
|
|
"mouseover"
|
|
);
|
|
cy.get(commonWidgetSelector.widgetConfigHandle(widgetName)).click();
|
|
};
|
|
|
|
export const verifyAndModifyToggleFx = (
|
|
paramName,
|
|
defaultValue,
|
|
toggleModification = true
|
|
) => {
|
|
cy.get(commonWidgetSelector.parameterLabel(paramName)).should(
|
|
"have.text",
|
|
paramName
|
|
);
|
|
cy.get(
|
|
commonWidgetSelector.parameterFxButton(
|
|
paramName,
|
|
"[class*='fx-button unselectable']"
|
|
)
|
|
)
|
|
.should("have.text", "Fx")
|
|
.click();
|
|
if (defaultValue)
|
|
cy.get(commonWidgetSelector.parameterInputField(paramName))
|
|
.find("pre.CodeMirror-line")
|
|
.should("have.text", defaultValue);
|
|
cy.get(commonWidgetSelector.parameterFxButton(paramName)).click();
|
|
if (toggleModification == true)
|
|
cy.get(commonWidgetSelector.parameterTogglebutton(paramName)).click();
|
|
};
|
|
|
|
export const addDefaultEventHandler = (message) => {
|
|
cy.get(commonWidgetSelector.addEventHandlerLink)
|
|
.should("contain.text", commonWidgetText.addEventHandlerLink)
|
|
.click();
|
|
cy.get(commonWidgetSelector.eventHandlerCard).click();
|
|
cy.get(commonWidgetSelector.alertMessageInputField)
|
|
.find('[data-cy*="-input-field"]')
|
|
.eq(0)
|
|
.clearAndTypeOnCodeMirror(message);
|
|
};
|
|
|
|
export const addAndVerifyTooltip = (widgetSelector, message) => {
|
|
cy.get(commonWidgetSelector.tooltipInputField).clearAndTypeOnCodeMirror(
|
|
message
|
|
);
|
|
verifyTooltip(widgetSelector, message);
|
|
};
|
|
|
|
export const editAndVerifyWidgetName = (
|
|
name,
|
|
accordion = ["General", "Properties", "Layout"]
|
|
) => {
|
|
closeAccordions(accordion);
|
|
cy.clearAndType(commonWidgetSelector.WidgetNameInputField, name);
|
|
cy.get(commonWidgetSelector.buttonCloseEditorSideBar).click();
|
|
|
|
cy.get(commonWidgetSelector.draggableWidget(name)).trigger("mouseover");
|
|
cy.get(commonWidgetSelector.widgetConfigHandle(name))
|
|
.click()
|
|
.should("have.text", name);
|
|
};
|
|
|
|
export const verifyComponentValueFromInspector = (
|
|
componentName,
|
|
value,
|
|
openStatus = "closed"
|
|
) => {
|
|
cy.get(commonWidgetSelector.sidebarinspector).click();
|
|
if (openStatus == "closed") {
|
|
cy.get(commonWidgetSelector.inspectorNodeComponents).click();
|
|
cy.get(commonWidgetSelector.nodeComponent(componentName)).click();
|
|
}
|
|
cy.get(commonWidgetSelector.nodeComponentValue).contains(value);
|
|
};
|
|
|
|
export const verifyMultipleComponentValuesFromInspector = (
|
|
componentName,
|
|
values = [],
|
|
openStatus = "closed"
|
|
) => {
|
|
cy.get(commonWidgetSelector.sidebarinspector).click();
|
|
if (openStatus == "closed") {
|
|
cy.wait(100);
|
|
cy.get(commonWidgetSelector.inspectorNodeComponents).realClick();
|
|
cy.get(commonWidgetSelector.nodeComponent(componentName)).click();
|
|
cy.get(commonWidgetSelector.nodeComponentValues).click();
|
|
}
|
|
values.forEach((value, i) =>
|
|
cy
|
|
.get(`[data-cy="inspector-node-${i}"] > .mx-2`)
|
|
.should("have.text", `${value}`)
|
|
);
|
|
cy.forceClickOnCanvas();
|
|
};
|
|
|
|
export const selectColourFromColourPicker = (
|
|
paramName,
|
|
colour,
|
|
index = 0,
|
|
parent = commonWidgetSelector.colourPickerParent
|
|
) => {
|
|
cy.get(commonWidgetSelector.stylePicker(paramName)).click();
|
|
cy.get(parent)
|
|
.eq(index)
|
|
.then(() => {
|
|
colour.forEach((value, i) =>
|
|
cy
|
|
.get(commonWidgetSelector.colourPickerInput(i + 1))
|
|
.click()
|
|
.clear()
|
|
.type(value)
|
|
.then(($input) => {
|
|
if (!$input.val(value)) {
|
|
cy.get(commonWidgetSelector.colourPickerInput(i + 1))
|
|
.click()
|
|
.clear()
|
|
.type(value);
|
|
}
|
|
})
|
|
);
|
|
});
|
|
cy.waitForAutoSave();
|
|
};
|
|
|
|
export const fillBoxShadowParams = (paramLabels, values) => {
|
|
paramLabels.forEach((label, i) =>
|
|
cy
|
|
.get(commonWidgetSelector.boxShadowParamInput(label))
|
|
.click()
|
|
.clear()
|
|
.type(values[i])
|
|
.then(($input) => {
|
|
if (!$input.val(values[i])) {
|
|
cy.get(commonWidgetSelector.boxShadowParamInput(label))
|
|
.click()
|
|
.clear()
|
|
.type(values[i]);
|
|
}
|
|
})
|
|
);
|
|
};
|
|
|
|
export const verifyBoxShadowCss = (
|
|
widgetName,
|
|
color,
|
|
shadowParam,
|
|
type = "component"
|
|
) => {
|
|
cy.forceClickOnCanvas();
|
|
cy.get(
|
|
type == "component"
|
|
? commonWidgetSelector.draggableWidget(widgetName)
|
|
: widgetName
|
|
).should(
|
|
"have.css",
|
|
"box-shadow",
|
|
`rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 100}) ${
|
|
shadowParam[0]
|
|
}px ${shadowParam[1]}px ${shadowParam[2]}px ${shadowParam[3]}px`
|
|
);
|
|
};
|
|
|
|
export const verifyComponentFromInspector = (
|
|
componentName,
|
|
openStatus = "closed"
|
|
) => {
|
|
cy.get(commonWidgetSelector.sidebarinspector).click();
|
|
if (openStatus == "closed") {
|
|
cy.get(commonWidgetSelector.inspectorNodeComponents).click();
|
|
cy.get(
|
|
commonWidgetSelector.nodeComponent(componentName)
|
|
).verifyVisibleElement("have.text", componentName);
|
|
}
|
|
};
|
|
|
|
export const verifyAndModifyStylePickerFx = (
|
|
paramName,
|
|
defaultValue,
|
|
value,
|
|
index = 0
|
|
) => {
|
|
cy.get(commonWidgetSelector.parameterLabel(paramName)).should(
|
|
"have.text",
|
|
paramName
|
|
);
|
|
cy.get(commonWidgetSelector.stylePicker(paramName)).should("be.visible");
|
|
cy.get(commonWidgetSelector.stylePickerValueIcon(paramName)).should(
|
|
"be.visible"
|
|
);
|
|
|
|
cy.get(commonWidgetSelector.stylePickerValue(paramName))
|
|
.should("be.visible")
|
|
.verifyVisibleElement("have.text", defaultValue);
|
|
cy.get(
|
|
commonWidgetSelector.parameterFxButton(
|
|
paramName,
|
|
"[class*='fx-button unselectable']"
|
|
)
|
|
)
|
|
.should("have.text", "Fx")
|
|
.click();
|
|
|
|
cy.get(commonWidgetSelector.stylePickerFxInput(paramName)).within(() => {
|
|
cy.get(".CodeMirror-line")
|
|
.should("be.visible")
|
|
.and("have.text", defaultValue);
|
|
});
|
|
|
|
cy.get(
|
|
commonWidgetSelector.stylePickerFxInput(paramName)
|
|
).clearAndTypeOnCodeMirror(value);
|
|
|
|
cy.get(commonWidgetSelector.stylePickerFxInput(paramName))
|
|
.eq(index)
|
|
.within(() => {
|
|
cy.get(".CodeMirror-line").should("be.visible").and("have.text", value);
|
|
});
|
|
};
|
|
|
|
export const verifyWidgetColorCss = (
|
|
widgetName,
|
|
cssProperty,
|
|
color,
|
|
innerProp = false
|
|
) => {
|
|
cy.forceClickOnCanvas();
|
|
cy.get(
|
|
innerProp ? widgetName : commonWidgetSelector.draggableWidget(widgetName)
|
|
).should(
|
|
"have.css",
|
|
cssProperty,
|
|
`rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 100})`
|
|
);
|
|
};
|
|
|
|
export const verifyLoaderColor = (widgetName, color) => {
|
|
//using only for button
|
|
cy.forceClickOnCanvas();
|
|
cy.get(commonWidgetSelector.draggableWidget(widgetName))
|
|
.invoke("attr", "style")
|
|
.then((style) => {
|
|
const loaderColor = style.split(" ").join("");
|
|
expect(loaderColor).to.include(
|
|
`--loader-color:rgba(${color[0]},${color[1]},${color[2]},${
|
|
color[3] / 100
|
|
})`
|
|
);
|
|
});
|
|
};
|
|
|
|
export const verifyLayout = (widgetName) => {
|
|
openEditorSidebar(widgetName);
|
|
openAccordion(commonWidgetText.accordionLayout);
|
|
verifyAndModifyToggleFx(
|
|
commonWidgetText.parameterShowOnDesktop,
|
|
commonWidgetText.codeMirrorLabelTrue
|
|
);
|
|
cy.get(commonWidgetSelector.draggableWidget(widgetName)).should("not.exist");
|
|
|
|
verifyAndModifyToggleFx(
|
|
commonWidgetText.parameterShowOnMobile,
|
|
commonWidgetText.codeMirrorLabelFalse
|
|
);
|
|
cy.get(commonWidgetSelector.changeLayoutToMobileButton).click();
|
|
cy.get(commonWidgetSelector.draggableWidget(widgetName)).should("exist");
|
|
};
|
|
|
|
export const verifyPropertiesGeneralAccordion = (widgetName, tooltipText) => {
|
|
openEditorSidebar(widgetName);
|
|
openAccordion(commonWidgetText.accordionGenaral);
|
|
cy.wait(3000);
|
|
addAndVerifyTooltip(
|
|
commonWidgetSelector.draggableWidget(widgetName),
|
|
tooltipText
|
|
);
|
|
};
|
|
|
|
export const verifyStylesGeneralAccordion = (
|
|
widgetName,
|
|
boxShadowParameter,
|
|
hexColor,
|
|
boxShadowColor,
|
|
index = 0
|
|
) => {
|
|
openEditorSidebar(widgetName);
|
|
cy.get(commonWidgetSelector.buttonStylesEditorSideBar).click();
|
|
openAccordion(commonWidgetText.accordionGenaral, []);
|
|
verifyAndModifyStylePickerFx(
|
|
commonWidgetText.parameterBoxShadow,
|
|
commonWidgetText.boxShadowDefaultValue,
|
|
`${boxShadowParameter[0]}px ${boxShadowParameter[1]}px ${boxShadowParameter[2]}px ${boxShadowParameter[3]}px ${hexColor}`
|
|
);
|
|
cy.get(
|
|
commonWidgetSelector.parameterFxButton(commonWidgetText.parameterBoxShadow)
|
|
).click();
|
|
|
|
cy.get(
|
|
commonWidgetSelector.stylePicker(commonWidgetText.parameterBoxShadow)
|
|
).click();
|
|
|
|
fillBoxShadowParams(
|
|
commonWidgetSelector.boxShadowDefaultParam,
|
|
boxShadowParameter
|
|
);
|
|
selectColourFromColourPicker(
|
|
commonWidgetText.boxShadowColor,
|
|
boxShadowColor,
|
|
index
|
|
);
|
|
|
|
verifyBoxShadowCss(widgetName, boxShadowColor, boxShadowParameter);
|
|
};
|
|
export const addTextWidgetToVerifyValue = (customfunction) => {
|
|
cy.forceClickOnCanvas();
|
|
cy.dragAndDropWidget("Text", 600, 80);
|
|
openEditorSidebar("text1");
|
|
verifyAndModifyParameter("Text", codeMirrorInputLabel(customfunction));
|
|
cy.forceClickOnCanvas();
|
|
cy.waitForAutoSave();
|
|
};
|
|
|
|
export const verifyTooltip = (widgetSelector, message) => {
|
|
cy.forceClickOnCanvas();
|
|
cy.get(widgetSelector).click();
|
|
cy.get(widgetSelector)
|
|
.trigger("mouseover", { timeout: 2000 })
|
|
.trigger("mouseover")
|
|
.then(() => {
|
|
cy.get(commonWidgetSelector.tooltipLabel)
|
|
.last()
|
|
.should("have.text", message);
|
|
});
|
|
};
|
|
|
|
export const verifyWidgetText = (widgetName, text) => {
|
|
cy.get(commonWidgetSelector.draggableWidget(widgetName)).should(
|
|
"have.text",
|
|
text
|
|
);
|
|
};
|
|
|
|
export const randomNumber = (x, y) => {
|
|
return faker.datatype.number({ min: x, max: y });
|
|
};
|
|
|
|
export const pushIntoArrayOfObject = (arrayOne, arrayTwo) => {
|
|
let arrayOfObj = "[";
|
|
arrayOne.forEach((element, index) => {
|
|
arrayOfObj += `{name: "${element}", mark: "${arrayTwo[index]}" },`;
|
|
});
|
|
return arrayOfObj + "]";
|
|
};
|
|
|
|
export const closeAccordions = (accordionNames = [], index = "0") => {
|
|
if (accordionNames) {
|
|
accordionNames.forEach((accordionName) => {
|
|
cy.get(commonWidgetSelector.accordion(accordionName, index))
|
|
.click()
|
|
.scrollIntoView()
|
|
.should("be.visible")
|
|
.and("have.text", accordionName)
|
|
.then(($accordion) => {
|
|
if (!$accordion.hasClass("collapsed")) {
|
|
cy.get(
|
|
commonWidgetSelector.accordion(accordionName, index)
|
|
).click();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
};
|