feat(views/table): display both promoted and non-promoted attributes

This commit is contained in:
Elian Doran 2025-07-14 10:25:32 +03:00
parent e4a2a8e56d
commit 71863752cd
No known key found for this signature in database
3 changed files with 16 additions and 14 deletions

View File

@ -6,7 +6,7 @@ import { LabelType } from "../../../services/promoted_attribute_definition_parse
type ColumnType = LabelType | "relation"; type ColumnType = LabelType | "relation";
export interface PromotedAttributeInformation { export interface AttributeDefinitionInformation {
name: string; name: string;
title?: string; title?: string;
type?: ColumnType; type?: ColumnType;
@ -42,7 +42,7 @@ const labelTypeMappings: Record<ColumnType, Partial<ColumnDefinition>> = {
} }
}; };
export function buildColumnDefinitions(info: PromotedAttributeInformation[], existingColumnData?: ColumnDefinition[]) { export function buildColumnDefinitions(info: AttributeDefinitionInformation[], existingColumnData?: ColumnDefinition[]) {
const columnDefs: ColumnDefinition[] = [ const columnDefs: ColumnDefinition[] = [
{ {
title: "#", title: "#",

View File

@ -11,7 +11,7 @@ import "tabulator-tables/dist/css/tabulator.css";
import "../../../../src/stylesheets/table.css"; import "../../../../src/stylesheets/table.css";
import { canReorderRows, configureReorderingRows } from "./dragging.js"; import { canReorderRows, configureReorderingRows } from "./dragging.js";
import buildFooter from "./footer.js"; import buildFooter from "./footer.js";
import getPromotedAttributeInformation, { buildRowDefinitions } from "./rows.js"; import getAttributeDefinitionInformation, { buildRowDefinitions } from "./rows.js";
import { buildColumnDefinitions } from "./columns.js"; import { buildColumnDefinitions } from "./columns.js";
import { setupContextMenu } from "./context_menu.js"; import { setupContextMenu } from "./context_menu.js";
@ -121,7 +121,7 @@ export default class TableView extends ViewMode<StateInfo> {
private async initialize(el: HTMLElement) { private async initialize(el: HTMLElement) {
const notes = await froca.getNotes(this.args.noteIds); const notes = await froca.getNotes(this.args.noteIds);
const info = getPromotedAttributeInformation(this.parentNote); const info = getAttributeDefinitionInformation(this.parentNote);
const viewStorage = await this.viewStorage.restore(); const viewStorage = await this.viewStorage.restore();
this.persistentData = viewStorage?.tableData || {}; this.persistentData = viewStorage?.tableData || {};
@ -245,7 +245,7 @@ export default class TableView extends ViewMode<StateInfo> {
return; return;
} }
const info = getPromotedAttributeInformation(this.parentNote); const info = getAttributeDefinitionInformation(this.parentNote);
const columnDefs = buildColumnDefinitions(info, this.persistentData?.columns); const columnDefs = buildColumnDefinitions(info, this.persistentData?.columns);
this.api.setColumns(columnDefs); this.api.setColumns(columnDefs);
} }
@ -256,7 +256,7 @@ export default class TableView extends ViewMode<StateInfo> {
} }
const notes = await froca.getNotes(this.args.noteIds); const notes = await froca.getNotes(this.args.noteIds);
const info = getPromotedAttributeInformation(this.parentNote); const info = getAttributeDefinitionInformation(this.parentNote);
this.api.replaceData(await buildRowDefinitions(this.parentNote, notes, info)); this.api.replaceData(await buildRowDefinitions(this.parentNote, notes, info));
if (this.noteIdToEdit) { if (this.noteIdToEdit) {

View File

@ -1,6 +1,6 @@
import FNote from "../../../entities/fnote.js"; import FNote from "../../../entities/fnote.js";
import type { LabelType } from "../../../services/promoted_attribute_definition_parser.js"; import type { LabelType } from "../../../services/promoted_attribute_definition_parser.js";
import type { PromotedAttributeInformation } from "./columns.js"; import type { AttributeDefinitionInformation } from "./columns.js";
export type TableData = { export type TableData = {
iconClass: string; iconClass: string;
@ -11,7 +11,7 @@ export type TableData = {
branchId: string; branchId: string;
}; };
export async function buildRowDefinitions(parentNote: FNote, notes: FNote[], infos: PromotedAttributeInformation[]) { export async function buildRowDefinitions(parentNote: FNote, notes: FNote[], infos: AttributeDefinitionInformation[]) {
const definitions: TableData[] = []; const definitions: TableData[] = [];
for (const branch of parentNote.getChildBranches()) { for (const branch of parentNote.getChildBranches()) {
const note = await branch.getNote(); const note = await branch.getNote();
@ -41,17 +41,19 @@ export async function buildRowDefinitions(parentNote: FNote, notes: FNote[], inf
return definitions; return definitions;
} }
export default function getPromotedAttributeInformation(parentNote: FNote) { export default function getAttributeDefinitionInformation(parentNote: FNote) {
const info: PromotedAttributeInformation[] = []; const info: AttributeDefinitionInformation[] = [];
for (const promotedAttribute of parentNote.getPromotedDefinitionAttributes()) { const attrDefs = parentNote.getAttributes()
const def = promotedAttribute.getDefinition(); .filter(attr => attr.isDefinition());
for (const attrDef of attrDefs) {
const def = attrDef.getDefinition();
if (def.multiplicity !== "single") { if (def.multiplicity !== "single") {
console.warn("Multiple values are not supported for now"); console.warn("Multiple values are not supported for now");
continue; continue;
} }
const [ labelType, name ] = promotedAttribute.name.split(":", 2); const [ labelType, name ] = attrDef.name.split(":", 2);
if (promotedAttribute.type !== "label") { if (attrDef.type !== "label") {
console.warn("Relations are not supported for now"); console.warn("Relations are not supported for now");
continue; continue;
} }