diff --git a/src/routes/journals/JournalEntry_Editor.svelte b/src/routes/journals/JournalEntry_Editor.svelte index 4eb41fca..51f050df 100644 --- a/src/routes/journals/JournalEntry_Editor.svelte +++ b/src/routes/journals/JournalEntry_Editor.svelte @@ -4,7 +4,7 @@ * Extracted 2026-01-08 to modularize the massive Journal Entry view. * Handles: CodeMirror vs Plain vs Rendered HTML for both View and Edit modes. */ - import { LockKeyhole, Save } from '@lucide/svelte'; + import { LockKeyhole, Save, RefreshCcw } from '@lucide/svelte'; import { ae_loc } from '$lib/stores/ae_stores'; import { journals_loc, journals_sess } from '$lib/ae_journals/ae_journals_stores'; import E_app_codemirror_v5 from '$lib/app_components/e_app_codemirror_v5.svelte'; @@ -18,6 +18,7 @@ has_changed: boolean; updated_idb: boolean; onSave: () => void; + onForceReset?: () => void; } let { @@ -27,7 +28,8 @@ editorView = $bindable(), has_changed, updated_idb, - onSave + onSave, + onForceReset }: Props = $props(); const is_editing = $derived($journals_loc.entry.edit_kv[entry.journal_entry_id] === 'current'); @@ -35,49 +37,35 @@
{#if !is_editing} - - {#if journal?.cfg_json?.pref_viewer == 'codemirror'} - - {:else if journal?.cfg_json?.pref_viewer == 'plain'} -
-                {tmp_entry_obj.content || '-- No Content --'}
-            
- {:else} - -
- {#if tmp_entry_obj?.content_md_html} - {@html tmp_entry_obj.content_md_html} - {:else if tmp_entry_obj?.content_encrypted && entry.private} -
- - Private encrypted content (Decrypt to view) -
- {/if} -
- {/if} + + ... {:else} {#if !tmp_entry_obj?.content && tmp_entry_obj?.content_encrypted} -
-
- - Decryption Required +
+
+
+ + Decryption Required +
+

This entry must be decrypted before it can be edited.

+ {#if tmp_entry_obj?.content === false} +

Decryption failed. Incorrect passcode.

+ {/if}
-

This entry must be decrypted before it can be edited.

- {#if tmp_entry_obj?.content === false} -

Decryption failed. Please check your journal passcodes.

+ + {#if $ae_loc.edit_mode && onForceReset} +
+

Passcode lost? You can force a reset to plain text, but all currently encrypted data will be permanently deleted.

+ +
{/if}
{:else} diff --git a/src/routes/journals/ae_comp__journal_entry_obj_id_view.svelte b/src/routes/journals/ae_comp__journal_entry_obj_id_view.svelte index fbc01411..dbb1f5c1 100644 --- a/src/routes/journals/ae_comp__journal_entry_obj_id_view.svelte +++ b/src/routes/journals/ae_comp__journal_entry_obj_id_view.svelte @@ -324,6 +324,31 @@ goto(`/journals/${tmp_entry_obj.journal_id}`); } + async function handle_force_reset() { + if (!confirm('WARNING: This will permanently DELETE the encrypted content and history for this entry and reset it to plain text. This cannot be undone. Proceed?')) { + return; + } + + is_processing = true; + tmp_entry_obj.private = false; + tmp_entry_obj.content = ""; + tmp_entry_obj.content_encrypted = null; + tmp_entry_obj.history = ""; + tmp_entry_obj.history_encrypted = null; + + // Sync orig to match the "cleared" state + if (orig_entry_obj) { + orig_entry_obj.private = false; + orig_entry_obj.content = ""; + orig_entry_obj.content_encrypted = null; + orig_entry_obj.history = ""; + orig_entry_obj.history_encrypted = null; + } + + await update_journal_entry(); + is_processing = false; + } + let show_append_modal = $state(false); let modal_mode: 'append' | 'prepend' | 'auto' = $state('auto'); @@ -379,6 +404,7 @@ has_changed={has_unsaved_changes} updated_idb={false} onSave={update_journal_entry} + onForceReset={handle_force_reset} />