From 027c64290e86df303386e0e63d09fce5c76dafa7 Mon Sep 17 00:00:00 2001 From: liufree Date: Thu, 24 Apr 2025 21:49:19 +0800 Subject: [PATCH 1/3] fix: fix filename display --- manifest.json | 2 +- package.json | 1 - src/pages/GenerateColumns.tsx | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index f153ddb..6f44ae7 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "querydash", "name": "QueryDash", - "version": "1.0.2", + "version": "1.0.3", "minAppVersion": "1.8.0", "description": "Refer to Dataview and add search, sorting, and pagination functions, just like Notion.", "author": "lwx", diff --git a/package.json b/package.json index 94f1c88..78aad68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,5 @@ { "name": "obsidian-querydash", - "version": "1.0.2", "description": "Refer to Dataview and add search, sorting, and pagination functions, just like Notion.", "main": "main.js", "scripts": { diff --git a/src/pages/GenerateColumns.tsx b/src/pages/GenerateColumns.tsx index 1fdeac6..46d1db6 100644 --- a/src/pages/GenerateColumns.tsx +++ b/src/pages/GenerateColumns.tsx @@ -21,7 +21,7 @@ export function formatValue( function formatObject(value: any) { const type =value.type; if(type==='file') { - const fileName = value.path.replace(/\.md$/, ''); + const fileName = value.path.split('/').pop().replace(/\.md$/, '') return {type: "link", path: value.path, display: fileName}; } From 5bea138f64cfd130645c9f441a19f80092b2bd2e Mon Sep 17 00:00:00 2001 From: liufree Date: Thu, 24 Apr 2025 23:14:53 +0800 Subject: [PATCH 2/3] feat: add timeline view --- README-zh.md | 19 ++++ README.md | 20 ++++ docs/timeline.png | Bin 0 -> 31373 bytes src/pages/QueryDashView.tsx | 10 +- src/pages/timelineview/TimeLineView.tsx | 122 ++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 docs/timeline.png create mode 100644 src/pages/timelineview/TimeLineView.tsx diff --git a/README-zh.md b/README-zh.md index 4f4092a..c39a29d 100644 --- a/README-zh.md +++ b/README-zh.md @@ -8,6 +8,7 @@ QueryDash的目标是开发一款类似Notion Database的Obsidian插件,但不 **现有功能** 1. **多视图支持**:提供表格和列表两种视图,满足不同场景需求。 + - **时间轴视图**: 使用时间轴来展示数据 2. **Dataview SQL支持**:兼容Dataview的SQL语法。 3. **增强功能**: - **搜索**:快速定位所需内容。 @@ -27,6 +28,24 @@ file.mtime as "mtime" ,file.tags as "tags" from #clippings ![demo.gif](docs/demo.gif) +**timeline** + +**simple mode** +~~~markdown +```querydash +timeline from #start +``` +~~~ +![timeline.png](docs/timeline.png) +**full mode** + +If you want to append the time later, alias a specific field as "time". +~~~markdown +```querydash +timeline file.ctime as "time" from #start where file.ctime<=date(today) sort file.mtime desc +``` +~~~ + **远景规划** 1. **首页**:将常用功能整合到首页,提供一站式便捷操作。 diff --git a/README.md b/README.md index 50255e0..515797a 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ In the future, it will gradually expand with more practical features to help use **Current Features** 1. **Multi-view Support**: Provides table and list views to meet different scenario needs. + - **timeline**: use timeline view to display data. 2. **Dataview SQL Support**: Compatible with Dataview's SQL syntax . 3. **Enhanced Features**: - **Search**: Quickly locate the content you need. @@ -18,6 +19,7 @@ In the future, it will gradually expand with more practical features to help use **Tutorial** +**table** ~~~markdown ```querydash table file.name , file.outlinks as "links" ,file.ctime as "ctime", @@ -27,6 +29,24 @@ file.mtime as "mtime" ,file.tags as "tags" from #clippings ![demo.gif](docs/demo.gif) +**timeline** + +**simple mode** +~~~markdown +```querydash +timeline from #start +``` +~~~ +![timeline.png](docs/timeline.png) +**full mode** + +If you want to append the time later, alias a specific field as "time". +~~~markdown +```querydash +timeline file.ctime as "time" from #start where file.ctime<=date(today) sort file.mtime desc +``` +~~~ + **Future Vision** 1. **Homepage**: Integrate frequently used functions into the homepage for one-stop convenience. 2. **Multi-view Support**: Supports timeline, gallery, table, and other views to meet diverse scenario needs. diff --git a/docs/timeline.png b/docs/timeline.png new file mode 100644 index 0000000000000000000000000000000000000000..d97b7e01efaf1194b228a305932ba094b94fbbf5 GIT binary patch literal 31373 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�hW@Qv9ZxDK(K5|?AAnSDr>~b>;t!{663{~@ z(>5at;L}&IP=F^tHq7+oS-F1HA?W<86rW}}+~>(h7Q2dmMO}70*I`1z17J3={PS^u z;~~sE#=(F&B;ym3YM4}r*LCS7&1eD8#bY*tB`Ui=KPe<;l?j! z%FMeOTT!oG=Vhm=^RyTA8P22OE@(LC3UVc702o(s!F(5M)BRdm-&OA#!V>QR!P>a{PXDpir1c zErr;+REUL}rOE3t))TI3j^0v*ZyCNRi)nNl)NJ1V({s5PhIsK*XEc^0ML`T%+_JM@tLFn!0(a+C_se`oaI|gl> zqzJ1NvYFU5p?*rYx5H^aR;_WJ`j!*JE^tDlHX^h=5Oo-U7nz4T%M1YP^hp}!M^ttjy_iEQQa+{S>kzNXk&dc zlGSLf1h8#2t4=fe{WQKD*A0}6)SlPJFb^@bV1t*A0kkHq37?JDy4~wl#JIuZi4td& znWp!yq<2(Ijz~ZjpI}~CWLLH;WO)8H+9GEn;OsRb%oxEdUzwc&@=2@9@!K&F*QB`qS-DB+=1p(~i4Lo70RVu^^GZf` zBK^SVZY}}T3;@U~$Yas2(`FU$=7Bg?@VqeVP8FQ#b#G1sS#mbl?5ephxnZFeJeifI z$v&JQRq_|JHj)TV_doT{$5c9HNP9h)dlE00^%_Kx(41Y-a_1e66+*XiwJ#2R#?KNg zxDAJlFn?G}l7y4Ru;i^Im~vD)4Fp%_DsedbK&WuDhV!t*7K&s6^nX7OC^R=E_14-> z`*fH}n>j@>(fQgI+}ag8!P}KTZoL*quRvF{bH3lxaY*|PM_1J7Y_b5y8>$RD?bX*~ z(p6G*3>`b(j#_ilsGav;lbkL%Xq8V*j_v>XxQ9V7I@GeLziiac2RK}qwfWS-$pM`d{ObI>^Gc$#v4;7~hkY8PJd1p1g?4D$X* zP|I~{ = ({app, source}) => { const [sourceType, setSourceType] = React.useState("table"); useEffect(() => { - const sourceType = source.toLowerCase().startsWith("list") ? "list" : "table"; + // 获取第一个单词 + const sourceType = source.split(" ")[0].toLowerCase(); setSourceType(sourceType); }, []); const getView = (app: App, source: string) => { if (sourceType === "table") { return ; - } else { + } else if (sourceType === "list") { return ; + } else if (sourceType === "timeline") { + return ; } } diff --git a/src/pages/timelineview/TimeLineView.tsx b/src/pages/timelineview/TimeLineView.tsx new file mode 100644 index 0000000..f825de2 --- /dev/null +++ b/src/pages/timelineview/TimeLineView.tsx @@ -0,0 +1,122 @@ +import {ProList} from '@ant-design/pro-components'; +import React, {useEffect, useState} from "react"; +import {formatValue} from "../GenerateColumns"; +import {getAPI} from 'obsidian-dataview'; +import {ViewProps} from "../../models/ViewProps"; +import {Radio, RadioChangeEvent, Timeline} from "antd"; +import {TFile} from "obsidian"; + + +const TimeLineView: React.FC = ({app, source}) => { + + const [data, setData] = React.useState([]); + + const dv = getAPI(app); + const [mode, setMode] = useState<'left' | 'alternate' | 'right'>('alternate'); + + const onChange = (e: RadioChangeEvent) => { + setMode(e.target.value); + }; + + + const renderItem = (itemFile: any, itemCtime: any) => { + const date = itemCtime?.display.split(" ")[0] || ""; + + return ( + + { + const file = app.vault.getAbstractFileByPath(itemFile.path); + if (file && file instanceof TFile) { + const leaf = app.workspace.getLeaf(); + leaf.openFile(file); + } + }}> + {itemFile.display} + + {date ? " " + date : ""} + + ) + } + + useEffect(() => { + + let resData: any[] = []; + + const response = executeTableQuery(dv, source, {}); + + response.then((res) => { + const {tableData} = res; + tableData.forEach((item: any) => { + const file = item["File"]; + const ctime = item["time"]; + const finalDisplay = renderItem(file, ctime); + resData.push({"children": finalDisplay}); + }); + setData(resData); + }).catch((error) => { + console.error("Error executing query:", error); + }); + // console.log(response, response); + + }, [app, source]); + + function parseTableResult(value: any, params: any): Array> { + const headers: string[] = value.headers; + const rows: Array> = []; + value.values.forEach((row: any) => { + const values: Record = {}; + headers.forEach((header, index) => { + const value = row[index]; + // console.log("list value", value); + const resValue = formatValue(value); + // console.log("list resValue", resValue); + values[header] = resValue; + }); + rows.push(values); + }); // console.log("list rows", rows); + + return rows; + } + + function replaceFirstWord(source: string): string { + const words = source.split(' '); + if (words[0] === 'timeline') { + words[0] = 'table'; + } + return words.join(' '); + } + + const executeTableQuery = async (dvApi: any, source: any, params: any) => { + const sql = replaceFirstWord(source); + const queryResult = await dvApi.query(sql); + + console.log("queryResult", queryResult); + const tableData: any = parseTableResult(queryResult.value, params); + return {tableData: tableData}; + + } + + + return ( + <> +

Timeline

+
+ + Left + Right + Alternate + + + ) +} + +export default TimeLineView; From e8b7ad692d8a9c1d3f62cdc018659819fac5d47e Mon Sep 17 00:00:00 2001 From: liufree Date: Thu, 24 Apr 2025 23:19:30 +0800 Subject: [PATCH 3/3] feat: add timeline view --- README-zh.md | 2 ++ README.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README-zh.md b/README-zh.md index c39a29d..57b9113 100644 --- a/README-zh.md +++ b/README-zh.md @@ -6,6 +6,8 @@ QueryDash的目标是开发一款类似Notion Database的Obsidian插件,但不 **由于使用了dataview的api,必须启用dataview插件。** 未来将逐步扩展更多实用特性,帮助用户更高效地管理知识、任务和生活。 +**如果你对项目感兴趣,请star一下,非常感谢,这对我很重要** + **现有功能** 1. **多视图支持**:提供表格和列表两种视图,满足不同场景需求。 - **时间轴视图**: 使用时间轴来展示数据 diff --git a/README.md b/README.md index 515797a..1c8e6af 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ The goal of QueryDash is to develop an Obsidian plugin similar to Notion Databas **Since the API of Dataview is used, the Dataview plugin must be enabled.** In the future, it will gradually expand with more practical features to help users manage knowledge, tasks, and life more efficiently. +**If you are interested in this project, please consider starring it. Thank you very much, it means a lot to me.** + **language** - [English](README.md) - [简体中文](README-zh.md)