Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 61 additions & 10 deletions src/components/ResultsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ const ResultsView: ResultsViewComponent = ({
const [columnFilters, setColumnFilters] = useState(settings.columnFilters);
const [searchFilter, setSearchFilter] = useState(settings.searchFilter);
const [showInterface, setShowInterface] = useState(settings.showInterface);
const [hiddenColumns, setHiddenColumns] = useState(settings.hiddenColumns);
const [showMenuIcons, setShowMenuIcons] = useState(false);

const { allProcessedResults, paginatedResults } = useMemo(() => {
Expand Down Expand Up @@ -360,6 +361,7 @@ const ResultsView: ResultsViewComponent = ({
const [isEditColumnSort, setIsEditColumnSort] = useState(false);
const [isEditColumnFilter, setIsEditColumnFilter] = useState(false);
const [isEditSearchFilter, setIsEditSearchFilter] = useState(false);
const [isEditHiddenColumns, setIsEditHiddenColumns] = useState(false);

const [layout, setLayout] = useState(settings.layout);
const layoutMode = useMemo(
Expand All @@ -370,9 +372,10 @@ const ResultsView: ResultsViewComponent = ({
() =>
searchFilter ||
columnFilters.length ||
hiddenColumns.length ||
random.count ||
(activeSort.length && layout.mode !== "table"), // indicator is on ResultHeader
[searchFilter, columnFilters, random, activeSort, layout.mode]
[searchFilter, columnFilters, hiddenColumns, random, activeSort, layout.mode]
);
const onViewChange = (view: (typeof views)[number], i: number) => {
const newViews = views.map((v, j) => (i === j ? view : v));
Expand Down Expand Up @@ -405,6 +408,11 @@ const ResultsView: ResultsViewComponent = ({
(view) => VIEWS[view.mode]?.value === true
);

const visibleColumns = useMemo(
() => columns.filter((c) => !hiddenColumns.includes(c.key)),
[columns, hiddenColumns]
);

return (
<div
className={`roamjs-query-results-view w-full relative mode-${layout.mode}`}
Expand Down Expand Up @@ -476,6 +484,7 @@ const ResultsView: ResultsViewComponent = ({
setIsEditColumnFilter(false);
setIsEditViews(false);
setIsEditColumnSort(false);
setIsEditHiddenColumns(false);
}}
autoFocus={false}
enforceFocus={false}
Expand Down Expand Up @@ -575,7 +584,7 @@ const ResultsView: ResultsViewComponent = ({
{settingsById[layoutMode].map((s) => {
const options =
s.options === "columns"
? columns.map((c) => c.key)
? visibleColumns.map((c) => c.key)
: s.options.slice();
return (
<Label key={s.key}>
Expand Down Expand Up @@ -654,7 +663,7 @@ const ResultsView: ResultsViewComponent = ({
</div>
))}
<MenuItemSelect
items={columns
items={visibleColumns
.map((c) => c.key)
.filter((c) => !activeSort.some((as) => as.key === c))}
transformItem={(k) =>
Expand All @@ -663,7 +672,7 @@ const ResultsView: ResultsViewComponent = ({
ButtonProps={{
text: "Choose Column",
intent: "primary",
disabled: columns.length === activeSort.length,
disabled: visibleColumns.length === activeSort.length,
}}
onItemSelect={(column) => {
resultViewSetActiveSort([
Expand All @@ -689,7 +698,7 @@ const ResultsView: ResultsViewComponent = ({
<div className="flex items-center justify-between gap-2 mb-2">
<MenuItemSelect
className="roamjs-column-filter-key"
items={columns.map((c) => c.key)}
items={visibleColumns.map((c) => c.key)}
transformItem={(k) =>
k.length > 10 ? `${k.slice(0, 7)}...` : k
}
Expand Down Expand Up @@ -825,7 +834,7 @@ const ResultsView: ResultsViewComponent = ({
intent="primary"
onClick={() => {
const newFilter = {
key: columns[0].key,
key: visibleColumns[0].key,
type: SUPPORTED_COLUMN_FILTER_TYPES[0].id,
value: [""],
uid: window.roamAlphaAPI.util.generateUID(),
Expand Down Expand Up @@ -942,6 +951,40 @@ const ResultsView: ResultsViewComponent = ({
</tbody>
</HTMLTable>
</div>
) : isEditHiddenColumns ? (
<div className="relative p-4" style={{ minWidth: "20rem" }}>
<MenuHeading
onClear={() => setIsEditHiddenColumns(false)}
text="Hide Columns"
/>
<MultiSelect
items={columns.map((c) => c.key)}
selectedItems={hiddenColumns}
itemRenderer={(item, { handleClick, modifiers }) => (
<MenuItem
key={item}
text={item}
onClick={handleClick}
active={modifiers.active}
icon={hiddenColumns.includes(item) ? "tick" : "blank"}
/>
)}
onItemSelect={(item) => {
const newHiddenColumns = hiddenColumns.includes(item)
? hiddenColumns.filter((hc) => hc !== item)
: [...hiddenColumns, item];
setHiddenColumns(newHiddenColumns);
if (preventSavingSettings) return;
setInputSettings({
key: "hiddenColumns",
values: newHiddenColumns,
blockUid: settings.resultNodeUid,
});
}}
tagRenderer={(item) => item}
popoverProps={{ minimal: true }}
/>
</div>
) : (
<Menu>
{onEdit && (
Expand Down Expand Up @@ -975,6 +1018,14 @@ const ResultsView: ResultsViewComponent = ({
setIsEditViews(true);
}}
/>
<MenuItem
icon={"eye-off"}
text={"Hide Columns"}
className={hiddenColumns.length ? "roamjs-item-dirty" : ""}
onClick={() => {
setIsEditHiddenColumns(true);
}}
/>
<MenuItem
icon={isEditSearchFilter ? "zoom-out" : "search"}
text={isEditSearchFilter ? "Hide Search" : "Search"}
Expand Down Expand Up @@ -1130,7 +1181,7 @@ const ResultsView: ResultsViewComponent = ({
layoutMode === "table" ? (
<ResultsTable
layout={layout}
columns={columns}
columns={visibleColumns}
results={paginatedResults}
parentUid={settings.resultNodeUid}
activeSort={activeSort}
Expand All @@ -1152,13 +1203,13 @@ const ResultsView: ResultsViewComponent = ({
<Charts
type="line"
data={allProcessedResults}
columns={columns.slice(1)}
columns={visibleColumns.slice(1)}
/>
) : layoutMode === "bar" ? (
<Charts
type="bar"
data={allProcessedResults}
columns={columns.slice(1)}
columns={visibleColumns.slice(1)}
/>
) : layoutMode === "timeline" ? (
<Timeline timelineElements={allProcessedResults} />
Expand All @@ -1167,7 +1218,7 @@ const ResultsView: ResultsViewComponent = ({
data={allProcessedResults}
layout={layout}
onQuery={() => onRefresh(true)}
resultKeys={columns}
resultKeys={visibleColumns}
parentUid={parentUid}
views={views}
activeSort={activeSort}
Expand Down
11 changes: 8 additions & 3 deletions src/utils/parseResultSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import getSettingIntFromTree from "roamjs-components/util/getSettingIntFromTree"
import getSubTree from "roamjs-components/util/getSubTree";
import toFlexRegex from "roamjs-components/util/toFlexRegex";
import { StoredFilters } from "../components/DefaultFilters";
import { Column } from "./types";
import { Column, ParsedResultSettings } from "./types";
import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree";
import getSettingValuesFromTree from "roamjs-components/util/getSettingValuesFromTree";

export type Sorts = { key: string; descending: boolean }[];
export type Sorts = ParsedResultSettings["activeSort"];
export type FilterData = Record<string, Filters>;
export type Views = {
column: string;
Expand Down Expand Up @@ -71,7 +71,7 @@ const parseResultSettings = (
parentUid: string,
columns: Column[],
extensionAPI?: OnloadArgs["extensionAPI"]
) => {
): ParsedResultSettings => {
const { globalFiltersData, globalPageSize } = getSettings(extensionAPI);
const tree = getBasicTreeByParentUid(parentUid);
const resultNode = getSubTree({ tree, key: "results" });
Expand All @@ -89,6 +89,10 @@ const parseResultSettings = (
tree: resultNode.children,
key: "interface",
});
const hiddenColumnsNode = getSubTree({
tree: resultNode.children,
key: "hiddenColumns",
});
const filterEntries = getFilterEntries(filtersNode);
const savedFilterData = filterEntries.length
? Object.fromEntries(filterEntries)
Expand Down Expand Up @@ -165,6 +169,7 @@ const parseResultSettings = (
pageSize,
layout,
page: 1, // TODO save in roam data
hiddenColumns: hiddenColumnsNode.children.map((c) => c.text),
};
};

Expand Down
27 changes: 27 additions & 0 deletions src/utils/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,30 @@ export type Column = { key: string; uid: string; selection: string };
export type QBGlobalRefs = {
[key: string]: (args: Record<string, string>) => void;
};

export type ParsedResultSettings = {
resultNodeUid: string;
activeSort: { key: string; descending: boolean }[];
searchFilter: string;
showInterface: boolean;
filters: Record<
string,
{ includes: { values: Set<string> }; excludes: { values: Set<string> } }
>;
columnFilters: {
key: string;
uid: string;
value: string[];
type: string;
}[];
views: {
column: string;
mode: string;
value: string;
}[];
random: number;
pageSize: number;
layout: Record<string, string | string[]> & { uid?: string };
page: number;
hiddenColumns: string[];
};