aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-03-01 04:17:12 -0800
committerFuwn <[email protected]>2024-03-01 04:17:12 -0800
commitaa600b666ae733de8662f1c15cfcaebaa13dca06 (patch)
treeb9664dca1e5b6ec6b3c055dd441c411f9c7be3a9 /src
parentfix(AiringTime): round minutes (diff)
downloaddue.moe-aa600b666ae733de8662f1c15cfcaebaa13dca06.tar.xz
due.moe-aa600b666ae733de8662f1c15cfcaebaa13dca06.zip
feat(badges): migrate category mode
Diffstat (limited to 'src')
-rw-r--r--src/lib/Database/userBadges.ts7
-rw-r--r--src/routes/api/badges/+server.ts11
-rw-r--r--src/routes/user/[user]/badges/+page.svelte67
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;