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

Commit 321b3eb

Browse files
committed
Merge branch 'csv_api'
2 parents 343da0c + 4e766b4 commit 321b3eb

File tree

16 files changed

+450
-195
lines changed

16 files changed

+450
-195
lines changed

src/cdm/TableStateInterface.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ConfigColumn, RowDataType, TableColumn } from "cdm/FolderModel";
33
import { FilterSettings, GlobalSettings, LocalSettings } from "cdm/SettingsModel";
44
import { ColumnOption } from "cdm/ComponentsModel";
55
import { DatabaseView } from "views/DatabaseView";
6-
import { Literal } from "obsidian-dataview";
6+
import { Link, Literal } from "obsidian-dataview";
77
import { StoreApi, UseBoundStore } from "zustand";
88
import { UpdaterData, ContextHeaderData } from "cdm/EmitterModel";
99

@@ -72,6 +72,7 @@ export type DataStateActions = {
7272
insertRows: () => Promise<void>;
7373
addRow: (args: CreateRowInfo) => Promise<void>;
7474
updateCell: (args: UpdateRowInfo) => Promise<void>;
75+
updateBidirectionalRelation: (source: RowDataType, column: TableColumn, oldPaths: string[], newPaths: string[]) => Promise<void>;
7576
parseDataOfColumn: (column: TableColumn, input: string, ddbbConfig: LocalSettings) => void;
7677
updateDataAfterLabelChange: (column: TableColumn, label: string, columns: TableColumn[], ddbbConfig: LocalSettings) => Promise<void>;
7778
removeRow: (row: RowDataType) => Promise<void>;
@@ -103,7 +104,7 @@ export interface DataState {
103104
export type ColumnsStateActions = {
104105
addToLeft: (column: TableColumn, customName?: string, customType?: string) => void;
105106
addToRight: (column: TableColumn, customName?: string, customType?: string) => void;
106-
remove: (column: TableColumn) => void;
107+
remove: (column: TableColumn) => Promise<void>;
107108
alterSorting: (column: TableColumn) => void;
108109
addOptionToColumn: (column: TableColumn, option: string, backgroundColor: string) => void;
109110
alterColumnType: (column: TableColumn, input: string, parsedRows?: RowDataType[]) => Promise<void>;

src/components/cellTypes/Editor/RelationEditor.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { useState } from "react";
44
import Select from "react-select";
55
import CustomTagsStyles from "components/styles/TagsStyles";
66
import { c } from "helpers/StylesHelper";
7-
import { recordRowsFromRelation } from "helpers/RelationHelper";
7+
import { obtainInfoFromRelation } from "helpers/RelationHelper";
88
import { TableColumn } from "cdm/FolderModel";
99
import { Link } from "obsidian-dataview";
1010
import { OnChangeValue } from "react-select";
11-
import { DEFAULT_SETTINGS, StyleVariables } from "helpers/Constants";
11+
import { StyleVariables } from "helpers/Constants";
1212

1313
const RelationEditor = (props: RelationEditorComponentProps) => {
1414
const { defaultCell, persistChange, relationCell } = props;
@@ -47,13 +47,11 @@ const RelationEditor = (props: RelationEditorComponentProps) => {
4747

4848
useEffect(() => {
4949
setTimeout(async () => {
50-
const relationRows = await recordRowsFromRelation(
51-
tableColumn.config.related_note_path,
52-
DEFAULT_SETTINGS.local_settings,
53-
columnsInfo.getAllColumns()
50+
const { recordRows } = await obtainInfoFromRelation(
51+
tableColumn.config.related_note_path
5452
);
5553

56-
const multiOptions = Object.entries(relationRows).map(([key, value]) => ({
54+
const multiOptions = Object.entries(recordRows).map(([key, value]) => ({
5755
label: value,
5856
value: key,
5957
color: StyleVariables.TEXT_NORMAL,

src/components/cellTypes/RelationCell.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ const RelationCell = (mdProps: CellComponentProps) => {
8383
columns: columnsInfo.getAllColumns(),
8484
ddbbConfig: configInfo.getLocalSettings(),
8585
});
86+
87+
if (tableColumn.config.bidirectional_relation) {
88+
dataActions.updateBidirectionalRelation(
89+
relationRow,
90+
tableColumn,
91+
oldPaths,
92+
newPaths
93+
);
94+
}
8695
}
8796
setDirtyCell(false);
8897
};

src/components/modals/columnSettings/handlers/automations/BidirectionalRelationToggleHandler.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@ export class BidirectionalRelationToggleHandler extends AbstractHandlerClass<Col
4040
const { column, columnSettingsManager } = columnHandlerResponse;
4141
const { view } = columnSettingsManager.modal;
4242
const file = resolve_tfile(column.config.related_note_path);
43-
const relationConfig = await new DatabaseInfo(file, view.plugin.settings.local_settings).build();
43+
const relatedDB = await new DatabaseInfo(file, view.plugin.settings.local_settings).build();
44+
// Check if the relation is already bidirectional
4445
if (toggleValue) {
45-
relationConfig.yaml.columns[column.id] = view.diskConfig.yaml.columns[column.id];
46+
const relatedColumn = { ...view.diskConfig.yaml.columns[column.id] };
47+
relatedColumn.config.related_note_path = view.file.path;
48+
relatedDB.yaml.columns[column.id] = relatedColumn;
4649
} else {
47-
delete relationConfig.yaml.columns[column.id];
50+
delete relatedDB.yaml.columns[column.id];
4851
}
49-
await relationConfig.saveOnDisk();
50-
// Check if the relation is already bidirectional
52+
await relatedDB.saveOnDisk();
5153
}
5254
}

src/helpers/Constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,6 @@ export const DatabaseCore = Object.freeze({
250250
export const UpdateRowOptions = Object.freeze({
251251
COLUMN_VALUE: 'column_value',
252252
COLUMN_KEY: 'column_key',
253-
INLINE_VALUE: 'inline_value',
254253
REMOVE_COLUMN: 'remove_column'
255254
});
256255

src/helpers/RelationHelper.ts

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { SMarkdownPage } from "obsidian-dataview";
1+
import { DataArray, Literal, SMarkdownPage } from "obsidian-dataview";
22
import { DataviewService } from "services/DataviewService";
3-
import { DatabaseCore } from "helpers/Constants";
3+
import { DatabaseCore, DEFAULT_SETTINGS } from "helpers/Constants";
44
import { resolve_tfile } from "helpers/FileManagement";
55
import DatabaseInfo from "services/DatabaseInfo";
6-
import { sourceDataviewPages } from "helpers/VaultManagement";
6+
import { adapterTFilesToRows, sourceDataviewPages } from "helpers/VaultManagement";
77
import { LocalSettings } from "cdm/SettingsModel";
8-
import { TableColumn } from "cdm/FolderModel";
9-
import { obtainColumnsFromRows } from "components/Columns";
8+
import { RowDataType, TableColumn } from "cdm/FolderModel";
9+
import { obtainColumnsFromFolder, obtainColumnsFromRows } from "components/Columns";
10+
import { TFile } from "obsidian";
1011

1112
/**
1213
* Search for all databases in the vault returning a Record of all databases
@@ -23,20 +24,25 @@ export function recordAllDatabases(): Record<string, string> {
2324
});
2425
return avaliableDDBB;
2526
}
27+
type RelationInfo = {
28+
recordRows: Record<string, string>;
29+
ddbbFile: TFile,
30+
ddbbInfo: DatabaseInfo,
31+
relatedColumns: TableColumn[],
32+
relatedRows: RowDataType[]
33+
}
2634

27-
export async function recordRowsFromRelation(ddbbPath: string, ddbbConfig: LocalSettings, columns?: TableColumn[]): Promise<Record<string, string>> {
28-
const relationRows: Record<string, string> = {};
35+
export async function obtainInfoFromRelation(ddbbPath: string): Promise<RelationInfo> {
36+
const recordRows: Record<string, string> = {};
2937
const ddbbFile = resolve_tfile(ddbbPath);
30-
const ddbbInfo = await new DatabaseInfo(ddbbFile, ddbbConfig).build();
31-
32-
const ddbbRows = await sourceDataviewPages(ddbbInfo.yaml.config, ddbbFile.parent.path, columns);
33-
ddbbRows
34-
.filter((page) => !page[DatabaseCore.FRONTMATTER_KEY])
35-
.forEach((page) => {
36-
const file = (page as SMarkdownPage).file;
37-
relationRows[file.path] = file.name;
38-
});
39-
return relationRows;
38+
const ddbbInfo = await new DatabaseInfo(ddbbFile, DEFAULT_SETTINGS.local_settings).build();
39+
const relatedColumns = await obtainColumnsFromFolder(ddbbInfo.yaml.columns);
40+
const relatedRows = await adapterTFilesToRows(ddbbFile, relatedColumns, ddbbInfo.yaml.config, ddbbInfo.yaml.filters);
41+
relatedRows.forEach((row) => {
42+
const file = row.__note__.getFile()
43+
recordRows[file.path] = file.name;
44+
});
45+
return { recordRows, ddbbFile, ddbbInfo, relatedColumns, relatedRows }
4046
}
4147

4248
export async function recordFieldsFromRelation(ddbbPath: string, ddbbConfig: LocalSettings, columns?: TableColumn[]): Promise<Record<string, string>> {

src/services/DatabaseInfo.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ConfigColumn, TableColumn } from 'cdm/FolderModel';
1010
import { FilterSettings, LocalSettings } from 'cdm/SettingsModel';
1111
import { isDatabaseNote } from 'helpers/VaultManagement';
1212
import databaseStringToYamlParser from 'IO/md/DatabaseStringToYamlParser';
13-
import { DATABASE_CONFIG } from 'helpers/Constants';
13+
import { DATABASE_CONFIG, DEFAULT_COLUMN_CONFIG } from 'helpers/Constants';
1414
import NoteContentActionBuilder from 'patterns/builders/NoteContentActionBuilder';
1515

1616
export default class DatabaseInfo {
@@ -159,6 +159,13 @@ export default class DatabaseInfo {
159159
await this.saveOnDisk();
160160
}
161161

162+
async resetColumnConfig(columnId: string): Promise<void> {
163+
const colToUpdate = this.yaml.columns[columnId];
164+
colToUpdate.config = DEFAULT_COLUMN_CONFIG;
165+
this.yaml.columns[columnId] = colToUpdate;
166+
await this.saveOnDisk();
167+
}
168+
162169
async updateYaml<K extends keyof DatabaseYaml>(key: K, value: DatabaseYaml[K]): Promise<void> {
163170
this.yaml[key] = value;
164171
await this.saveOnDisk();

0 commit comments

Comments
 (0)