diff --git a/src/public/app/widgets/ribbon_widgets/book_properties.js b/src/public/app/widgets/ribbon_widgets/book_properties.ts
similarity index 80%
rename from src/public/app/widgets/ribbon_widgets/book_properties.js
rename to src/public/app/widgets/ribbon_widgets/book_properties.ts
index efc49d142..6bb66dd1f 100644
--- a/src/public/app/widgets/ribbon_widgets/book_properties.js
+++ b/src/public/app/widgets/ribbon_widgets/book_properties.ts
@@ -1,6 +1,8 @@
import NoteContextAwareWidget from "../note_context_aware_widget.js";
import attributeService from "../../services/attributes.js";
import { t } from "../../services/i18n.js";
+import type FNote from "../../entities/fnote.js";
+import type { EventData } from "../../components/app_context.js";
const TPL = `
`;
export default class BookPropertiesWidget extends NoteContextAwareWidget {
+
+ private $viewTypeSelect!: JQuery;
+ private $expandChildrenButton!: JQuery;
+ private $collapseAllButton!: JQuery;
+
get name() {
return "bookProperties";
}
@@ -70,11 +77,15 @@ export default class BookPropertiesWidget extends NoteContextAwareWidget {
this.contentSized();
this.$viewTypeSelect = this.$widget.find(".view-type-select");
- this.$viewTypeSelect.on("change", () => this.toggleViewType(this.$viewTypeSelect.val()));
+ this.$viewTypeSelect.on("change", () => this.toggleViewType(String(this.$viewTypeSelect.val())));
this.$expandChildrenButton = this.$widget.find(".expand-children-button");
this.$expandChildrenButton.on("click", async () => {
- if (!this.note.isLabelTruthy("expanded")) {
+ if (!this.noteId || !this.note) {
+ return;
+ }
+
+ if (!this.note?.isLabelTruthy("expanded")) {
await attributeService.addLabel(this.noteId, "expanded");
}
@@ -83,6 +94,10 @@ export default class BookPropertiesWidget extends NoteContextAwareWidget {
this.$collapseAllButton = this.$widget.find(".collapse-all-button");
this.$collapseAllButton.on("click", async () => {
+ if (!this.noteId || !this.note) {
+ return;
+ }
+
// owned is important - we shouldn't remove inherited expanded labels
for (const expandedAttr of this.note.getOwnedLabels("expanded")) {
await attributeService.removeAttributeById(this.noteId, expandedAttr.attributeId);
@@ -92,7 +107,11 @@ export default class BookPropertiesWidget extends NoteContextAwareWidget {
});
}
- async refreshWithNote(note) {
+ async refreshWithNote(note: FNote) {
+ if (!this.note) {
+ return;
+ }
+
const viewType = this.note.getLabelValue("viewType") || "grid";
this.$viewTypeSelect.val(viewType);
@@ -101,7 +120,11 @@ export default class BookPropertiesWidget extends NoteContextAwareWidget {
this.$collapseAllButton.toggle(viewType === "list");
}
- async toggleViewType(type) {
+ async toggleViewType(type: string) {
+ if (!this.noteId) {
+ return;
+ }
+
if (type !== "list" && type !== "grid") {
throw new Error(t("book_properties.invalid_view_type", { type }));
}
@@ -109,7 +132,7 @@ export default class BookPropertiesWidget extends NoteContextAwareWidget {
await attributeService.setLabel(this.noteId, "viewType", type);
}
- entitiesReloadedEvent({ loadResults }) {
+ entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
if (loadResults.getAttributeRows().find((attr) => attr.noteId === this.noteId && attr.name === "viewType")) {
this.refresh();
}