Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions src/stores/categories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@ function getScoreFromCategory(c: Category, allCats: Category[]): number {
}
}

// Normalize URL-encoded category segments (e.g. "Work%20Project" → "Work Project").
// Route query params can arrive encoded while category names are stored decoded.
function normalizeSegments(cat: string[]): string[] {
return (cat || []).map(segment => {
try {
return decodeURIComponent(segment);
} catch {
return segment;
}
});
}

export const useCategoryStore = defineStore('categories', {
state: (): State => ({
classes: [],
Expand Down Expand Up @@ -99,12 +111,12 @@ export const useCategoryStore = defineStore('categories', {
},
get_category_color() {
return (cat: string[]): string => {
return getColorFromCategory(this.get_category(cat), this.classes);
return getColorFromCategory(this.get_category(normalizeSegments(cat)), this.classes);
};
},
get_category_score() {
return (cat: string[]): number => {
return getScoreFromCategory(this.get_category(cat), this.classes);
return getScoreFromCategory(this.get_category(normalizeSegments(cat)), this.classes);
};
},
category_select() {
Expand Down
32 changes: 32 additions & 0 deletions test/unit/store/categories.test.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,36 @@ describe('categories store', () => {
1
);
});

test('get_category_color decodes URL-encoded category segments', () => {
categoryStore.load([
{
name: ['Work Project'],
rule: { type: 'regex', regex: 'work-project' },
data: { color: '#123456' },
} as Category,
]);

const decoded = categoryStore.get_category_color(['Work Project']);
const encoded = categoryStore.get_category_color(['Work%20Project']);

expect(decoded).toEqual('#123456');
expect(encoded).toEqual('#123456');
});

test('get_category_score decodes URL-encoded category segments', () => {
categoryStore.load([
{
name: ['Work Project'],
rule: { type: 'regex', regex: 'work-project' },
data: { score: 42 },
} as Category,
]);

const decoded = categoryStore.get_category_score(['Work Project']);
const encoded = categoryStore.get_category_score(['Work%20Project']);

expect(decoded).toEqual(42);
expect(encoded).toEqual(42);
});
});
Loading