feat(book/table): allow show/hide columns

This commit is contained in:
Elian Doran
2025-06-25 13:52:53 +03:00
parent 7e20e41521
commit c7b16cd043
3 changed files with 63 additions and 6 deletions

View File

@@ -2,7 +2,7 @@ import keyboardActionService from "../services/keyboard_actions.js";
import note_tooltip from "../services/note_tooltip.js";
import utils from "../services/utils.js";
interface ContextMenuOptions<T> {
export interface ContextMenuOptions<T> {
x: number;
y: number;
orientation?: "left";
@@ -28,6 +28,7 @@ export interface MenuCommandItem<T> {
items?: MenuItem<T>[] | null;
shortcut?: string;
spellingSuggestion?: string;
checked?: boolean;
}
export type MenuItem<T> = MenuCommandItem<T> | MenuSeparatorItem;
@@ -146,10 +147,13 @@ class ContextMenu {
} else {
const $icon = $("<span>");
if ("uiIcon" in item && item.uiIcon) {
$icon.addClass(item.uiIcon);
} else {
$icon.append("&nbsp;");
if ("uiIcon" in item || "checked" in item) {
const icon = (item.checked ? "bx bx-check" : item.uiIcon);
if (icon) {
$icon.addClass(icon);
} else {
$icon.append("&nbsp;");
}
}
const $link = $("<span>")

View File

@@ -0,0 +1,49 @@
import { GridApi } from "ag-grid-community";
import contextMenu, { MenuItem } from "../../../menus/context_menu.js";
import { TableData } from "./data.js";
export default function applyHeaderCustomization(baseEl: HTMLElement, api: GridApi<TableData>) {
const header = baseEl.querySelector(".ag-header");
if (!header) {
return;
}
header.addEventListener("contextmenu", (e) => {
e.preventDefault();
contextMenu.show({
items: [
{
title: "Columns",
items: buildColumnChooser(api)
}
],
x: e.pageX,
y: e.pageY,
selectMenuItemHandler: () => {}
});
});
}
export function buildColumnChooser(api: GridApi<TableData>) {
const items: MenuItem<unknown>[] = [];
for (const column of api.getColumns() ?? []) {
const colDef = column.getColDef();
if (!colDef) {
continue;
}
const visible = column.isVisible();
items.push({
title: colDef.headerName ?? api.getDisplayNameForColumn(column, "header") ?? "",
checked: visible,
handler() {
api.setColumnsVisible([ column ], !visible);
}
});
}
return items;
}

View File

@@ -3,6 +3,7 @@ import { buildData, type TableData } from "./data.js";
import FNote from "../../../entities/fnote.js";
import getPromotedAttributeInformation, { PromotedAttributeInformation } from "./parser.js";
import { setLabel } from "../../../services/attributes.js";
import applyHeaderCustomization from "./header-customization.js";
ModuleRegistry.registerModules([ AllCommunityModule ]);
@@ -11,7 +12,10 @@ export default function renderTable(el: HTMLElement, parentNote: FNote, notes: F
createGrid(el, {
...buildData(info, notes),
...setupEditing(info)
...setupEditing(info),
onGridReady(event) {
applyHeaderCustomization(el, event.api);
},
});
}