From 303058d406aba73e957e59b91d1255e1eb213e7f Mon Sep 17 00:00:00 2001 From: Till JS Date: Sat, 25 Apr 2026 18:16:57 +0200 Subject: [PATCH] =?UTF-8?q?refactor(visibility):=20M6.1=20=E2=80=94=20drop?= =?UTF-8?q?=20legacy=20isPublic=20everywhere?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the deprecated `isPublic` field from picture, memoro, cards, presi, and uload. The unified `visibility` enum has been the source of truth since M3 (picture) / M6 (others) and the soft-fallback in queries was the last consumer of the legacy field. Killing it cleanly: - types: drops isPublic from LocalX + X interfaces, and from CreateDeckInput/UpdateDeckInput/UpdateDeckDto. - queries.ts: type converters now read `visibility ?? 'space'` (or 'private' for picture) without the isPublic fallback. Cards's `getPublicDecks` helper now filters on `visibility === 'public'`. - stores: createX no longer initializes isPublic; updateX no longer accepts/mirrors it; setVisibility no longer writes the mirror. - UI: cards CreateDeckModal drops the public-toggle (use the Picker in DetailView post-create); DeckCard + presi ListView + /cards/decks/[id] page badges read `visibility === 'public'`. - collections.ts: drops isPublic: false from seed rows. - embeds.ts: picture/memoro/cards/presi resolvers drop the isPublic fallback. Top comment updated to reference canEmbedOnWebsite as the canonical gate. Existing IndexedDB rows still carry the stale isPublic value but nothing reads it. No Dexie schema bump needed (field was never indexed). No data loss — visibility was mirrored on every flip during the soft-migrate window so all "public" intent has already propagated to the unified field. Closes M6.1 — picture/memoro/cards/presi/uload now have no legacy visibility flags. Events' isPublished/publicToken stays (orthogonal RSVP-snapshot system, not legacy). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../web/src/lib/modules/cards/collections.ts | 1 - .../cards/components/CreateDeckModal.svelte | 15 --------- .../modules/cards/components/DeckCard.svelte | 2 +- .../apps/web/src/lib/modules/cards/queries.ts | 5 ++- .../lib/modules/cards/stores/decks.svelte.ts | 20 +++--------- .../apps/web/src/lib/modules/cards/types.ts | 6 ---- .../lib/modules/cards/views/DetailView.svelte | 2 +- .../web/src/lib/modules/memoro/collections.ts | 1 - .../web/src/lib/modules/memoro/queries.ts | 7 +---- .../lib/modules/memoro/stores/memos.svelte.ts | 13 +++----- .../apps/web/src/lib/modules/memoro/types.ts | 10 ------ .../modules/memoro/views/DetailView.svelte | 2 +- .../web/src/lib/modules/picture/queries.ts | 6 ++-- .../modules/picture/stores/boards.svelte.ts | 3 +- .../apps/web/src/lib/modules/picture/types.ts | 11 ------- .../web/src/lib/modules/presi/ListView.svelte | 2 +- .../web/src/lib/modules/presi/collections.ts | 1 - .../apps/web/src/lib/modules/presi/queries.ts | 3 +- .../lib/modules/presi/stores/decks.svelte.ts | 10 +----- .../apps/web/src/lib/modules/presi/types.ts | 5 --- .../lib/modules/presi/views/DetailView.svelte | 2 +- .../web/src/lib/modules/uload/collections.ts | 3 -- .../apps/web/src/lib/modules/uload/queries.ts | 5 +-- .../apps/web/src/lib/modules/uload/types.ts | 6 ---- .../web/src/lib/modules/website/embeds.ts | 31 ++++++------------- .../(app)/cards/decks/[id]/+page.svelte | 2 +- 26 files changed, 32 insertions(+), 142 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/cards/collections.ts b/apps/mana/apps/web/src/lib/modules/cards/collections.ts index c7cd5daeb..76d635385 100644 --- a/apps/mana/apps/web/src/lib/modules/cards/collections.ts +++ b/apps/mana/apps/web/src/lib/modules/cards/collections.ts @@ -24,7 +24,6 @@ export const CARDS_GUEST_SEED = { description: 'Lerne Cards kennen mit diesen Beispiel-Karteikarten.', color: '#6366f1', cardCount: 3, - isPublic: false, }, ], cards: [ diff --git a/apps/mana/apps/web/src/lib/modules/cards/components/CreateDeckModal.svelte b/apps/mana/apps/web/src/lib/modules/cards/components/CreateDeckModal.svelte index d793c702a..04331d7fe 100644 --- a/apps/mana/apps/web/src/lib/modules/cards/components/CreateDeckModal.svelte +++ b/apps/mana/apps/web/src/lib/modules/cards/components/CreateDeckModal.svelte @@ -13,7 +13,6 @@ let title = $state(''); let description = $state(''); - let isPublic = $state(false); let color = $state(DEFAULT_COLOR); let submitting = $state(false); let selectedTagIds = $state([]); @@ -27,7 +26,6 @@ const deck = await deckStore.createDeck({ title: title.trim(), description: description.trim() || undefined, - isPublic, }); submitting = false; @@ -35,7 +33,6 @@ if (deck) { title = ''; description = ''; - isPublic = false; open = false; onClose?.(); } @@ -96,18 +93,6 @@ > -
- - -
-
Tags
{deck.cardCount || 0} Karten - {#if deck.isPublic} + {#if deck.visibility === 'public'} Öffentlich diff --git a/apps/mana/apps/web/src/lib/modules/cards/queries.ts b/apps/mana/apps/web/src/lib/modules/cards/queries.ts index 1743c40fd..5ecbd4741 100644 --- a/apps/mana/apps/web/src/lib/modules/cards/queries.ts +++ b/apps/mana/apps/web/src/lib/modules/cards/queries.ts @@ -18,8 +18,7 @@ export function toDeck(local: LocalDeck): Deck { title: local.name, description: local.description ?? undefined, color: local.color, - isPublic: local.isPublic ?? local.visibility === 'public', - visibility: local.visibility ?? (local.isPublic === true ? 'public' : 'space'), + visibility: local.visibility ?? 'space', tags: [], cardCount: local.cardCount, createdAt: local.createdAt ?? new Date().toISOString(), @@ -83,7 +82,7 @@ export function getDeckById(decks: Deck[], id: string): Deck | undefined { } export function getPublicDecks(decks: Deck[]): Deck[] { - return decks.filter((d) => d.isPublic); + return decks.filter((d) => d.visibility === 'public'); } export function getCardCountForDeck(cards: Card[], deckId: string): number { diff --git a/apps/mana/apps/web/src/lib/modules/cards/stores/decks.svelte.ts b/apps/mana/apps/web/src/lib/modules/cards/stores/decks.svelte.ts index bcf4d49cb..dcac530d6 100644 --- a/apps/mana/apps/web/src/lib/modules/cards/stores/decks.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/cards/stores/decks.svelte.ts @@ -28,17 +28,13 @@ export const deckStore = { async createDeck(input: CreateDeckInput): Promise { error = null; try { - const initialPublic = input.isPublic ?? false; const newLocal: LocalDeck = { id: crypto.randomUUID(), name: input.title, description: input.description ?? null, color: '#6366f1', cardCount: 0, - isPublic: initialPublic, - // Initialize the unified field too — if the create flow set - // isPublic, mirror it as 'public'; otherwise space-default. - visibility: initialPublic ? 'public' : defaultVisibilityFor(getActiveSpace()?.type), + visibility: defaultVisibilityFor(getActiveSpace()?.type), }; const plaintextSnapshot = toDeck(newLocal); @@ -59,12 +55,6 @@ export const deckStore = { const localUpdates: Partial = {}; if (updates.title !== undefined) localUpdates.name = updates.title; if (updates.description !== undefined) localUpdates.description = updates.description; - if (updates.isPublic !== undefined) { - // Legacy callers still pass isPublic — mirror to visibility - // so the unified field stays in sync until M6.1 hard-drop. - localUpdates.isPublic = updates.isPublic; - localUpdates.visibility = updates.isPublic ? 'public' : 'space'; - } const diff: Partial = { ...localUpdates, @@ -79,20 +69,18 @@ export const deckStore = { }, /** - * Flip a deck's visibility. M6 soft-migration: writes both - * `visibility` and the legacy `isPublic` mirror so the picker - * coexists with the older "public" badge UI until M6.1 hard-drop. + * Flip a deck's visibility. Public decks surface in the cards + * embed-resolver on the user's website. */ async setVisibility(id: string, next: VisibilityLevel) { const existing = await cardDeckTable.get(id); if (!existing) throw new Error(`Deck ${id} not found`); - const before: VisibilityLevel = existing.visibility ?? (existing.isPublic ? 'public' : 'space'); + const before: VisibilityLevel = existing.visibility ?? 'space'; if (before === next) return; const stamp = new Date().toISOString(); await cardDeckTable.update(id, { visibility: next, - isPublic: next === 'public', visibilityChangedAt: stamp, visibilityChangedBy: getEffectiveUserId(), updatedAt: stamp, diff --git a/apps/mana/apps/web/src/lib/modules/cards/types.ts b/apps/mana/apps/web/src/lib/modules/cards/types.ts index afc6829ca..be2d5aaeb 100644 --- a/apps/mana/apps/web/src/lib/modules/cards/types.ts +++ b/apps/mana/apps/web/src/lib/modules/cards/types.ts @@ -11,8 +11,6 @@ export interface LocalDeck extends BaseRecord { color: string; cardCount: number; lastStudied?: string | null; - /** @deprecated Use `visibility`. Mirror kept until M6.1 hard-drop. */ - isPublic: boolean; visibility?: VisibilityLevel; visibilityChangedAt?: string; visibilityChangedBy?: string; @@ -36,8 +34,6 @@ export interface Deck { title: string; description?: string; color: string; - /** @deprecated Use `visibility`. */ - isPublic: boolean; visibility: VisibilityLevel; tags: string[]; cardCount: number; @@ -61,13 +57,11 @@ export interface Card { export interface CreateDeckInput { title: string; description?: string; - isPublic?: boolean; } export interface UpdateDeckInput { title?: string; description?: string; - isPublic?: boolean; } export interface CreateCardInput { diff --git a/apps/mana/apps/web/src/lib/modules/cards/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/cards/views/DetailView.svelte index 9cfe6bb38..cacda7926 100644 --- a/apps/mana/apps/web/src/lib/modules/cards/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/cards/views/DetailView.svelte @@ -98,7 +98,7 @@
Sichtbarkeit deckStore.setVisibility(deckId, next)} disabledLevels={['unlisted']} /> diff --git a/apps/mana/apps/web/src/lib/modules/memoro/collections.ts b/apps/mana/apps/web/src/lib/modules/memoro/collections.ts index 4c63422f1..049cd0cf2 100644 --- a/apps/mana/apps/web/src/lib/modules/memoro/collections.ts +++ b/apps/mana/apps/web/src/lib/modules/memoro/collections.ts @@ -39,7 +39,6 @@ export const MEMORO_GUEST_SEED = { processingStatus: 'completed' as const, isArchived: false, isPinned: true, - isPublic: false, blueprintId: null, language: 'de', }, diff --git a/apps/mana/apps/web/src/lib/modules/memoro/queries.ts b/apps/mana/apps/web/src/lib/modules/memoro/queries.ts index 760208981..4de56d5a3 100644 --- a/apps/mana/apps/web/src/lib/modules/memoro/queries.ts +++ b/apps/mana/apps/web/src/lib/modules/memoro/queries.ts @@ -35,12 +35,7 @@ export function toMemo(local: LocalMemo): Memo { processingStatus: local.processingStatus, isArchived: local.isArchived, isPinned: local.isPinned, - isPublic: local.isPublic ?? local.visibility === 'public', - // Soft-fallback during M6 soak: legacy rows use isPublic, new - // writes set visibility directly. Keep both in sync via the - // store's setVisibility/setPublic methods until M6.1 drops the - // legacy field. - visibility: local.visibility ?? (local.isPublic === true ? 'public' : 'space'), + visibility: local.visibility ?? 'space', language: local.language, createdAt: local.createdAt ?? new Date().toISOString(), updatedAt: local.updatedAt ?? new Date().toISOString(), diff --git a/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts b/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts index 2c5523fa4..5ab2e1bf1 100644 --- a/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/memoro/stores/memos.svelte.ts @@ -45,7 +45,6 @@ export const memosStore = { processingStatus: data.processingStatus ?? (data.transcript ? 'completed' : 'pending'), isArchived: false, isPinned: false, - isPublic: false, visibility: defaultVisibilityFor(getActiveSpace()?.type), blueprintId: data.blueprintId ?? null, language: data.language ?? null, @@ -141,7 +140,7 @@ export const memosStore = { /** Update a memo's fields. */ async update( id: string, - data: Partial> + data: Partial> ) { const diff: Partial = { ...data, @@ -173,22 +172,18 @@ export const memosStore = { unarchive: (id: string) => memoArchive.unarchive(id), /** - * Flip a memo's visibility. M6 soft-migration: writes both - * `visibility` and the legacy `isPublic` mirror so older readers - * (search index, server snapshots) keep working until the M6.1 - * hard-drop. Public memos surface in the user's website embed - * once a memoro embed-resolver lands. + * Flip a memo's visibility. Public memos surface in the user's + * website embed via the memoro embed-resolver. */ async setVisibility(id: string, next: VisibilityLevel) { const existing = await memoTable.get(id); if (!existing) throw new Error(`Memo ${id} not found`); - const before: VisibilityLevel = existing.visibility ?? (existing.isPublic ? 'public' : 'space'); + const before: VisibilityLevel = existing.visibility ?? 'space'; if (before === next) return; const stamp = new Date().toISOString(); await memoTable.update(id, { visibility: next, - isPublic: next === 'public', visibilityChangedAt: stamp, visibilityChangedBy: getEffectiveUserId(), updatedAt: stamp, diff --git a/apps/mana/apps/web/src/lib/modules/memoro/types.ts b/apps/mana/apps/web/src/lib/modules/memoro/types.ts index 9ba9d810d..a51fd2cc0 100644 --- a/apps/mana/apps/web/src/lib/modules/memoro/types.ts +++ b/apps/mana/apps/web/src/lib/modules/memoro/types.ts @@ -16,14 +16,6 @@ export interface LocalMemo extends BaseRecord { processingStatus: ProcessingStatus; isArchived: boolean; isPinned: boolean; - /** - * @deprecated Soft-migrating to unified `visibility`. Kept for the - * soak window so the converter can fall back to `isPublic` for - * legacy rows that haven't been touched since the M6 rollout. - * Hard-drop once `visibility` has propagated to all rows. - */ - isPublic?: boolean; - /** Unified visibility (M6 pilot — replaces isPublic). */ visibility?: VisibilityLevel; visibilityChangedAt?: string; visibilityChangedBy?: string; @@ -95,8 +87,6 @@ export interface Memo { processingStatus: ProcessingStatus; isArchived: boolean; isPinned: boolean; - /** @deprecated Use `visibility`. Mirror kept until M6.1 hard-drop. */ - isPublic: boolean; visibility: VisibilityLevel; language: string | null; createdAt: string; diff --git a/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte index 4c4a0573c..44a9eba46 100644 --- a/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/memoro/views/DetailView.svelte @@ -194,7 +194,7 @@
Sichtbarkeit memosStore.setVisibility(memoId, next)} disabledLevels={['unlisted']} /> diff --git a/apps/mana/apps/web/src/lib/modules/picture/queries.ts b/apps/mana/apps/web/src/lib/modules/picture/queries.ts index e2bf198a8..81b96ef09 100644 --- a/apps/mana/apps/web/src/lib/modules/picture/queries.ts +++ b/apps/mana/apps/web/src/lib/modules/picture/queries.ts @@ -38,9 +38,7 @@ export function toImage(local: LocalImage): Image { height: local.height ?? undefined, fileSize: local.fileSize ?? undefined, blurhash: local.blurhash ?? undefined, - // Soft-migration fallback: rows written before M3 only have the - // legacy `isPublic` flag; map it to the nearest visibility level. - visibility: local.visibility ?? (local.isPublic === true ? 'public' : 'private'), + visibility: local.visibility ?? 'private', isFavorite: local.isFavorite, downloadCount: local.downloadCount, rating: local.rating ?? undefined, @@ -68,7 +66,7 @@ export function toBoard(local: LocalBoard): Board { canvasWidth: local.canvasWidth, canvasHeight: local.canvasHeight, backgroundColor: local.backgroundColor, - visibility: local.visibility ?? (local.isPublic === true ? 'public' : 'private'), + visibility: local.visibility ?? 'private', createdAt: local.createdAt ?? new Date().toISOString(), updatedAt: local.updatedAt ?? new Date().toISOString(), }; diff --git a/apps/mana/apps/web/src/lib/modules/picture/stores/boards.svelte.ts b/apps/mana/apps/web/src/lib/modules/picture/stores/boards.svelte.ts index 365ff25bb..275d05854 100644 --- a/apps/mana/apps/web/src/lib/modules/picture/stores/boards.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/picture/stores/boards.svelte.ts @@ -190,8 +190,7 @@ export const boardsStore = { try { const existing = await db.table('boards').get(id); if (!existing) return { success: false, error: 'Board not found' }; - const before: VisibilityLevel = - existing.visibility ?? (existing.isPublic === true ? 'public' : 'private'); + const before: VisibilityLevel = existing.visibility ?? 'private'; if (before === next) return { success: true }; const now = new Date().toISOString(); diff --git a/apps/mana/apps/web/src/lib/modules/picture/types.ts b/apps/mana/apps/web/src/lib/modules/picture/types.ts index 5436cbc6a..5dd19dd59 100644 --- a/apps/mana/apps/web/src/lib/modules/picture/types.ts +++ b/apps/mana/apps/web/src/lib/modules/picture/types.ts @@ -26,12 +26,6 @@ export interface LocalImage extends BaseRecord { height?: number | null; fileSize?: number | null; blurhash?: string | null; - /** - * @deprecated Use `visibility` instead. Kept for the soft-migration - * window — will be dropped in the hard follow-up once no reader - * references it. See docs/plans/visibility-system.md §M3. - */ - isPublic?: boolean; visibility?: VisibilityLevel; visibilityChangedAt?: string; visibilityChangedBy?: string; @@ -95,11 +89,6 @@ export interface LocalBoard extends BaseRecord { canvasWidth: number; canvasHeight: number; backgroundColor: string; - /** - * @deprecated Use `visibility` instead. Kept during the M3 soft - * migration — dropped in the hard follow-up. - */ - isPublic?: boolean; visibility?: VisibilityLevel; visibilityChangedAt?: string; visibilityChangedBy?: string; diff --git a/apps/mana/apps/web/src/lib/modules/presi/ListView.svelte b/apps/mana/apps/web/src/lib/modules/presi/ListView.svelte index 20d9c3ff5..d34e88b84 100644 --- a/apps/mana/apps/web/src/lib/modules/presi/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/presi/ListView.svelte @@ -110,7 +110,7 @@

{deck.title}

{slideCount(deck.id)} Folien - {#if deck.isPublic} + {#if deck.visibility === 'public'} Öffentlich {/if}
diff --git a/apps/mana/apps/web/src/lib/modules/presi/collections.ts b/apps/mana/apps/web/src/lib/modules/presi/collections.ts index 5b8bcdbaa..863701cca 100644 --- a/apps/mana/apps/web/src/lib/modules/presi/collections.ts +++ b/apps/mana/apps/web/src/lib/modules/presi/collections.ts @@ -22,7 +22,6 @@ export const PRESI_GUEST_SEED = { id: ONBOARDING_DECK_ID, title: 'Willkommen bei Presi', description: 'Eine kurze Einfuhrung in die Prasentations-App.', - isPublic: false, }, ], slides: [ diff --git a/apps/mana/apps/web/src/lib/modules/presi/queries.ts b/apps/mana/apps/web/src/lib/modules/presi/queries.ts index 57ec34211..a8b79559c 100644 --- a/apps/mana/apps/web/src/lib/modules/presi/queries.ts +++ b/apps/mana/apps/web/src/lib/modules/presi/queries.ts @@ -19,8 +19,7 @@ export function toDeck(local: LocalDeck): Deck { title: local.title, description: local.description ?? undefined, themeId: local.themeId ?? undefined, - isPublic: local.isPublic ?? local.visibility === 'public', - visibility: local.visibility ?? (local.isPublic === true ? 'public' : 'space'), + visibility: local.visibility ?? 'space', createdAt: local.createdAt ?? new Date().toISOString(), updatedAt: local.updatedAt ?? new Date().toISOString(), }; diff --git a/apps/mana/apps/web/src/lib/modules/presi/stores/decks.svelte.ts b/apps/mana/apps/web/src/lib/modules/presi/stores/decks.svelte.ts index 464d4b063..f01cecaa7 100644 --- a/apps/mana/apps/web/src/lib/modules/presi/stores/decks.svelte.ts +++ b/apps/mana/apps/web/src/lib/modules/presi/stores/decks.svelte.ts @@ -39,7 +39,6 @@ function createDecksStore() { title: dto.title, description: dto.description || null, themeId: dto.themeId || null, - isPublic: false, visibility: defaultVisibilityFor(getActiveSpace()?.type), }; const plaintextSnapshot = toDeck(newLocal); @@ -65,11 +64,6 @@ function createDecksStore() { if (dto.title !== undefined) localUpdates.title = dto.title; if (dto.description !== undefined) localUpdates.description = dto.description; if (dto.themeId !== undefined) localUpdates.themeId = dto.themeId; - if (dto.isPublic !== undefined) { - // Mirror to unified visibility during M6 soak. - localUpdates.isPublic = dto.isPublic; - localUpdates.visibility = dto.isPublic ? 'public' : 'space'; - } await encryptRecord('presiDecks', localUpdates); await presiDeckTable.update(id, localUpdates); @@ -85,13 +79,11 @@ function createDecksStore() { try { const existing = await presiDeckTable.get(id); if (!existing) return false; - const before: VisibilityLevel = - existing.visibility ?? (existing.isPublic ? 'public' : 'space'); + const before: VisibilityLevel = existing.visibility ?? 'space'; if (before === next) return true; const stamp = new Date().toISOString(); await presiDeckTable.update(id, { visibility: next, - isPublic: next === 'public', visibilityChangedAt: stamp, visibilityChangedBy: getEffectiveUserId(), updatedAt: stamp, diff --git a/apps/mana/apps/web/src/lib/modules/presi/types.ts b/apps/mana/apps/web/src/lib/modules/presi/types.ts index 20baf1c9c..c04b568d2 100644 --- a/apps/mana/apps/web/src/lib/modules/presi/types.ts +++ b/apps/mana/apps/web/src/lib/modules/presi/types.ts @@ -9,8 +9,6 @@ export interface LocalDeck extends BaseRecord { title: string; description?: string | null; themeId?: string | null; - /** @deprecated Use `visibility`. Mirror kept until M6.1 hard-drop. */ - isPublic: boolean; visibility?: VisibilityLevel; visibilityChangedAt?: string; visibilityChangedBy?: string; @@ -39,8 +37,6 @@ export interface Deck { title: string; description?: string; themeId?: string; - /** @deprecated Use `visibility`. */ - isPublic: boolean; visibility: VisibilityLevel; createdAt: string; updatedAt: string; @@ -66,7 +62,6 @@ export interface UpdateDeckDto { title?: string; description?: string; themeId?: string; - isPublic?: boolean; } export interface CreateSlideDto { diff --git a/apps/mana/apps/web/src/lib/modules/presi/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/presi/views/DetailView.svelte index f3ce9e82b..7ca523d9f 100644 --- a/apps/mana/apps/web/src/lib/modules/presi/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/presi/views/DetailView.svelte @@ -84,7 +84,7 @@
Sichtbarkeit decksStore.setVisibility(deckId, next)} disabledLevels={['unlisted']} /> diff --git a/apps/mana/apps/web/src/lib/modules/uload/collections.ts b/apps/mana/apps/web/src/lib/modules/uload/collections.ts index ff1f893ea..211677d71 100644 --- a/apps/mana/apps/web/src/lib/modules/uload/collections.ts +++ b/apps/mana/apps/web/src/lib/modules/uload/collections.ts @@ -87,7 +87,6 @@ export const ULOAD_GUEST_SEED = { slug: 'social-media', color: '#8b5cf6', icon: null, - isPublic: false, visibility: 'space', usageCount: 0, }, @@ -97,7 +96,6 @@ export const ULOAD_GUEST_SEED = { slug: 'dokumentation', color: '#3b82f6', icon: null, - isPublic: false, visibility: 'space', usageCount: 0, }, @@ -107,7 +105,6 @@ export const ULOAD_GUEST_SEED = { slug: 'marketing', color: '#10b981', icon: null, - isPublic: false, visibility: 'space', usageCount: 0, }, diff --git a/apps/mana/apps/web/src/lib/modules/uload/queries.ts b/apps/mana/apps/web/src/lib/modules/uload/queries.ts index 569704bd6..a3501abfb 100644 --- a/apps/mana/apps/web/src/lib/modules/uload/queries.ts +++ b/apps/mana/apps/web/src/lib/modules/uload/queries.ts @@ -42,8 +42,6 @@ export interface Tag { slug: string; color?: string; icon?: string; - /** @deprecated Use `visibility`. */ - isPublic: boolean; visibility: import('@mana/shared-privacy').VisibilityLevel; usageCount: number; createdAt: string; @@ -106,8 +104,7 @@ export function toTag(local: LocalTag): Tag { slug: local.slug, color: local.color ?? undefined, icon: local.icon ?? undefined, - isPublic: local.isPublic ?? local.visibility === 'public', - visibility: local.visibility ?? (local.isPublic === true ? 'public' : 'space'), + visibility: local.visibility ?? 'space', usageCount: local.usageCount, createdAt: local.createdAt ?? new Date().toISOString(), updatedAt: local.updatedAt ?? new Date().toISOString(), diff --git a/apps/mana/apps/web/src/lib/modules/uload/types.ts b/apps/mana/apps/web/src/lib/modules/uload/types.ts index 79a390e3d..70dbcd1fe 100644 --- a/apps/mana/apps/web/src/lib/modules/uload/types.ts +++ b/apps/mana/apps/web/src/lib/modules/uload/types.ts @@ -30,12 +30,6 @@ export interface LocalTag extends BaseRecord { slug: string; color?: string | null; icon?: string | null; - /** - * @deprecated Use `visibility`. Mirror kept for the M6 soak window. - * No active CRUD UI yet — the field is set only by seed data and - * the future tag-management view will write `visibility` directly. - */ - isPublic: boolean; visibility?: VisibilityLevel; usageCount: number; } diff --git a/apps/mana/apps/web/src/lib/modules/website/embeds.ts b/apps/mana/apps/web/src/lib/modules/website/embeds.ts index 60c2da77f..6e9f52247 100644 --- a/apps/mana/apps/web/src/lib/modules/website/embeds.ts +++ b/apps/mana/apps/web/src/lib/modules/website/embeds.ts @@ -9,10 +9,10 @@ import { formatDateTime } from '$lib/i18n/format'; * content. Trade-off: publishes are slightly slower, public visits are * much faster. * - * Every resolver MUST enforce the source's public-visibility rules — - * e.g. `picture.board.isPublic === true`. An owner who embeds a - * private board gets an empty result with a clear error message in the - * resolved.error field. + * Every resolver MUST enforce the source's public-visibility rules + * via `canEmbedOnWebsite(visibility)`. An owner who embeds a + * non-public record gets an empty result with a clear error message + * in the resolved.error field. */ import { db } from '$lib/data/database'; @@ -117,8 +117,7 @@ export async function resolveEmbed(props: ModuleEmbedProps): Promise { if (!props.sourceId) { @@ -134,8 +133,7 @@ async function resolvePictureBoard(props: ModuleEmbedProps): Promise { let memos = await db.table('memos').toArray(); memos = memos.filter( - (m) => - !m.deletedAt && - !m.isArchived && - canEmbedOnWebsite(m.visibility ?? (m.isPublic === true ? 'public' : 'private')) + (m) => !m.deletedAt && !m.isArchived && canEmbedOnWebsite(m.visibility ?? 'private') ); if (memos.length === 0) return []; @@ -853,11 +848,7 @@ async function resolveMemos(_props: ModuleEmbedProps): Promise { */ async function resolveCardDecks(_props: ModuleEmbedProps): Promise { let decks = await db.table('cardDecks').toArray(); - decks = decks.filter( - (d) => - !d.deletedAt && - canEmbedOnWebsite(d.visibility ?? (d.isPublic === true ? 'public' : 'private')) - ); + decks = decks.filter((d) => !d.deletedAt && canEmbedOnWebsite(d.visibility ?? 'private')); if (decks.length === 0) return []; @@ -886,11 +877,7 @@ async function resolveCardDecks(_props: ModuleEmbedProps): Promise */ async function resolvePresiDecks(_props: ModuleEmbedProps): Promise { let decks = await db.table('presiDecks').toArray(); - decks = decks.filter( - (d) => - !d.deletedAt && - canEmbedOnWebsite(d.visibility ?? (d.isPublic === true ? 'public' : 'private')) - ); + decks = decks.filter((d) => !d.deletedAt && canEmbedOnWebsite(d.visibility ?? 'private')); if (decks.length === 0) return []; diff --git a/apps/mana/apps/web/src/routes/(app)/cards/decks/[id]/+page.svelte b/apps/mana/apps/web/src/routes/(app)/cards/decks/[id]/+page.svelte index 5725f8290..dc837bf67 100644 --- a/apps/mana/apps/web/src/routes/(app)/cards/decks/[id]/+page.svelte +++ b/apps/mana/apps/web/src/routes/(app)/cards/decks/[id]/+page.svelte @@ -91,7 +91,7 @@
- {#if deck.isPublic} + {#if deck.visibility === 'public'} Offentlich