diff options
| author | Fuwn <[email protected]> | 2024-03-01 04:17:12 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-03-01 04:17:12 -0800 |
| commit | aa600b666ae733de8662f1c15cfcaebaa13dca06 (patch) | |
| tree | b9664dca1e5b6ec6b3c055dd441c411f9c7be3a9 /src | |
| parent | fix(AiringTime): round minutes (diff) | |
| download | due.moe-aa600b666ae733de8662f1c15cfcaebaa13dca06.tar.xz due.moe-aa600b666ae733de8662f1c15cfcaebaa13dca06.zip | |
feat(badges): migrate category mode
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/Database/userBadges.ts | 7 | ||||
| -rw-r--r-- | src/routes/api/badges/+server.ts | 11 | ||||
| -rw-r--r-- | src/routes/user/[user]/badges/+page.svelte | 67 |
3 files changed, 84 insertions, 1 deletions
diff --git a/src/lib/Database/userBadges.ts b/src/lib/Database/userBadges.ts index 1f4b5b5b..4ee47685 100644 --- a/src/lib/Database/userBadges.ts +++ b/src/lib/Database/userBadges.ts @@ -68,3 +68,10 @@ export const renameCategory = async (userId: number, oldName: string, newName: s export const removeAllUserBadges = async (userId: number) => await supabase.from('user_badges').delete().eq('user_id', userId); + +export const migrateCategory = async (userId: number, oldName: string, newName: string) => + await supabase + .from('user_badges') + .update({ category: newName }) + .eq('category', oldName) + .eq('user_id', userId); diff --git a/src/routes/api/badges/+server.ts b/src/routes/api/badges/+server.ts index 9cfc49fc..20777845 100644 --- a/src/routes/api/badges/+server.ts +++ b/src/routes/api/badges/+server.ts @@ -5,7 +5,8 @@ import { updateUserBadge, getUserBadges, addUserBadge, - type Badge + type Badge, + migrateCategory } from '$lib/Database/userBadges'; const unauthorised = new Response('Unauthorised', { status: 401 }); @@ -62,6 +63,14 @@ export const PUT = async ({ cookies, url, request }) => { ); return await badges(identity.id); + } else if (url.searchParams.get('migrate') || undefined) { + await migrateCategory( + identity.id, + url.searchParams.get('original') || '', + url.searchParams.get('new') || '' + ); + + return await badges(identity.id); } const badge = { diff --git a/src/routes/user/[user]/badges/+page.svelte b/src/routes/user/[user]/badges/+page.svelte index 03c9af50..ba02679c 100644 --- a/src/routes/user/[user]/badges/+page.svelte +++ b/src/routes/user/[user]/badges/+page.svelte @@ -49,6 +49,7 @@ let importCategory = ''; let importReplies = false; let badger: Partial<User>; + let migrateMode = false; // $: downloadDisabled = badgeCount > 20; @@ -376,6 +377,21 @@ importMode = false; importImages = undefined; }); + + const migrateCategory = () => { + badgesPromise = fetch( + `/api/badges?migrate=true&original=${encodeURIComponent( + (document.querySelector('#migrate_original') as HTMLInputElement).value + )}&new=${encodeURIComponent( + (document.querySelector('#migrate_new') as HTMLInputElement).value + )}`, + { + method: 'PUT' + } + ); + + migrateMode = false; + }; </script> <HeadTitle route={`${data.username}'s Badge Wall`} path={`/user/${data.username}`} /> @@ -490,6 +506,16 @@ ? $locale().user.badges.importMode.disable : $locale().user.badges.importMode.enable} </button> + <span style="margin: 0 0.625rem;">•</span> + <button + on:click={() => { + if (migrateMode) selectedBadge = undefined; + + migrateMode = !migrateMode; + }} + > + Migrate Category + </button> {#if editMode && isOwner} {@const groups = groupedBadges @@ -767,6 +793,47 @@ </Popup> {/if} +<Popup fullscreen onLeave={() => (migrateMode = false)} show={migrateMode}> + Migrate Category + + <p /> + + <input + type="text" + placeholder="Original Category" + id="migrate_original" + minlength="1" + maxlength="1000" + size="20" + /> + <input + type="text" + placeholder="New Category" + id="migrate_new" + minlength="1" + maxlength="1000" + size="20" + /> + <SettingHint lineBreak> + Leave original category empty to migrate all uncategorised badges. + </SettingHint> + + <p /> + + <button + on:click={() => { + importMode = false; + importImages = undefined; + }} + class="button-lined" + > + {$locale().user.badges.importMode.cancel} + </button> + <button on:click={() => migrateCategory()} class="button-lined" style="float: right;"> + Migrate + </button> +</Popup> + <style> /* body { margin: 0; |