feat(web): English paths, and a portfolio that updates itself

/cartera, /explorar and /p/:key/proponer are /portfolio, /explore and
/p/:key/propose now, like every other path; the Spanish ones redirect,
so links already shared keep working. Settings sections go by
?section= with English names.

The portfolio reads itself again, quietly, when a ticket, sprint or
release of the projects shown changes, when my projects change, or when
the live connection comes back; «En directo» replaces the refresh
button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 22:15:32 +02:00
parent 9044690348
commit d0efaeba80
22 changed files with 150 additions and 66 deletions

View File

@@ -3,7 +3,7 @@ import { GO_TO, isTyping, projectKeyIn } from './shortcuts';
describe('shortcuts', () => {
it('knows the project of a URL', () => {
expect(projectKeyIn('/p/WEB/issues/WEB-3')).toBe('WEB');
expect(projectKeyIn('/explorar')).toBeNull();
expect(projectKeyIn('/explore')).toBeNull();
expect(GO_TO['k']).toEqual({ path: 'backlog', inProject: true });
});

View File

@@ -20,7 +20,7 @@ export const SHORTCUTS: { keys: string; what: string; where: string }[] = [
/** Where `g` + key goes; project pages are relative to `/p/KEY`. */
export const GO_TO: Record<string, { path: string; inProject: boolean }> = {
p: { path: '/', inProject: false },
e: { path: '/explorar', inProject: false },
e: { path: '/explore', inProject: false },
b: { path: 'board', inProject: true },
k: { path: 'backlog', inProject: true },
s: { path: 'sprints', inProject: true },