diff --git a/package-lock.json b/package-lock.json index 06489c9a..d3a08bf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "dexie": "^4.0.1-beta.14", "flowbite-svelte": "^0.48.00", "html5-qrcode": "^2.3.8", + "marked": "^15.0.7", "shadcn-svelte": "^0.14.0" }, "devDependencies": { @@ -4703,6 +4704,18 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/marked": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.7.tgz", + "integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", diff --git a/package.json b/package.json index 14b08aa5..9d069471 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "dexie": "^4.0.1-beta.14", "flowbite-svelte": "^0.48.00", "html5-qrcode": "^2.3.8", + "marked": "^15.0.7", "shadcn-svelte": "^0.14.0" } } diff --git a/src/lib/ae_journals/ae_journals__journal_entry.ts b/src/lib/ae_journals/ae_journals__journal_entry.ts index 3352f5cf..3dc3cbc5 100644 --- a/src/lib/ae_journals/ae_journals__journal_entry.ts +++ b/src/lib/ae_journals/ae_journals__journal_entry.ts @@ -2,6 +2,7 @@ import type { key_val } from '$lib/ae_stores'; import { api } from '$lib/api'; import { db_journals } from "$lib/ae_journals/db_journals"; +import { marked } from 'marked'; let ae_promises: key_val = {}; @@ -357,6 +358,7 @@ export async function db_save_ae_obj_li__journal_entry( category_code: obj.category_code, type_code: obj.type_code, topic_code: obj.topic_code, + tags: obj.tags, public: obj.public, private: obj.private, @@ -369,6 +371,7 @@ export async function db_save_ae_obj_li__journal_entry( // description: obj.description, content: obj.content, + content_md_html: marked.parse(obj.content), content_html: obj.content_html, content_json: obj.content_json, @@ -415,6 +418,12 @@ export async function db_save_ae_obj_li__journal_entry( created_on: obj.created_on, updated_on: obj.updated_on, + // Generated fields for sorting locally only + tmp_sort_1: `${obj.group}_${obj.priority}_${obj.sort}_${obj.updated_on}_${obj.created_on}`, + tmp_sort_2: `${obj.group}_${obj.priority}_${obj.sort}_${obj.updated_on ?? obj.created_on}`, + // tmp_sort_1: `${obj.original_datetime}_${obj.group}_${obj.priority}_${obj.sort}`, + // tmp_sort_2: `${obj.group}_${obj.original_datetime}_${obj.priority}_${obj.sort}`, + // Generated fields for sorting locally only // tmp_sort_1: `${obj.original_datetime}_${obj.group}_${obj.priority}_${obj.sort}`, // tmp_sort_2: `${obj.group}_${obj.original_datetime}_${obj.priority}_${obj.sort}`, diff --git a/src/lib/ae_journals/db_journals.ts b/src/lib/ae_journals/db_journals.ts index 5ffafdc1..e6c12d55 100644 --- a/src/lib/ae_journals/db_journals.ts +++ b/src/lib/ae_journals/db_journals.ts @@ -151,6 +151,7 @@ export interface Journal_Entry { category_code?: null|string; topic_code?: null|string; type_code?: null|string; + tags?: null|string; // Comma separated tags journal_entry_type?: null|string; // This is the type of journal entry @@ -170,6 +171,7 @@ export interface Journal_Entry { // description?: null|string; // This is the description of the journal entry content?: null|string; + content_md_html?: null|string; // Markdown converted to HTML based on content content_html?: null|string; content_json?: null|string; @@ -211,6 +213,10 @@ export interface Journal_Entry { created_on: Date; updated_on?: null|Date; + // Generated fields for sorting locally only + tmp_sort_1?: null|string; + tmp_sort_2?: null|string; + // Additional fields for convenience (database views) file_count?: null|number; // Only files directly under a journal journal_file_id_li_json?: null|string; diff --git a/src/routes/journals/[journal_id]/+page.svelte b/src/routes/journals/[journal_id]/+page.svelte index e057077b..69b1e389 100644 --- a/src/routes/journals/[journal_id]/+page.svelte +++ b/src/routes/journals/[journal_id]/+page.svelte @@ -4,6 +4,7 @@ let log_lvl: number = 0; // *** Import Svelte specific import { browser } from '$app/environment'; +import { goto } from '$app/navigation'; // *** Import other supporting libraries import { Modal } from 'flowbite-svelte'; @@ -59,12 +60,11 @@ let lq__journal_obj = $derived(liveQuery(async () => { return results; })); -let force_refresh = false; // Set to true to force a refresh of the data + let lq__journal_entry_obj_li = $derived(liveQuery(async () => { if (log_lvl) { console.log(`$lq__journal_obj.cfg_json = `, $lq__journal_obj?.cfg_json); console.log(`$journals_loc.filter__category_code = `, $journals_loc.filter__category_code); - console.log(`force_refresh = `, force_refresh); } if ($lq__journal_obj?.cfg_json?.entry_group_sort === 'DESC') { let results = await db_journals.journal_entry @@ -77,24 +77,14 @@ let lq__journal_entry_obj_li = $derived(liveQuery(async () => { // .sortBy('title'); return results; - // } else if (force_refresh) { - // force_refresh = false; - // console.log(`lq__journal_entry_obj_li - force refresh`); - // let results = await db_journals.journal_entry - // .where('journal_id') - // .equals($journals_slct?.journal_id ?? '') // null or undefined does not reset things like '' does - // // .reverse() - // .sortBy('updated_on'); - - // return results; } else if ($journals_loc.filter__category_code && $journals_loc.filter__category_code.length > 0) { console.log(`lq__journal_entry_obj_li - filtering by category_code: ${$journals_loc.filter__category_code}`); let results = await db_journals.journal_entry .where('journal_id') .equals($journals_slct?.journal_id ?? '') // null or undefined does not reset things like '' does .and(entry => entry.category_code === $journals_loc.filter__category_code) - // .reverse() - .sortBy('updated_on'); + .reverse() + .sortBy('tmp_sort_1'); return results; } else { @@ -102,33 +92,18 @@ let lq__journal_entry_obj_li = $derived(liveQuery(async () => { let results = await db_journals.journal_entry .where('journal_id') .equals($journals_slct?.journal_id ?? '') // null or undefined does not reset things like '' does - // .reverse() - .sortBy('updated_on'); + .reverse() + .sortBy('tmp_sort_1'); + // .sortBy('updated_on'); return results; } })); -// let lq__journal_entry_obj = $derived(liveQuery(async () => { -// if (log_lvl) { -// console.log(`lq__journal_entry_obj: journal_entry_id = ${$journals_slct?.journal_entry_id}`); -// } -// if ($journals_slct.journal_entry_id) { -// let results = await db_journals.journal_entry -// .get($journals_slct.journal_entry_id); // null or undefined does not reset things like '' does - -// return results; -// } -// // const results = await db_journals.journal_entry -// // .get($journals_slct.journal_entry_id); // null or undefined does not reset things like '' does - -// // return results; -// })); - $effect(() => { - if ($journals_trig.journal_entry_li) { +if ($journals_trig.journal_entry_li) { $journals_trig.journal_entry_li = false; if (log_lvl) { @@ -136,30 +111,14 @@ $effect(() => { } if ($journals_loc.qry__enabled !== 'all' || $journals_loc.qry__hidden !== 'all') { - console.log(`Deleting disabled or hidden journal entry.`); - // let results = db_journals.journal_entry - // .where('enable') - // .notEqual(true) - // .delete(); + console.log(`Not set to all for enabled or hidden. Clearing all journal entries to be safe.`); + let results = db_journals.journal_entry .clear(); console.log(`Deleted ${results} disabled journal entry.`); } - // if ($journals_loc.qry__hidden !== 'all') { - // console.log(`Deleting hidden journal entry.`); - // let results = db_journals.journal_entry - // .clear(); - // console.log(`Deleted ${results} hidden journal entry.`); - - // } - // let results = db_journals.journal_entry - // .where('enable') - // .equals('false') - // .delete(); - // console.log(`Deleted ${results} disabled journal entry.`); - $journals_prom.load__journal_entry_obj_li = journals_func.load_ae_obj_li__journal_entry({ api_cfg: $ae_api, for_obj_type: 'journal', @@ -174,38 +133,6 @@ $effect(() => { } }); -// $effect(() => { -// if ($journals_loc.filter__category_code) { -// console.log(`Filtering journal entry by category_code: ${$journals_loc.filter__category_code}`); - -// $journals_prom.load__journal_entry_obj_li = journals_func.load_ae_obj_li__journal_entry({ -// api_cfg: $ae_api, -// for_obj_type: 'journal', -// for_obj_id: $journals_slct.journal_id, -// enabled: $journals_loc.qry__enabled, -// hidden: $journals_loc.qry__hidden, -// limit: $journals_loc.qry__limit, -// order_by_li: $journals_loc.qry__order_by_li, -// try_cache: true, -// log_lvl: log_lvl, -// }); -// } else { -// console.log(`No category_code filter applied.`); -// // force_refresh = true; -// $journals_prom.load__journal_entry_obj_li = journals_func.load_ae_obj_li__journal_entry({ -// api_cfg: $ae_api, -// for_obj_type: 'journal', -// for_obj_id: $journals_slct.journal_id, -// enabled: $journals_loc.qry__enabled, -// hidden: $journals_loc.qry__hidden, -// limit: $journals_loc.qry__limit, -// order_by_li: $journals_loc.qry__order_by_li, -// try_cache: true, -// log_lvl: log_lvl, -// }); -// } -// }); - if (browser) { console.log('Browser environment detected.'); @@ -213,13 +140,6 @@ if (browser) { window.parent.postMessage(message, "*"); } -let journal_entry_category_li = [ - { code: 'test', name: 'Test' }, - { code: 'personal', name: 'Personal' }, - { code: 'work', name: 'Work' }, - { code: 'other', name: 'Other' }, -]; - @@ -247,8 +167,6 @@ let journal_entry_category_li = [
diff --git a/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.svelte b/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.svelte index 1a7f97be..5196cc3d 100644 --- a/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.svelte +++ b/src/routes/journals/[journal_id]/entry/[journal_entry_id]/+page.svelte @@ -40,11 +40,20 @@ if (log_lvl) { console.log(`ae_acct = `, ae_acct); } +$journals_slct.journal_id = ae_acct.slct.journal_id; +let lq__journal_obj = $derived(liveQuery(async () => { + let results = await db_journals.journal + .where('id') + .equals($journals_slct.journal_id) + .first(); + + return results; +})); + // For some reason data.params.journal_entry_id (or whatever param) is not being passed to this page when loaded by a link from another page. This seems to be a bug with Svelte or SvelteKit. Hopefully fixed in a future version 5? 2024-11-06 $journals_slct.journal_entry_id = ae_acct.slct.journal_entry_id; // $journals_slct.journal_entry_obj = ae_acct.slct.journal_entry_obj; - let lq__journal_entry_obj = $derived(liveQuery(async () => { if (log_lvl) { console.log(`lq__journal_entry_obj: journal_entry_id = ${$journals_slct?.journal_entry_id}`); @@ -192,6 +201,7 @@ if (browser) { {#if $lq__journal_entry_obj} {
if ($ae_loc.trusted_access) {
// Toggle edit mode
@@ -295,12 +512,21 @@ $effect(() => {
$journals_loc.entry.edit_kv[$lq__journal_entry_obj?.journal_entry_id] = $journals_loc.entry.edit;
}
}}
+ role="button"
+ tabindex="0"
class:hidden={!$ae_loc.trusted_access || $journals_loc.entry.edit_kv[$lq__journal_entry_obj?.journal_entry_id]}
+ class="w-full font-mono shadow-md rounded-lg border-gray-500 bg-gray-100 p-2"
>
-{$lq__journal_entry_obj?.content}
-
+