Skip to content

Commit eeca848

Browse files
authored
ENG-137 - Query Builder - hide columns (#629)
1 parent b08948a commit eeca848

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

apps/roam/src/components/results-view/ResultsTable.tsx

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,18 @@ const ResultsTable = ({
404404
rightStartWidth: 0,
405405
});
406406

407+
const viewsByColumn = useMemo(
408+
() => Object.fromEntries(views.map((v) => [v.column, v])),
409+
[views],
410+
);
411+
412+
const visibleColumns = useMemo(() => {
413+
const filtered = columns.filter(
414+
(column) => viewsByColumn[column.key]?.mode !== "hidden",
415+
);
416+
return filtered.length ? filtered : columns;
417+
}, [columns, viewsByColumn]);
418+
407419
const rafIdRef = useRef<number | null>(null);
408420
const throttledSetColumnWidths = useCallback((update: ColumnWidths) => {
409421
if (rafIdRef.current !== null) {
@@ -435,7 +447,7 @@ const ResultsTable = ({
435447
widths.map((w) => w.split(" - ")).filter((p) => p.length === 2),
436448
);
437449
const allWidths: ColumnWidths = {};
438-
const defaultWidth = `${100 / columns.length}%`;
450+
const defaultWidth = `${100 / (visibleColumns.length || columns.length)}%`;
439451
columns.forEach((c) => {
440452
allWidths[c.uid] = fromLayout[c.uid] || defaultWidth;
441453
});
@@ -527,8 +539,8 @@ const ResultsTable = ({
527539
const minWidth = 40;
528540
const minPercent = (minWidth / totalWidth) * 100;
529541

530-
const finalWidths: ColumnWidths = {};
531-
const uids = columns.map((c) => c.uid);
542+
const finalWidths: ColumnWidths = { ...columnWidths };
543+
const uids = visibleColumns.map((c) => c.uid);
532544
uids.forEach((uid) => {
533545
const header = tableRef.current?.querySelector(
534546
`thead td[data-column="${uid}"]`,
@@ -553,7 +565,7 @@ const ResultsTable = ({
553565
values: Object.entries(finalWidths).map(([k, v]) => `${k} - ${v}`),
554566
});
555567
}
556-
}, [columns, parentUid, columnWidths]);
568+
}, [parentUid, columnWidths, visibleColumns]);
557569

558570
const resultHeaderSetFilters = React.useCallback(
559571
(fs: FilterData) => {
@@ -653,7 +665,7 @@ const ResultsTable = ({
653665
>
654666
<thead style={{ background: "#eeeeee80" }}>
655667
<tr style={{ visibility: !showInterface ? "collapse" : "visible" }}>
656-
{columns.map((c) => (
668+
{visibleColumns.map((c) => (
657669
<ResultHeader
658670
key={c.uid}
659671
c={c}
@@ -676,14 +688,14 @@ const ResultsTable = ({
676688
parentUid={parentUid}
677689
views={views}
678690
onRefresh={onRefresh}
679-
columns={columns}
691+
columns={visibleColumns}
680692
onDragStart={onDragStart}
681693
onDrag={onDrag}
682694
onDragEnd={onDragEnd}
683695
/>
684696
{extraRowUid === r.uid && (
685697
<tr className={`roamjs-${extraRowType}-row roamjs-extra-row`}>
686-
<td colSpan={columns.length}>
698+
<td colSpan={visibleColumns.length}>
687699
{extraRowUid && extraRowType === "context" ? (
688700
<ExtraContextRow uid={extraRowUid} />
689701
) : extraRowUid && extraRowType === "discourse" ? (

apps/roam/src/components/results-view/ResultsView.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ const VIEWS: Record<string, { value: boolean }> = {
5454
plain: { value: false },
5555
embed: { value: true },
5656
alias: { value: true },
57+
hidden: { value: false },
5758
};
5859

5960
const EMBED_FOLD_VALUES = ["default", "open", "closed"];
@@ -395,15 +396,21 @@ const ResultsView: ResultsViewComponent = ({
395396
() => (Array.isArray(layout.mode) ? layout.mode[0] : layout.mode),
396397
[layout],
397398
);
399+
const isColumnViewsDirty = useMemo(
400+
() => views.some((v) => v.mode === "hidden"),
401+
[views],
402+
);
398403
const isMenuIconDirty = useMemo(
399404
() =>
400405
(searchFilter && !showSearchFilter) ||
406+
isColumnViewsDirty ||
401407
columnFilters.length ||
402408
random.count ||
403409
(activeSort.length && layout.mode !== "table"), // indicator is on ResultHeader
404410
[
405411
searchFilter,
406412
showSearchFilter,
413+
isColumnViewsDirty,
407414
columnFilters,
408415
random,
409416
activeSort,
@@ -440,6 +447,10 @@ const ResultsView: ResultsViewComponent = ({
440447
const showColumnViewOptions = views.some(
441448
(view) => VIEWS[view.mode]?.value === true,
442449
);
450+
const visibleColumnCount = useMemo(
451+
() => views.filter((view) => view.mode !== "hidden").length,
452+
[views],
453+
);
443454

444455
return (
445456
<div
@@ -1045,7 +1056,12 @@ const ResultsView: ResultsViewComponent = ({
10451056
<td className="whitespace-nowrap">
10461057
<MenuItemSelect
10471058
className="roamjs-view-select"
1048-
items={Object.keys(VIEWS)}
1059+
items={Object.keys(VIEWS).filter(
1060+
(viewMode) =>
1061+
viewMode !== "hidden" ||
1062+
visibleColumnCount > 1 ||
1063+
mode === "hidden",
1064+
)}
10491065
activeItem={mode}
10501066
onItemSelect={(m) => {
10511067
posthog.capture(
@@ -1143,6 +1159,7 @@ const ResultsView: ResultsViewComponent = ({
11431159
<MenuItem
11441160
icon={"eye-open"}
11451161
text={"Column Views"}
1162+
className={isColumnViewsDirty ? "roamjs-item-dirty" : ""}
11461163
onClick={() => {
11471164
setIsEditViews(true);
11481165
}}

0 commit comments

Comments
 (0)