diff --git a/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx b/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx
index 4a22fe9..49e3faa 100644
--- a/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx
+++ b/src/qqq/components/widgets/misc/FilterAndColumnsSetupWidget.tsx
@@ -44,7 +44,7 @@ import RecordQuery from "qqq/pages/records/query/RecordQuery";
import Client from "qqq/utils/qqq/Client";
import FilterUtils from "qqq/utils/qqq/FilterUtils";
import TableUtils from "qqq/utils/qqq/TableUtils";
-import React, {useContext, useEffect, useRef, useState} from "react";
+import React, {useContext, useEffect, useMemo, useRef, useState} from "react";
interface FilterAndColumnsSetupWidgetProps
{
@@ -106,6 +106,8 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp,
const [warning, setWarning] = useState(null as string);
const [widgetFailureAlertContent, setWidgetFailureAlertContent] = useState(null as string);
+ const omitExposedJoins: string[] = widgetData?.omitExposedJoins ?? [];
+
//////////////////////////////////////////////////////////////////////////////////////////////////
// we'll actually keep 2 copies of the query filter around here - //
// the one in the record (as json) is one that the backend likes (e.g., possible values as ids) //
@@ -441,7 +443,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp,
- {label ?? "Query Filter"}
+ {label ?? widgetData.label ?? widgetMetaData.label ?? "Query Filter"}
{!hideSortBy && {mayShowQuery() && getCurrentSortIndicator(frontendQueryFilter, tableMetaData, null)}}
{
@@ -454,7 +456,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp,
{
isEditable &&
-
+
}
{
@@ -501,6 +503,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp,
initialQueryFilter={frontendQueryFilter}
initialColumns={columns}
apiVersion={apiVersion}
+ omitExposedJoins={omitExposedJoins}
/>
)}
@@ -510,7 +513,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp,
- Edit Filters and Columns
+ Edit Filters {hideColumns ? "" : " and Columns"}
{
showHelp("modalSubheader") &&
@@ -527,6 +530,7 @@ export default function FilterAndColumnsSetupWidget({isEditable: isEditableProp,
initialQueryFilter={usingDefaultEmptyFilter ? null : frontendQueryFilter}
initialColumns={columns}
apiVersion={apiVersion}
+ omitExposedJoins={omitExposedJoins}
/>
}
diff --git a/src/qqq/models/fields/FieldPossibleValueProps.ts b/src/qqq/models/fields/FieldPossibleValueProps.ts
index 34b300f..8f06e22 100644
--- a/src/qqq/models/fields/FieldPossibleValueProps.ts
+++ b/src/qqq/models/fields/FieldPossibleValueProps.ts
@@ -20,6 +20,7 @@
*/
import {QPossibleValue} from "@kingsrook/qqq-frontend-core/lib/model/QPossibleValue";
+import {QQueryFilter} from "@kingsrook/qqq-frontend-core/lib/model/query/QQueryFilter";
/*******************************************************************************
** Properties attached to a (formik?) form field, to denote how it behaves as
@@ -34,5 +35,6 @@ export interface FieldPossibleValueProps
tableName?: string;
processName?: string;
possibleValueSourceName?: string;
+ possibleValueSourceFilter?: QQueryFilter;
}
diff --git a/src/qqq/pages/records/query/RecordQuery.tsx b/src/qqq/pages/records/query/RecordQuery.tsx
index 7401d44..7458321 100644
--- a/src/qqq/pages/records/query/RecordQuery.tsx
+++ b/src/qqq/pages/records/query/RecordQuery.tsx
@@ -89,15 +89,16 @@ export type QueryScreenUsage = "queryScreen" | "reportSetup"
interface Props
{
- table?: QTableMetaData;
- apiVersion?: ApiVersion;
- launchProcess?: QProcessMetaData;
- usage?: QueryScreenUsage;
- isModal?: boolean;
- isPreview?: boolean;
- initialQueryFilter?: QQueryFilter;
- initialColumns?: QQueryColumns;
- allowVariables?: boolean;
+ table?: QTableMetaData,
+ apiVersion?: ApiVersion,
+ launchProcess?: QProcessMetaData,
+ usage?: QueryScreenUsage,
+ isModal?: boolean,
+ isPreview?: boolean,
+ initialQueryFilter?: QQueryFilter,
+ initialColumns?: QQueryColumns,
+ allowVariables?: boolean,
+ omitExposedJoins?: string[]
}
///////////////////////////////////////////////////////
@@ -130,7 +131,7 @@ const getLoadingScreen = (isModal: boolean) =>
**
** Yuge component. The best. Lots of very smart people are saying so.
*******************************************************************************/
-const RecordQuery = forwardRef(({table, apiVersion, usage, isModal, isPreview, allowVariables, initialQueryFilter, initialColumns}: Props, ref) =>
+const RecordQuery = forwardRef(({table, apiVersion, usage, isModal, isPreview, allowVariables, initialQueryFilter, initialColumns, omitExposedJoins}: Props, ref) =>
{
const tableName = table.name;
const [searchParams] = useSearchParams();
@@ -2843,6 +2844,7 @@ const RecordQuery = forwardRef(({table, apiVersion, usage, isModal, isPreview, a
idPrefix="columns"
tableMetaData={tableMetaData}
showTableHeaderEvenIfNoExposedJoins={true}
+ omitExposedJoins={omitExposedJoins}
placeholder="Search Fields"
buttonProps={{sx: columnMenuButtonStyles}}
buttonChildren={<>view_week_outline Columns ({view.queryColumns.getVisibleColumnCount()}) keyboard_arrow_down>}
@@ -2985,6 +2987,7 @@ const RecordQuery = forwardRef(({table, apiVersion, usage, isModal, isPreview, a
setMode={doSetMode}
savedViewsComponent={savedViewsComponent}
columnMenuComponent={buildColumnMenu()}
+ omitExposedJoins={omitExposedJoins}
/>
}
@@ -3010,7 +3013,8 @@ const RecordQuery = forwardRef(({table, apiVersion, usage, isModal, isPreview, a
metaData: metaData,
queryFilter: queryFilter,
updateFilter: doSetQueryFilter,
- allowVariables: allowVariables
+ allowVariables: allowVariables,
+ omitExposedJoins: omitExposedJoins,
}
}}
localeText={{
diff --git a/src/qqq/utils/qqq/QFMDBridge.tsx b/src/qqq/utils/qqq/QFMDBridge.tsx
index a25330d..3708216 100644
--- a/src/qqq/utils/qqq/QFMDBridge.tsx
+++ b/src/qqq/utils/qqq/QFMDBridge.tsx
@@ -73,10 +73,20 @@ function QFMDBridgeForm({fields, record, handleChange, handleSubmit}: QFMDBridge
for (let field of fields)
{
initialValues[field.name] = record.values.get(field.name);
+ if(initialValues[field.name] === undefined && field.defaultValue !== undefined)
+ {
+ initialValues[field.name] = field.defaultValue;
+ }
+
}
const [lastValues, setLastValues] = useState(initialValues);
const [loaded, setLoaded] = useState(false);
+ ///////////////////////////////////////////////////////////////////////////////
+ // store reference to record display values in a state var - see usage below //
+ ///////////////////////////////////////////////////////////////////////////////
+ const [recordDisplayValues, setRecordDisplayValues] = useState(record?.displayValues ?? new Map())
+
useEffect(() =>
{
(async () =>
@@ -91,7 +101,12 @@ function QFMDBridgeForm({fields, record, handleChange, handleSubmit}: QFMDBridge
const possibleValues = await qController.possibleValues(null, null, field.possibleValueSourceName, null, [value], [], record.values, "form");
if (possibleValues && possibleValues.length > 0)
{
- record.displayValues.set(field.name, possibleValues[0].label);
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // originally, we put this in record.displayValues, but, sometimes that would then be empty at the usage point below... //
+ // this works, so, we'll go with it //
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ recordDisplayValues.set(field.name, possibleValues[0].label)
+ setRecordDisplayValues(recordDisplayValues);
}
}
}
@@ -109,7 +124,7 @@ function QFMDBridgeForm({fields, record, handleChange, handleSubmit}: QFMDBridge
dynamicFormFields,
formValidations,
} = DynamicFormUtils.getFormData(fields);
- DynamicFormUtils.addPossibleValueProps(dynamicFormFields, fields, null, null, record ? record.displayValues : new Map());
+ DynamicFormUtils.addPossibleValueProps(dynamicFormFields, fields, null, null, recordDisplayValues);
const otherValuesMap = new Map();
record.values.forEach((value, key) => otherValuesMap.set(key, value));