From 9a509a79c0e226b561d6606bf96907086326ae8f Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Sun, 23 Oct 2022 20:36:29 +0530 Subject: [PATCH] fix: note option changes not updating correctly (#1862) --- .../Controllers/NotesController.ts | 2 +- .../Controllers/SelectedItemsController.ts | 60 ++++++++++++------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/packages/web/src/javascripts/Controllers/NotesController.ts b/packages/web/src/javascripts/Controllers/NotesController.ts index 568a878d6..131c50056 100644 --- a/packages/web/src/javascripts/Controllers/NotesController.ts +++ b/packages/web/src/javascripts/Controllers/NotesController.ts @@ -80,7 +80,7 @@ export class NotesController extends AbstractViewController { } public get selectedNotes(): SNNote[] { - return this.selectionController.getSelectedItems(ContentType.Note) + return this.selectionController.getFilteredSelectedItems(ContentType.Note) } get firstSelectedNote(): SNNote | undefined { diff --git a/packages/web/src/javascripts/Controllers/SelectedItemsController.ts b/packages/web/src/javascripts/Controllers/SelectedItemsController.ts index 999f612c3..9f4c1c948 100644 --- a/packages/web/src/javascripts/Controllers/SelectedItemsController.ts +++ b/packages/web/src/javascripts/Controllers/SelectedItemsController.ts @@ -26,6 +26,7 @@ export class SelectedItemsController { lastSelectedItem: ListableContentItem | undefined selectedUuids: Set = observable(new Set()) + selectedItems: Record = {} private itemListController!: ItemListController override deinit(): void { @@ -38,6 +39,7 @@ export class SelectedItemsController makeObservable(this, { selectedUuids: observable, + selectedItems: observable, selectedItemsCount: computed, selectedFiles: computed, @@ -46,6 +48,7 @@ export class SelectedItemsController selectItem: action, setSelectedUuids: action, + setSelectedItems: action, hydrateFromPersistedValue: action, }) @@ -82,13 +85,22 @@ export class SelectedItemsController this.itemListController = itemListController this.disposers.push( - this.application.streamItems([ContentType.Note, ContentType.File], ({ removed }) => { - runInAction(() => { - for (const removedNote of removed) { - this.removeFromSelectedUuids(removedNote.uuid) - } - }) - }), + this.application.streamItems( + [ContentType.Note, ContentType.File], + ({ changed, inserted, removed }) => { + runInAction(() => { + for (const removedItem of removed) { + this.removeSelectedItem(removedItem.uuid) + } + + for (const item of [...changed, ...inserted]) { + if (this.selectedItems[item.uuid]) { + this.selectedItems[item.uuid] = item + } + } + }) + }, + ), ) } @@ -97,11 +109,11 @@ export class SelectedItemsController } get selectedItemsCount(): number { - return this.selectedUuids.size + return Object.keys(this.selectedItems).length } get selectedFiles(): FileItem[] { - return this.getSelectedItems(ContentType.File) + return this.getFilteredSelectedItems(ContentType.File) } get selectedFilesCount(): number { @@ -109,31 +121,37 @@ export class SelectedItemsController } get firstSelectedItem() { - return this.application.items.findSureItem(Array.from(this.selectedUuids)[0]) as ListableContentItem + return Object.values(this.selectedItems)[0] } - getSelectedItems = (contentType?: ContentType): T[] => { + getSelectedItems = () => { const uuids = Array.from(this.selectedUuids) - return uuids.length > 0 - ? (uuids - .map((uuid) => this.application.items.findSureItem(uuid)) - .filter((item) => { - return !contentType ? true : item.content_type === contentType - }) as T[]) - : [] + return uuids.map((uuid) => this.application.items.findSureItem(uuid)).filter((item) => !!item) + } + + getFilteredSelectedItems = (contentType?: ContentType): T[] => { + return Object.values(this.selectedItems).filter((item) => { + return !contentType ? true : item.content_type === contentType + }) as T[] + } + + setSelectedItems = () => { + this.selectedItems = Object.fromEntries(this.getSelectedItems().map((item) => [item.uuid, item])) } setSelectedUuids = (selectedUuids: Set) => { this.selectedUuids = new Set(selectedUuids) + this.setSelectedItems() } - private removeFromSelectedUuids = (uuid: UuidString) => { + private removeSelectedItem = (uuid: UuidString) => { this.selectedUuids.delete(uuid) this.setSelectedUuids(this.selectedUuids) + delete this.selectedItems[uuid] } public deselectItem = (item: { uuid: ListableContentItem['uuid'] }): void => { - this.removeFromSelectedUuids(item.uuid) + this.removeSelectedItem(item.uuid) if (item.uuid === this.lastSelectedItem?.uuid) { this.lastSelectedItem = undefined @@ -244,7 +262,7 @@ export class SelectedItemsController if (userTriggered && (hasMeta || hasCtrl)) { if (this.selectedUuids.has(uuid) && hasMoreThanOneSelected) { - this.removeFromSelectedUuids(uuid) + this.removeSelectedItem(uuid) } else if (isAuthorizedForAccess) { this.setSelectedUuids(this.selectedUuids.add(uuid)) this.lastSelectedItem = item