Skip to content

Commit efd73dd

Browse files
committed
fix expand and collapse
1 parent 75322ed commit efd73dd

6 files changed

Lines changed: 50 additions & 32 deletions

File tree

src/lib/consts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const ARG_DATA_URI = import.meta.env.BASE_URL + "/arg_clusters.gexf";
1515
// Palettes
1616
export const PALETTES = RAW_PALETTES as Record<number, string[]>;
1717
export const MAX_PALETTE_SIZE = Math.max(...Object.keys(PALETTES).map((s) => +s));
18+
export const EXPAND_STEP_SIZE = 10; // Number of items to show when expanding
1819
export const GRADIENT = ["#99f3cb", "#222123"];
1920

2021
// Graph rendering

src/lib/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { ComputedData } from "./computedData";
66
import { Data } from "./data";
77
import { NavState } from "./navState";
88

9-
export const PANELS = ["main", "readability"] as const;
9+
export const PANELS = ["main", "settings"] as const;
1010
export type Panel = (typeof PANELS)[number];
1111

1212
export const AppContext = createContext<{ portalTarget: HTMLDivElement }>({

src/views/ContextPanel.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { useNotifications } from "../lib/notifications";
1111
import Filters from "./Filters";
1212
import GraphSumUp from "./GraphSumUp";
1313
import NodesAppearanceBlock from "./NodesAppearanceBlock";
14-
import ReadabilityBlock from "./ReadabilityBlock";
14+
import Settings from "./Settings";
1515
import SelectedNodePanel from "./SelectedNodePanel";
1616

1717
const ContextPanel: FC = () => {
@@ -31,8 +31,8 @@ const ContextPanel: FC = () => {
3131
);
3232

3333
let content: JSX.Element;
34-
if (panel === "readability") {
35-
content = <ReadabilityBlock />;
34+
if (panel === "settings") {
35+
content = <Settings />;
3636
} else if (selectedNode) {
3737
content = <SelectedNodePanel node={navState?.selectedNode as string} data={selectedNode} />;
3838
} else {
@@ -60,9 +60,9 @@ const ContextPanel: FC = () => {
6060
<MdOutlinePreview /> Explore
6161
</button>
6262
<button
63-
className={cx("btn ms-2 mt-1", panel === "readability" ? selectedButtonClass : "btn-outline-dark")}
64-
onClick={() => setPanel("readability")}
65-
disabled={panel === "readability"}
63+
className={cx("btn ms-2 mt-1", panel === "settings" ? selectedButtonClass : "btn-outline-dark")}
64+
onClick={() => setPanel("settings")}
65+
disabled={panel === "settings"}
6666
>
6767
<VscSettings /> Settings
6868
</button>

src/views/EditionPanel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ const EditionPanel: FC<{ isExpanded: boolean }> = ({ isExpanded }) => {
131131
<button
132132
type="button"
133133
className="btn btn-outline-light btn-sm btn-inline"
134-
onClick={() => setPanel("readability")}
134+
onClick={() => setPanel("settings")}
135135
>
136136
<VscSettings className="small" /> Settings
137137
</button>{" "}

src/views/Filters.tsx

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { MdBubbleChart } from "react-icons/md";
1010
import { RiFilterOffFill } from "react-icons/ri";
1111

1212
import { RangeMetric, SearchMetrics, TermsMetric } from "../lib/computedData";
13-
import { MAX_PALETTE_SIZE, RANGE_STYLE } from "../lib/consts";
13+
import { MAX_PALETTE_SIZE, EXPAND_STEP_SIZE, RANGE_STYLE } from "../lib/consts";
1414
import { GraphContext } from "../lib/context";
1515
import { ContentField, QualiField, QuantiField, getFilterableFields, getValue } from "../lib/data";
1616
import { Filter, RangeFilter, SearchFilter, TermsFilter } from "../lib/navState";
@@ -38,11 +38,11 @@ const SearchFilterComponent: FC<{
3838
setFilter(
3939
value
4040
? {
41-
type: "search",
42-
field: field.id,
43-
value: value,
44-
normalizedValue: normalize(value),
45-
}
41+
type: "search",
42+
field: field.id,
43+
value: value,
44+
normalizedValue: normalize(value),
45+
}
4646
: null,
4747
);
4848
}}
@@ -73,17 +73,30 @@ const TermsFilterComponent: FC<{
7373
const { data: graphData, setHovered } = useContext(GraphContext);
7474
const [alphaSort, setAlphaSort] = useState(false);
7575
const [expanded, setExpanded] = useState(false);
76+
const [currentLimit, setCurrentLimit] = useState(MAX_PALETTE_SIZE);
7677
const maxCount = max(data.values.map((v) => v.globalCount)) as number;
7778
const filteredValues = filter?.values ? new Set(filter.values) : null;
7879

7980
const showExpandToggle = data.values.length > MAX_PALETTE_SIZE;
81+
82+
const handleExpand = () => {
83+
const newLimit = Math.min(currentLimit + EXPAND_STEP_SIZE, data.values.length);
84+
setCurrentLimit(newLimit);
85+
setExpanded(true);
86+
};
87+
88+
const handleCollapse = () => {
89+
setCurrentLimit(MAX_PALETTE_SIZE);
90+
setExpanded(false);
91+
};
92+
8093
const values = useMemo(
8194
() =>
8295
take(
8396
alphaSort ? sortBy(data.values, (value) => value.label.toLowerCase()) : data.values,
84-
showExpandToggle && !expanded ? MAX_PALETTE_SIZE : Infinity,
97+
currentLimit,
8598
),
86-
[showExpandToggle, expanded, alphaSort, data.values],
99+
[currentLimit, alphaSort, data.values],
87100
);
88101

89102
return (
@@ -172,17 +185,21 @@ const TermsFilterComponent: FC<{
172185
})}
173186
</ul>
174187
{showExpandToggle && (
175-
<button className="btn btn-link p-0 btn-sm" onClick={() => setExpanded((v) => !v)}>
176-
{expanded ? (
177-
<>
178-
<FiMinus /> Only show {MAX_PALETTE_SIZE} first values
179-
</>
180-
) : (
181-
<>
182-
<FiPlus /> Show all values ({data.values.length - values.length} more)
183-
</>
188+
<div className="d-flex flex-column gap-2 mt-2">
189+
<div className="text-muted small">
190+
Showing {currentLimit} of {data.values.length} values
191+
</div>
192+
{currentLimit < data.values.length && (
193+
<button className="btn btn-link p-0 btn-sm" onClick={handleExpand}>
194+
<FiPlus /> Show {Math.min(EXPAND_STEP_SIZE, data.values.length - currentLimit)} more values ({data.values.length - currentLimit} remaining)
195+
</button>
184196
)}
185-
</button>
197+
{expanded && (
198+
<button className="btn btn-link p-0 btn-sm text-muted" onClick={handleCollapse}>
199+
<FiMinus /> Collapse to {MAX_PALETTE_SIZE} values
200+
</button>
201+
)}
202+
</div>
186203
)}
187204
</>
188205
);
@@ -207,9 +224,9 @@ const RangeFilterComponent: FC<{
207224
(v) =>
208225
v === currentMin || v === currentMax
209226
? {
210-
label: shortenNumber(v),
211-
style: { fontWeight: "bold", background: "white", padding: "0 0.2em", zIndex: 1 },
212-
}
227+
label: shortenNumber(v),
228+
style: { fontWeight: "bold", background: "white", padding: "0 0.2em", zIndex: 1 },
229+
}
213230
: shortenNumber(v),
214231
);
215232
const [inputValues, setInputValues] = useState<{ min: number; max: number }>({ min: currentMin, max: currentMax });
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interface Option {
2929
field?: string;
3030
}
3131

32-
const ReadabilityBlock: FC = () => {
32+
const Settings: FC = () => {
3333
// const { navState, setNavState } = useContext(GraphContext);
3434
const { navState, setNavState, setShowEditionPanel, setShowEdgePanel, data } = useContext(GraphContext);
3535
const [initialNavState] = useState<NavState>(navState);
@@ -62,7 +62,7 @@ const ReadabilityBlock: FC = () => {
6262
const cancel = () => setNavState(initialNavState);
6363

6464
return (
65-
<div className="readability-block block">
65+
<div className="settings-block block">
6666
<h1 className="fs-4 mt-4">
6767
<VscSettings /> Settings
6868
</h1>
@@ -312,4 +312,4 @@ const ReadabilityBlock: FC = () => {
312312
);
313313
};
314314

315-
export default ReadabilityBlock;
315+
export default Settings;

0 commit comments

Comments
 (0)