add View in Database menu item for admins

This commit is contained in:
Justin Edmund 2025-12-23 12:59:39 -08:00
parent a6f7d92b99
commit 268ece6e96
6 changed files with 53 additions and 0 deletions

View file

@ -25,6 +25,7 @@
"extra_weapons": "Additional Weapons",
"context_view_details": "View Details",
"context_view_in_database": "View in Database",
"context_replace": "Replace",
"context_remove": "Remove",

View file

@ -25,6 +25,7 @@
"extra_weapons": "追加武器",
"context_view_details": "詳細を見る",
"context_view_in_database": "データベースで見る",
"context_replace": "交換",
"context_remove": "削除",

View file

@ -3,22 +3,26 @@
interface MenuItemsProps {
onViewDetails?: (() => void) | undefined
onViewInDatabase?: (() => void) | undefined
onReplace?: (() => void) | undefined
onRemove?: (() => void | Promise<void>) | undefined
canEdit?: boolean | undefined
variant?: 'context' | 'dropdown'
viewDetailsLabel?: string | undefined
viewInDatabaseLabel?: string | undefined
replaceLabel?: string | undefined
removeLabel?: string | undefined
}
let {
onViewDetails,
onViewInDatabase,
onReplace,
onRemove,
canEdit = false,
variant = 'context',
viewDetailsLabel = 'View Details',
viewInDatabaseLabel = 'View in Database',
replaceLabel = 'Replace',
removeLabel = 'Remove'
}: MenuItemsProps = $props()
@ -36,6 +40,12 @@
</Item>
{/if}
{#if onViewInDatabase}
<Item class={itemClass} onclick={onViewInDatabase}>
{viewInDatabaseLabel}
</Item>
{/if}
{#if canEdit}
{#if onReplace}
<Item class={itemClass} onclick={onReplace}>

View file

@ -2,6 +2,8 @@
import type { GridCharacter } from '$lib/types/api/party'
import type { Party } from '$lib/types/api/party'
import { getContext } from 'svelte'
import { page } from '$app/stores'
import { goto } from '$app/navigation'
import Icon from '$lib/components/Icon.svelte'
import UnitMenuContainer from '$lib/components/ui/menu/UnitMenuContainer.svelte'
import MenuItems from '$lib/components/ui/menu/MenuItems.svelte'
@ -128,6 +130,14 @@
}
}
function viewInDatabase() {
if (!item?.character?.granblueId) return
goto(`/database/characters/${item.character.granblueId}`)
}
// Check if user can view database (role >= 7)
let canViewDatabase = $derived(($page.data.account?.role ?? 0) >= 7)
async function togglePerpetuity(e: Event) {
e.stopPropagation()
if (!item?.id || !ctx?.canEdit()) return
@ -224,11 +234,13 @@
{#snippet contextMenu()}
<MenuItems
onViewDetails={viewDetails}
onViewInDatabase={canViewDatabase ? viewInDatabase : undefined}
onReplace={ctx?.canEdit() ? replace : undefined}
onRemove={ctx?.canEdit() ? remove : undefined}
canEdit={ctx?.canEdit()}
variant="context"
viewDetailsLabel={m.context_view_details()}
viewInDatabaseLabel={m.context_view_in_database()}
replaceLabel={m.context_replace()}
removeLabel={m.context_remove()}
/>
@ -237,11 +249,13 @@
{#snippet dropdownMenu()}
<MenuItems
onViewDetails={viewDetails}
onViewInDatabase={canViewDatabase ? viewInDatabase : undefined}
onReplace={ctx?.canEdit() ? replace : undefined}
onRemove={ctx?.canEdit() ? remove : undefined}
canEdit={ctx?.canEdit()}
variant="dropdown"
viewDetailsLabel={m.context_view_details()}
viewInDatabaseLabel={m.context_view_in_database()}
replaceLabel={m.context_replace()}
removeLabel={m.context_remove()}
/>

View file

@ -2,6 +2,8 @@
import type { GridSummon } from '$lib/types/api/party'
import type { Party } from '$lib/types/api/party'
import { getContext } from 'svelte'
import { page } from '$app/stores'
import { goto } from '$app/navigation'
import Icon from '$lib/components/Icon.svelte'
import UnitMenuContainer from '$lib/components/ui/menu/UnitMenuContainer.svelte'
import MenuItems from '$lib/components/ui/menu/MenuItems.svelte'
@ -102,6 +104,13 @@
}
}
function viewInDatabase() {
if (!item?.summon?.granblueId) return
goto(`/database/summons/${item.summon.granblueId}`)
}
// Check if user can view database (role >= 7)
let canViewDatabase = $derived(($page.data.account?.role ?? 0) >= 7)
</script>
@ -134,11 +143,13 @@
{#snippet contextMenu()}
<MenuItems
onViewDetails={viewDetails}
onViewInDatabase={canViewDatabase ? viewInDatabase : undefined}
onReplace={ctx?.canEdit() ? replace : undefined}
onRemove={ctx?.canEdit() ? remove : undefined}
canEdit={ctx?.canEdit()}
variant="context"
viewDetailsLabel={m.context_view_details()}
viewInDatabaseLabel={m.context_view_in_database()}
replaceLabel={m.context_replace()}
removeLabel={m.context_remove()}
/>
@ -147,11 +158,13 @@
{#snippet dropdownMenu()}
<MenuItems
onViewDetails={viewDetails}
onViewInDatabase={canViewDatabase ? viewInDatabase : undefined}
onReplace={ctx?.canEdit() ? replace : undefined}
onRemove={ctx?.canEdit() ? remove : undefined}
canEdit={ctx?.canEdit()}
variant="dropdown"
viewDetailsLabel={m.context_view_details()}
viewInDatabaseLabel={m.context_view_in_database()}
replaceLabel={m.context_replace()}
removeLabel={m.context_remove()}
/>

View file

@ -2,6 +2,8 @@
import type { GridWeapon } from '$lib/types/api/party'
import type { Party } from '$lib/types/api/party'
import { getContext } from 'svelte'
import { page } from '$app/stores'
import { goto } from '$app/navigation'
import Icon from '$lib/components/Icon.svelte'
import UnitMenuContainer from '$lib/components/ui/menu/UnitMenuContainer.svelte'
import MenuItems from '$lib/components/ui/menu/MenuItems.svelte'
@ -135,6 +137,14 @@
ctx.openPicker({ type: 'weapon', position, item })
}
}
function viewInDatabase() {
if (!item?.weapon?.granblueId) return
goto(`/database/weapons/${item.weapon.granblueId}`)
}
// Check if user can view database (role >= 7)
let canViewDatabase = $derived(($page.data.account?.role ?? 0) >= 7)
</script>
<div
@ -193,11 +203,13 @@
{#snippet contextMenu()}
<MenuItems
onViewDetails={viewDetails}
onViewInDatabase={canViewDatabase ? viewInDatabase : undefined}
onReplace={ctx?.canEdit() ? replace : undefined}
onRemove={ctx?.canEdit() ? remove : undefined}
canEdit={ctx?.canEdit()}
variant="context"
viewDetailsLabel={m.context_view_details()}
viewInDatabaseLabel={m.context_view_in_database()}
replaceLabel={m.context_replace()}
removeLabel={m.context_remove()}
/>
@ -206,11 +218,13 @@
{#snippet dropdownMenu()}
<MenuItems
onViewDetails={viewDetails}
onViewInDatabase={canViewDatabase ? viewInDatabase : undefined}
onReplace={ctx?.canEdit() ? replace : undefined}
onRemove={ctx?.canEdit() ? remove : undefined}
canEdit={ctx?.canEdit()}
variant="dropdown"
viewDetailsLabel={m.context_view_details()}
viewInDatabaseLabel={m.context_view_in_database()}
replaceLabel={m.context_replace()}
removeLabel={m.context_remove()}
/>