mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-18 05:10:45 +00:00
2
pom.xml
2
pom.xml
@ -66,7 +66,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.kingsrook.qqq</groupId>
|
<groupId>com.kingsrook.qqq</groupId>
|
||||||
<artifactId>qqq-backend-core</artifactId>
|
<artifactId>qqq-backend-core</artifactId>
|
||||||
<version>feature-CTLE-503-optimization-weather-api-data-20230701.011918-3</version>
|
<version>0.17.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
|
@ -88,7 +88,7 @@ function ColumnStats({tableMetaData, fieldMetaData, fieldTableName, filter}: Pro
|
|||||||
}
|
}
|
||||||
const processResult = await qController.processRun("columnStats", formData);
|
const processResult = await qController.processRun("columnStats", formData);
|
||||||
|
|
||||||
setStatusString(null)
|
setStatusString(null);
|
||||||
if (processResult instanceof QJobError)
|
if (processResult instanceof QJobError)
|
||||||
{
|
{
|
||||||
const jobError = processResult as QJobError;
|
const jobError = processResult as QJobError;
|
||||||
@ -107,7 +107,7 @@ function ColumnStats({tableMetaData, fieldMetaData, fieldTableName, filter}: Pro
|
|||||||
const newStatsFields = [] as QFieldMetaData[];
|
const newStatsFields = [] as QFieldMetaData[];
|
||||||
for(let i = 0; i<statFieldObjects.length; i++)
|
for(let i = 0; i<statFieldObjects.length; i++)
|
||||||
{
|
{
|
||||||
newStatsFields.push(new QFieldMetaData(statFieldObjects[i]))
|
newStatsFields.push(new QFieldMetaData(statFieldObjects[i]));
|
||||||
}
|
}
|
||||||
setStatsFields(newStatsFields);
|
setStatsFields(newStatsFields);
|
||||||
}
|
}
|
||||||
@ -139,15 +139,15 @@ function ColumnStats({tableMetaData, fieldMetaData, fieldTableName, filter}: Pro
|
|||||||
fakeTableMetaData.fields = new Map<string, QFieldMetaData>();
|
fakeTableMetaData.fields = new Map<string, QFieldMetaData>();
|
||||||
fakeTableMetaData.fields.set(fieldMetaData.name, fieldMetaData);
|
fakeTableMetaData.fields.set(fieldMetaData.name, fieldMetaData);
|
||||||
fakeTableMetaData.fields.set("count", new QFieldMetaData({name: "count", label: "Count", type: "INTEGER"}));
|
fakeTableMetaData.fields.set("count", new QFieldMetaData({name: "count", label: "Count", type: "INTEGER"}));
|
||||||
|
fakeTableMetaData.fields.set("percent", new QFieldMetaData({name: "percent", label: "Percent", type: "DECIMAL"}));
|
||||||
fakeTableMetaData.sections = [] as QTableSection[];
|
fakeTableMetaData.sections = [] as QTableSection[];
|
||||||
fakeTableMetaData.sections.push(new QTableSection({fieldNames: [fieldMetaData.name, "count"]}));
|
fakeTableMetaData.sections.push(new QTableSection({fieldNames: [fieldMetaData.name, "count", "percent"]}));
|
||||||
|
|
||||||
const rows = DataGridUtils.makeRows(valueCounts, fakeTableMetaData);
|
const rows = DataGridUtils.makeRows(valueCounts, fakeTableMetaData);
|
||||||
const columns = DataGridUtils.setupGridColumns(fakeTableMetaData, null, null, "bySection");
|
const columns = DataGridUtils.setupGridColumns(fakeTableMetaData, null, null, "bySection");
|
||||||
|
|
||||||
columns.forEach((c) =>
|
columns.forEach((c) =>
|
||||||
{
|
{
|
||||||
c.width = 200;
|
|
||||||
c.filterable = false;
|
c.filterable = false;
|
||||||
c.hideable = false;
|
c.hideable = false;
|
||||||
})
|
})
|
||||||
@ -162,7 +162,7 @@ function ColumnStats({tableMetaData, fieldMetaData, fieldTableName, filter}: Pro
|
|||||||
function CustomPagination()
|
function CustomPagination()
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
<Box pr={3}>
|
<Box pr={3} fontSize="0.85rem">
|
||||||
{rows && rows.length && countDistinct && rows.length < countDistinct ? <span>Showing the first {rows.length.toLocaleString()} of {countDistinct.toLocaleString()} values</span> : <></>}
|
{rows && rows.length && countDistinct && rows.length < countDistinct ? <span>Showing the first {rows.length.toLocaleString()} of {countDistinct.toLocaleString()} values</span> : <></>}
|
||||||
{rows && rows.length && countDistinct && rows.length >= countDistinct && rows.length == 1 ? <span>Showing the only value</span> : <></>}
|
{rows && rows.length && countDistinct && rows.length >= countDistinct && rows.length == 1 ? <span>Showing the only value</span> : <></>}
|
||||||
{rows && rows.length && countDistinct && rows.length >= countDistinct && rows.length > 1 ? <span>Showing all {rows.length.toLocaleString()} values</span> : <></>}
|
{rows && rows.length && countDistinct && rows.length >= countDistinct && rows.length > 1 ? <span>Showing all {rows.length.toLocaleString()} values</span> : <></>}
|
||||||
@ -172,9 +172,9 @@ function ColumnStats({tableMetaData, fieldMetaData, fieldTableName, filter}: Pro
|
|||||||
|
|
||||||
const refresh = () =>
|
const refresh = () =>
|
||||||
{
|
{
|
||||||
setLoading(true)
|
setLoading(true);
|
||||||
setStatusString("Refreshing...")
|
setStatusString("Refreshing...");
|
||||||
}
|
};
|
||||||
|
|
||||||
const doExport = () =>
|
const doExport = () =>
|
||||||
{
|
{
|
||||||
@ -188,7 +188,7 @@ function ColumnStats({tableMetaData, fieldMetaData, fieldTableName, filter}: Pro
|
|||||||
|
|
||||||
const fileName = tableMetaData.label + " - " + fieldMetaData.label + " Column Stats " + ValueUtils.formatDateTimeForFileName(new Date()) + ".csv";
|
const fileName = tableMetaData.label + " - " + fieldMetaData.label + " Column Stats " + ValueUtils.formatDateTimeForFileName(new Date()) + ".csv";
|
||||||
HtmlUtils.download(fileName, csv);
|
HtmlUtils.download(fileName, csv);
|
||||||
}
|
};
|
||||||
|
|
||||||
function Loading()
|
function Loading()
|
||||||
{
|
{
|
||||||
|
@ -259,7 +259,6 @@ export default class DataGridUtils
|
|||||||
public static makeColumnFromField = (field: QFieldMetaData, tableMetaData: QTableMetaData, namePrefix?: string, labelPrefix?: string): GridColDef =>
|
public static makeColumnFromField = (field: QFieldMetaData, tableMetaData: QTableMetaData, namePrefix?: string, labelPrefix?: string): GridColDef =>
|
||||||
{
|
{
|
||||||
let columnType = "string";
|
let columnType = "string";
|
||||||
let columnWidth = 200;
|
|
||||||
let filterOperators: GridFilterOperator<any>[] = QGridStringOperators;
|
let filterOperators: GridFilterOperator<any>[] = QGridStringOperators;
|
||||||
|
|
||||||
if (field.possibleValueSourceName)
|
if (field.possibleValueSourceName)
|
||||||
@ -273,28 +272,18 @@ export default class DataGridUtils
|
|||||||
case QFieldType.DECIMAL:
|
case QFieldType.DECIMAL:
|
||||||
case QFieldType.INTEGER:
|
case QFieldType.INTEGER:
|
||||||
columnType = "number";
|
columnType = "number";
|
||||||
columnWidth = 100;
|
|
||||||
|
|
||||||
if (field.name === tableMetaData.primaryKeyField && field.label.length < 3)
|
|
||||||
{
|
|
||||||
columnWidth = 75;
|
|
||||||
}
|
|
||||||
|
|
||||||
filterOperators = QGridNumericOperators;
|
filterOperators = QGridNumericOperators;
|
||||||
break;
|
break;
|
||||||
case QFieldType.DATE:
|
case QFieldType.DATE:
|
||||||
columnType = "date";
|
columnType = "date";
|
||||||
columnWidth = 100;
|
|
||||||
filterOperators = QGridDateOperators;
|
filterOperators = QGridDateOperators;
|
||||||
break;
|
break;
|
||||||
case QFieldType.DATE_TIME:
|
case QFieldType.DATE_TIME:
|
||||||
columnType = "dateTime";
|
columnType = "dateTime";
|
||||||
columnWidth = 200;
|
|
||||||
filterOperators = QGridDateTimeOperators;
|
filterOperators = QGridDateTimeOperators;
|
||||||
break;
|
break;
|
||||||
case QFieldType.BOOLEAN:
|
case QFieldType.BOOLEAN:
|
||||||
columnType = "string"; // using boolean gives an odd 'no' for nulls.
|
columnType = "string"; // using boolean gives an odd 'no' for nulls.
|
||||||
columnWidth = 75;
|
|
||||||
filterOperators = QGridBooleanOperators;
|
filterOperators = QGridBooleanOperators;
|
||||||
break;
|
break;
|
||||||
case QFieldType.BLOB:
|
case QFieldType.BLOB:
|
||||||
@ -305,6 +294,31 @@ export default class DataGridUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let headerName = labelPrefix ? labelPrefix + field.label : field.label;
|
||||||
|
let fieldName = namePrefix ? namePrefix + field.name : field.name;
|
||||||
|
|
||||||
|
const column: GridColDef = {
|
||||||
|
field: fieldName,
|
||||||
|
type: columnType,
|
||||||
|
headerName: headerName,
|
||||||
|
width: DataGridUtils.getColumnWidthForField(field, tableMetaData),
|
||||||
|
renderCell: null as any,
|
||||||
|
filterOperators: filterOperators,
|
||||||
|
};
|
||||||
|
|
||||||
|
column.renderCell = (cellValues: any) => (
|
||||||
|
(cellValues.value)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (column);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public static getColumnWidthForField = (field: QFieldMetaData, table?: QTableMetaData): number =>
|
||||||
|
{
|
||||||
if (field.hasAdornment(AdornmentType.SIZE))
|
if (field.hasAdornment(AdornmentType.SIZE))
|
||||||
{
|
{
|
||||||
const sizeAdornment = field.getAdornment(AdornmentType.SIZE);
|
const sizeAdornment = field.getAdornment(AdornmentType.SIZE);
|
||||||
@ -318,7 +332,7 @@ export default class DataGridUtils
|
|||||||
]);
|
]);
|
||||||
if (widths.has(width))
|
if (widths.has(width))
|
||||||
{
|
{
|
||||||
columnWidth = widths.get(width);
|
return widths.get(width);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -326,23 +340,31 @@ export default class DataGridUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let headerName = labelPrefix ? labelPrefix + field.label : field.label;
|
if(field.possibleValueSourceName)
|
||||||
let fieldName = namePrefix ? namePrefix + field.name : field.name;
|
{
|
||||||
|
return (200);
|
||||||
|
}
|
||||||
|
|
||||||
const column: GridColDef = {
|
switch (field.type)
|
||||||
field: fieldName,
|
{
|
||||||
type: columnType,
|
case QFieldType.DECIMAL:
|
||||||
headerName: headerName,
|
case QFieldType.INTEGER:
|
||||||
width: columnWidth,
|
|
||||||
renderCell: null as any,
|
|
||||||
filterOperators: filterOperators,
|
|
||||||
};
|
|
||||||
|
|
||||||
column.renderCell = (cellValues: any) => (
|
if (table && field.name === table.primaryKeyField && field.label.length < 3)
|
||||||
(cellValues.value)
|
{
|
||||||
);
|
return (75);
|
||||||
|
}
|
||||||
|
|
||||||
return (column);
|
return (100);
|
||||||
|
case QFieldType.DATE:
|
||||||
|
return (100);
|
||||||
|
case QFieldType.DATE_TIME:
|
||||||
|
return (200);
|
||||||
|
case QFieldType.BOOLEAN:
|
||||||
|
return (75);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -449,12 +449,15 @@ class FilterUtils
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// replace objects that look like expressions with expression instances //
|
// replace objects that look like expressions with expression instances //
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
for(let i = 0; i < values.length; i++)
|
if(values && values.length)
|
||||||
{
|
{
|
||||||
const expression = this.gridCriteriaValueToExpression(values[i])
|
for (let i = 0; i < values.length; i++)
|
||||||
if(expression)
|
|
||||||
{
|
{
|
||||||
values[i] = expression;
|
const expression = this.gridCriteriaValueToExpression(values[i])
|
||||||
|
if (expression)
|
||||||
|
{
|
||||||
|
values[i] = expression;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
* QQQ - Low-code Application Framework for Engineers.
|
||||||
|
* Copyright (C) 2021-2022. Kingsrook, LLC
|
||||||
|
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
|
||||||
|
* contact@kingsrook.com
|
||||||
|
* https://github.com/Kingsrook/
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.kingsrook.qqq.materialdashboard.tests;
|
||||||
|
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.expressions.NowWithOffset;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.expressions.ThisOrLastPeriod;
|
||||||
|
import com.kingsrook.qqq.backend.core.utils.JsonUtils;
|
||||||
|
import com.kingsrook.qqq.materialdashboard.lib.QBaseSeleniumTest;
|
||||||
|
import com.kingsrook.qqq.materialdashboard.lib.QQQMaterialDashboardSelectors;
|
||||||
|
import com.kingsrook.qqq.materialdashboard.lib.javalin.QSeleniumJavalin;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Test for the record query screen when a filter is given in the URL
|
||||||
|
*******************************************************************************/
|
||||||
|
public class QueryScreenFilterInUrlTest extends QBaseSeleniumTest
|
||||||
|
{
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Override
|
||||||
|
protected void addJavalinRoutes(QSeleniumJavalin qSeleniumJavalin)
|
||||||
|
{
|
||||||
|
super.addJavalinRoutes(qSeleniumJavalin);
|
||||||
|
qSeleniumJavalin
|
||||||
|
.withRouteToFile("/data/person/count", "data/person/count.json")
|
||||||
|
.withRouteToFile("/data/person/query", "data/person/index.json")
|
||||||
|
.withRouteToFile("/data/person/possibleValues/homeCityId", "data/person/possibleValues/homeCityId.json")
|
||||||
|
.withRouteToFile("/data/person/variants", "data/person/variants.json")
|
||||||
|
.withRouteToFile("/processes/querySavedFilter/init", "processes/querySavedFilter/init.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Test
|
||||||
|
void testUrlWithFilter()
|
||||||
|
{
|
||||||
|
////////////////////////////////////////
|
||||||
|
// not-blank -- criteria w/ no values //
|
||||||
|
////////////////////////////////////////
|
||||||
|
String filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||||
|
.withCriteria(new QFilterCriteria("annualSalary", QCriteriaOperator.IS_NOT_BLANK)));
|
||||||
|
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||||
|
waitForQueryToHaveRan();
|
||||||
|
assertFilterButtonBadge(1);
|
||||||
|
clickFilterButton();
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"is not empty\"]");
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// between on a number field //
|
||||||
|
///////////////////////////////
|
||||||
|
filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||||
|
.withCriteria(new QFilterCriteria("annualSalary", QCriteriaOperator.BETWEEN, 1701, 74656)));
|
||||||
|
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||||
|
waitForQueryToHaveRan();
|
||||||
|
assertFilterButtonBadge(1);
|
||||||
|
clickFilterButton();
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"is between\"]");
|
||||||
|
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");
|
||||||
|
waitForQueryToHaveRan();
|
||||||
|
assertFilterButtonBadge(1);
|
||||||
|
clickFilterButton();
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"does not equal\"]");
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"St. Louis\"]");
|
||||||
|
|
||||||
|
//////////////////////////////////////
|
||||||
|
// an IN for a possible-value field //
|
||||||
|
//////////////////////////////////////
|
||||||
|
filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||||
|
.withCriteria(new QFilterCriteria("homeCityId", QCriteriaOperator.IN, 1, 2)));
|
||||||
|
qSeleniumLib.gotoAndWaitForBreadcrumbHeader("/peopleApp/greetingsApp/person?filter=" + URLEncoder.encode(filterJSON, StandardCharsets.UTF_8), "Person");
|
||||||
|
waitForQueryToHaveRan();
|
||||||
|
assertFilterButtonBadge(1);
|
||||||
|
clickFilterButton();
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"is any of\"]");
|
||||||
|
qSeleniumLib.waitForSelectorContaining(".MuiChip-label", "St. Louis");
|
||||||
|
qSeleniumLib.waitForSelectorContaining(".MuiChip-label", "Chesterfield");
|
||||||
|
|
||||||
|
/////////////////////////////////////////
|
||||||
|
// greater than a date-time expression //
|
||||||
|
/////////////////////////////////////////
|
||||||
|
filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||||
|
.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");
|
||||||
|
waitForQueryToHaveRan();
|
||||||
|
assertFilterButtonBadge(1);
|
||||||
|
clickFilterButton();
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"is after\"]");
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"5 days ago\"]");
|
||||||
|
|
||||||
|
///////////////////////
|
||||||
|
// multiple criteria //
|
||||||
|
///////////////////////
|
||||||
|
filterJSON = JsonUtils.toJson(new QQueryFilter()
|
||||||
|
.withCriteria(new QFilterCriteria("firstName", QCriteriaOperator.STARTS_WITH, "Dar"))
|
||||||
|
.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");
|
||||||
|
waitForQueryToHaveRan();
|
||||||
|
assertFilterButtonBadge(2);
|
||||||
|
clickFilterButton();
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"is at or before\"]");
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"start of this year\"]");
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"starts with\"]");
|
||||||
|
qSeleniumLib.waitForSelector("input[value=\"Dar\"]");
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// remove one //
|
||||||
|
////////////////
|
||||||
|
qSeleniumLib.waitForSelectorContaining(".MuiIcon-root", "close").click();
|
||||||
|
assertFilterButtonBadge(1);
|
||||||
|
|
||||||
|
qSeleniumLib.waitForever();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private WebElement assertFilterButtonBadge(int valueInBadge)
|
||||||
|
{
|
||||||
|
return qSeleniumLib.waitForSelectorContaining(".MuiBadge-root", String.valueOf(valueInBadge));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private WebElement waitForQueryToHaveRan()
|
||||||
|
{
|
||||||
|
return qSeleniumLib.waitForSelector(QQQMaterialDashboardSelectors.QUERY_GRID_CELL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
private void clickFilterButton()
|
||||||
|
{
|
||||||
|
qSeleniumLib.waitForSelectorContaining(".MuiDataGrid-toolbarContainer BUTTON", "Filter").click();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"label": "St. Louis"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"label": "Chesterfield"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -74,6 +74,15 @@
|
|||||||
"isEditable": true,
|
"isEditable": true,
|
||||||
"displayFormat": "%s"
|
"displayFormat": "%s"
|
||||||
},
|
},
|
||||||
|
"homeCityId": {
|
||||||
|
"name": "homeCityId",
|
||||||
|
"label": "Home City",
|
||||||
|
"type": "INTEGER",
|
||||||
|
"possibleValueSourceName": "city",
|
||||||
|
"isRequired": false,
|
||||||
|
"isEditable": true,
|
||||||
|
"displayFormat": "%s"
|
||||||
|
},
|
||||||
"email": {
|
"email": {
|
||||||
"name": "email",
|
"name": "email",
|
||||||
"label": "Email",
|
"label": "Email",
|
||||||
|
Reference in New Issue
Block a user