{
selectFullFilterState === "checked" && (
The
{` ${selectedIds.length.toLocaleString()} `}
- records on this page are selected.
-
+ {joinIsMany ? " distinct " : ""}
+ record{selectedIds.length == 1 ? "" : "s"} on this page {selectedIds.length == 1 ? "is" : "are"} selected.
)
}
{
selectFullFilterState === "filter" && (
- All
- {/* todo - distinct? */}
- {` ${totalRecords ? totalRecords.toLocaleString() : ""} `}
- records matching this query are selected.
-
+ {
+ (joinIsMany
+ ? (
+ distinctRecords == 1
+ ? (<>The only 1 distinct record matching this query is selected.>)
+ : (<>All {(distinctRecords ? distinctRecords.toLocaleString() : "")} distinct records matching this query are selected.>)
+ )
+ : (<>All {totalRecords ? totalRecords.toLocaleString() : ""} records matching this query are selected.>)
+ )
+ }
+
+ )
+ }
+ {
+ selectFullFilterState === "filterSubset" && (
+
+ )
+ }
+ {
+ (selectFullFilterState === "n/a" && selectedIds.length > 0) && (
+
+ {safeToLocaleString(selectedIds.length)} {joinIsMany ? "distinct" : ""} {selectedIds.length == 1 ? "record is" : "records are"} selected.
)
}
@@ -1671,7 +1817,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
// getRowHeight={() => "auto"} // maybe nice? wraps values in cells...
columns={columnsModel}
rowBuffer={10}
- rowCount={/*todo - distinct?*/totalRecords === null || totalRecords === undefined ? 0 : totalRecords}
+ rowCount={totalRecords === null || totalRecords === undefined ? 0 : totalRecords}
onPageSizeChange={handleRowsPerPageChange}
onRowClick={handleRowClick}
onStateChange={handleStateChange}
@@ -1688,6 +1834,8 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
sortModel={columnSortModel}
getRowClassName={(params) => (params.indexRelativeToCurrentPage % 2 === 0 ? "even" : "odd")}
getRowId={(row) => row.__rowIndex}
+ selectionModel={rowSelectionModel}
+ hideFooterSelectedRowCount={true}
/>
@@ -1724,4 +1872,49 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
);
}
+//////////////////////////////////////////////////////////////////////////////////
+// mini-component that is the dialog for the user to enter the selection-subset //
+//////////////////////////////////////////////////////////////////////////////////
+function SelectionSubsetDialog(props: {isOpen: boolean; initialValue: number; closeHandler: (value?: number) => void})
+{
+ const [value, setValue] = useState(props.initialValue)
+
+ const handleChange = (newValue: string) =>
+ {
+ setValue(parseInt(newValue))
+ }
+
+ const keyPressed = (e: React.KeyboardEvent
) =>
+ {
+ if(e.key == "Enter" && value)
+ {
+ props.closeHandler(value);
+ }
+ }
+
+ return (
+
+ )
+}
+
+
+
export default RecordQuery;
diff --git a/src/qqq/styles/qqq-override-styles.css b/src/qqq/styles/qqq-override-styles.css
index 13393ff..4e61b6f 100644
--- a/src/qqq/styles/qqq-override-styles.css
+++ b/src/qqq/styles/qqq-override-styles.css
@@ -124,7 +124,6 @@
.MuiDataGrid-toolbarContainer .selectionTool
{
- margin-left: 40px;
font-size: 14px;
}
diff --git a/src/qqq/utils/DataGridUtils.tsx b/src/qqq/utils/DataGridUtils.tsx
index f0dfc6c..f9c8d48 100644
--- a/src/qqq/utils/DataGridUtils.tsx
+++ b/src/qqq/utils/DataGridUtils.tsx
@@ -22,10 +22,12 @@
import {AdornmentType} from "@kingsrook/qqq-frontend-core/lib/model/metaData/AdornmentType";
import {QFieldMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFieldMetaData";
import {QFieldType} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QFieldType";
+import {QInstance} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QInstance";
import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QTableMetaData";
import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord";
import {getGridDateOperators, GridColDef, GridRowsProp} from "@mui/x-data-grid-pro";
import {GridFilterOperator} from "@mui/x-data-grid/models/gridFilterOperator";
+import React from "react";
import {Link} from "react-router-dom";
import {buildQGridPvsOperators, QGridBooleanOperators, QGridNumericOperators, QGridStringOperators} from "qqq/pages/records/query/GridFilterOperators";
import ValueUtils from "qqq/utils/qqq/ValueUtils";
@@ -87,7 +89,7 @@ export default class DataGridUtils
/*******************************************************************************
**
*******************************************************************************/
- public static setupGridColumns = (tableMetaData: QTableMetaData, linkBase: string = ""): GridColDef[] =>
+ public static setupGridColumns = (tableMetaData: QTableMetaData, linkBase: string = "", metaData?: QInstance): GridColDef[] =>
{
const columns = [] as GridColDef[];
this.addColumnsForTable(tableMetaData, linkBase, columns, null);
@@ -97,8 +99,15 @@ export default class DataGridUtils
for (let i = 0; i < tableMetaData.exposedJoins.length; i++)
{
const join = tableMetaData.exposedJoins[i];
- // todo - link base here - link to the join table
- this.addColumnsForTable(join.joinTable, null, columns, join.joinTable.name + ".", join.label + ": ");
+
+ let joinLinkBase = null;
+ if(metaData)
+ {
+ joinLinkBase = metaData.getTablePath(join.joinTable);
+ joinLinkBase += joinLinkBase.endsWith("/") ? "" : "/";
+ }
+
+ this.addColumnsForTable(join.joinTable, joinLinkBase, columns, join.joinTable.name + ".", join.label + ": ");
}
}
@@ -111,6 +120,10 @@ export default class DataGridUtils
*******************************************************************************/
private static addColumnsForTable(tableMetaData: QTableMetaData, linkBase: string, columns: GridColDef[], namePrefix?: string, labelPrefix?: string)
{
+ /*
+ ////////////////////////////////////////////////////////////////////////
+ // this sorted by sections - e.g., manual sorting by the meta-data... //
+ ////////////////////////////////////////////////////////////////////////
const sortedKeys: string[] = [];
for (let i = 0; i < tableMetaData.sections.length; i++)
{
@@ -125,23 +138,37 @@ export default class DataGridUtils
sortedKeys.push(section.fieldNames[j]);
}
}
+ */
+
+ ///////////////////////////
+ // sort by labels... mmm //
+ ///////////////////////////
+ const sortedKeys = [...tableMetaData.fields.keys()];
+ sortedKeys.sort((a: string, b: string): number =>
+ {
+ return (tableMetaData.fields.get(a).label.localeCompare(tableMetaData.fields.get(b).label))
+ })
sortedKeys.forEach((key) =>
{
const field = tableMetaData.fields.get(key);
const column = this.makeColumnFromField(field, tableMetaData, namePrefix, labelPrefix);
- if (key === tableMetaData.primaryKeyField && linkBase)
+ if(key === tableMetaData.primaryKeyField && linkBase && namePrefix == null)
{
columns.splice(0, 0, column);
- column.renderCell = (cellValues: any) => (
- {cellValues.value}
- );
}
else
{
columns.push(column);
}
+
+ if (key === tableMetaData.primaryKeyField && linkBase)
+ {
+ column.renderCell = (cellValues: any) => (
+ e.stopPropagation()}>{cellValues.value}
+ );
+ }
});
}