From 35754695aa262185d9316a0f621687befd03063d Mon Sep 17 00:00:00 2001 From: Gabriel Musat Date: Fri, 21 Jun 2024 21:13:25 +0200 Subject: [PATCH] Fix bug --- web/src/Explorer/FolderState.test.ts | 4 ++++ web/src/Explorer/FolderState.ts | 32 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/web/src/Explorer/FolderState.test.ts b/web/src/Explorer/FolderState.test.ts index 46b96fa..8168864 100644 --- a/web/src/Explorer/FolderState.test.ts +++ b/web/src/Explorer/FolderState.test.ts @@ -22,6 +22,7 @@ describe('FolderState', () => { a.ts {}`, events: [ ["tagged", "expanded", "true"], + ['tagged', 'selected', 'true'], ["untagged", "selected"], ] } @@ -71,7 +72,10 @@ describe('FolderState', () => { f.ts {"selected":"true"}`, events: [ ["tagged", "expanded", "true"], + ["tagged", "selected", "true"], ["untagged", "selected"], + ["tagged", "selected", "true"], + ["tagged", "selected", "true"], ["fileTagged", "f.ts", "selected", "true"], ] } diff --git a/web/src/Explorer/FolderState.ts b/web/src/Explorer/FolderState.ts index d366076..0c40c8d 100644 --- a/web/src/Explorer/FolderState.ts +++ b/web/src/Explorer/FolderState.ts @@ -9,6 +9,7 @@ export type Message = ['fileUntagged', string, string] export class FolderState { + /** the name of the folder */ name: string = '' /** the subfolders that live in this folder */ @@ -18,9 +19,17 @@ export class FolderState { /** the color of the folder */ color: string = 'white' /** tags for this folder */ - tags: Record = {} + private _tags: Record = {} + get tags (): Record { + return this._tags; + } + /** tags for each file, the first level is a file */ - fileTags: Record> = {} + private _fileTags: Record> = {} + get fileTags (): Record> { + return this._fileTags; + } + /** record for accessing nested tags in O(1) time */ private taggedFolders: Record> = {} private parent?: FolderState @@ -60,7 +69,7 @@ export class FolderState { } untag (tag: string) { - delete this.tags[tag] + delete this._tags[tag] if (this.parent !== undefined) { delete this.parent.taggedFolders[tag] } @@ -71,14 +80,14 @@ export class FolderState { for (const folder of this.taggedFolders[tag]?.values() ?? []) { this.folders.get(folder)?.untagAll(tag) } - for (const tags of Object.values(this.fileTags)) { + for (const tags of Object.values(this._fileTags)) { delete tags[tag] } this.untag(tag) } tag (tag: string, value: string) { - this.tags[tag] = value + this._tags[tag] = value if (this.parent !== undefined) { this.parent.taggedFolders[tag] ??= new Set() this.parent.taggedFolders[tag].add(this.name) @@ -88,22 +97,23 @@ export class FolderState { tagFile (file: string, tag: string, value: string) { if (this.files.has(file)) { - this.fileTags[file] ??= {} - this.fileTags[file][tag] = value + this._fileTags[file] ??= {} + this._fileTags[file][tag] = value this.notifyListeners(['fileTagged', file, tag, value]) } } tagRecursive (name: string[], tag: string, value: string) { if (name.length === 0) return + this.tag(tag, value) // eslint-disable-next-line @typescript-eslint/no-this-alias let folder: FolderState | undefined = this - for (const n of name.slice(0, name.length-1)) { + for (const n of name.slice(0, name.length - 1)) { folder = folder.folders.get(n) if (!folder) return folder.tag(tag, value) } - const last = name[name.length-1] + const last = name[name.length - 1] if (folder.files.has(last)) { folder.tagFile(last, tag, value) @@ -135,11 +145,11 @@ export class FolderState { render (lvl = 0): string { const stringBuilder: string[] = [] for (const [name, folder] of this.folders.entries()) { - stringBuilder.push(' '.repeat(lvl) + '> ' + name + " " + JSON.stringify(folder.tags)) + stringBuilder.push(' '.repeat(lvl) + '> ' + name + " " + JSON.stringify(folder._tags)) stringBuilder.push(folder.render(lvl + 1)) } for (const name of this.files.keys()) { - stringBuilder.push(' '.repeat(lvl) + name + " " +JSON.stringify(this.fileTags[name])) + stringBuilder.push(' '.repeat(lvl) + name + " " + JSON.stringify(this._fileTags[name])) } return stringBuilder.filter(_ => _.length > 0).join('\n') }