chore(react/dialog): improve recent changes

This commit is contained in:
Elian Doran
2025-08-07 22:31:51 +03:00
parent c0d7278827
commit bd6c690160
4 changed files with 46 additions and 21 deletions

View File

@@ -233,11 +233,11 @@ div.tn-tool-dialog {
/* Item title link */ /* Item title link */
.recent-changes-content ul li .note-title a { .recent-changes-content ul li a {
color: currentColor; color: currentColor;
} }
.recent-changes-content ul li .note-title a:hover { .recent-changes-content ul li a:hover {
text-decoration: underline; text-decoration: underline;
} }

View File

@@ -1,6 +1,6 @@
import { useEffect, useState } from "preact/hooks"; import { useEffect, useState } from "preact/hooks";
import { EventData } from "../../components/app_context"; import appContext, { EventData } from "../../components/app_context";
import { openDialog } from "../../services/dialog"; import dialog, { closeActiveDialog, openDialog } from "../../services/dialog";
import { t } from "../../services/i18n"; import { t } from "../../services/i18n";
import server from "../../services/server"; import server from "../../services/server";
import toast from "../../services/toast"; import toast from "../../services/toast";
@@ -8,11 +8,12 @@ import Button from "../react/Button";
import Modal from "../react/Modal"; import Modal from "../react/Modal";
import ReactBasicWidget from "../react/ReactBasicWidget"; import ReactBasicWidget from "../react/ReactBasicWidget";
import hoisted_note from "../../services/hoisted_note"; import hoisted_note from "../../services/hoisted_note";
import { RecentChangesRow } from "@triliumnext/commons"; import type { RecentChangesRow } from "@triliumnext/commons";
import froca from "../../services/froca"; import froca from "../../services/froca";
import { formatDateTime } from "../../utils/formatters"; import { formatDateTime } from "../../utils/formatters";
import link from "../../services/link"; import link from "../../services/link";
import RawHtml from "../react/RawHtml"; import RawHtml from "../react/RawHtml";
import ws from "../../services/ws";
interface RecentChangesDialogProps { interface RecentChangesDialogProps {
ancestorNoteId?: string; ancestorNoteId?: string;
@@ -90,9 +91,9 @@ function RecentChangesTimeline({ groupedByDate }: { groupedByDate: Map<String, R
return ( return (
<li className={isDeleted ? "deleted-note" : ""}> <li className={isDeleted ? "deleted-note" : ""}>
<span title={change.date}>{formattedTime}</span> <span title={change.date}>{formattedTime}</span>
{ !isDeleted && notePath { !isDeleted
? <NoteLink notePath={notePath} title={change.current_title} /> ? <NoteLink notePath={notePath} title={change.current_title} />
: <span className="note-title">{change.current_title}</span> } : <DeletedNoteLink change={change} /> }
</li> </li>
); );
})} })}
@@ -117,7 +118,35 @@ function NoteLink({ notePath, title }: { notePath: string, title: string }) {
}).then(setNoteLink); }).then(setNoteLink);
}, [notePath, title]); }, [notePath, title]);
return ( return (
noteLink ? <RawHtml className="note-title" html={noteLink[0].innerHTML} /> : <span className="note-title">Foo {title}</span> noteLink ? <RawHtml className="note-title" html={noteLink[0].innerHTML} /> : <span className="note-title">{title}</span>
);
}
function DeletedNoteLink({ change }: { change: RecentChangesRow }) {
return (
<>
<span className="note-title">{change.current_title}</span>
&nbsp;
(<a href="javascript:"
onClick={() => {
async () => {
const text = t("recent_changes.confirm_undelete");
if (await dialog.confirm(text)) {
await server.put(`notes/${change.noteId}/undelete`);
closeActiveDialog();
await ws.waitForMaxKnownEntityChangeId();
const activeContext = appContext.tabManager.getActiveContext();
if (activeContext) {
activeContext.setNote(change.noteId);
}
}
}
}}>
{t("recent_changes.undelete_link")})
</a>
</>
); );
} }

View File

@@ -5,18 +5,7 @@ import protectedSessionService from "../../services/protected_session.js";
import noteService from "../../services/notes.js"; import noteService from "../../services/notes.js";
import becca from "../../becca/becca.js"; import becca from "../../becca/becca.js";
import type { Request } from "express"; import type { Request } from "express";
import type { RecentChangeRow } from "@triliumnext/commons";
interface RecentChangeRow {
noteId: string;
current_isDeleted: boolean;
current_deleteId: string;
current_title: string;
current_isProtected: boolean;
title: string;
utcDate: string;
date: string;
canBeUndeleted?: boolean;
}
function getRecentChanges(req: Request) { function getRecentChanges(req: Request) {
const { ancestorNoteId } = req.params; const { ancestorNoteId } = req.params;

View File

@@ -46,9 +46,16 @@ export interface RevisionPojo {
contentLength?: number; contentLength?: number;
} }
export interface RecentChangesRow { export interface RecentChangeRow {
noteId: string; noteId: string;
current_isDeleted: boolean;
current_deleteId: string;
current_title: string;
current_isProtected: boolean;
title: string;
utcDate: string;
date: string; date: string;
canBeUndeleted?: boolean;
} }
export interface BulkActionAffectedNotes { export interface BulkActionAffectedNotes {