Skip to content
This repository was archived by the owner on May 13, 2025. It is now read-only.

Commit 5618c54

Browse files
authored
fix: filter issues (#201)
fixes #200
1 parent 6315d41 commit 5618c54

File tree

5 files changed

+48
-29
lines changed

5 files changed

+48
-29
lines changed

src/components/Header/Querier.tsx

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
Popover,
32
Stack,
43
Group,
54
ScrollArea,
@@ -11,6 +10,8 @@ import {
1110
Button,
1211
CloseIcon,
1312
Pill,
13+
ActionIcon,
14+
Modal,
1415
} from '@mantine/core';
1516
import { useCallback } from 'react';
1617
import classes from './styles/QueryBuilder.module.css';
@@ -80,9 +81,9 @@ const RuleView = (props: RuleViewType) => {
8081
type={type}
8182
disabled={isDisabled}
8283
/>
83-
<ThemeIcon className={classes.deleteRulebtn} onClick={deleteBtnHandler}>
84+
<ActionIcon className={classes.deleteRulebtn} onClick={deleteBtnHandler}>
8485
<CloseIcon />
85-
</ThemeIcon>
86+
</ActionIcon>
8687
</Stack>
8788
);
8889
};
@@ -224,28 +225,34 @@ const FilterBtnPlaceholder = () => {
224225
);
225226
};
226227

228+
const ModalTitle = () => {
229+
return <Text style={{ fontSize: '1.2rem', fontWeight: 700, marginLeft: '0.5rem' }}>Filters</Text>;
230+
};
231+
227232
const Querier = () => {
228233
const { state: queryBuilderState, methods: queryBuilderMethods } = useQueryFilterContext();
229234
const { isModalOpen, query, isSumbitDisabled, appliedQuery } = queryBuilderState;
230-
const { createRuleGroup, toggleBuilderModal, clearFilters, applyQuery } = queryBuilderMethods;
235+
const { createRuleGroup, clearFilters, applyQuery, closeBuilderModal, openBuilderModal } = queryBuilderMethods;
231236
const {
232237
state: { custQuerySearchState },
233238
methods: {},
234239
} = useLogsPageContext();
235240

236241
const isFiltersApplied = custQuerySearchState.mode === 'filters' && custQuerySearchState.isQuerySearchActive;
237-
238242
return (
239-
<Popover opened={isModalOpen} offset={{ mainAxis: 8, crossAxis: 500 }} position="bottom">
240-
<Popover.Target>
241-
<div />
242-
</Popover.Target>
243-
<Group onClick={toggleBuilderModal} className={classes.queryBuilderBtn}>
243+
<>
244+
<Group onClick={openBuilderModal} className={classes.queryBuilderBtn}>
244245
{!isFiltersApplied ? <FilterBtnPlaceholder /> : <QueryPills query={appliedQuery} />}
245246
</Group>
246-
<Popover.Dropdown p={0}>
247+
<Modal
248+
opened={isModalOpen}
249+
onClose={closeBuilderModal}
250+
size="auto"
251+
centered
252+
styles={{ body: { padding: '0 0.5rem' }, header: { padding: '1rem', paddingBottom: '0' } }}
253+
title={<ModalTitle />}>
247254
<Stack style={{ width: '820px', padding: '1rem' }} gap={0}>
248-
<ScrollArea h={'400px'} className={classes.queryBuilderContainer} style={{ width: '100%' }}>
255+
<ScrollArea h={'420px'} className={classes.queryBuilderContainer} style={{ width: '100%' }}>
249256
<Stack gap={0}>
250257
{query.rules.map((ruleSet) => {
251258
return <RuleSet ruleSet={ruleSet} key={ruleSet.id} />;
@@ -260,8 +267,8 @@ const Querier = () => {
260267
Apply
261268
</Button>
262269
</Stack>
263-
</Popover.Dropdown>
264-
</Popover>
270+
</Modal>
271+
</>
265272
);
266273
};
267274

src/components/Header/TimeRange.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const TimeRange: FC = () => {
1717
state: { subLogQuery, subLogSelectedTimeRange },
1818
} = useHeaderContext();
1919

20-
const handleOuterClick = (event: any) => {
20+
const handleOuterClick = useCallback((event: any) => {
2121
const targetClassNames: string[] = event.target?.classList || [];
2222
const maybeSubmitBtnClassNames: string[] = event.target.closest('button')?.classList || [];
2323
const classNames: string[] = [
@@ -32,7 +32,7 @@ const TimeRange: FC = () => {
3232
);
3333
});
3434
!shouldIgnoreClick && setOpened(false);
35-
};
35+
}, []);
3636

3737
const innerRef = useOuterClick(handleOuterClick);
3838
const [opened, setOpened] = useMountedState(false);

src/components/Header/styles/QueryBuilder.module.css

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
cursor: pointer;
9191
height: 2.2rem;
9292
overflow: auto;
93-
margin-left: -20px;
9493
min-width: 70%;
9594
max-width: 100%;
9695
}
@@ -112,8 +111,8 @@
112111
.footer {
113112
flex-direction: row;
114113
justify-content: flex-end;
115-
padding: 1rem;
116-
padding-top: 0;
114+
padding: 1.5rem;
115+
padding-top: 0.75rem;
117116
}
118117

119118
.queryBuilderContainer {

src/pages/Logs/LogTable.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const LogTable: FC = () => {
6363
custQuerySearchState: { isQuerySearchActive, custSearchQuery },
6464
pageOffset,
6565
},
66-
methods: { setPageOffset },
66+
methods: { setPageOffset, resetQuerySearch },
6767
} = useLogsPageContext();
6868
const {
6969
state: { subLogSearch, subLogQuery, subRefreshInterval, subLogSelectedTimeRange },
@@ -100,6 +100,11 @@ const LogTable: FC = () => {
100100
return subLogSearch.get().filters[key] ?? [];
101101
};
102102

103+
const currentStreamName = subLogQuery.get().streamName;
104+
useEffect(() => {
105+
resetQuerySearch();
106+
}, [currentStreamName])
107+
103108
const applyFilter = (key: string, value: string[]) => {
104109
subLogSearch.set((state) => {
105110
state.filters[key] = value;

src/providers/QueryFilterProvider.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ type QueryFilterContextMethods = {
3131
deleteRuleFromGroup: (groupId: string, ruleId: string) => void;
3232
updateGroupCombinator: (id: string, op: Combinator) => void;
3333
updateRule: (groupId: string, ruleId: string, updateOpts: RuleUpdateOpts) => void;
34-
toggleBuilderModal: () => void;
3534
updateParentCombinator: (combinator: Combinator) => void;
3635
parseQuery: () => string;
3736
applyQuery: () => void;
3837
clearFilters: () => void;
38+
closeBuilderModal: () => void;
39+
openBuilderModal: () => void;
3940
};
4041

4142
type QueryFilterContextValue = {
@@ -249,8 +250,12 @@ const QueryFilterProvider = (props: QueryFilterProviderProps) => {
249250
});
250251
}, []);
251252

252-
const toggleBuilderModal = useCallback(() => {
253-
return setModalOpen((prev) => !prev);
253+
const openBuilderModal = useCallback(() => {
254+
return setModalOpen(true);
255+
}, []);
256+
257+
const closeBuilderModal = useCallback(() => {
258+
return setModalOpen(false);
254259
}, []);
255260

256261
const updateParentCombinator = useCallback((combinator: Combinator) => {
@@ -261,7 +266,7 @@ const QueryFilterProvider = (props: QueryFilterProviderProps) => {
261266

262267
const parseQuery = useCallback(() => {
263268
// todo - custom rule processor to prevent converting number strings into numbers for text fields
264-
const where = formatQuery(query, { format: 'sql', parseNumbers: true });
269+
const where = formatQuery(query, { format: 'sql', parseNumbers: true, quoteFieldNamesWith: ['\"', '\"'] });
265270
return `select * from ${subAppContext.get().selectedStream} where ${where} limit 9000`;
266271
}, [query]);
267272

@@ -279,8 +284,10 @@ const QueryFilterProvider = (props: QueryFilterProviderProps) => {
279284
setQuery(defaultQuery);
280285
}, []);
281286

282-
const schemaFields = subLogStreamSchema.get()?.fields || [];
287+
const schemaFields = subLogStreamSchema.get()?.fields;
283288
useEffect(() => {
289+
if (!schemaFields || schemaFields?.length === 0) return;
290+
284291
const fields: Field[] = schemaFields
285292
.filter((field) => field.name !== 'p_timestamp')
286293
.map((field) => ({
@@ -299,15 +306,15 @@ const QueryFilterProvider = (props: QueryFilterProviderProps) => {
299306
}, [schemaFields]);
300307

301308
useEffect(() => {
302-
if (isModalOpen && query.rules.length === 0) {
309+
if (query.rules.length === 0) {
303310
createRuleGroup();
304311
}
305-
}, [isModalOpen]);
312+
}, [fields]);
306313

307314
useEffect(() => {
308315
const ruleSets = query.rules.map((r) => r.rules);
309316
const allValues = ruleSets.flat().flatMap((rule) => {
310-
return noValueOperators.indexOf(rule.operator) !== -1 ? [] : [rule.value];
317+
return noValueOperators.indexOf(rule.operator) !== -1 ? [null] : [rule.value];
311318
});
312319

313320
const shouldSumbitDisabled = allValues.length === 0 || allValues.some((value) => value === '');
@@ -349,11 +356,12 @@ const QueryFilterProvider = (props: QueryFilterProviderProps) => {
349356
deleteRuleFromGroup,
350357
updateGroupCombinator,
351358
updateRule,
352-
toggleBuilderModal,
353359
updateParentCombinator,
354360
parseQuery,
355361
applyQuery,
356362
clearFilters,
363+
closeBuilderModal,
364+
openBuilderModal,
357365
};
358366
const value = useMemo(() => ({ state, methods }), [state, methods]);
359367

0 commit comments

Comments
 (0)