onRowClick(row) : undefined}
- className={onRowClick ? 'cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800' : ''}
+ className={
+ onRowClick ? 'cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800' : ''
+ }
>
{columns.map((col) => (
- Edit Team ({boss?.pokemon.length ?? 0})
-
- ) : undefined}
+ headerExtra={
+ onEditTeam ? (
+
+ ) : undefined
+ }
>
diff --git a/frontend/src/components/admin/BossTeamEditor.tsx b/frontend/src/components/admin/BossTeamEditor.tsx
index 427263d..e21d955 100644
--- a/frontend/src/components/admin/BossTeamEditor.tsx
+++ b/frontend/src/components/admin/BossTeamEditor.tsx
@@ -38,7 +38,12 @@ function groupByVariant(boss: BossBattle): Variant[] {
}
if (map.size === 0) {
- return [{ label: null, pokemon: [{ pokemonId: null, pokemonName: '', level: '', order: 1 }] }]
+ return [
+ {
+ label: null,
+ pokemon: [{ pokemonId: null, pokemonName: '', level: '', order: 1 }],
+ },
+ ]
}
const variants: Variant[] = []
@@ -70,14 +75,24 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit
const addSlot = () => {
updateVariant(activeTab, (v) => ({
...v,
- pokemon: [...v.pokemon, { pokemonId: null, pokemonName: '', level: '', order: v.pokemon.length + 1 }],
+ pokemon: [
+ ...v.pokemon,
+ {
+ pokemonId: null,
+ pokemonName: '',
+ level: '',
+ order: v.pokemon.length + 1,
+ },
+ ],
}))
}
const removeSlot = (index: number) => {
updateVariant(activeTab, (v) => ({
...v,
- pokemon: v.pokemon.filter((_, i) => i !== index).map((item, i) => ({ ...item, order: i + 1 })),
+ pokemon: v.pokemon
+ .filter((_, i) => i !== index)
+ .map((item, i) => ({ ...item, order: i + 1 })),
}))
}
@@ -92,15 +107,22 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit
const name = newVariantName.trim()
if (!name) return
if (variants.some((v) => v.label === name)) return
- setVariants((prev) => [...prev, { label: name, pokemon: [{ pokemonId: null, pokemonName: '', level: '', order: 1 }] }])
+ setVariants((prev) => [
+ ...prev,
+ {
+ label: name,
+ pokemon: [{ pokemonId: null, pokemonName: '', level: '', order: 1 }],
+ },
+ ])
setActiveTab(variants.length)
setNewVariantName('')
setShowAddVariant(false)
}
const removeVariant = (tabIndex: number) => {
- if (variants[tabIndex].label === null) return
- if (!window.confirm(`Remove variant "${variants[tabIndex].label}"?`)) return
+ const variant = variants[tabIndex]
+ if (!variant || variant.label === null) return
+ if (!window.confirm(`Remove variant "${variant.label}"?`)) return
setVariants((prev) => prev.filter((_, i) => i !== tabIndex))
setActiveTab((prev) => Math.min(prev, variants.length - 2))
}
@@ -112,9 +134,11 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit
const conditionLabel = variants.length === 1 && variant.label === null ? null : variant.label
const validPokemon = variant.pokemon.filter((t) => t.pokemonId != null && t.level)
for (let i = 0; i < validPokemon.length; i++) {
+ const p = validPokemon[i]
+ if (!p?.pokemonId) continue
allPokemon.push({
- pokemonId: validPokemon[i].pokemonId!,
- level: Number(validPokemon[i].level),
+ pokemonId: p.pokemonId,
+ level: Number(p.level),
order: i + 1,
conditionLabel,
})
@@ -147,7 +171,10 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit
{v.label ?? 'Default'}
{v.label !== null && (
{ e.stopPropagation(); removeVariant(i) }}
+ onClick={(e) => {
+ e.stopPropagation()
+ removeVariant(i)
+ }}
className="ml-1.5 text-gray-400 hover:text-red-500 cursor-pointer"
title="Remove variant"
>
@@ -171,20 +198,38 @@ export function BossTeamEditor({ boss, onSave, onClose, isSaving }: BossTeamEdit
type="text"
value={newVariantName}
onChange={(e) => setNewVariantName(e.target.value)}
- onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); addVariant() } if (e.key === 'Escape') setShowAddVariant(false) }}
+ onKeyDown={(e) => {
+ if (e.key === 'Enter') {
+ e.preventDefault()
+ addVariant()
+ }
+ if (e.key === 'Escape') setShowAddVariant(false)
+ }}
placeholder="Variant name..."
className="px-2 py-1 text-sm border rounded dark:bg-gray-700 dark:border-gray-600 w-40"
autoFocus
/>
-
-
+
+
)}
|