Skip to content

Commit 91441e2

Browse files
authored
Merge pull request #133 from UW-Macrostrat/postgrest-scroll
Postgrest scroll 4.4.0
2 parents d107a5b + 99c77b3 commit 91441e2

File tree

4 files changed

+48
-23
lines changed

4 files changed

+48
-23
lines changed

packages/ui-components/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# Changelog
22

3-
## [unreleased] -
3+
## [4.4.0] -
44

55
For PostgRESTInfiniteScrollView
66

7+
- Custom multiselect labels
8+
79
## [4.3.8] - 2025-07-09
810

911
For PostgRESTInfiniteScrollView

packages/ui-components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@macrostrat/ui-components",
3-
"version": "4.3.8",
3+
"version": "4.4.0",
44
"description": "UI components for React and Blueprint.js",
55
"main": "dist/cjs/index.js",
66
"module": "dist/esm/index.js",

packages/ui-components/src/postgrest-infinite-scroll.ts

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,16 @@ import { useMemo, useState } from "react";
55
import { MultiSelect, ItemRenderer, ItemPredicate } from "@blueprintjs/select";
66
import { MenuItem, Spinner, InputGroup } from "@blueprintjs/core";
77
import styles from "./postgrest.module.sass";
8-
import "@blueprintjs/core/lib/css/blueprint.css";
9-
import "@blueprintjs/select/lib/css/blueprint-select.css";
108

119
const h = hyper.styled(styles);
12-
const b = hyper;
1310

1411
interface PostgRESTInfiniteScrollProps extends InfiniteScrollProps<any> {
1512
id_key: string;
1613
limit: number;
1714
extraParams?: Record<string, any>;
1815
ascending?: boolean;
1916
filterable?: boolean;
20-
searchColumns?: string[];
17+
searchColumns?: Array<{ value: string; label: string }>;
2118
order_key?: string;
2219
key?: string;
2320
toggles?: any;
@@ -65,8 +62,9 @@ export function PostgRESTInfiniteScrollView(
6562
}
6663

6764
const [selectedItems, setSelectedItems] = useState<string[]>(
68-
searchColumns || [],
65+
(searchColumns ?? []).map((col) => col.value),
6966
);
67+
7068
const [filterValue, setFilterValue] = useState<string>("");
7169

7270
const SearchBarToUse = SearchBarComponent ?? SearchBar;
@@ -137,16 +135,25 @@ export function PostgRESTInfiniteScrollView(
137135
}
138136

139137
const keys =
140-
searchColumns ||
141-
Object.keys(res[0] || {}).filter((key) => typeof res[0][key] === "string");
138+
searchColumns ??
139+
(res?.[0]
140+
? Object.keys(res[0])
141+
.filter((key) => typeof res[0][key] === "string")
142+
.map((key) => ({
143+
label: key.replace(/_/g, " "),
144+
value: key,
145+
}))
146+
: []);
142147

143148
// Filtering function
144-
const filterItem: ItemPredicate<string> = (query, item) =>
145-
item.toLowerCase().includes(query.toLowerCase());
149+
const filterItem: ItemPredicate<{ label: string; value: string }> = (
150+
query,
151+
item,
152+
) => item.label.toLowerCase().includes(query.toLowerCase());
146153

147-
const handleSelect = (item: string) => {
148-
if (!selectedItems.includes(item)) {
149-
setSelectedItems([...selectedItems, item]);
154+
const handleSelect = (item: { label: string; value: string }) => {
155+
if (!selectedItems.includes(item.value)) {
156+
setSelectedItems([...selectedItems, item.value]);
150157
}
151158
};
152159

@@ -198,14 +205,14 @@ export function PostgRESTInfiniteScrollView(
198205
};
199206

200207
// Function to render each item in dropdown
201-
const itemRenderer: ItemRenderer<string> = (
208+
const itemRenderer: ItemRenderer<{ label: string; value: string }> = (
202209
item,
203210
{ handleClick, modifiers },
204211
) => {
205212
if (!modifiers.matchesPredicate) return null;
206213
return h(MenuItem, {
207-
key: item,
208-
text: item,
214+
key: item.value,
215+
text: item.label,
209216
active: modifiers.active,
210217
onClick: handleClick,
211218
shouldDismissPopover: false,
@@ -226,16 +233,19 @@ export function PostgRESTInfiniteScrollView(
226233
return h("div.postgrest-infinite-scroll", [
227234
h("div.header", [
228235
h.if(filterable)("div.search-bar", [
229-
b(SearchBarToUse, {
236+
h(SearchBarToUse, {
230237
onChange: (value) => setFilterValue(value || ""),
231238
}),
232-
b(MultiSelectToUse, {
233-
items: keys.filter((item) => !selectedItems.includes(item)),
239+
h(MultiSelectToUse, {
240+
items: keys.filter((item) => !selectedItems.includes(item.value)),
234241
itemRenderer,
235242
itemPredicate: filterItem,
236243
selectedItems,
237244
onItemSelect: handleSelect,
238-
tagRenderer: (item) => item,
245+
tagRenderer: (value) => {
246+
const found = keys.find((k) => k.value === value);
247+
return found ? found.label : value;
248+
},
239249
onRemove: handleRemove,
240250
tagInputProps: {
241251
onRemove: handleRemove,

packages/ui-components/stories/postgrest-infinite-scroll.stories.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ComponentStory, ComponentMeta } from "@storybook/react-vite";
22
import h from "@macrostrat/hyper";
33
import { PostgRESTInfiniteScrollView } from "../src/postgrest-infinite-scroll";
4+
import { MultiSelect } from "@blueprintjs/select";
45

56
// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
67
export default {
@@ -15,7 +16,6 @@ const Template: ComponentStory<typeof PostgRESTInfiniteScrollView> = (args) =>
1516
h(PostgRESTInfiniteScrollView, args);
1617

1718
export const Primary = Template.bind({});
18-
// More on args: https://storybook.js.org/docs/react/writing-stories/args
1919

2020
Primary.args = {
2121
limit: 5,
@@ -25,5 +25,18 @@ Primary.args = {
2525
route: "https://dev.macrostrat.org/api/pg/sources_metadata",
2626
delay: 100,
2727
toggles: h("h1", "Toggles here"),
28-
searchColumns: ["name"],
28+
searchColumns: [{ value: "name", label: "Name" }],
29+
};
30+
31+
export const CustomMultiselect = Template.bind({});
32+
33+
CustomMultiselect.args = {
34+
limit: 5,
35+
id_key: "source_id",
36+
filterable: true,
37+
ascending: true,
38+
route: "https://dev.macrostrat.org/api/pg/sources_metadata",
39+
delay: 100,
40+
toggles: h("h1", "Toggles here"),
41+
searchColumns: [{ value: "name", label: "Name" }],
2942
};

0 commit comments

Comments
 (0)