From 38a7285666168cdb7171c8b3f8d73a2e5708c5e0 Mon Sep 17 00:00:00 2001 From: Kacper Kula Date: Sun, 3 Nov 2024 22:23:13 +0000 Subject: [PATCH] chore: fixing updates and adding checkboxes --- CHANGELOG.md | 4 +++ docs/links-and-images.md | 8 +++++- manifest.json | 2 +- package.json | 2 +- src/database.ts | 62 ++++++++++++++++++++++++---------------- src/ui.ts | 18 ++++++++++-- versions.json | 3 +- 7 files changed, 68 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb8008e..ce3126c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.9.2 +Adding checkbox method to display boolean values as checkboxes +Fixing how updates are parsed + # 0.9.1 Turning off verbose mode # 0.9.0 diff --git a/docs/links-and-images.md b/docs/links-and-images.md index 51f46f8..bfed5ee 100644 --- a/docs/links-and-images.md +++ b/docs/links-and-images.md @@ -50,4 +50,10 @@ WHERE authors LIKE concat('%', @author, '%') LIMIT 10 ``` -![Advanced links and images](links-and-images-advanced.png) \ No newline at end of file +![Advanced links and images](links-and-images-advanced.png) + +## Checkboxes +You can display boolean data as checkbox in the interface by calling `checkbox` function: +```sql +SELECT date, checkbox(excercised) FROM files WHERE date is not null +``` \ No newline at end of file diff --git a/manifest.json b/manifest.json index 96eec84..c5d36c9 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "sqlseal", "name": "SQLSeal", - "version": "0.9.1", + "version": "0.9.2", "minAppVersion": "0.15.0", "description": "Use SQL in your notes to query your vault files and CSV content.", "author": "hypersphere", diff --git a/package.json b/package.json index 7c298db..7fccda8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sqlseal", - "version": "0.9.1", + "version": "0.9.2", "description": "A plugin for Obsidian that allows you to run SQL queries on your notes.", "main": "main.js", "scripts": { diff --git a/src/database.ts b/src/database.ts index dd1e213..99cc2c5 100644 --- a/src/database.ts +++ b/src/database.ts @@ -14,6 +14,33 @@ export interface FieldDefinition { type: FieldTypes } +const formatData = (data: Record) => { + return Object.keys(data).reduce((ret, key) => { + if (typeof data[key] === 'boolean') { + return { + ...ret, + [key]: data[key] ? 1 : 0 + } + } + if (!data[key]) { + return { + ...ret, + [key]: null + } + } + if (typeof data[key] === 'object' || Array.isArray(data[key])) { + return { + ...ret, + [key]: JSON.stringify(data[key]) + } + } + return { + ...ret, + [key]: data[key] + } + }, {}) +} + export class SqlSealDatabase { private savedDatabases: Record = {} db: Database.Database @@ -112,6 +139,14 @@ export class SqlSealDatabase { return `SQLSEALCUSTOM(${JSON.stringify(imgObject)})` }) + this.db.function('checkbox', (val: string) => { + const imgObject = { + type: 'checkbox', + value: val + } + return `SQLSEALCUSTOM(${JSON.stringify(imgObject)})` + }) + } async disconect() { @@ -151,7 +186,7 @@ export class SqlSealDatabase { const updateMany = this.db.transaction((pData: Array>) => { pData.forEach(data => { try { - update.run(data) + update.run(formatData(data)) } catch (e) { console.error(e) } @@ -183,30 +218,7 @@ export class SqlSealDatabase { pData.forEach(data => { const columns = Object.keys(data) const insert = this.db.prepare(`INSERT INTO ${name} (${columns.join(', ')}) VALUES (${columns.map((key: string) => '@' + key).join(', ')})`); - const d = Object.keys(data).reduce((ret, key) => { - if (typeof data[key] === 'boolean') { - return { - ...ret, - [key]: data[key] ? 1 : 0 - } - } - if (!data[key]) { - return { - ...ret, - [key]: null - } - } - if (typeof data[key] === 'object' || Array.isArray(data[key])) { - return { - ...ret, - [key]: JSON.stringify(data[key]) - } - } - return { - ...ret, - [key]: data[key] - } - }, {}) + const d = formatData(data) insert.run(d) }) }) diff --git a/src/ui.ts b/src/ui.ts index 224d1ee..1bd1927 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -32,7 +32,11 @@ export const displayData = (el: HTMLElement, columns: string[], data: Array ({ field: c, - cellRenderer: ({ value }: { value: string }) => parseCell(value, app), + cellRendererSelector: (data) => { + return { + component: ({ value }: { value: string }) => parseCell(value, app) + } + }, autoHeight: true })), domLayout: 'autoHeight' @@ -86,7 +90,12 @@ type SQLSealImgElement = { href: string } -type SqlSealCustomElement = SqlSealAnchorElement | SQLSealImgElement; +type SQLSealCheckboxElement = { + type: 'checkbox', + value: number +} + +type SqlSealCustomElement = SqlSealAnchorElement | SQLSealImgElement | SQLSealCheckboxElement; const isLinkLocal = (link: string) => !link?.trim().startsWith('http') @@ -143,6 +152,11 @@ const renderSqlSealCustomElement = (customConfig: SqlSealCustomElement, app: App return 'File does not exist' } return createEl('img', { attr: { src: app.vault.getResourcePath(file) } }); + case 'checkbox': + const el = createEl('input', { type: 'checkbox' }) + el.checked = !!customConfig.value + el.disabled = true + return el default: return 'Invalid Custom Element' } diff --git a/versions.json b/versions.json index 1bdf860..45b6902 100644 --- a/versions.json +++ b/versions.json @@ -9,5 +9,6 @@ "0.7.0": "0.15.0", "0.8.0": "0.15.0", "0.9.0": "0.15.0", - "0.9.1": "0.15.0" + "0.9.1": "0.15.0", + "0.9.2": "0.15.0" } \ No newline at end of file