diff --git a/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx b/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx
index 4f29966..1f67a23 100644
--- a/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx
+++ b/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx
@@ -108,32 +108,41 @@ export default function FilterAndColumnsSetupWidget({isEditable, widgetMetaData,
let columns: QQueryColumns = null;
let usingDefaultEmptyFilter = false;
let queryFilter = recordValues["queryFilterJson"] && JSON.parse(recordValues["queryFilterJson"]) as QQueryFilter;
+ const defaultFilterFields = getDefaultFilterFieldNames(widgetMetaData);
if (!queryFilter)
{
queryFilter = new QQueryFilter();
-
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // if there is no queryFilter provided, see if there are default fields from which a query should be seeded //
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
- const defaultFilterFields = getDefaultFilterFieldNames(widgetMetaData);
- if (defaultFilterFields?.length > 0)
- {
- defaultFilterFields.forEach((fieldName: string) =>
- {
- if (recordValues[fieldName])
- {
- queryFilter.addCriteria(new QFilterCriteria(fieldName, QCriteriaOperator.EQUALS, [recordValues[fieldName]]));
- }
- });
-
- queryFilter.addOrderBy(new QFilterOrderBy("id", false));
- queryFilter = Object.assign({}, queryFilter);
- }
- else
+ if (defaultFilterFields?.length == 0)
{
usingDefaultEmptyFilter = true;
}
}
+ else
+ {
+ queryFilter = Object.assign(new QQueryFilter(), queryFilter);
+ }
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////
+ // if there are default fields from which a query should be seeded, add/update the filter with them //
+ //////////////////////////////////////////////////////////////////////////////////////////////////////
+ if (defaultFilterFields?.length > 0)
+ {
+ defaultFilterFields.forEach((fieldName: string) =>
+ {
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // if a value for the default field exists, remove the criteria for it in our query first //
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ queryFilter.criteria = queryFilter.criteria?.filter(c => c.fieldName != fieldName);
+
+ if (recordValues[fieldName])
+ {
+ queryFilter.addCriteria(new QFilterCriteria(fieldName, QCriteriaOperator.EQUALS, [recordValues[fieldName]]));
+ }
+ });
+
+ queryFilter.addOrderBy(new QFilterOrderBy("id", false));
+ queryFilter = Object.assign({}, queryFilter);
+ }
if (recordValues["columnsJson"])
{
diff --git a/src/qqq/components/widgets/misc/RecordGridWidget.tsx b/src/qqq/components/widgets/misc/RecordGridWidget.tsx
index 4bf329f..f4323fd 100644
--- a/src/qqq/components/widgets/misc/RecordGridWidget.tsx
+++ b/src/qqq/components/widgets/misc/RecordGridWidget.tsx
@@ -40,14 +40,14 @@ import {Link, useNavigate} from "react-router-dom";
export interface ChildRecordListData extends WidgetData
{
title: string;
- queryOutput: {records: {values: any}[]}
+ queryOutput: { records: { values: any }[] };
childTableMetaData: QTableMetaData;
tablePath: string;
viewAllLink: string;
totalRows: number;
canAddChildRecord: boolean;
- defaultValuesForNewChildRecords: {[fieldName: string]: any};
- disabledFieldsForNewChildRecords: {[fieldName: string]: any};
+ defaultValuesForNewChildRecords: { [fieldName: string]: any };
+ disabledFieldsForNewChildRecords: { [fieldName: string]: any };
}
interface Props
@@ -75,9 +75,9 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
{
const instance = useRef({timer: null});
const [rows, setRows] = useState([]);
- const [records, setRecords] = useState([] as QRecord[])
+ const [records, setRecords] = useState([] as QRecord[]);
const [columns, setColumns] = useState([]);
- const [allColumns, setAllColumns] = useState([])
+ const [allColumns, setAllColumns] = useState([]);
const [csv, setCsv] = useState(null as string);
const [fileName, setFileName] = useState(null as string);
const [gridMouseDownX, setGridMouseDownX] = useState(0);
@@ -110,20 +110,20 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// capture all-columns to use for the export (before we might splice some away from the on-screen display) //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
- const allColumns = [... columns];
+ const allColumns = [...columns];
setAllColumns(JSON.parse(JSON.stringify(columns)));
////////////////////////////////////////////////////////////////
// do not not show the foreign-key column of the parent table //
////////////////////////////////////////////////////////////////
- if(data.defaultValuesForNewChildRecords)
+ if (data.defaultValuesForNewChildRecords)
{
for (let i = 0; i < columns.length; i++)
{
- if(data.defaultValuesForNewChildRecords[columns[i].field])
+ if (data.defaultValuesForNewChildRecords[columns[i].field])
{
columns.splice(i, 1);
- i--
+ i--;
}
}
}
@@ -131,7 +131,7 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
////////////////////////////////////
// add actions cell, if available //
////////////////////////////////////
- if(allowRecordEdit || allowRecordDelete)
+ if (allowRecordEdit || allowRecordDelete)
{
columns.unshift({
field: "_actions",
@@ -145,19 +145,19 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
return
{allowRecordEdit && editRecordCallback(params.row.__rowIndex)}>edit}
{allowRecordDelete && deleteRecordCallback(params.row.__rowIndex)}>delete}
-
+ ;
})
- })
+ });
}
setRows(rows);
- setRecords(records)
+ setRecords(records);
setColumns(columns);
let csv = "";
for (let i = 0; i < allColumns.length; i++)
{
- csv += `${i > 0 ? "," : ""}"${ValueUtils.cleanForCsv(allColumns[i].headerName)}"`
+ csv += `${i > 0 ? "," : ""}"${ValueUtils.cleanForCsv(allColumns[i].headerName)}"`;
}
csv += "\n";
@@ -165,8 +165,8 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
{
for (let j = 0; j < allColumns.length; j++)
{
- const value = records[i].displayValues.get(allColumns[j].field) ?? records[i].values.get(allColumns[j].field)
- csv += `${j > 0 ? "," : ""}"${ValueUtils.cleanForCsv(value)}"`
+ const value = records[i].displayValues.get(allColumns[j].field) ?? records[i].values.get(allColumns[j].field);
+ csv += `${j > 0 ? "," : ""}"${ValueUtils.cleanForCsv(value)}"`;
}
csv += "\n";
}
@@ -182,13 +182,13 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
// view all link //
///////////////////
const labelAdditionalElementsLeft: JSX.Element[] = [];
- if(data && data.viewAllLink)
+ if (data && data.viewAllLink)
{
labelAdditionalElementsLeft.push(
View All
- )
+ );
}
///////////////////
@@ -200,10 +200,10 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
{
isExportDisabled = false;
- if(data.totalRows && data.queryOutput.records.length < data.totalRows)
+ if (data.totalRows && data.queryOutput.records.length < data.totalRows)
{
- tooltipTitle = "Export these " + data.queryOutput.records.length + " records."
- if(data.viewAllLink)
+ tooltipTitle = "Export these " + data.queryOutput.records.length + " records.";
+ if (data.viewAllLink)
{
tooltipTitle += "\nClick View All to export all records.";
}
@@ -212,17 +212,17 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
const onExportClick = () =>
{
- if(csv)
+ if (csv)
{
HtmlUtils.download(fileName, csv);
}
else
{
- alert("There is no data available to export.")
+ alert("There is no data available to export.");
}
- }
+ };
- if(widgetMetaData?.showExportButton)
+ if (widgetMetaData?.showExportButton)
{
labelAdditionalElementsLeft.push(
@@ -234,15 +234,15 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
////////////////////
// add new button //
////////////////////
- const labelAdditionalComponentsRight: LabelComponent[] = []
- if(data && data.canAddChildRecord)
+ const labelAdditionalComponentsRight: LabelComponent[] = [];
+ if (data && data.canAddChildRecord)
{
let disabledFields = data.disabledFieldsForNewChildRecords;
- if(!disabledFields)
+ if (!disabledFields)
{
disabledFields = data.defaultValuesForNewChildRecords;
}
- labelAdditionalComponentsRight.push(new AddNewRecordButton(data.childTableMetaData, data.defaultValuesForNewChildRecords, "Add new", disabledFields, addNewRecordCallback))
+ labelAdditionalComponentsRight.push(new AddNewRecordButton(data.childTableMetaData, data.defaultValuesForNewChildRecords, "Add new", disabledFields, addNewRecordCallback));
}
@@ -251,16 +251,16 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
/////////////////////////////////////////////////////////////////
const handleRowClick = (params: GridRowParams, event: MuiEvent, details: GridCallbackDetails) =>
{
- if(disableRowClick)
+ if (disableRowClick)
{
return;
}
(async () =>
{
- const qInstance = await qController.loadMetaData()
- let tablePath = qInstance.getTablePathByName(data.childTableMetaData.name)
- if(tablePath)
+ const qInstance = await qController.loadMetaData();
+ let tablePath = qInstance.getTablePathByName(data.childTableMetaData.name);
+ if (tablePath)
{
tablePath = `${tablePath}/${params.row[data.childTableMetaData.primaryKeyField]}`;
DataGridUtils.handleRowClick(tablePath, event, gridMouseDownX, gridMouseDownY, navigate, instance);
@@ -276,7 +276,7 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
*******************************************************************************/
function CustomToolbar()
{
- const handleMouseDown: GridEventListener<"cellMouseDown"> = ( params, event, details ) =>
+ const handleMouseDown: GridEventListener<"cellMouseDown"> = (params, event, details) =>
{
setGridMouseDownX(event.clientX);
setGridMouseDownY(event.clientY);
@@ -304,8 +304,8 @@ function RecordGridWidget({widgetMetaData, data, addNewRecordCallback, disableRo
labelAdditionalComponentsRight={labelAdditionalComponentsRight}
labelBoxAdditionalSx={{position: "relative", top: "-0.375rem"}}
>
-
-
+
+