almost finish the structure

This commit is contained in:
Jiaxin Peng
2024-01-29 00:55:06 +00:00
parent 569d8eb699
commit a179d3da52
10 changed files with 319 additions and 246 deletions

View File

@@ -1,7 +1,7 @@
import { i18nConfig } from "src/lang/I18n"; import { i18nConfig } from "src/lang/I18n";
import {Editor, MarkdownView, setTooltip} from "obsidian"; import {Editor, MarkdownView, setTooltip} from "obsidian";
import { FuzzySuggester, DatabaseList } from "./FuzzySuggester"; import { FuzzySuggester, DatabaseList } from "./FuzzySuggester";
import { uploadCommandGeneral, uploadCommandNext } from "../upload/uploadCommand"; import {uploadCommandCustom, uploadCommandGeneral, uploadCommandNext} from "../upload/uploadCommand";
import ObsidianSyncNotionPlugin from "src/main"; import ObsidianSyncNotionPlugin from "src/main";
import {DatabaseDetails} from "../ui/settingTabs"; import {DatabaseDetails} from "../ui/settingTabs";
@@ -94,11 +94,11 @@ export default class RibbonCommands {
await uploadCommandGeneral(this.plugin, this.plugin.settings, dbDetails, this.plugin.app); await uploadCommandGeneral(this.plugin, this.plugin.settings, dbDetails, this.plugin.app);
}; };
} }
// else if (dbDetails.format === 'custom') { else if (dbDetails.format === 'custom') {
// editorCallback = async (editor, view) => { editorCallback = async (editor, view) => {
// await uploadCommandGeneral(this.plugin, dbDetails, this.plugin.app); await uploadCommandCustom(this.plugin, this.plugin.settings, dbDetails, this.plugin.app);
// }; };
// } }
this.Ncommand.push({ id: commandId, name: commandName, editorCallback }); this.Ncommand.push({ id: commandId, name: commandName, editorCallback });
} }

View File

@@ -4,7 +4,7 @@ import {ObsidianSettingTab} from "./settingTabs";
export class CustomModal extends Modal { export class CustomModal extends Modal {
propertyLines: Setting[] = []; // Store all property line settings propertyLines: Setting[] = []; // Store all property line settings
properties: { customValue: string, customType: string }[] = []; // Array to store property values and types properties: { customName: string, customType: string }[] = []; // Array to store property values and types
plugin: ObsidianSyncNotionPlugin; plugin: ObsidianSyncNotionPlugin;
settingTab: ObsidianSettingTab; settingTab: ObsidianSettingTab;
@@ -14,19 +14,45 @@ export class CustomModal extends Modal {
createPropertyLine(containerEl: HTMLElement): void { createPropertyLine(containerEl: HTMLElement): void {
const propertyIndex = this.properties.length; const propertyIndex = this.properties.length;
this.properties.push({customValue: "", customType: ""}); // Initialize with empty values this.properties.push({customName: "", customType: ""}); // Initialize with empty values
const propertyLine = new Setting(containerEl) const propertyLine = new Setting(containerEl)
if (propertyIndex === 0) {
propertyLine propertyLine
.setName("Property " + (propertyIndex + 1)) .setName("Title")
.setDesc("The title of the page, must be the first property")
propertyLine.addText((text) => { propertyLine.addText((text) => {
text text
.setPlaceholder("Property name") .setPlaceholder("Property name")
.setValue("") .setValue("")
.onChange(async (value) => { .onChange(async (value) => {
this.properties[propertyIndex].customValue = value; // Update the customValue of the specific property this.properties[propertyIndex].customName = value; // Update the customValue of the specific property
});
}
)
propertyLine.addDropdown((dropdown) => {
dropdown
.addOption("title", "Title")
.setValue("")
.onChange(async (value) => {
this.properties[propertyIndex].customType = value; // Update the customType of the specific property
});
}
)
} else {
propertyLine
.setName("Property " + (propertyIndex))
propertyLine.addText((text) => {
text
.setPlaceholder("Property name")
.setValue("")
.onChange(async (value) => {
this.properties[propertyIndex].customName = value; // Update the customValue of the specific property
}); });
} }
) )
@@ -70,7 +96,7 @@ export class CustomModal extends Modal {
}); });
} }
); );
}
this.propertyLines.push(propertyLine); this.propertyLines.push(propertyLine);
} }

View File

@@ -235,9 +235,6 @@ export class EditModal extends SettingModal {
// add database id // add database id
this.createSettingEl(nextTabs, i18nConfig.DatabaseID, i18nConfig.NotionAPIDesc, 'password', i18nConfig.DatabaseIDText, this.dataTemp.databaseIDTemp, 'dataTemp', 'databaseIDTemp') this.createSettingEl(nextTabs, i18nConfig.DatabaseID, i18nConfig.NotionAPIDesc, 'password', i18nConfig.DatabaseIDText, this.dataTemp.databaseIDTemp, 'dataTemp', 'databaseIDTemp')
// add custom title name
this.createSettingEl(nextTabs, i18nConfig.NotionCustomTitleName, i18nConfig.NotionCustomTitleNameDesc, 'text', i18nConfig.NotionCustomTitleText, this.dataTemp.customTitleNameTemp, 'dataTemp', 'customTitleNameTemp')
// add new property button // add new property button
new Setting(nextTabs) new Setting(nextTabs)
.setName(i18nConfig.NotionCustomValues) .setName(i18nConfig.NotionCustomValues)

View File

@@ -214,9 +214,6 @@ export class SettingModal extends Modal {
// add database id // add database id
this.createSettingEl(nextTabs, i18nConfig.DatabaseID, i18nConfig.NotionAPIDesc, 'password', i18nConfig.DatabaseIDText, this.data.databaseID, 'data', 'databaseID') this.createSettingEl(nextTabs, i18nConfig.DatabaseID, i18nConfig.NotionAPIDesc, 'password', i18nConfig.DatabaseIDText, this.data.databaseID, 'data', 'databaseID')
// add custom title name
this.createSettingEl(nextTabs, i18nConfig.NotionCustomTitleName, i18nConfig.NotionCustomTitleNameDesc, 'text', i18nConfig.NotionCustomTitleText, this.data.customTitleName, 'data', 'customTitleName')
// add new property button // add new property button
new Setting(nextTabs) new Setting(nextTabs)
.setName(i18nConfig.NotionCustomValues) .setName(i18nConfig.NotionCustomValues)
@@ -251,9 +248,9 @@ export class SettingModal extends Modal {
renderCustomPreview(properties: any[], nextTabs: HTMLElement) { renderCustomPreview(properties: any[], nextTabs: HTMLElement) {
const previewContainer = nextTabs.createDiv('preview-container'); const previewContainer = nextTabs.createDiv('preview-container');
properties.forEach((property: { customValue: any; customType: any; }) => { properties.forEach((property: { customName: any; customType: any; }) => {
const propertyEl = previewContainer.createEl('div', {cls: 'property-preview'}); const propertyEl = previewContainer.createEl('div', {cls: 'property-preview'});
propertyEl.createEl('span', {text: `Property: ${property.customValue}, Type: ${property.customType}`}); propertyEl.createEl('span', {text: `Property: ${property.customName}, Type: ${property.customType}`});
}); });
} }

View File

@@ -37,7 +37,7 @@ export interface DatabaseDetails {
tagButton: boolean; tagButton: boolean;
customTitleButton: boolean; customTitleButton: boolean;
customTitleName: string; customTitleName: string;
customProperties:{ customValue: string, customType: string }[]; customProperties:{ customName: string, customType: string }[];
// customValues: string; // customValues: string;
saved: boolean; saved: boolean;
} }

View File

@@ -32,7 +32,21 @@ export async function uploadCommandNext(
return; return;
} }
const { markDownData, nowFile, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime } = await getNowFileMarkdownContentNext(app, settings) const {
markDownData,
nowFile,
emoji,
cover,
tags,
type,
slug,
stats,
category,
summary,
paword,
favicon,
datetime
} = await getNowFileMarkdownContentNext(app, settings)
if (markDownData) { if (markDownData) {
const {basename} = nowFile; const {basename} = nowFile;
@@ -49,7 +63,6 @@ export async function uploadCommandNext(
} }
export async function uploadCommandGeneral( export async function uploadCommandGeneral(
plugin: ObsidianSyncNotionPlugin, plugin: ObsidianSyncNotionPlugin,
settings: PluginSettings, settings: PluginSettings,
@@ -106,7 +119,7 @@ export async function uploadCommandCustom(
const { basename} = nowFile; const { basename} = nowFile;
const upload = new Upload2NotionCustom(plugin, dbDetails); const upload = new Upload2NotionCustom(plugin, dbDetails);
const res = await upload.syncMarkdownToNotionCustom(basename, cover, customValues, markDownData, nowFile, this.app); const res = await upload.syncMarkdownToNotionCustom(cover, customValues, markDownData, nowFile, this.app);
if (res.status === 200) { if (res.status === 200) {
new Notice(`${i18nConfig["sync-success"]}${basename}`); new Notice(`${i18nConfig["sync-success"]}${basename}`);

View File

@@ -11,6 +11,7 @@ export class UploadBaseGeneral {
notion: Client; notion: Client;
agent: any; agent: any;
dbDetails: DatabaseDetails dbDetails: DatabaseDetails
constructor(plugin: MyPlugin, dbDetails: DatabaseDetails) { constructor(plugin: MyPlugin, dbDetails: DatabaseDetails) {
this.plugin = plugin; this.plugin = plugin;
this.dbDetails = dbDetails this.dbDetails = dbDetails

View File

@@ -1,5 +1,4 @@
import {App, Notice, requestUrl, TFile} from "obsidian"; import {App, Notice, requestUrl, TFile} from "obsidian";
import { Client } from "@notionhq/client";
import {markdownToBlocks} from "@tryfabric/martian"; import {markdownToBlocks} from "@tryfabric/martian";
import * as yamlFrontMatter from "yaml-front-matter"; import * as yamlFrontMatter from "yaml-front-matter";
// import * as yaml from "yaml" // import * as yaml from "yaml"
@@ -21,7 +20,6 @@ export class Upload2NotionCustom extends UploadBaseCustom {
// 暂时就直接删除新建一个page // 暂时就直接删除新建一个page
async updatePage( async updatePage(
notionID: string, notionID: string,
title: string,
cover: string, cover: string,
customValues: Record<string, string>, customValues: Record<string, string>,
childArr: any, childArr: any,
@@ -38,11 +36,10 @@ export class Upload2NotionCustom extends UploadBaseCustom {
cover = databaseCover; cover = databaseCover;
} }
return await this.createPage(title, cover, customValues, childArr); return await this.createPage(cover, customValues, childArr);
} }
async createPage( async createPage(
title: string,
cover: string, cover: string,
customValues: Record<string, string>, customValues: Record<string, string>,
childArr: any, childArr: any,
@@ -50,42 +47,11 @@ export class Upload2NotionCustom extends UploadBaseCustom {
const { const {
databaseID, databaseID,
customTitleButton, customProperties,
customTitleName,
notionAPI notionAPI
} = this.dbDetails; } = this.dbDetails;
const bodyString: any = { const bodyString: any = this.buildBodyString(customProperties, customValues, childArr);
parent: {
database_id: databaseID,
},
properties: {
[customTitleButton
? customTitleName
: "title"]: {
title: [
{
text: {
content: title,
},
},
],
},
...(Object.keys(customValues).reduce((acc, key) => {
acc[key] = {
rich_text: [
{
text: {
content: customValues[key] || '',
},
},
],
};
return acc;
}, {} as Record<string, { rich_text: { text: { content: string } }[] } >)),
},
children: childArr,
};
if (cover) { if (cover) {
bodyString.cover = { bodyString.cover = {
@@ -124,7 +90,6 @@ export class Upload2NotionCustom extends UploadBaseCustom {
} }
async syncMarkdownToNotionCustom( async syncMarkdownToNotionCustom(
title: string,
cover: string, cover: string,
customValues: Record<string, string>, customValues: Record<string, string>,
markdown: string, markdown: string,
@@ -147,13 +112,12 @@ export class Upload2NotionCustom extends UploadBaseCustom {
if (notionID) { if (notionID) {
res = await this.updatePage( res = await this.updatePage(
notionID, notionID,
title,
cover, cover,
customValues, customValues,
file2Block, file2Block,
); );
} else { } else {
res = await this.createPage(title, cover, customValues, file2Block); res = await this.createPage(cover, customValues, file2Block);
} }
if (res.status === 200) { if (res.status === 200) {
await updateYamlInfo(markdown, nowFile, res, app, this.plugin, this.dbDetails); await updateYamlInfo(markdown, nowFile, res, app, this.plugin, this.dbDetails);
@@ -162,4 +126,72 @@ export class Upload2NotionCustom extends UploadBaseCustom {
} }
return res; return res;
} }
private buildPropertyObject(customName: string, customType: string, customValues: Record<string, any>) {
const value = customValues[customName] || '';
switch (customType) {
case "title":
return {
title: [
{
text: {
content: value,
},
},
],
};
case "rich_text":
return {
rich_text: [
{
text: {
content: value || '',
},
},
],
};
case "date":
return {
date: {
start: value || new Date().toISOString(),
},
};
case "select":
return {
select: {
name: value,
},
};
case "multi_select":
return {
multi_select: Array.isArray(value) ? value.map(item => ({name: item})) : [{name: value}],
};
}
}
private buildBodyString(
customProperties: { customName: string; customType: string }[],
customValues: Record<string, string>,
childArr: any,
) {
const properties: { [key: string]: any } = {};
customProperties.forEach(({customName, customType}) => {
properties[customName] = this.buildPropertyObject(customName, customType, customValues);
}
);
return {
parent: {
database_id: this.dbDetails.databaseID,
},
properties,
children: childArr,
};
}
} }

View File

@@ -1,4 +1,4 @@
import {App, Notice} from "obsidian"; import {App, Notice, TAbstractFile, TFile} from "obsidian";
import {i18nConfig} from "../../lang/I18n"; import {i18nConfig} from "../../lang/I18n";
import {DatabaseDetails, PluginSettings} from "../../ui/settingTabs"; import {DatabaseDetails, PluginSettings} from "../../ui/settingTabs";
@@ -8,22 +8,29 @@ export async function getNowFileMarkdownContentCustom(
settings: PluginSettings, settings: PluginSettings,
) { ) {
const nowFile = app.workspace.getActiveFile(); const nowFile = app.workspace.getActiveFile();
if (!nowFile) {
new Notice(i18nConfig["open-file"]);
return;
}
let cover = ''; let cover = '';
let customValues: Record<string, any> = {}; // Change 'any' to a more specific type if possible let customValues: Record<string, any> = {};
const FileCache = app.metadataCache.getFileCache(nowFile); const FileCache = app.metadataCache.getFileCache(nowFile);
try { try {
cover = FileCache.frontmatter.coverurl; cover = FileCache.frontmatter.coverurl;
// Get custom property names from dbDetails // Get custom property names from dbDetails
const customPropertyNames = dbDetails.customProperties.map(property => property.customValue); const customPropertyValues = dbDetails.customProperties.map(property => property.customName);
// Extract custom values from the frontmatter based on the names // Extract custom values from the frontmatter based on the names
customPropertyNames.forEach(propertyName => { customPropertyValues.forEach( propertyName => {
if (FileCache.frontmatter[propertyName] !== undefined) { if (FileCache.frontmatter[propertyName] !== undefined) {
customValues[propertyName] = FileCache.frontmatter[propertyName]; customValues[propertyName] = FileCache.frontmatter[propertyName];
} }
}); });
customValues['title'] = nowFile.basename; // Use 'basename' for the file name without extension
} catch (error) { } catch (error) {
new Notice(i18nConfig["set-tags-fail"]); new Notice(i18nConfig["set-tags-fail"]);
} }