mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-17 12:50:43 +00:00
CE-882 Support working outside of table or process
This commit is contained in:
@ -28,16 +28,17 @@ import Box from "@mui/material/Box";
|
|||||||
import Switch from "@mui/material/Switch";
|
import Switch from "@mui/material/Switch";
|
||||||
import TextField from "@mui/material/TextField";
|
import TextField from "@mui/material/TextField";
|
||||||
import {ErrorMessage, useFormikContext} from "formik";
|
import {ErrorMessage, useFormikContext} from "formik";
|
||||||
import React, {useEffect, useState} from "react";
|
|
||||||
import colors from "qqq/assets/theme/base/colors";
|
import colors from "qqq/assets/theme/base/colors";
|
||||||
import MDTypography from "qqq/components/legacy/MDTypography";
|
import MDTypography from "qqq/components/legacy/MDTypography";
|
||||||
import Client from "qqq/utils/qqq/Client";
|
import Client from "qqq/utils/qqq/Client";
|
||||||
|
import React, {useEffect, useState} from "react";
|
||||||
|
|
||||||
interface Props
|
interface Props
|
||||||
{
|
{
|
||||||
tableName?: string;
|
tableName?: string;
|
||||||
processName?: string;
|
processName?: string;
|
||||||
fieldName: string;
|
fieldName?: string;
|
||||||
|
possibleValueSourceName?: string;
|
||||||
overrideId?: string;
|
overrideId?: string;
|
||||||
fieldLabel: string;
|
fieldLabel: string;
|
||||||
inForm: boolean;
|
inForm: boolean;
|
||||||
@ -57,6 +58,8 @@ interface Props
|
|||||||
DynamicSelect.defaultProps = {
|
DynamicSelect.defaultProps = {
|
||||||
tableName: null,
|
tableName: null,
|
||||||
processName: null,
|
processName: null,
|
||||||
|
fieldName: null,
|
||||||
|
possibleValueSourceName: null,
|
||||||
inForm: true,
|
inForm: true,
|
||||||
initialValue: null,
|
initialValue: null,
|
||||||
initialDisplayValue: null,
|
initialDisplayValue: null,
|
||||||
@ -73,16 +76,78 @@ DynamicSelect.defaultProps = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const {inputBorderColor} = colors;
|
||||||
|
|
||||||
|
|
||||||
|
export const getAutocompleteOutlinedStyle = (isDisabled: boolean) =>
|
||||||
|
{
|
||||||
|
return ({
|
||||||
|
"& .MuiOutlinedInput-root": {
|
||||||
|
borderRadius: "0.75rem",
|
||||||
|
},
|
||||||
|
"& .MuiInputBase-root": {
|
||||||
|
padding: "0.5rem",
|
||||||
|
background: isDisabled ? "#f0f2f5!important" : "initial",
|
||||||
|
},
|
||||||
|
"& .MuiOutlinedInput-root .MuiAutocomplete-input": {
|
||||||
|
padding: "0",
|
||||||
|
fontSize: "1rem"
|
||||||
|
},
|
||||||
|
"& .Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
||||||
|
borderColor: inputBorderColor
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const qController = Client.getInstance();
|
const qController = Client.getInstance();
|
||||||
|
|
||||||
function DynamicSelect({tableName, processName, fieldName, overrideId, fieldLabel, inForm, initialValue, initialDisplayValue, initialValues, onChange, isEditable, isMultiple, bulkEditMode, bulkEditSwitchChangeHandler, otherValues, variant, initiallyOpen}: Props)
|
function DynamicSelect({tableName, processName, fieldName, possibleValueSourceName, overrideId, fieldLabel, inForm, initialValue, initialDisplayValue, initialValues, onChange, isEditable, isMultiple, bulkEditMode, bulkEditSwitchChangeHandler, otherValues, variant, initiallyOpen}: Props)
|
||||||
{
|
{
|
||||||
const [open, setOpen] = useState(initiallyOpen);
|
const [open, setOpen] = useState(initiallyOpen);
|
||||||
const [options, setOptions] = useState<readonly QPossibleValue[]>([]);
|
const [options, setOptions] = useState<readonly QPossibleValue[]>([]);
|
||||||
const [searchTerm, setSearchTerm] = useState(null);
|
const [searchTerm, setSearchTerm] = useState(null);
|
||||||
const [firstRender, setFirstRender] = useState(true);
|
const [firstRender, setFirstRender] = useState(true);
|
||||||
const [otherValuesWhenResultsWereLoaded, setOtherValuesWhenResultsWereLoaded] = useState(JSON.stringify(Object.fromEntries((otherValues))))
|
const [otherValuesWhenResultsWereLoaded, setOtherValuesWhenResultsWereLoaded] = useState(JSON.stringify(Object.fromEntries((otherValues))))
|
||||||
const {inputBorderColor} = colors;
|
|
||||||
|
useEffect(() =>
|
||||||
|
{
|
||||||
|
if(tableName && processName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - you may not provide both a tableName and a processName")
|
||||||
|
}
|
||||||
|
if(tableName && !fieldName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - if you provide a tableName, you must also provide a fieldName");
|
||||||
|
}
|
||||||
|
if(processName && !fieldName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - if you provide a processName, you must also provide a fieldName");
|
||||||
|
}
|
||||||
|
if(fieldName && possibleValueSourceName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - if you provide a fieldName and a possibleValueSourceName, the possibleValueSourceName will be ignored");
|
||||||
|
}
|
||||||
|
if(!fieldName && !possibleValueSourceName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - you must provide either a fieldName (and a tableName or processName) or a possibleValueSourceName");
|
||||||
|
}
|
||||||
|
if(fieldName)
|
||||||
|
{
|
||||||
|
if(!tableName || !processName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - if you provide a fieldName, you must also provide a tableName or processName");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(possibleValueSourceName)
|
||||||
|
{
|
||||||
|
if(tableName || processName)
|
||||||
|
{
|
||||||
|
console.log("DynamicSelect - if you provide a possibleValueSourceName, you should not also provide a tableName or processName");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, [tableName, processName, fieldName, possibleValueSourceName]);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// default value - needs to be an array (from initialValues (array) prop) for multiple mode - //
|
// default value - needs to be an array (from initialValues (array) prop) for multiple mode - //
|
||||||
@ -133,7 +198,7 @@ function DynamicSelect({tableName, processName, fieldName, overrideId, fieldLabe
|
|||||||
(async () =>
|
(async () =>
|
||||||
{
|
{
|
||||||
// console.log(`doing a search with ${searchTerm}`);
|
// console.log(`doing a search with ${searchTerm}`);
|
||||||
const results: QPossibleValue[] = await qController.possibleValues(tableName, processName, fieldName, searchTerm ?? "", null, otherValues);
|
const results: QPossibleValue[] = await qController.possibleValues(tableName, processName, fieldName ?? possibleValueSourceName, searchTerm ?? "", null, otherValues);
|
||||||
|
|
||||||
if(tableMetaData == null && tableName)
|
if(tableMetaData == null && tableName)
|
||||||
{
|
{
|
||||||
@ -166,7 +231,7 @@ function DynamicSelect({tableName, processName, fieldName, overrideId, fieldLabe
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
setOptions([]);
|
setOptions([]);
|
||||||
console.log("Refreshing possible values...");
|
console.log("Refreshing possible values...");
|
||||||
const results: QPossibleValue[] = await qController.possibleValues(tableName, processName, fieldName, searchTerm ?? "", null, otherValues);
|
const results: QPossibleValue[] = await qController.possibleValues(tableName, processName, fieldName ?? possibleValueSourceName, searchTerm ?? "", null, otherValues);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
setOptions([ ...results ]);
|
setOptions([ ...results ]);
|
||||||
setOtherValuesWhenResultsWereLoaded(JSON.stringify(Object.fromEntries(otherValues)));
|
setOtherValuesWhenResultsWereLoaded(JSON.stringify(Object.fromEntries(otherValues)));
|
||||||
@ -206,7 +271,7 @@ function DynamicSelect({tableName, processName, fieldName, overrideId, fieldLabe
|
|||||||
onChange(value ? new QPossibleValue(value) : null);
|
onChange(value ? new QPossibleValue(value) : null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(setFieldValueRef)
|
else if(setFieldValueRef && fieldName)
|
||||||
{
|
{
|
||||||
setFieldValueRef(fieldName, value ? value.id : null);
|
setFieldValueRef(fieldName, value ? value.id : null);
|
||||||
}
|
}
|
||||||
@ -282,28 +347,13 @@ function DynamicSelect({tableName, processName, fieldName, overrideId, fieldLabe
|
|||||||
let autocompleteSX = {};
|
let autocompleteSX = {};
|
||||||
if (variant == "outlined")
|
if (variant == "outlined")
|
||||||
{
|
{
|
||||||
autocompleteSX = {
|
autocompleteSX = getAutocompleteOutlinedStyle(isDisabled);
|
||||||
"& .MuiOutlinedInput-root": {
|
|
||||||
borderRadius: "0.75rem",
|
|
||||||
},
|
|
||||||
"& .MuiInputBase-root": {
|
|
||||||
padding: "0.5rem",
|
|
||||||
background: isDisabled ? "#f0f2f5!important" : "initial",
|
|
||||||
},
|
|
||||||
"& .MuiOutlinedInput-root .MuiAutocomplete-input": {
|
|
||||||
padding: "0",
|
|
||||||
fontSize: "1rem"
|
|
||||||
},
|
|
||||||
"& .Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
|
||||||
borderColor: inputBorderColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const autocomplete = (
|
const autocomplete = (
|
||||||
<Box>
|
<Box>
|
||||||
<Autocomplete
|
<Autocomplete
|
||||||
id={overrideId ?? fieldName}
|
id={overrideId ?? fieldName ?? possibleValueSourceName}
|
||||||
sx={autocompleteSX}
|
sx={autocompleteSX}
|
||||||
open={open}
|
open={open}
|
||||||
fullWidth
|
fullWidth
|
||||||
@ -383,7 +433,7 @@ function DynamicSelect({tableName, processName, fieldName, overrideId, fieldLabe
|
|||||||
inForm &&
|
inForm &&
|
||||||
<Box mt={0.75}>
|
<Box mt={0.75}>
|
||||||
<MDTypography component="div" variant="caption" color="error" fontWeight="regular">
|
<MDTypography component="div" variant="caption" color="error" fontWeight="regular">
|
||||||
{!isDisabled && <div className="fieldErrorMessage"><ErrorMessage name={fieldName} render={msg => <span data-field-error="true">{msg}</span>} /></div>}
|
{!isDisabled && <div className="fieldErrorMessage"><ErrorMessage name={fieldName ?? possibleValueSourceName} render={msg => <span data-field-error="true">{msg}</span>} /></div>}
|
||||||
</MDTypography>
|
</MDTypography>
|
||||||
</Box>
|
</Box>
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user