import { formatDateTime } from "../../utils/formatters.js";
import { t } from "../../services/i18n.js";
import NoteContextAwareWidget from "../note_context_aware_widget.js";
import server from "../../services/server.js";
import utils from "../../services/utils.js";
import type { EventData } from "../../components/app_context.js";
import type FNote from "../../entities/fnote.js";
const TPL = /*html*/`
`;
// TODO: Deduplicate with server
interface NoteSizeResponse {
noteSize: number;
}
interface SubtreeSizeResponse {
subTreeNoteCount: number;
subTreeSize: number;
}
interface MetadataResponse {
dateCreated: number;
dateModified: number;
}
export default class NoteInfoWidget extends NoteContextAwareWidget {
private $noteId!: JQuery;
private $dateCreated!: JQuery;
private $dateModified!: JQuery;
private $type!: JQuery;
private $mime!: JQuery;
private $noteSizesWrapper!: JQuery;
private $noteSize!: JQuery;
private $subTreeSize!: JQuery;
private $calculateButton!: JQuery;
get name() {
return "noteInfo";
}
get toggleCommand() {
return "toggleRibbonTabNoteInfo";
}
isEnabled() {
return !!this.note;
}
getTitle() {
return {
show: this.isEnabled(),
title: t("note_info_widget.title"),
icon: "bx bx-info-circle"
};
}
doRender() {
this.$widget = $(TPL);
this.contentSized();
this.$noteId = this.$widget.find(".note-info-note-id");
this.$dateCreated = this.$widget.find(".note-info-date-created");
this.$dateModified = this.$widget.find(".note-info-date-modified");
this.$type = this.$widget.find(".note-info-type");
this.$mime = this.$widget.find(".note-info-mime");
this.$noteSizesWrapper = this.$widget.find(".note-sizes-wrapper");
this.$noteSize = this.$widget.find(".note-size");
this.$subTreeSize = this.$widget.find(".subtree-size");
this.$calculateButton = this.$widget.find(".calculate-button");
this.$calculateButton.on("click", async () => {
this.$noteSizesWrapper.show();
this.$calculateButton.hide();
this.$noteSize.empty().append($(''));
this.$subTreeSize.empty().append($(''));
const noteSizeResp = await server.get(`stats/note-size/${this.noteId}`);
this.$noteSize.text(utils.formatSize(noteSizeResp.noteSize));
const subTreeResp = await server.get(`stats/subtree-size/${this.noteId}`);
if (subTreeResp.subTreeNoteCount > 1) {
this.$subTreeSize.text(t("note_info_widget.subtree_size", { size: utils.formatSize(subTreeResp.subTreeSize), count: subTreeResp.subTreeNoteCount }));
} else {
this.$subTreeSize.text("");
}
});
}
async refreshWithNote(note: FNote) {
const metadata = await server.get(`notes/${this.noteId}/metadata`);
this.$noteId.text(note.noteId);
this.$dateCreated.text(formatDateTime(metadata.dateCreated)).attr("title", metadata.dateCreated);
this.$dateModified.text(formatDateTime(metadata.dateModified)).attr("title", metadata.dateModified);
this.$type.text(note.type);
if (note.mime) {
this.$mime.text(`(${note.mime})`);
} else {
this.$mime.empty();
}
this.$calculateButton.show();
this.$noteSizesWrapper.hide();
}
entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
if (this.noteId && (loadResults.isNoteReloaded(this.noteId) || loadResults.isNoteContentReloaded(this.noteId))) {
this.refresh();
}
}
}