mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-17 12:50:43 +00:00
CE-793 - Fixes for failed selnium tests
This commit is contained in:
@ -375,11 +375,13 @@ export default function QuickFilter({tableMetaData, fullFieldName, fieldMetaData
|
||||
|
||||
let buttonAdditionalStyles: any = {};
|
||||
let buttonContent = <span>{tableForField?.name != tableMetaData.name ? `${tableForField.label}: ` : ""}{fieldMetaData.label}</span>
|
||||
let buttonClassName = "filterNotActive";
|
||||
if (criteriaIsValid)
|
||||
{
|
||||
buttonAdditionalStyles.backgroundColor = accentColor + " !important";
|
||||
buttonAdditionalStyles.borderColor = accentColor + " !important";
|
||||
buttonAdditionalStyles.color = "white !important";
|
||||
buttonClassName = "filterActive";
|
||||
|
||||
buttonContent = (
|
||||
<Tooltip title={`${operatorSelectedValue.label} ${FilterUtils.getValuesString(fieldMetaData, criteria)}`} enterDelay={tooltipEnterDelay}>
|
||||
@ -390,6 +392,7 @@ export default function QuickFilter({tableMetaData, fullFieldName, fieldMetaData
|
||||
|
||||
let button = fieldMetaData && <Button
|
||||
id={`quickFilter.${fullFieldName}`}
|
||||
className={buttonClassName}
|
||||
sx={{...quickFilterButtonStyles, ...buttonAdditionalStyles, mr: "0.5rem"}}
|
||||
onClick={tooComplex ? noop : handleOpenMenu}
|
||||
disabled={tooComplex}
|
||||
|
@ -33,7 +33,7 @@ import {QCriteriaOperator} from "@kingsrook/qqq-frontend-core/lib/model/query/QC
|
||||
import {QFilterCriteria} from "@kingsrook/qqq-frontend-core/lib/model/query/QFilterCriteria";
|
||||
import {QFilterOrderBy} from "@kingsrook/qqq-frontend-core/lib/model/query/QFilterOrderBy";
|
||||
import {QQueryFilter} from "@kingsrook/qqq-frontend-core/lib/model/query/QQueryFilter";
|
||||
import {Alert, Collapse, TablePagination, Typography} from "@mui/material";
|
||||
import {Alert, Collapse, Typography} from "@mui/material";
|
||||
import Box from "@mui/material/Box";
|
||||
import Button from "@mui/material/Button";
|
||||
import Card from "@mui/material/Card";
|
||||
@ -44,7 +44,7 @@ import LinearProgress from "@mui/material/LinearProgress";
|
||||
import MenuItem from "@mui/material/MenuItem";
|
||||
import Modal from "@mui/material/Modal";
|
||||
import Tooltip from "@mui/material/Tooltip";
|
||||
import {ColumnHeaderFilterIconButtonProps, DataGridPro, GridCallbackDetails, GridColDef, GridColumnMenuContainer, GridColumnMenuProps, GridColumnOrderChangeParams, GridColumnPinningMenuItems, GridColumnResizeParams, GridColumnsMenuItem, GridColumnVisibilityModel, GridDensity, GridEventListener, gridFilterableColumnDefinitionsSelector, GridFilterMenuItem, GridFilterModel, GridPinnedColumns, gridPreferencePanelStateSelector, GridPreferencePanelsValue, GridRowId, GridRowParams, GridRowsProp, GridSelectionModel, GridSortItem, GridSortModel, GridState, GridToolbarColumnsButton, GridToolbarContainer, GridToolbarDensitySelector, GridToolbarExportContainer, HideGridColMenuItem, MuiEvent, SortGridMenuItems, useGridApiContext, useGridApiEventHandler, useGridApiRef, useGridSelector} from "@mui/x-data-grid-pro";
|
||||
import {ColumnHeaderFilterIconButtonProps, DataGridPro, GridCallbackDetails, GridColDef, GridColumnMenuContainer, GridColumnMenuProps, GridColumnOrderChangeParams, GridColumnPinningMenuItems, GridColumnResizeParams, GridColumnsMenuItem, GridColumnVisibilityModel, GridDensity, GridEventListener, GridFilterMenuItem, GridPinnedColumns, gridPreferencePanelStateSelector, GridPreferencePanelsValue, GridRowId, GridRowParams, GridRowsProp, GridSelectionModel, GridSortItem, GridSortModel, GridState, GridToolbarColumnsButton, GridToolbarContainer, GridToolbarDensitySelector, GridToolbarExportContainer, HideGridColMenuItem, MuiEvent, SortGridMenuItems, useGridApiContext, useGridApiEventHandler, useGridApiRef, useGridSelector} from "@mui/x-data-grid-pro";
|
||||
import {GridRowModel} from "@mui/x-data-grid/models/gridRows";
|
||||
import FormData from "form-data";
|
||||
import React, {forwardRef, useContext, useEffect, useReducer, useRef, useState} from "react";
|
||||
@ -54,7 +54,7 @@ import {QCancelButton, QCreateNewButton} from "qqq/components/buttons/DefaultBut
|
||||
import MenuButton from "qqq/components/buttons/MenuButton";
|
||||
import {GotoRecordButton} from "qqq/components/misc/GotoRecordDialog";
|
||||
import SavedViews from "qqq/components/misc/SavedViews";
|
||||
import BasicAndAdvancedQueryControls, {getDefaultQuickFilterFieldNames} from "qqq/components/query/BasicAndAdvancedQueryControls";
|
||||
import BasicAndAdvancedQueryControls from "qqq/components/query/BasicAndAdvancedQueryControls";
|
||||
import {CustomColumnsPanel} from "qqq/components/query/CustomColumnsPanel";
|
||||
import {CustomFilterPanel} from "qqq/components/query/CustomFilterPanel";
|
||||
import CustomPaginationComponent from "qqq/components/query/CustomPaginationComponent";
|
||||
@ -2062,6 +2062,18 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
|
||||
|
||||
await FilterUtils.cleanupValuesInFilerFromQueryString(qController, tableMetaData, queryFilter);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// so, URLs with filters, they might say NOT_EQUALS - but - everything else we do in here, uses NOT_EQUALS_OR_IS_NULL... //
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
for (let i = 0; i < queryFilter?.criteria?.length; i++)
|
||||
{
|
||||
const criteria = queryFilter.criteria[i];
|
||||
if(criteria.operator == QCriteriaOperator.NOT_EQUALS)
|
||||
{
|
||||
criteria.operator = QCriteriaOperator.NOT_EQUALS_OR_IS_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// set this new query filter in the view, and activate the full view //
|
||||
// stuff other than the query filter should "stick" from what user had active previously //
|
||||
|
@ -66,15 +66,10 @@ class FilterUtils
|
||||
console.log(param[i]);
|
||||
if (param[i] && param[i].id && param[i].label)
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// if the param looks like a possible value, return its id //
|
||||
// during build of new custom filter panel, this ended up causing us //
|
||||
// problems (because we wanted the full PV object in the filter model for the frontend) //
|
||||
// so, we can keep the PV as-is here, and see calls to convertFilterPossibleValuesToIds //
|
||||
// to do what this used to do. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// rs.push(param[i].id);
|
||||
rs.push(param[i]);
|
||||
/////////////////////////////////////////////////////////////
|
||||
// if the param looks like a possible value, return its id //
|
||||
/////////////////////////////////////////////////////////////
|
||||
rs.push(param[i].id);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -80,9 +80,9 @@ public class QueryScreenLib
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
public WebElement assertQuickFilterButtonBadge(String fieldName)
|
||||
public WebElement assertQuickFilterButtonIndicatesActiveFilter(String fieldName)
|
||||
{
|
||||
return qSeleniumLib.waitForSelector("#quickFilter\\." + fieldName + " .MuiBadge-root");
|
||||
return qSeleniumLib.waitForSelector("#quickFilter\\." + fieldName + ".filterActive");
|
||||
}
|
||||
|
||||
|
||||
@ -92,7 +92,6 @@ public class QueryScreenLib
|
||||
*******************************************************************************/
|
||||
public void clickQuickFilterButton(String fieldName)
|
||||
{
|
||||
// qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filter").click();
|
||||
qSeleniumLib.waitForSelector("#quickFilter\\." + fieldName).click();
|
||||
}
|
||||
|
||||
|
@ -98,18 +98,6 @@ public class QueryScreenFilterInUrlAdvancedModeTest extends QBaseSeleniumTest
|
||||
qSeleniumLib.waitForSelector("input[value=\"1701\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"74656\"]");
|
||||
|
||||
//////////////////////////////////////////
|
||||
// not-equals on a possible-value field //
|
||||
//////////////////////////////////////////
|
||||
filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||
.withCriteria(new QFilterCriteria("homeCityId", QCriteriaOperator.NOT_EQUALS, 1)));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertFilterButtonBadge(1);
|
||||
queryScreenLib.clickFilterButton();
|
||||
qSeleniumLib.waitForSelector("input[value=\"does not equal\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"St. Louis\"]");
|
||||
|
||||
//////////////////////////////////////
|
||||
// an IN for a possible-value field //
|
||||
//////////////////////////////////////
|
||||
@ -150,6 +138,27 @@ public class QueryScreenFilterInUrlAdvancedModeTest extends QBaseSeleniumTest
|
||||
qSeleniumLib.waitForSelector("input[value=\"starts with\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"Dar\"]");
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// replace the homeCityId possible-value route //
|
||||
/////////////////////////////////////////////////
|
||||
qSeleniumJavalin.stop();
|
||||
qSeleniumJavalin.clearRoutes();
|
||||
addJavalinRoutes(qSeleniumJavalin);
|
||||
qSeleniumJavalin.withRouteToFile("/data/person/possibleValues/homeCityId", "data/person/possibleValues/homeCityId=1.json");
|
||||
qSeleniumJavalin.restart();
|
||||
|
||||
//////////////////////////////////////////
|
||||
// not-equals on a possible-value field //
|
||||
//////////////////////////////////////////
|
||||
filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||
.withCriteria(new QFilterCriteria("homeCityId", QCriteriaOperator.NOT_EQUALS, 1)));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertFilterButtonBadge(1);
|
||||
queryScreenLib.clickFilterButton();
|
||||
qSeleniumLib.waitForSelector("input[value=\"does not equal\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"St. Louis\"]");
|
||||
|
||||
////////////////
|
||||
// remove one //
|
||||
////////////////
|
||||
|
@ -75,7 +75,7 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
.withCriteria(new QFilterCriteria("annualSalary", QCriteriaOperator.IS_NOT_BLANK)));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertQuickFilterButtonBadge("annualSalary");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("annualSalary");
|
||||
queryScreenLib.clickQuickFilterButton("annualSalary");
|
||||
qSeleniumLib.waitForSelector("input[value=\"is not empty\"]");
|
||||
|
||||
@ -86,7 +86,7 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
.withCriteria(new QFilterCriteria("annualSalary", QCriteriaOperator.BETWEEN, 1701, 74656)));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertQuickFilterButtonBadge("annualSalary");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("annualSalary");
|
||||
queryScreenLib.clickQuickFilterButton("annualSalary");
|
||||
qSeleniumLib.waitForSelector("input[value=\"is between\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"1701\"]");
|
||||
@ -99,7 +99,7 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
.withCriteria(new QFilterCriteria("homeCityId", QCriteriaOperator.NOT_EQUALS, 1)));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertQuickFilterButtonBadge("homeCityId");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("homeCityId");
|
||||
queryScreenLib.clickQuickFilterButton("homeCityId");
|
||||
qSeleniumLib.waitForSelector("input[value=\"does not equal\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"St. Louis\"]");
|
||||
@ -111,7 +111,7 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
.withCriteria(new QFilterCriteria("homeCityId", QCriteriaOperator.IN, 1, 2)));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertQuickFilterButtonBadge("homeCityId");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("homeCityId");
|
||||
queryScreenLib.clickQuickFilterButton("homeCityId");
|
||||
qSeleniumLib.waitForSelector("input[value=\"is any of\"]");
|
||||
qSeleniumLib.waitForSelectorContaining(".MuiChip-label", "St. Louis");
|
||||
@ -124,7 +124,7 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
.withCriteria(new QFilterCriteria("createDate", QCriteriaOperator.GREATER_THAN, NowWithOffset.minus(5, ChronoUnit.DAYS))));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertQuickFilterButtonBadge("createDate");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("createDate");
|
||||
queryScreenLib.clickQuickFilterButton("createDate");
|
||||
qSeleniumLib.waitForSelector("input[value=\"is after\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"5 days ago\"]");
|
||||
@ -137,8 +137,8 @@ public class QueryScreenFilterInUrlBasicModeTest extends QBaseSeleniumTest
|
||||
.withCriteria(new QFilterCriteria("createDate", QCriteriaOperator.LESS_THAN_OR_EQUALS, ThisOrLastPeriod.this_(ChronoUnit.YEARS))));
|
||||
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||
queryScreenLib.waitForQueryToHaveRan();
|
||||
queryScreenLib.assertQuickFilterButtonBadge("firstName");
|
||||
queryScreenLib.assertQuickFilterButtonBadge("createDate");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("firstName");
|
||||
queryScreenLib.assertQuickFilterButtonIndicatesActiveFilter("createDate");
|
||||
queryScreenLib.clickQuickFilterButton("createDate");
|
||||
qSeleniumLib.waitForSelector("input[value=\"is at or before\"]");
|
||||
qSeleniumLib.waitForSelector("input[value=\"start of this year\"]");
|
||||
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"options": [
|
||||
{
|
||||
"id": 1,
|
||||
"label": "St. Louis"
|
||||
}
|
||||
]
|
||||
}
|
@ -223,21 +223,21 @@
|
||||
"label": "Sleep Interactive",
|
||||
"isHidden": false
|
||||
},
|
||||
"querySavedFilter": {
|
||||
"name": "querySavedFilter",
|
||||
"label": "Query Saved Filter",
|
||||
"querySavedView": {
|
||||
"name": "querySavedView",
|
||||
"label": "Query Saved View",
|
||||
"isHidden": false,
|
||||
"hasPermission": true
|
||||
},
|
||||
"storeSavedFilter": {
|
||||
"name": "storeSavedFilter",
|
||||
"label": "Store Saved Filter",
|
||||
"storeSavedView": {
|
||||
"name": "storeSavedView",
|
||||
"label": "Store Saved View",
|
||||
"isHidden": false,
|
||||
"hasPermission": true
|
||||
},
|
||||
"deleteSavedFilter": {
|
||||
"name": "deleteSavedFilter",
|
||||
"label": "Delete Saved Filter",
|
||||
"deleteSavedView": {
|
||||
"name": "deleteSavedView",
|
||||
"label": "Delete Saved View",
|
||||
"isHidden": false,
|
||||
"hasPermission": true
|
||||
},
|
||||
|
Reference in New Issue
Block a user