Make note picker add notes to persistent context instead of one-shot
Previously the paperclip button created a one-shot attachment that was only included for the single message it was sent with, then discarded. Now selecting a note via the picker calls includeNote() directly, so it appears in the "In Context" sidebar and stays for the entire conversation — consistent with clicking "+" on a suggested note. Removed attachedNote ref, removeAttachedNote(), the pinned-note sidebar block, and the contextNoteId/contextNoteTitle sendMessage arguments that are no longer needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -27,7 +27,6 @@ const showResearchModal = ref(false);
|
|||||||
const researchTopic = ref("");
|
const researchTopic = ref("");
|
||||||
|
|
||||||
// Note picker state
|
// Note picker state
|
||||||
const attachedNote = ref<{ id: number; title: string } | null>(null);
|
|
||||||
const showNotePicker = ref(false);
|
const showNotePicker = ref(false);
|
||||||
const noteSearchQuery = ref("");
|
const noteSearchQuery = ref("");
|
||||||
const noteSearchResults = ref<{ id: number; title: string }[]>([]);
|
const noteSearchResults = ref<{ id: number; title: string }[]>([]);
|
||||||
@@ -99,7 +98,6 @@ watch(convId, async (newId) => {
|
|||||||
includedNoteIds.value = new Set();
|
includedNoteIds.value = new Set();
|
||||||
includedNotes.value = [];
|
includedNotes.value = [];
|
||||||
suggestedNotes.value = [];
|
suggestedNotes.value = [];
|
||||||
attachedNote.value = null;
|
|
||||||
store.lastContextMeta = null;
|
store.lastContextMeta = null;
|
||||||
if (newId) {
|
if (newId) {
|
||||||
// Skip re-fetch if this conversation is already loaded (avoids race
|
// Skip re-fetch if this conversation is already loaded (avoids race
|
||||||
@@ -175,19 +173,15 @@ async function sendMessage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sending.value = true;
|
sending.value = true;
|
||||||
const contextNoteId = attachedNote.value?.id ?? undefined;
|
|
||||||
const contextNoteTitle = attachedNote.value?.title ?? undefined;
|
|
||||||
attachedNote.value = null;
|
|
||||||
messageInput.value = "";
|
messageInput.value = "";
|
||||||
resetTextareaHeight();
|
resetTextareaHeight();
|
||||||
scrollToBottom();
|
scrollToBottom();
|
||||||
|
|
||||||
await store.sendMessage(
|
await store.sendMessage(
|
||||||
content,
|
content,
|
||||||
contextNoteId,
|
undefined,
|
||||||
includedNoteIds.value.size ? [...includedNoteIds.value] : undefined,
|
includedNoteIds.value.size ? [...includedNoteIds.value] : undefined,
|
||||||
true, // enable thinking in the full chat view
|
true, // enable thinking in the full chat view
|
||||||
contextNoteTitle,
|
|
||||||
);
|
);
|
||||||
sending.value = false;
|
sending.value = false;
|
||||||
|
|
||||||
@@ -300,14 +294,10 @@ function onNoteSearchInput() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function selectNote(note: { id: number; title: string }) {
|
function selectNote(note: { id: number; title: string }) {
|
||||||
attachedNote.value = note;
|
includeNote(note);
|
||||||
showNotePicker.value = false;
|
showNotePicker.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeAttachedNote() {
|
|
||||||
attachedNote.value = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function includeNote(note: { id: number; title: string }) {
|
function includeNote(note: { id: number; title: string }) {
|
||||||
if (includedNoteIds.value.has(note.id)) return;
|
if (includedNoteIds.value.has(note.id)) return;
|
||||||
includedNoteIds.value = new Set([...includedNoteIds.value, note.id]);
|
includedNoteIds.value = new Set([...includedNoteIds.value, note.id]);
|
||||||
@@ -471,20 +461,11 @@ onUnmounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Context sidebar -->
|
<!-- Context sidebar -->
|
||||||
<aside v-if="includedNotes.length || suggestedNotes.length || attachedNote" class="context-sidebar">
|
<aside v-if="includedNotes.length || suggestedNotes.length" class="context-sidebar">
|
||||||
<!-- IN CONTEXT section -->
|
<!-- IN CONTEXT section -->
|
||||||
<template v-if="attachedNote || includedNotes.length">
|
<template v-if="includedNotes.length">
|
||||||
<div class="context-sidebar-header">In Context</div>
|
<div class="context-sidebar-header">In Context</div>
|
||||||
|
|
||||||
<!-- Manually attached note — pinned until sent -->
|
|
||||||
<div v-if="attachedNote" class="context-note context-note-pinned">
|
|
||||||
<span class="context-note-icon" title="Attached for this message">📌</span>
|
|
||||||
<router-link :to="`/notes/${attachedNote.id}`" class="context-note-name">
|
|
||||||
{{ attachedNote.title }}
|
|
||||||
</router-link>
|
|
||||||
<button class="context-note-remove" @click="removeAttachedNote" title="Remove">×</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Explicitly included notes -->
|
<!-- Explicitly included notes -->
|
||||||
<div v-for="note in includedNotes" :key="note.id" class="context-note context-note-included">
|
<div v-for="note in includedNotes" :key="note.id" class="context-note context-note-included">
|
||||||
<router-link :to="`/notes/${note.id}`" class="context-note-name">
|
<router-link :to="`/notes/${note.id}`" class="context-note-name">
|
||||||
@@ -805,13 +786,6 @@ onUnmounted(() => {
|
|||||||
border: 1px solid var(--color-border);
|
border: 1px solid var(--color-border);
|
||||||
font-size: 0.82rem;
|
font-size: 0.82rem;
|
||||||
}
|
}
|
||||||
.context-note-pinned {
|
|
||||||
border-color: var(--color-primary);
|
|
||||||
}
|
|
||||||
.context-note-icon {
|
|
||||||
font-size: 0.75rem;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
.context-note-name {
|
.context-note-name {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user