diff --git a/src/components/Firestore/CollectionFilter/CollectionFilter.tsx b/src/components/Firestore/CollectionFilter/CollectionFilter.tsx
index 4ba153a02..17d3e20fe 100644
--- a/src/components/Firestore/CollectionFilter/CollectionFilter.tsx
+++ b/src/components/Firestore/CollectionFilter/CollectionFilter.tsx
@@ -31,12 +31,23 @@ import {
isSingleValueCollectionFilter,
isSortableCollectionFilter,
} from '../models';
+import { isBoolean, isNumber } from '../utils';
import { useCollectionFilter, useDispatch } from '../store';
import styles from './CollectionFilter.module.scss';
import { ConditionEntries } from './ConditionEntries';
import { ConditionEntry } from './ConditionEntry';
import { SortRadioGroup } from './SortRadioGroup';
+function getConditionEntryType(value: any) {
+ if (isBoolean(value)) {
+ return 'boolean';
+ }
+ if (isNumber(value)) {
+ return 'number';
+ }
+ return 'string';
+}
+
export const CollectionFilter: React.FC<
React.PropsWithChildren<{
className?: string;
@@ -54,7 +65,20 @@ export const CollectionFilter: React.FC<
const cf = formMethods.watch();
+ const [fieldType, setFieldType] = useState(
+ getConditionEntryType(
+ isSingleValueCollectionFilter(collectionFilter) && collectionFilter.value
+ )
+ );
+
const onSubmit = (data: CollectionFilterType) => {
+ if (isSingleValueCollectionFilter(data)) {
+ if (fieldType === 'number') {
+ data.value = Number(data.value);
+ } else if (fieldType === 'boolean') {
+ data.value = data.value === 'true';
+ }
+ }
dispatch(
actions.addCollectionFilter({
path,
@@ -96,7 +120,10 @@ export const CollectionFilter: React.FC<
preview={}
defaultOpen
>
-
+
{cf && isSingleValueCollectionFilter(cf) && (
)}
@@ -207,9 +236,12 @@ const Preview: React.FC<
);
};
-const ConditionSelect: React.FC> = ({
- children,
-}) => {
+const ConditionSelect: React.FC<
+ React.PropsWithChildren<{
+ fieldType: string;
+ setFieldType: (type: string) => void;
+ }>
+> = ({ children, fieldType, setFieldType }) => {
const options: Array<{
label: string;
value: WhereFilterOp;
diff --git a/src/components/Firestore/CollectionFilter/ConditionEntry.tsx b/src/components/Firestore/CollectionFilter/ConditionEntry.tsx
index 1ee9a8be8..b2c6bfd19 100644
--- a/src/components/Firestore/CollectionFilter/ConditionEntry.tsx
+++ b/src/components/Firestore/CollectionFilter/ConditionEntry.tsx
@@ -21,29 +21,21 @@ import { Field, SelectField } from '../../../components/common/Field';
import { NUMBER_REGEX, isBoolean, isNumber } from '../utils';
import styles from './CollectionFilter.module.scss';
-function getConditionEntryType(value: any) {
- if (isBoolean(value)) {
- return 'boolean';
- }
- if (isNumber(value)) {
- return 'number';
- }
- return 'string';
-}
interface ConditionEntryProps {
name: string;
// Error may be undefined; require consumers to still pass or we might end up
// in a state where we validate without showing the error message.
error: string | undefined;
+ fieldType: string;
+ setFieldType: (type: string) => void;
}
export const ConditionEntry: React.FC<
React.PropsWithChildren
-> = React.memo(({ name, error }) => {
+> = React.memo(({ name, error, fieldType, setFieldType }) => {
const { setValue, watch } = useFormContext();
const value = watch(name);
- const [fieldType, setFieldType] = useState(getConditionEntryType(value));
useEffect(() => {
// Essentially setting the defaultValue of this form-field,
@@ -58,9 +50,7 @@ export const ConditionEntry: React.FC<
{
- setFieldType(evt.currentTarget.value);
- }}
+ onChange={(evt) => setFieldType(evt.currentTarget.value)}
fieldClassName={styles.conditionEntryType}
/>