Skip to content

Commit c648566

Browse files
authored
Fixes #7 - Adds a simple quick search to records list. (#3366)
* Fixes #7 - Adds a simple quick search to records list.
1 parent a4b66f2 commit c648566

File tree

3 files changed

+57
-10
lines changed

3 files changed

+57
-10
lines changed

css/styles.css

+4
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,10 @@ form button[type="submit"].btn-primary {
454454
display: none;
455455
}
456456

457+
.quickFilter {
458+
margin-bottom: -0.5em;
459+
}
460+
457461
/* Spinner http://tobiasahlin.com/spinkit/ */
458462
.spinner {
459463
margin: 30px auto 0;

src/components/collection/RecordTable.tsx

+31-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import SignoffContainer from "@src/containers/signoff/SignoffToolBar";
77
import { canCreateRecord } from "@src/permission";
88
import type { RecordData } from "@src/types";
99
import { capitalize } from "@src/utils";
10-
import React from "react";
10+
import React, { useState } from "react";
1111
import { SortUp } from "react-bootstrap-icons";
1212
import { SortDown } from "react-bootstrap-icons";
1313

@@ -129,6 +129,12 @@ export default function RecordTable({
129129
redirectTo,
130130
capabilities,
131131
}: TableProps) {
132+
const [filter, setFilter] = useState("");
133+
134+
const onFilterChange = (e: React.ChangeEvent<HTMLInputElement>) => {
135+
setFilter(e.target.value);
136+
};
137+
132138
const getFieldTitle = displayField => {
133139
if (displayField === "__json") {
134140
return "Data";
@@ -154,6 +160,12 @@ export default function RecordTable({
154160
);
155161
}
156162

163+
if (filter && records.length) {
164+
records = records.filter(x =>
165+
JSON.stringify(x).match(new RegExp(filter, "i"))
166+
);
167+
}
168+
157169
const thead = (
158170
<thead>
159171
<tr>
@@ -201,13 +213,23 @@ export default function RecordTable({
201213
);
202214

203215
return (
204-
<PaginatedTable
205-
thead={thead}
206-
tbody={tbody}
207-
dataLoaded={recordsLoaded}
208-
colSpan={displayFields.length + 2}
209-
hasNextPage={hasNextRecords}
210-
listNextPage={listNextRecords}
211-
/>
216+
<>
217+
<input
218+
type="text"
219+
className="form-control quickFilter"
220+
placeholder="Quicksearch"
221+
onChange={onFilterChange}
222+
value={filter}
223+
data-testid="quickFilter"
224+
/>
225+
<PaginatedTable
226+
thead={thead}
227+
tbody={tbody}
228+
dataLoaded={recordsLoaded}
229+
colSpan={displayFields.length + 2}
230+
hasNextPage={hasNextRecords}
231+
listNextPage={listNextRecords}
232+
/>
233+
</>
212234
);
213235
}

test/components/CollectionRecords_test.tsx

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import CollectionRecords from "@src/components/collection/CollectionRecords";
22
import { renderWithProvider } from "@test/testUtils";
3-
import { screen } from "@testing-library/react";
3+
import { fireEvent, screen } from "@testing-library/react";
44
import React from "react";
55

66
describe("CollectionRecords component", () => {
@@ -129,6 +129,27 @@ describe("CollectionRecords component", () => {
129129
expect(screen.getByTestId("id1-foo").textContent).toBe("bar");
130130
expect(screen.getByTestId("id2-foo").textContent).toBe("baz");
131131
});
132+
133+
it("should apply live filtering", () => {
134+
let quickFilter = screen.getByTestId("quickFilter");
135+
fireEvent.change(quickFilter, {
136+
target: { value: "bar" },
137+
});
138+
expect(screen.getByTestId("id1-row")).toBeDefined();
139+
expect(screen.queryByTestId("id2-row")).toBeNull();
140+
141+
fireEvent.change(quickFilter, {
142+
target: { value: "baz" },
143+
});
144+
expect(screen.getByTestId("id2-row")).toBeDefined();
145+
expect(screen.queryByTestId("id1-row")).toBeNull();
146+
147+
fireEvent.change(quickFilter, {
148+
target: { value: "" },
149+
});
150+
expect(screen.getByTestId("id1-row")).toBeDefined();
151+
expect(screen.queryByTestId("id2-row")).toBeDefined();
152+
});
132153
});
133154

134155
describe("No schema defined", () => {

0 commit comments

Comments
 (0)