Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit 4a8412a

Browse files
committed
new metadata tags column option
1 parent 94d4558 commit 4a8412a

File tree

17 files changed

+139
-3
lines changed

17 files changed

+139
-3
lines changed

src/cdm/DatabaseModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export type TableOptionsResponse = {
4646
}
4747

4848
export type NoteInfoPage = Omit<SMarkdownPage, "file"> & {
49-
file: Pick<SMarkdownPage["file"], "link" | "path" | "ctime" | "mtime" | "tasks" | "outlinks" | "inlinks" | "folder">
49+
file: Pick<SMarkdownPage["file"], "link" | "path" | "ctime" | "mtime" | "tasks" | "outlinks" | "inlinks" | "folder" | "tags">;
5050
};
5151

5252
export type LocaleDict = keyof typeof en;

src/cdm/SettingsModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export interface LocalSettings {
4949
show_metadata_tasks: boolean;
5050
show_metadata_inlinks: boolean;
5151
show_metadata_outlinks: boolean;
52+
show_metadata_tags: boolean;
5253
source_form_result: string;
5354
source_destination_path: string;
5455
source_data: string;

src/components/Columns.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ export async function obtainMetadataColumns(
8484
delete yamlColumns[MetadataColumns.OUTLINKS];
8585
}
8686

87+
if (localSetting.show_metadata_tags) {
88+
// If TAGS is not already in the table, add it
89+
yamlColumns[MetadataColumns.TAGS] = {
90+
...MetadataDatabaseColumns.TAGS,
91+
...(yamlColumns[MetadataColumns.TAGS] ?? {}),
92+
};
93+
} else {
94+
delete yamlColumns[MetadataColumns.TAGS];
95+
}
96+
8797
yamlColumns[MetadataColumns.ADD_COLUMN] = {
8898
...MetadataDatabaseColumns.ADD_COLUMN,
8999
position: DatabaseLimits.MAX_COLUMNS + 1,

src/components/DefaultCell.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import RelationCell from "components/cellTypes/RelationCell";
1818
import RollupCell from "components/cellTypes/RollupCell";
1919
import { CellContext } from "@tanstack/react-table";
2020
import { Literal } from "obsidian-dataview";
21+
import MetadataTagsCell from "./cellTypes/MetadataTagsCell";
2122

2223
export default function DefaultCell(
2324
defaultCell: CellContext<RowDataType, Literal>
@@ -70,6 +71,10 @@ export default function DefaultCell(
7071
case InputType.OUTLINKS:
7172
return <InOutLinksCell defaultCell={defaultCell} />;
7273

74+
/** Metadata file tags */
75+
case InputType.METADATA_TAGS:
76+
return <MetadataTagsCell defaultCell={defaultCell} />;
77+
7378
/** Checkbox option */
7479
case InputType.CHECKBOX:
7580
return <CheckboxCell defaultCell={defaultCell} />;

src/components/DefaultHeader.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import IncomingLinkIcon from "components/img/IncomingLinkIcon";
1616
import CodeIcon from "components/img/CodeIcon";
1717
import RelationBidirectionalIcon from "components/img/RelationBidirectionalIcon";
1818
import RollupIcon from "components/img/RollupIcon";
19+
import MetadataTagsIcon from "components/img/MetadataTags";
1920
import { AddColumnModal } from "components/modals/newColumn/addColumnModal";
2021
import {
2122
BaseFilter,
@@ -98,6 +99,10 @@ export default function DefaultHeader(headerProps: DatabaseHeaderProps) {
9899
propertyIcon = <TaskIcon />;
99100
columnSearch = <BaseFilter {...headerProps} />;
100101
break;
102+
case InputType.METADATA_TAGS:
103+
propertyIcon = <MetadataTagsIcon />;
104+
columnSearch = <BaseFilter {...headerProps} />;
105+
break;
101106
case InputType.CHECKBOX:
102107
propertyIcon = <TaskIcon />;
103108
columnSearch = <BooleanFilter {...headerProps} />;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { CellComponentProps } from "cdm/ComponentsModel";
2+
import { c } from "helpers/StylesHelper";
3+
import React, { useEffect, useRef } from "react";
4+
import { MarkdownService } from "services/MarkdownRenderService";
5+
6+
const MetadataTagsCell = (mdProps: CellComponentProps) => {
7+
const { defaultCell } = mdProps;
8+
const { table, row, column } = defaultCell;
9+
const { tableState } = table.options.meta;
10+
const metaTagsRow = tableState.data((state) => state.rows[row.index]);
11+
const mdRef = useRef<HTMLDivElement>();
12+
useEffect(() => {
13+
if (mdRef.current === null) return;
14+
15+
const metaTags = metaTagsRow[column.id] as string[];
16+
MarkdownService.renderMarkdown(
17+
defaultCell,
18+
metaTags.join(" "),
19+
mdRef.current,
20+
5
21+
);
22+
});
23+
return (
24+
<span
25+
ref={mdRef}
26+
className={c("md_cell text-align-left tabIndex")}
27+
tabIndex={0}
28+
/>
29+
);
30+
};
31+
32+
export default MetadataTagsCell;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from "react";
2+
3+
export default function MetadataTagsIcon() {
4+
return (
5+
<svg
6+
width="24"
7+
height="24"
8+
viewBox="0 0 24 24"
9+
stroke-width="2"
10+
stroke="currentColor"
11+
fill="none"
12+
stroke-linecap="round"
13+
stroke-linejoin="round"
14+
>
15+
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
16+
<path d="M13 7a2 2 0 0 1 2 2v12l-5 -3l-5 3v-12a2 2 0 0 1 2 -2h6z"></path>
17+
<path d="M9.265 4a2 2 0 0 1 1.735 -1h6a2 2 0 0 1 2 2v12l-1 -.6"></path>
18+
</svg>
19+
);
20+
}

src/components/modals/columnSettings/ColumnSections.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class BehaviorSetttingsSection extends AbstractChain<ColumnSettingsHandlerRespon
9494
case InputType.METATADA_TIME:
9595
case InputType.INLINKS:
9696
case InputType.OUTLINKS:
97-
97+
case InputType.METADATA_TAGS:
9898
// do nothing
9999
break;
100100
default:

src/components/modals/newColumn/handlers/MetadataToggleGroupHandler.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,23 @@ export class MetadataToggleGroupHandler extends AbstractHandlerClass<AddColumnMo
116116
.onChange(metadata_outlinks_toggle_promise)
117117
);
118118

119+
/************************
120+
* METADATA TAGS COLUMN
121+
************************/
122+
const metadata_tags_toggle_promise = async (value: boolean): Promise<void> => {
123+
// Persist value
124+
view.diskConfig.updateConfig({ show_metadata_tags: value });
125+
addColumnModalManager.addColumnModal.enableReset = true;
126+
}
127+
128+
new Setting(metadata_section)
129+
.setName(t("settings_metatata_tags_toggle_title"))
130+
.setDesc(t("settings_metatata_tags_toggle_desc"))
131+
.addToggle(toggle =>
132+
toggle.setValue(view.diskConfig.yaml.config.show_metadata_tags)
133+
.onChange(metadata_tags_toggle_promise)
134+
);
135+
119136
return this.goNext(response);
120137
}
121138
}

src/helpers/Constants.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const StaticInputType = Object.freeze({
3030
TASK: 'task',
3131
INLINKS: 'inlinks',
3232
OUTLINKS: 'outlinks',
33+
METADATA_TAGS: 'metadata_tags',
3334
NEW_COLUMN: 'new_column',
3435
});
3536

@@ -51,7 +52,8 @@ export const MetadataColumns = Object.freeze({
5152
TASKS: `__tasks__`,
5253
OUTLINKS: `__outlinks__`,
5354
INLINKS: `__inlinks__`,
54-
ROW_CONTEXT_MENU: "__rowContextMenu__"
55+
ROW_CONTEXT_MENU: "__rowContextMenu__",
56+
TAGS: `__tags__`,
5557
});
5658

5759
export const MetadataLabels = Object.freeze({
@@ -62,6 +64,7 @@ export const MetadataLabels = Object.freeze({
6264
TASK: 'Task',
6365
OUTLINKS: 'Outlinks',
6466
INLINKS: 'Inlinks',
67+
TAGS: 'File Tags',
6568
});
6669

6770
export const PaginationRenderOptions = Object.freeze({
@@ -214,6 +217,18 @@ export const MetadataDatabaseColumns: MetadataColumnsModel = Object.freeze({
214217
config: DEFAULT_COLUMN_CONFIG
215218

216219
},
220+
TAGS: {
221+
key: MetadataColumns.TAGS,
222+
id: MetadataColumns.TAGS,
223+
input: InputType.METADATA_TAGS,
224+
label: MetadataLabels.TAGS,
225+
accessorKey: MetadataColumns.TAGS,
226+
isMetadata: true,
227+
isDragDisabled: false,
228+
skipPersist: false,
229+
csvCandidate: false,
230+
config: DEFAULT_COLUMN_CONFIG
231+
},
217232
ROW_CONTEXT_MENU: {
218233
id: MetadataColumns.ROW_CONTEXT_MENU,
219234
key: MetadataColumns.ROW_CONTEXT_MENU,
@@ -413,6 +428,7 @@ export const DEFAULT_SETTINGS: DatabaseSettings = {
413428
show_metadata_tasks: false,
414429
show_metadata_inlinks: false,
415430
show_metadata_outlinks: false,
431+
show_metadata_tags: false,
416432
source_data: SourceDataTypes.CURRENT_FOLDER,
417433
source_form_result: '',
418434
source_destination_path: '/',

0 commit comments

Comments
 (0)