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

View File

@@ -4,7 +4,7 @@ import {ObsidianSettingTab} from "./settingTabs";
export class CustomModal extends Modal {
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;
settingTab: ObsidianSettingTab;
@@ -14,19 +14,45 @@ export class CustomModal extends Modal {
createPropertyLine(containerEl: HTMLElement): void {
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)
if (propertyIndex === 0) {
propertyLine
.setName("Property " + (propertyIndex + 1))
.setName("Title")
.setDesc("The title of the page, must be the first property")
propertyLine.addText((text) => {
text
.setPlaceholder("Property name")
.setValue("")
.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);
}

View File

@@ -235,9 +235,6 @@ export class EditModal extends SettingModal {
// add database id
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
new Setting(nextTabs)
.setName(i18nConfig.NotionCustomValues)

View File

@@ -214,9 +214,6 @@ export class SettingModal extends Modal {
// add database id
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
new Setting(nextTabs)
.setName(i18nConfig.NotionCustomValues)
@@ -251,9 +248,9 @@ export class SettingModal extends Modal {
renderCustomPreview(properties: any[], nextTabs: HTMLElement) {
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'});
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;
customTitleButton: boolean;
customTitleName: string;
customProperties:{ customValue: string, customType: string }[];
customProperties:{ customName: string, customType: string }[];
// customValues: string;
saved: boolean;
}

View File

@@ -1,12 +1,12 @@
import { i18nConfig } from "../lang/I18n";
import { App, Notice } from "obsidian";
import { Upload2NotionNext } from "./upload_next/Upload2NotionNext";
import { Upload2NotionGeneral } from "./upload_general/Upload2NotionGeneral";
import { Upload2NotionCustom } from "./upoload_custom/Upload2NotionCustom";
import {i18nConfig} from "../lang/I18n";
import {App, Notice} from "obsidian";
import {Upload2NotionNext} from "./upload_next/Upload2NotionNext";
import {Upload2NotionGeneral} from "./upload_general/Upload2NotionGeneral";
import {Upload2NotionCustom} from "./upoload_custom/Upload2NotionCustom";
import {DatabaseDetails, PluginSettings} from "../ui/settingTabs";
import ObsidianSyncNotionPlugin from "../main";
import { getNowFileMarkdownContentNext } from "./upload_next/getMarkdownNext";
import { getNowFileMarkdownContentGeneral } from "./upload_general/getMarkdownGeneral";
import {getNowFileMarkdownContentNext} from "./upload_next/getMarkdownNext";
import {getNowFileMarkdownContentGeneral} from "./upload_general/getMarkdownGeneral";
import {getNowFileMarkdownContentCustom} from "./upoload_custom/getMarkdownCustom";
export async function uploadCommandNext(
@@ -16,7 +16,7 @@ export async function uploadCommandNext(
app: App,
) {
const { notionAPI, databaseID } = dbDetails;
const {notionAPI, databaseID} = dbDetails;
// Check if NNon exists
// if (NNon === undefined) {
@@ -32,10 +32,24 @@ export async function uploadCommandNext(
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) {
const { basename } = nowFile;
const {basename} = nowFile;
const upload = new Upload2NotionNext(plugin, dbDetails);
const res = await upload.syncMarkdownToNotionNext(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app);
@@ -49,7 +63,6 @@ export async function uploadCommandNext(
}
export async function uploadCommandGeneral(
plugin: ObsidianSyncNotionPlugin,
settings: PluginSettings,
@@ -57,7 +70,7 @@ export async function uploadCommandGeneral(
app: App,
) {
const { notionAPI, databaseID } = dbDetails;
const {notionAPI, databaseID} = dbDetails;
// Check if the user has set up the Notion API and database ID
if (notionAPI === "" || databaseID === "") {
@@ -66,10 +79,10 @@ export async function uploadCommandGeneral(
return;
}
const { markDownData, nowFile, cover, tags } = await getNowFileMarkdownContentGeneral(app, settings)
const {markDownData, nowFile, cover, tags} = await getNowFileMarkdownContentGeneral(app, settings)
if (markDownData) {
const { basename } = nowFile;
const {basename} = nowFile;
const upload = new Upload2NotionGeneral(plugin, dbDetails);
const res = await upload.syncMarkdownToNotionGeneral(basename, cover, tags, markDownData, nowFile, this.app);
@@ -91,7 +104,7 @@ export async function uploadCommandCustom(
app: App,
) {
const { notionAPI, databaseID } = settings;
const {notionAPI, databaseID} = settings;
// Check if the user has set up the Notion API and database ID
if (notionAPI === "" || databaseID === "") {
@@ -100,13 +113,13 @@ export async function uploadCommandCustom(
return;
}
const { markDownData, nowFile, cover, customValues} = await getNowFileMarkdownContentCustom(app, dbDetails, settings)
const {markDownData, nowFile, cover, customValues} = await getNowFileMarkdownContentCustom(app, dbDetails, settings)
if (markDownData) {
const { basename } = nowFile;
const { basename} = nowFile;
const upload = new Upload2NotionCustom(plugin,dbDetails);
const res = await upload.syncMarkdownToNotionCustom(basename, cover, customValues, markDownData, nowFile, this.app);
const upload = new Upload2NotionCustom(plugin, dbDetails);
const res = await upload.syncMarkdownToNotionCustom(cover, customValues, markDownData, nowFile, this.app);
if (res.status === 200) {
new Notice(`${i18nConfig["sync-success"]}${basename}`);

View File

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

View File

@@ -1,11 +1,10 @@
import { App, Notice, requestUrl, TFile } from "obsidian";
import { Client } from "@notionhq/client";
import { markdownToBlocks } from "@tryfabric/martian";
import {App, Notice, requestUrl, TFile} from "obsidian";
import {markdownToBlocks} from "@tryfabric/martian";
import * as yamlFrontMatter from "yaml-front-matter";
// import * as yaml from "yaml"
import MyPlugin from "src/main";
import {DatabaseDetails, PluginSettings} from "../../ui/settingTabs";
import { updateYamlInfo } from "../updateYaml";
import {updateYamlInfo} from "../updateYaml";
import {UploadBaseCustom} from "./BaseUpload2NotionCustom";
export class Upload2NotionCustom extends UploadBaseCustom {
@@ -21,14 +20,13 @@ export class Upload2NotionCustom extends UploadBaseCustom {
// 暂时就直接删除新建一个page
async updatePage(
notionID: string,
title: string,
cover: string,
customValues: Record<string, string>,
childArr: any,
) {
await this.deletePage(notionID);
const { databaseID } = this.dbDetails;
const {databaseID} = this.dbDetails;
const databaseCover = await this.getDataBase(
databaseID
@@ -38,11 +36,10 @@ export class Upload2NotionCustom extends UploadBaseCustom {
cover = databaseCover;
}
return await this.createPage(title, cover, customValues, childArr);
return await this.createPage(cover, customValues, childArr);
}
async createPage(
title: string,
cover: string,
customValues: Record<string, string>,
childArr: any,
@@ -50,42 +47,11 @@ export class Upload2NotionCustom extends UploadBaseCustom {
const {
databaseID,
customTitleButton,
customTitleName,
customProperties,
notionAPI
} = this.dbDetails;
const bodyString: any = {
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,
};
const bodyString: any = this.buildBodyString(customProperties, customValues, childArr);
if (cover) {
bodyString.cover = {
@@ -124,7 +90,6 @@ export class Upload2NotionCustom extends UploadBaseCustom {
}
async syncMarkdownToNotionCustom(
title: string,
cover: string,
customValues: Record<string, string>,
markdown: string,
@@ -147,13 +112,12 @@ export class Upload2NotionCustom extends UploadBaseCustom {
if (notionID) {
res = await this.updatePage(
notionID,
title,
cover,
customValues,
file2Block,
);
} else {
res = await this.createPage(title, cover, customValues, file2Block);
res = await this.createPage(cover, customValues, file2Block);
}
if (res.status === 200) {
await updateYamlInfo(markdown, nowFile, res, app, this.plugin, this.dbDetails);
@@ -162,4 +126,72 @@ export class Upload2NotionCustom extends UploadBaseCustom {
}
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 {DatabaseDetails, PluginSettings} from "../../ui/settingTabs";
@@ -8,22 +8,29 @@ export async function getNowFileMarkdownContentCustom(
settings: PluginSettings,
) {
const nowFile = app.workspace.getActiveFile();
if (!nowFile) {
new Notice(i18nConfig["open-file"]);
return;
}
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);
try {
cover = FileCache.frontmatter.coverurl;
// 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
customPropertyNames.forEach(propertyName => {
customPropertyValues.forEach( propertyName => {
if (FileCache.frontmatter[propertyName] !== undefined) {
customValues[propertyName] = FileCache.frontmatter[propertyName];
}
});
customValues['title'] = nowFile.basename; // Use 'basename' for the file name without extension
} catch (error) {
new Notice(i18nConfig["set-tags-fail"]);
}