64bc50c788
Drift-audit Group 7 frontend cleanup (no behavioral change): - SettingsView: remove the 'auto-consolidate task bodies' toggle and its saveAutoConsolidate handler. The auto_consolidate_tasks setting has zero backend readers (curator removed in Phase 8); the control did nothing. - AppSettings type: drop the dead assistant_name / default_model hints (kept the open string index signature the store actually uses). Delete the fully orphaned types/chat.ts (zero importers). - notes/tasks Pinia stores: remove the list/filter/sort/pagination surface that backed the removed /notes and /tasks list views (verified no consumer uses the tasks/notes arrays, refresh, or any filter/sort/pagination method). Kept currentNote/currentTask, loading, fetch/create/update/delete, convert, patchStatus, startPlanning, backlinks, tags. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
137 lines
3.7 KiB
TypeScript
137 lines
3.7 KiB
TypeScript
import { ref } from "vue";
|
|
import { defineStore } from "pinia";
|
|
import { apiGet, apiPost, apiPut, apiDelete } from "@/api/client";
|
|
import { useToastStore } from "@/stores/toast";
|
|
import type { Note } from "@/types/note";
|
|
|
|
// Single-note + mutation surface. The list/filter/sort/pagination surface that
|
|
// backed the removed /notes list view was dropped in the 2026-06-02 drift-audit
|
|
// cleanup (no consumers — KnowledgeView and the editors use single-entity and
|
|
// mutation methods only).
|
|
export const useNotesStore = defineStore("notes", () => {
|
|
const currentNote = ref<Note | null>(null);
|
|
const loading = ref(false);
|
|
|
|
async function fetchNote(id: number) {
|
|
loading.value = true;
|
|
try {
|
|
currentNote.value = await apiGet<Note>(`/api/notes/${id}`);
|
|
} catch (e) {
|
|
useToastStore().show("Failed to load note", "error");
|
|
throw e;
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
async function createNote(data: {
|
|
title: string;
|
|
body: string;
|
|
tags?: string[];
|
|
project_id?: number | null;
|
|
milestone_id?: number | null;
|
|
note_type?: string;
|
|
metadata?: Record<string, string> | null;
|
|
}): Promise<Note> {
|
|
try {
|
|
return await apiPost<Note>("/api/notes", data);
|
|
} catch (e) {
|
|
useToastStore().show("Failed to create note", "error");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function updateNote(
|
|
id: number,
|
|
data: Partial<Pick<Note, "title" | "body" | "tags" | "project_id" | "milestone_id" | "note_type" | "metadata">>
|
|
): Promise<Note> {
|
|
try {
|
|
const note = await apiPut<Note>(`/api/notes/${id}`, data);
|
|
if (currentNote.value?.id === id) {
|
|
currentNote.value = note;
|
|
}
|
|
return note;
|
|
} catch (e) {
|
|
useToastStore().show("Failed to update note", "error");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function deleteNote(id: number) {
|
|
try {
|
|
await apiDelete(`/api/notes/${id}`);
|
|
if (currentNote.value?.id === id) {
|
|
currentNote.value = null;
|
|
}
|
|
} catch (e) {
|
|
useToastStore().show("Failed to delete note", "error");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function resolveTitle(title: string): Promise<Note> {
|
|
return await apiPost<Note>("/api/notes/resolve-title", { title });
|
|
}
|
|
|
|
async function convertToTask(noteId: number): Promise<Note> {
|
|
try {
|
|
const note = await apiPost<Note>(
|
|
`/api/notes/${noteId}/convert-to-task`,
|
|
{}
|
|
);
|
|
if (currentNote.value?.id === noteId) {
|
|
currentNote.value = note;
|
|
}
|
|
return note;
|
|
} catch (e) {
|
|
useToastStore().show("Failed to convert to task", "error");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function convertToNote(noteId: number): Promise<Note> {
|
|
try {
|
|
const note = await apiPost<Note>(
|
|
`/api/notes/${noteId}/convert-to-note`,
|
|
{}
|
|
);
|
|
if (currentNote.value?.id === noteId) {
|
|
currentNote.value = note;
|
|
}
|
|
return note;
|
|
} catch (e) {
|
|
useToastStore().show("Failed to convert to note", "error");
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function fetchBacklinks(
|
|
noteId: number
|
|
): Promise<{ type: string; id: number; title: string }[]> {
|
|
const data = await apiGet<{
|
|
backlinks: { type: string; id: number; title: string }[];
|
|
}>(`/api/notes/${noteId}/backlinks`);
|
|
return data.backlinks;
|
|
}
|
|
|
|
async function fetchAllTags(q?: string): Promise<string[]> {
|
|
const params = q ? `?q=${encodeURIComponent(q)}` : "";
|
|
const data = await apiGet<{ tags: string[] }>(`/api/notes/tags${params}`);
|
|
return data.tags;
|
|
}
|
|
|
|
return {
|
|
currentNote,
|
|
loading,
|
|
fetchNote,
|
|
createNote,
|
|
updateNote,
|
|
deleteNote,
|
|
resolveTitle,
|
|
convertToTask,
|
|
convertToNote,
|
|
fetchBacklinks,
|
|
fetchAllTags,
|
|
};
|
|
});
|