Skip to content

Commit

Permalink
Merge pull request #88 from DagsHub/add-debounce-to-query-update
Browse files Browse the repository at this point in the history
Add debounce to query update
  • Loading branch information
TalMalka123 authored Jan 29, 2024
2 parents b7b0005 + fd5399b commit 389e4ab
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 44 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"type": "git",
"url": "git+https://github.com/dagshub/design-system.git"
},
"version": "0.1.77",
"version": "0.1.78",
"description": "A component library for consuming dagshub user interfaces.",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
Expand Down
2 changes: 1 addition & 1 deletion src/components/dagshub/data-engine/CSVViewer/CSVViewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export function CSVViewer({ headers, values }: { headers: string[]; values: stri

const autoSizeStrategy: SizeColumnsToFitGridStrategy = {
type: 'fitGridWidth',
defaultMinWidth: 100,
defaultMinWidth: 100
};

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import StyledTextField from '../metadataKeyValue/StyledTextField';
import '../metadataKeyValue/style.scss';
import { ThemeProvider, Typography } from '@mui/material';
import theme from '../../../../theme';
import {useDebounce} from "react-use";

export function ConditionTextField({
disabled,
Expand Down Expand Up @@ -67,6 +68,10 @@ export function ConditionTextField({
}
};

useDebounce(() => {
onChange(currentValue);
},200, [currentValue]);

return (
<ThemeProvider theme={theme}>
<Box
Expand Down Expand Up @@ -137,7 +142,6 @@ export function ConditionTextField({
}}
onChange={(e: any) => {
setCurrentValue(e.target.value);
onChange(e.target.value);
}}
onKeyDown={handleKeyDown}
value={currentValue}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@ import { MetadataType } from '../metadataKeyValue/MetadataKeyValueList';
export function QueryBuilder({
queryInput,
metadataFields,
forceCompoundMode = false,
onChange,
validateValueByType,
showConditionSummary = false,
}: {
queryInput: QueryInput;
metadataFields: MetadataFieldProps[]; // need to take into consideration the select and the alias
forceCompoundMode?: boolean;
onChange: (query: QueryInput) => void;
validateValueByType: (valueType: MetadataType, value: string, comparator: Comparator) => boolean;
showConditionSummary?: boolean;
Expand All @@ -27,7 +25,6 @@ export function QueryBuilder({
<QueryBuilderProvider
queryInput={queryInput}
metadataFields={metadataFields}
forceCompoundMode={forceCompoundMode}
validateValueByType={validateValueByType}
onChange={onChange}
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import React, {
useState,
} from 'react';
import _ from 'lodash';
import { root } from 'postcss';

type MetadataType = 'BOOLEAN' | 'INTEGER' | 'FLOAT' | 'STRING' | 'BLOB';

Expand Down Expand Up @@ -100,10 +99,9 @@ export interface QueryInput {

interface QueryBuilderContextInterface {
isSimpleMode: boolean;
setIsSimpleMode: (isSimpleMode: boolean) => void;
rootCondition: AndOrMetadataInput;
setRootCondition: (rootCondition: AndOrMetadataInput) => void;
metadataFieldsList: MetadataFieldProps[];
metadataFields: MetadataFieldProps[];
generateUniqueId: () => string;
addUniqueIds: (input: AndOrMetadataInput) => AndOrMetadataInput;
getOperatorsByMetadataType: (type: MetadataType) => { label: string; id: Comparator }[];
Expand All @@ -129,14 +127,12 @@ export const QueryBuilderProvider = ({
children,
queryInput,
metadataFields,
forceCompoundMode = false,
validateValueByType,
onChange,
}: {
children: ReactNode;
queryInput: QueryInput;
metadataFields: MetadataFieldProps[]; // need to take into consideration the select and the alias
forceCompoundMode?: boolean;
validateValueByType: (valueType: MetadataType, value: string, comparator: Comparator) => boolean;
onChange: (query: QueryInput) => void;
}) => {
Expand Down Expand Up @@ -170,48 +166,45 @@ export const QueryBuilderProvider = ({
return true;
};

const checkIfSimpleMode = useCallback(
(query: AndOrMetadataInput | undefined) => {
return !forceCompoundMode && checkIfConditionIsDisplayableInSimpleMode(query);
},
[forceCompoundMode]
);

const [rootCondition, setRootCondition] = useState<AndOrMetadataInput>(() => getInitialQuery());
const [isSimpleMode, setIsSimpleMode] = useState<boolean>(() =>
checkIfSimpleMode(queryInput.query)
);
const [metadataFieldsList, setMetadataFieldsList] =
useState<MetadataFieldProps[]>(metadataFields);
const [isDisplayableInSimpleMode, setIsDisplayableInSimpleMode] = useState<boolean>(
const [rootCondition, setRootCondition] = useState<AndOrMetadataInput>(getInitialQuery);
const [isDisplayableInSimpleMode, setIsDisplayableInSimpleMode] = useState<boolean>(() =>
checkIfConditionIsDisplayableInSimpleMode(queryInput.query)
);
const [isSimpleMode, setIsSimpleMode] = useState<boolean>(isDisplayableInSimpleMode);

useEffect(() => {
if (
JSON.stringify(removeIdFields(getInitialQuery())) !==
JSON.stringify(removeIdFields(rootCondition))
) {
setRootCondition(getInitialQuery);
setIsDisplayableInSimpleMode(checkIfConditionIsDisplayableInSimpleMode(queryInput.query));
}
setIsDisplayableInSimpleMode(checkIfConditionIsDisplayableInSimpleMode(queryInput.query));
}, [queryInput.query]);

useEffect(() => {
setIsDisplayableInSimpleMode(checkIfConditionIsDisplayableInSimpleMode(rootCondition));
}, [rootCondition]);

useEffect(() => {
setIsSimpleMode(checkIfSimpleMode(queryInput.query));
}, [forceCompoundMode, queryInput.query]);

function onToggleQueryMode() {
setIsSimpleMode(!isSimpleMode);
setIsSimpleMode((isSimpleMode) => {
if (isSimpleMode) {
return false;
} else {
return isDisplayableInSimpleMode;
}
});
}

useEffect(() => {
setMetadataFieldsList(metadataFields);
}, [metadataFields]);
setIsSimpleMode((isSimpleMode) => {
if (isSimpleMode) {
return isDisplayableInSimpleMode;
} else {
return false;
}
});
}, [isDisplayableInSimpleMode]);

//This function is used to remove the root and wrapper, if it was added for ui purposes and not needed anymore
const removeRootAndBlockIfWasAddedAndNotNeeded = (condition: AndOrMetadataInput | null) => {
Expand Down Expand Up @@ -419,10 +412,9 @@ export const QueryBuilderProvider = ({
<QueryBuilderContext.Provider
value={{
isSimpleMode,
setIsSimpleMode,
rootCondition,
setRootCondition,
metadataFieldsList,
metadataFields,
generateUniqueId,
addUniqueIds,
getOperatorsByMetadataType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export function SimpleCondition({
const {
isSimpleMode,
validateValueByType,
metadataFieldsList,
metadataFields,
getOperatorsByMetadataType,
checkIfOperatorRequiresValueField,
} = useQueryBuilderContext();
Expand Down Expand Up @@ -68,7 +68,7 @@ export function SimpleCondition({
const [isEmpty, setIsEmpty] = useState<boolean>(checkIfConditionIsUncompleted());

function getSelectedMetadataKey() {
return metadataFieldsList?.find((field) => field.name === condition.filter?.key);
return metadataFields?.find((field) => field.name === condition.filter?.key);
}

const [selectedMetadataKey, setSelectedMetadataKey] = useState<MetadataFieldProps | undefined>(
Expand All @@ -89,7 +89,7 @@ export function SimpleCondition({

useEffect(() => {
setSelectedMetadataKey(getSelectedMetadataKey());
}, [metadataFieldsList, condition.filter?.key]);
}, [metadataFields, condition.filter?.key]);

useEffect(() => {
setSelectedOperator(getSelectedComparator());
Expand Down Expand Up @@ -208,12 +208,11 @@ export function SimpleCondition({
filter: {
...condition.filter,
key: value?.id,
valueType: metadataFieldsList.find((field) => field.name === value?.label)
?.valueType,
},
valueType: metadataFields.find((field) => field.name === value?.label)?.valueType,
}
});
}}
options={metadataFieldsList?.map((field) => ({ id: field.name, label: field.name }))}
options={metadataFields?.map((field) => ({ id: field.name, label: field.name }))}
/>
<ConditionDropdown
isReadOnly={true}
Expand Down
3 changes: 3 additions & 0 deletions src/components/elements/dropdownV2/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,9 @@ export function DropdownV2({
</Typography>
{/*This is a hidden div that is used to calculate the width of the input field*/}
<Autocomplete
isOptionEqualToValue={(option: RadioButtonItemProps, value: RadioButtonItemProps) =>
option.id === value.id && option.label === value.label
}
noOptionsText={
<Typography
sx={{
Expand Down

0 comments on commit 389e4ab

Please sign in to comment.