From ab36dbd31a8a1e53cb2d4ce226dde43cd7321424 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sat, 25 Apr 2026 20:46:26 -0400 Subject: [PATCH] feat(ext/popup): wire Document type into form + detail + list dispatchers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document is no longer 'coming soon' — the type chooser unlocks it, form dispatcher routes to documentType.renderForm, detail dispatcher routes to documentType.renderDetail. teardown chains include documentType. Co-Authored-By: Claude Opus 4.7 (1M context) --- extension/src/popup/components/item-detail.ts | 4 +++- extension/src/popup/components/item-form.ts | 4 +++- extension/src/popup/components/item-list.ts | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/extension/src/popup/components/item-detail.ts b/extension/src/popup/components/item-detail.ts index 9e1b199..e4f7349 100644 --- a/extension/src/popup/components/item-detail.ts +++ b/extension/src/popup/components/item-detail.ts @@ -10,6 +10,7 @@ import * as identity from './types/identity'; import * as card from './types/card'; import * as key from './types/key'; import * as totp from './types/totp'; +import * as documentType from './types/document'; export async function renderItemDetail(app: HTMLElement): Promise { // Tear down any tickers/handlers from a previous detail render before @@ -21,6 +22,7 @@ export async function renderItemDetail(app: HTMLElement): Promise { card.teardown(); key.teardown(); totp.teardown(); + documentType.teardown(); const item = getState().selectedItem; if (!item) { navigate('list'); return; } @@ -32,7 +34,7 @@ export async function renderItemDetail(app: HTMLElement): Promise { case 'card': return card.renderDetail(app, item); case 'key': return key.renderDetail(app, item); case 'totp': return totp.renderDetail(app, item); - case 'document': return renderComingSoon(app, item); + case 'document': return documentType.renderDetail(app, item); } } diff --git a/extension/src/popup/components/item-form.ts b/extension/src/popup/components/item-form.ts index 97dab1b..2176a9b 100644 --- a/extension/src/popup/components/item-form.ts +++ b/extension/src/popup/components/item-form.ts @@ -9,6 +9,7 @@ import * as identity from './types/identity'; import * as card from './types/card'; import * as key from './types/key'; import * as totp from './types/totp'; +import * as documentType from './types/document'; export function renderItemForm(app: HTMLElement, mode: 'add' | 'edit'): void { login.teardown(); // detail-view's ticker/listener don't leak into form @@ -17,6 +18,7 @@ export function renderItemForm(app: HTMLElement, mode: 'add' | 'edit'): void { card.teardown(); key.teardown(); totp.teardown(); + documentType.teardown(); const state = getState(); const existing = mode === 'edit' ? state.selectedItem : null; const type: ItemType = existing?.type ?? state.newType ?? 'login'; @@ -28,7 +30,7 @@ export function renderItemForm(app: HTMLElement, mode: 'add' | 'edit'): void { case 'card': return card.renderForm(app, mode, existing); case 'key': return key.renderForm(app, mode, existing); case 'totp': return totp.renderForm(app, mode, existing); - case 'document': return renderComingSoon(app, type); + case 'document': return documentType.renderForm(app, mode, existing); } } diff --git a/extension/src/popup/components/item-list.ts b/extension/src/popup/components/item-list.ts index 75820fd..18b21cf 100644 --- a/extension/src/popup/components/item-list.ts +++ b/extension/src/popup/components/item-list.ts @@ -233,7 +233,7 @@ const NEW_TYPE_OPTIONS: Array<{ type: ItemType; icon: string; label: string; dis { type: 'card', icon: '💳', label: 'card' }, { type: 'key', icon: '🗝', label: 'key' }, { type: 'totp', icon: '⏱', label: 'totp' }, - { type: 'document', icon: '📄', label: 'document', disabled: true, tooltip: 'coming in γ — needs attachment upload' }, + { type: 'document', icon: '📄', label: 'document' }, ]; function showNewTypePicker(anchor: HTMLElement): void {