fix: tags do not count orphan refs
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
|
import { TagsState } from '@/ui_models/app_state/tags_state';
|
||||||
import { SNTag } from '@standardnotes/snjs';
|
import { SNTag } from '@standardnotes/snjs';
|
||||||
import { runInAction } from 'mobx';
|
import { computed, runInAction } from 'mobx';
|
||||||
import { observer } from 'mobx-react-lite';
|
import { observer } from 'mobx-react-lite';
|
||||||
import { FunctionComponent, JSX } from 'preact';
|
import { FunctionComponent, JSX } from 'preact';
|
||||||
import { useCallback, useEffect, useRef, useState } from 'preact/hooks';
|
import { useCallback, useEffect, useRef, useState } from 'preact/hooks';
|
||||||
@@ -14,6 +15,7 @@ type Props = {
|
|||||||
|
|
||||||
export type TagsListState = {
|
export type TagsListState = {
|
||||||
readonly selectedTag: SNTag | undefined;
|
readonly selectedTag: SNTag | undefined;
|
||||||
|
tags: TagsState;
|
||||||
editingTag: SNTag | undefined;
|
editingTag: SNTag | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -24,7 +26,7 @@ export const TagsListItem: FunctionComponent<Props> = observer(
|
|||||||
|
|
||||||
const isSelected = appState.selectedTag === tag;
|
const isSelected = appState.selectedTag === tag;
|
||||||
const isEditing = appState.editingTag === tag;
|
const isEditing = appState.editingTag === tag;
|
||||||
const noteCounts = tag.noteCount;
|
const noteCounts = computed(() => appState.tags.getNotesCount(tag));
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setTitle(tag.title || '');
|
setTitle(tag.title || '');
|
||||||
@@ -97,7 +99,7 @@ export const TagsListItem: FunctionComponent<Props> = observer(
|
|||||||
spellCheck={false}
|
spellCheck={false}
|
||||||
ref={inputRef}
|
ref={inputRef}
|
||||||
/>
|
/>
|
||||||
<div className="count">{noteCounts}</div>
|
<div className="count">{noteCounts.get()}</div>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
{tag.conflictOf && (
|
{tag.conflictOf && (
|
||||||
|
|||||||
@@ -1,15 +1,25 @@
|
|||||||
import { ContentType, SNSmartTag, SNTag } from '@standardnotes/snjs';
|
import { ContentType, SNSmartTag, SNTag } from '@standardnotes/snjs';
|
||||||
import { computed, makeObservable, observable, runInAction } from 'mobx';
|
import {
|
||||||
|
action,
|
||||||
|
computed,
|
||||||
|
makeAutoObservable,
|
||||||
|
makeObservable,
|
||||||
|
observable,
|
||||||
|
runInAction,
|
||||||
|
} from 'mobx';
|
||||||
import { WebApplication } from '../application';
|
import { WebApplication } from '../application';
|
||||||
|
|
||||||
export class TagsState {
|
export class TagsState {
|
||||||
tags: SNTag[] = [];
|
tags: SNTag[] = [];
|
||||||
smartTags: SNSmartTag[] = [];
|
smartTags: SNSmartTag[] = [];
|
||||||
|
private readonly tagsCountsState: TagsCountsState;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private application: WebApplication,
|
private application: WebApplication,
|
||||||
appEventListeners: (() => void)[]
|
appEventListeners: (() => void)[]
|
||||||
) {
|
) {
|
||||||
|
this.tagsCountsState = new TagsCountsState(this.application);
|
||||||
|
|
||||||
makeObservable(this, {
|
makeObservable(this, {
|
||||||
tags: observable,
|
tags: observable,
|
||||||
smartTags: observable,
|
smartTags: observable,
|
||||||
@@ -26,13 +36,46 @@ export class TagsState {
|
|||||||
ContentType.Tag
|
ContentType.Tag
|
||||||
) as SNTag[];
|
) as SNTag[];
|
||||||
this.smartTags = this.application.getSmartTags();
|
this.smartTags = this.application.getSmartTags();
|
||||||
|
|
||||||
|
this.tagsCountsState.update(this.tags);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getNotesCount(tag: SNTag): number {
|
||||||
|
return this.tagsCountsState.counts[tag.uuid] || 0;
|
||||||
|
}
|
||||||
|
|
||||||
get tagsCount(): number {
|
get tagsCount(): number {
|
||||||
return this.tags.length;
|
return this.tags.length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bug fix for issue 1201550111577311,
|
||||||
|
*/
|
||||||
|
class TagsCountsState {
|
||||||
|
public counts: { [uuid: string]: number } = {};
|
||||||
|
|
||||||
|
public constructor(private application: WebApplication) {
|
||||||
|
makeAutoObservable(this, {
|
||||||
|
counts: observable.ref,
|
||||||
|
update: action,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public update(tags: SNTag[]) {
|
||||||
|
const newCounts: { [uuid: string]: number } = {};
|
||||||
|
|
||||||
|
tags.forEach((tag) => {
|
||||||
|
newCounts[tag.uuid] = this.application.referencesForItem(
|
||||||
|
tag,
|
||||||
|
ContentType.Note
|
||||||
|
).length;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.counts = newCounts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user