Skip to content

Commit e0d66d3

Browse files
authored
🐛 (rules) fix filtering in the rules page (#2141)
1 parent d999e46 commit e0d66d3

File tree

3 files changed

+41
-54
lines changed

3 files changed

+41
-54
lines changed

packages/desktop-client/src/components/ManageRules.tsx

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ function ManageRulesContent({
9595
payeeId,
9696
setLoading,
9797
}: ManageRulesContentProps) {
98-
const [allRules, setAllRules] = useState(null);
99-
const [rules, setRules] = useState(null);
98+
const [allRules, setAllRules] = useState([]);
99+
const [page, setPage] = useState(0);
100100
const [filter, setFilter] = useState('');
101101
const dispatch = useDispatch();
102102

@@ -117,18 +117,27 @@ function ManageRulesContent({
117117

118118
const filteredRules = useMemo(
119119
() =>
120-
filter === '' || !rules
121-
? rules
122-
: rules.filter(rule =>
120+
(filter === ''
121+
? allRules
122+
: allRules.filter(rule =>
123123
ruleToString(rule, filterData)
124124
.toLowerCase()
125125
.includes(filter.toLowerCase()),
126-
),
127-
[rules, filter, filterData],
126+
)
127+
).slice(0, 100 + page * 50),
128+
[allRules, filter, filterData, page],
128129
);
129130
const selectedInst = useSelected('manage-rules', allRules, []);
130131
const [hoveredRule, setHoveredRule] = useState(null);
131132

133+
const onSearchChange = useCallback(
134+
(value: string) => {
135+
setFilter(value);
136+
setPage(0);
137+
},
138+
[setFilter],
139+
);
140+
132141
async function loadRules() {
133142
setLoading(true);
134143

@@ -147,8 +156,7 @@ function ManageRulesContent({
147156

148157
useEffect(() => {
149158
async function loadData() {
150-
const loadedRules = await loadRules();
151-
setRules(loadedRules.slice(0, 100));
159+
await loadRules();
152160
setLoading(false);
153161

154162
await dispatch(initiallyLoadPayees());
@@ -166,7 +174,7 @@ function ManageRulesContent({
166174
}, []);
167175

168176
function loadMore() {
169-
setRules(rules.concat(allRules.slice(rules.length, rules.length + 50)));
177+
setPage(page => page + 1);
170178
}
171179

172180
async function onDeleteSelected() {
@@ -179,10 +187,7 @@ function ManageRulesContent({
179187
alert('Some rules were not deleted because they are linked to schedules');
180188
}
181189

182-
const newRules = await loadRules();
183-
setRules(rules => {
184-
return newRules.slice(0, rules.length);
185-
});
190+
await loadRules();
186191
selectedInst.dispatch({ type: 'select-none' });
187192
setLoading(false);
188193
}
@@ -191,19 +196,8 @@ function ManageRulesContent({
191196
dispatch(
192197
pushModal('edit-rule', {
193198
rule,
194-
onSave: async newRule => {
195-
const newRules = await loadRules();
196-
197-
setRules(rules => {
198-
const newIdx = newRules.findIndex(rule => rule.id === newRule.id);
199-
200-
if (newIdx > rules.length) {
201-
return newRules.slice(0, newIdx + 75);
202-
} else {
203-
return newRules.slice(0, rules.length);
204-
}
205-
});
206-
199+
onSave: async () => {
200+
await loadRules();
207201
setLoading(false);
208202
},
209203
}),
@@ -236,13 +230,7 @@ function ManageRulesContent({
236230
pushModal('edit-rule', {
237231
rule,
238232
onSave: async newRule => {
239-
const newRules = await loadRules();
240-
241-
setRules(rules => {
242-
const newIdx = newRules.findIndex(rule => rule.id === newRule.id);
243-
return newRules.slice(0, newIdx + 75);
244-
});
245-
233+
await loadRules();
246234
setLoading(false);
247235
},
248236
}),
@@ -253,7 +241,7 @@ function ManageRulesContent({
253241
setHoveredRule(id);
254242
}, []);
255243

256-
if (rules === null) {
244+
if (allRules.length === 0) {
257245
return null;
258246
}
259247

@@ -290,13 +278,12 @@ function ManageRulesContent({
290278
<Search
291279
placeholder="Filter rules..."
292280
value={filter}
293-
onChange={setFilter}
281+
onChange={onSearchChange}
294282
/>
295283
</View>
296284
<View style={{ flex: 1 }}>
297285
<RulesHeader />
298286
<SimpleTable
299-
data={filteredRules}
300287
loadMore={loadMore}
301288
// Hide the last border of the item in the table
302289
style={{ marginBottom: -1 }}

packages/desktop-client/src/components/rules/SimpleTable.tsx

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,37 @@
1-
import React, { type ReactNode, useEffect, useRef } from 'react';
1+
import React, { type ReactNode, type UIEvent, useRef } from 'react';
22

33
import { type CSSProperties } from '../../style';
44
import View from '../common/View';
55

66
type SimpleTableProps = {
7-
data: unknown;
87
loadMore?: () => void;
98
style?: CSSProperties;
109
onHoverLeave?: () => void;
1110
children: ReactNode;
1211
};
1312

1413
export default function SimpleTable({
15-
data,
1614
loadMore,
1715
style,
1816
onHoverLeave,
1917
children,
2018
}: SimpleTableProps) {
2119
const contentRef = useRef<HTMLDivElement>();
22-
const contentHeight = useRef<number>();
2320
const scrollRef = useRef<HTMLDivElement>();
2421

25-
function onScroll(e) {
26-
if (contentHeight.current != null) {
27-
if (loadMore && e.target.scrollTop > contentHeight.current - 750) {
28-
loadMore();
29-
}
22+
function onScroll(e: UIEvent<HTMLElement>) {
23+
if (
24+
loadMore &&
25+
Math.abs(
26+
e.currentTarget.scrollHeight -
27+
e.currentTarget.clientHeight -
28+
e.currentTarget.scrollTop,
29+
) < 1
30+
) {
31+
loadMore();
3032
}
3133
}
3234

33-
useEffect(() => {
34-
if (contentRef.current) {
35-
contentHeight.current = contentRef.current.getBoundingClientRect().height;
36-
} else {
37-
contentHeight.current = null;
38-
}
39-
}, [contentRef.current, data]);
40-
4135
return (
4236
<View
4337
style={{

upcoming-release-notes/2141.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
category: Bugfix
3+
authors: [MatissJanis, jasonmichalski]
4+
---
5+
6+
Fix filtering in rules page: apply the filter on the full data set instead of the limited (paginated) data set.

0 commit comments

Comments
 (0)