mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-17 21:00:45 +00:00
Merge pull request #48 from Kingsrook/bugfix/null-field-names-in-criteria
Strip away null field names in criteria (e.g., from incomplete advanc…
This commit is contained in:
@ -25,7 +25,7 @@ import {QTableMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QT
|
|||||||
import {QJobComplete} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobComplete";
|
import {QJobComplete} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobComplete";
|
||||||
import {QJobError} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobError";
|
import {QJobError} from "@kingsrook/qqq-frontend-core/lib/model/processes/QJobError";
|
||||||
import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord";
|
import {QRecord} from "@kingsrook/qqq-frontend-core/lib/model/QRecord";
|
||||||
import {Alert, Button, Link} from "@mui/material";
|
import {Alert, Button} from "@mui/material";
|
||||||
import Box from "@mui/material/Box";
|
import Box from "@mui/material/Box";
|
||||||
import Dialog from "@mui/material/Dialog";
|
import Dialog from "@mui/material/Dialog";
|
||||||
import DialogActions from "@mui/material/DialogActions";
|
import DialogActions from "@mui/material/DialogActions";
|
||||||
@ -40,14 +40,14 @@ import TextField from "@mui/material/TextField";
|
|||||||
import Tooltip from "@mui/material/Tooltip";
|
import Tooltip from "@mui/material/Tooltip";
|
||||||
import {TooltipProps} from "@mui/material/Tooltip/Tooltip";
|
import {TooltipProps} from "@mui/material/Tooltip/Tooltip";
|
||||||
import FormData from "form-data";
|
import FormData from "form-data";
|
||||||
import React, {useContext, useEffect, useRef, useState} from "react";
|
|
||||||
import {useLocation, useNavigate} from "react-router-dom";
|
|
||||||
import QContext from "QContext";
|
import QContext from "QContext";
|
||||||
import colors from "qqq/assets/theme/base/colors";
|
import colors from "qqq/assets/theme/base/colors";
|
||||||
import {QCancelButton, QDeleteButton, QSaveButton} from "qqq/components/buttons/DefaultButtons";
|
import {QCancelButton, QDeleteButton, QSaveButton} from "qqq/components/buttons/DefaultButtons";
|
||||||
import RecordQueryView from "qqq/models/query/RecordQueryView";
|
import RecordQueryView from "qqq/models/query/RecordQueryView";
|
||||||
import FilterUtils from "qqq/utils/qqq/FilterUtils";
|
import FilterUtils from "qqq/utils/qqq/FilterUtils";
|
||||||
import {SavedViewUtils} from "qqq/utils/qqq/SavedViewUtils";
|
import {SavedViewUtils} from "qqq/utils/qqq/SavedViewUtils";
|
||||||
|
import React, {useContext, useEffect, useRef, useState} from "react";
|
||||||
|
import {useLocation, useNavigate} from "react-router-dom";
|
||||||
|
|
||||||
interface Props
|
interface Props
|
||||||
{
|
{
|
||||||
@ -227,6 +227,12 @@ function SavedViews({qController, metaData, tableMetaData, currentSavedView, tab
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
const viewObject = JSON.parse(JSON.stringify(view));
|
const viewObject = JSON.parse(JSON.stringify(view));
|
||||||
viewObject.queryFilter = JSON.parse(JSON.stringify(FilterUtils.convertFilterPossibleValuesToIds(viewObject.queryFilter)));
|
viewObject.queryFilter = JSON.parse(JSON.stringify(FilterUtils.convertFilterPossibleValuesToIds(viewObject.queryFilter)));
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// strip away incomplete filters too, just for cleaner saved view filters //
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
FilterUtils.stripAwayIncompleteCriteria(viewObject.queryFilter)
|
||||||
|
|
||||||
formData.append("viewJson", JSON.stringify(viewObject));
|
formData.append("viewJson", JSON.stringify(viewObject));
|
||||||
|
|
||||||
if (isSaveFilterAs || isRenameFilter || currentSavedView == null)
|
if (isSaveFilterAs || isRenameFilter || currentSavedView == null)
|
||||||
|
@ -63,6 +63,8 @@ export default class RecordQueryView
|
|||||||
|
|
||||||
view.queryFilter = json.queryFilter as QQueryFilter;
|
view.queryFilter = json.queryFilter as QQueryFilter;
|
||||||
|
|
||||||
|
FilterUtils.stripAwayIncompleteCriteria(view.queryFilter)
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// it's important that some criteria values exist as expression objects - so - do that. //
|
// it's important that some criteria values exist as expression objects - so - do that. //
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -711,8 +711,27 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
|
|||||||
const doSetView = (view: RecordQueryView): void =>
|
const doSetView = (view: RecordQueryView): void =>
|
||||||
{
|
{
|
||||||
setView(view);
|
setView(view);
|
||||||
setViewAsJson(JSON.stringify(view));
|
const viewAsJSON = JSON.stringify(view);
|
||||||
localStorage.setItem(viewLocalStorageKey, JSON.stringify(view));
|
setViewAsJson(viewAsJSON);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// in case there's an incomplete criteria in the view (e.g., w/o a fieldName), //
|
||||||
|
// don't store that in local storage - we don't want that, it's messy, and it //
|
||||||
|
// has caused fails in the past. So, clone the view, and strip away such things. //
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
const viewForLocalStorage: RecordQueryView = JSON.parse(viewAsJSON);
|
||||||
|
if (viewForLocalStorage?.queryFilter?.criteria?.length > 0)
|
||||||
|
{
|
||||||
|
FilterUtils.stripAwayIncompleteCriteria(viewForLocalStorage.queryFilter)
|
||||||
|
}
|
||||||
|
localStorage.setItem(viewLocalStorageKey, JSON.stringify(viewForLocalStorage));
|
||||||
|
}
|
||||||
|
catch(e)
|
||||||
|
{
|
||||||
|
console.log("Error storing view in local storage: " + e)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -589,6 +589,29 @@ class FilterUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** after go-live of redesigin in march 2024, we had bugs where we could get a
|
||||||
|
** filter with a criteria w/ a null field name (e.g., by having an incomplete
|
||||||
|
** criteria in the Advanced filter builder - and that would sometimes break
|
||||||
|
** the screen! So, strip those away when storing or loading filters, via
|
||||||
|
** this function.
|
||||||
|
*******************************************************************************/
|
||||||
|
public static stripAwayIncompleteCriteria(filter: QQueryFilter)
|
||||||
|
{
|
||||||
|
if (filter?.criteria?.length > 0)
|
||||||
|
{
|
||||||
|
for (let i = 0; i < filter.criteria.length; i++)
|
||||||
|
{
|
||||||
|
if (!filter.criteria[i].fieldName)
|
||||||
|
{
|
||||||
|
filter.criteria.splice(i, 1);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default FilterUtils;
|
export default FilterUtils;
|
||||||
|
Reference in New Issue
Block a user