diff --git a/app/assets/javascripts/views/tags/tags_view.ts b/app/assets/javascripts/views/tags/tags_view.ts index 4c98770d5..6f9aa1bed 100644 --- a/app/assets/javascripts/views/tags/tags_view.ts +++ b/app/assets/javascripts/views/tags/tags_view.ts @@ -25,7 +25,7 @@ type TagState = { tags: SNTag[] smartTags: SNSmartTag[] noteCounts: NoteCounts - selectedTag: SNTag + selectedTag?: SNTag /** If creating a new tag, the previously selected tag will be set here, so that if new * tag creation is canceled, the previous tag is re-selected */ previousTag?: SNTag @@ -35,7 +35,7 @@ type TagState = { templateTag?: SNTag } -class TagsViewCtrl extends PureViewCtrl { +class TagsViewCtrl extends PureViewCtrl<{}, TagState> { /** Passed through template */ readonly application!: WebApplication @@ -46,7 +46,7 @@ class TagsViewCtrl extends PureViewCtrl { private editingOriginalName?: string formData: { tagTitle?: string } = {} titles: Partial> = {} - private removeTagsObserver!: () => void + private removeTagsObserver?: () => void /* @ngInject */ constructor( @@ -59,8 +59,8 @@ class TagsViewCtrl extends PureViewCtrl { } deinit() { - this.removeTagsObserver(); - (this.removeTagsObserver as any) = undefined; + this.removeTagsObserver?.(); + this.removeTagsObserver = undefined; this.unregisterComponent(); this.unregisterComponent = undefined; super.deinit(); @@ -78,10 +78,6 @@ class TagsViewCtrl extends PureViewCtrl { return this.state as TagState; } - async setTagState(state: Partial) { - return this.setState(state); - } - async onAppStart() { super.onAppStart(); this.registerComponentHandler(); @@ -92,7 +88,7 @@ class TagsViewCtrl extends PureViewCtrl { this.loadPreferences(); this.beginStreamingItems(); const smartTags = this.application.getSmartTags(); - this.setTagState({ + this.setState({ smartTags: smartTags, }); this.selectTag(smartTags[0]); @@ -117,24 +113,29 @@ class TagsViewCtrl extends PureViewCtrl { beginStreamingItems() { this.removeTagsObserver = this.application.streamItems( - ContentType.Tag, + [ContentType.Tag, ContentType.SmartTag], async (items) => { - await this.setTagState({ + await this.setState({ tags: this.getMappedTags(), smartTags: this.application.getSmartTags(), }); - this.reloadTitles(items as SNTag[]); + + for (const tag of items as Array) { + this.titles[tag.uuid] = tag.title; + } + this.reloadNoteCounts(); - if (this.getState().selectedTag) { + const selectedTag = this.state.selectedTag; + if (selectedTag) { /** If the selected tag has been deleted, revert to All view. */ const matchingTag = items.find((tag) => { - return tag.uuid === this.getState().selectedTag.uuid; + return tag.uuid === selectedTag.uuid; }) as SNTag; if (matchingTag) { if (matchingTag.deleted) { this.selectTag(this.getState().smartTags[0]); } else { - this.setTagState({ + this.setState({ selectedTag: matchingTag }) } @@ -144,18 +145,12 @@ class TagsViewCtrl extends PureViewCtrl { ); } - reloadTitles(tags: Array) { - for (const tag of tags) { - this.titles[tag.uuid] = tag.title; - } - } - /** @override */ onAppStateEvent(eventName: AppStateEvent, data?: any) { if (eventName === AppStateEvent.PreferencesChanged) { this.loadPreferences(); } else if (eventName === AppStateEvent.TagChanged) { - this.setTagState({ + this.setState({ selectedTag: this.application.getAppState().getSelectedTag() }); } @@ -197,7 +192,7 @@ class TagsViewCtrl extends PureViewCtrl { noteCounts[tag.uuid] = notes.length; } } - this.setTagState({ + this.setState({ noteCounts: noteCounts }); } @@ -283,7 +278,7 @@ class TagsViewCtrl extends PureViewCtrl { const newTag = await this.application.createTemplateItem( ContentType.Tag ) as SNTag; - this.setTagState({ + this.setState({ tags: [newTag].concat(this.getState().tags), previousTag: this.getState().selectedTag, selectedTag: newTag, @@ -293,7 +288,7 @@ class TagsViewCtrl extends PureViewCtrl { } onTagTitleChange(tag: SNTag | SNSmartTag) { - this.setTagState({ + this.setState({ editingTag: tag }); } @@ -324,7 +319,7 @@ class TagsViewCtrl extends PureViewCtrl { await this.application.changeAndSaveItem(tag.uuid, (mutator) => { mutator.title = newTitle; }); - await this.setTagState({ + await this.setState({ editingTag: undefined }); } @@ -333,7 +328,7 @@ class TagsViewCtrl extends PureViewCtrl { const newTag = this.getState().templateTag!; const newTitle = this.titles[newTag.uuid] || ''; if (newTitle.length === 0) { - await this.setTagState({ + await this.setState({ templateTag: undefined }); return; @@ -349,7 +344,7 @@ class TagsViewCtrl extends PureViewCtrl { const changedTag = await this.application.changeItem(insertedTag.uuid, (m) => { m.title = newTitle; }); - await this.setTagState({ + await this.setState({ templateTag: undefined, editingTag: undefined }); @@ -359,7 +354,7 @@ class TagsViewCtrl extends PureViewCtrl { async selectedRenameTag(tag: SNTag) { this.editingOriginalName = tag.title; - await this.setTagState({ + await this.setState({ editingTag: tag }); document.getElementById('tag-' + tag.uuid)!.focus();