-
Import Loot Profile
-
-
-
-
+
+
+
+
+ Import loot profile
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
-
+
-
+
+
+
diff --git a/frontend/src/views/admin/PluginConfigsView.vue b/frontend/src/views/admin/PluginConfigsView.vue
index 99ab898..919e08e 100644
--- a/frontend/src/views/admin/PluginConfigsView.vue
+++ b/frontend/src/views/admin/PluginConfigsView.vue
@@ -11,19 +11,13 @@ import { useFurnaceSplitterStore } from '@/stores/furnacesplitter'
import { useBetterChatStore } from '@/stores/betterchat'
import { useTimedExecuteStore } from '@/stores/timedexecute'
import { useRaidableBasesStore } from '@/stores/raidablebases'
-import {
- Crosshair,
- Navigation2,
- Pickaxe,
- DoorOpen,
- Gift,
- Flame,
- MessageSquare,
- Clock,
- Swords,
- Search,
- ArrowRight,
-} from 'lucide-vue-next'
+
+import Panel from '@/components/ds/data/Panel.vue'
+import Button from '@/components/ds/core/Button.vue'
+import Icon from '@/components/ds/core/Icon.vue'
+import Badge from '@/components/ds/core/Badge.vue'
+import Input from '@/components/ds/forms/Input.vue'
+import EmptyState from '@/components/ds/feedback/EmptyState.vue'
const router = useRouter()
const auth = useAuthStore()
@@ -45,7 +39,7 @@ interface PluginDef {
key: string
name: string
description: string
- icon: any
+ icon: string
path: string
permission: string
getConfigs: () => any[]
@@ -53,15 +47,15 @@ interface PluginDef {
}
const plugins: PluginDef[] = [
- { key: 'loot', name: 'Loot Tables', description: 'Configure loot container drop tables and item probabilities', icon: Crosshair, path: '/loot-builder', permission: 'loot.view', getConfigs: () => lootStore.profiles, fetchFn: () => lootStore.fetchProfiles() },
- { key: 'teleport', name: 'Teleport', description: 'Home locations, TPR cooldowns, and VIP teleport settings', icon: Navigation2, path: '/teleport-config', permission: 'teleport.view', getConfigs: () => teleportStore.configs, fetchFn: () => teleportStore.fetchConfigs() },
- { key: 'gather', name: 'Gather Rates', description: 'Resource gathering multipliers and pickup rates', icon: Pickaxe, path: '/gather-manager', permission: 'gather.view', getConfigs: () => gatherStore.configs, fetchFn: () => gatherStore.fetchConfigs() },
- { key: 'autodoors', name: 'Auto Doors', description: 'Automatic door closing delays and permissions', icon: DoorOpen, path: '/autodoors', permission: 'autodoors.view', getConfigs: () => autoDoorsStore.configs, fetchFn: () => autoDoorsStore.fetchConfigs() },
- { key: 'kits', name: 'Kits', description: 'Player kits with items, cooldowns, and permissions', icon: Gift, path: '/kits', permission: 'kits.view', getConfigs: () => kitsStore.configs, fetchFn: () => kitsStore.fetchConfigs() },
- { key: 'furnacesplitter', name: 'Furnace Splitter', description: 'Automatic furnace ore splitting and smelting config', icon: Flame, path: '/furnace-splitter', permission: 'furnacesplitter.view', getConfigs: () => furnaceSplitterStore.configs, fetchFn: () => furnaceSplitterStore.fetchConfigs() },
- { key: 'betterchat', name: 'Better Chat', description: 'Chat formatting, group colors, and title prefixes', icon: MessageSquare, path: '/better-chat', permission: 'betterchat.view', getConfigs: () => betterChatStore.configs, fetchFn: () => betterChatStore.fetchConfigs() },
- { key: 'timedexecute', name: 'Timed Execute', description: 'Scheduled, real-time, and event-driven command execution', icon: Clock, path: '/timed-execute', permission: 'timedexecute.view', getConfigs: () => timedExecuteStore.configs, fetchFn: () => timedExecuteStore.fetchConfigs() },
- { key: 'raidablebases', name: 'Raidable Bases', description: 'PVE raid events, difficulty, NPCs, and loot settings', icon: Swords, path: '/raidable-bases', permission: 'raidablebases.view', getConfigs: () => raidableBasesStore.configs, fetchFn: () => raidableBasesStore.fetchConfigs() },
+ { key: 'loot', name: 'Loot tables', description: 'Configure loot container drop tables and item probabilities', icon: 'crosshair', path: '/loot-builder', permission: 'loot.view', getConfigs: () => lootStore.profiles, fetchFn: () => lootStore.fetchProfiles() },
+ { key: 'teleport', name: 'Teleport', description: 'Home locations, TPR cooldowns, and VIP teleport settings', icon: 'navigation', path: '/teleport-config', permission: 'teleport.view', getConfigs: () => teleportStore.configs, fetchFn: () => teleportStore.fetchConfigs() },
+ { key: 'gather', name: 'Gather rates', description: 'Resource gathering multipliers and pickup rates', icon: 'pickaxe', path: '/gather-manager', permission: 'gather.view', getConfigs: () => gatherStore.configs, fetchFn: () => gatherStore.fetchConfigs() },
+ { key: 'autodoors', name: 'Auto doors', description: 'Automatic door closing delays and permissions', icon: 'door-open', path: '/autodoors', permission: 'autodoors.view', getConfigs: () => autoDoorsStore.configs, fetchFn: () => autoDoorsStore.fetchConfigs() },
+ { key: 'kits', name: 'Kits', description: 'Player kits with items, cooldowns, and permissions', icon: 'gift', path: '/kits', permission: 'kits.view', getConfigs: () => kitsStore.configs, fetchFn: () => kitsStore.fetchConfigs() },
+ { key: 'furnacesplitter', name: 'Furnace splitter', description: 'Automatic furnace ore splitting and smelting config', icon: 'flame', path: '/furnace-splitter', permission: 'furnacesplitter.view', getConfigs: () => furnaceSplitterStore.configs, fetchFn: () => furnaceSplitterStore.fetchConfigs() },
+ { key: 'betterchat', name: 'Better Chat', description: 'Chat formatting, group colors, and title prefixes', icon: 'message-square', path: '/better-chat', permission: 'betterchat.view', getConfigs: () => betterChatStore.configs, fetchFn: () => betterChatStore.fetchConfigs() },
+ { key: 'timedexecute', name: 'Timed Execute', description: 'Scheduled, real-time, and event-driven command execution', icon: 'clock', path: '/timed-execute', permission: 'timedexecute.view', getConfigs: () => timedExecuteStore.configs, fetchFn: () => timedExecuteStore.fetchConfigs() },
+ { key: 'raidablebases', name: 'Raidable Bases', description: 'PVE raid events, difficulty, NPCs, and loot settings', icon: 'swords', path: '/raidable-bases', permission: 'raidablebases.view', getConfigs: () => raidableBasesStore.configs, fetchFn: () => raidableBasesStore.fetchConfigs() },
]
const visiblePlugins = computed(() =>
@@ -76,12 +70,12 @@ const filteredPlugins = computed(() => {
)
})
-function getStatus(plugin: PluginDef): { label: string; color: string } {
+function getStatus(plugin: PluginDef): { label: string; tone: 'online' | 'info' | 'neutral' } {
const configs = plugin.getConfigs()
- if (!configs || configs.length === 0) return { label: 'Not Configured', color: 'neutral' }
+ if (!configs || configs.length === 0) return { label: 'Not configured', tone: 'neutral' }
const hasActive = configs.some((c: any) => c.is_active)
- if (hasActive) return { label: 'Active', color: 'green' }
- return { label: 'Configured', color: 'blue' }
+ if (hasActive) return { label: 'Active', tone: 'online' }
+ return { label: 'Configured', tone: 'info' }
}
function getConfigCount(plugin: PluginDef): string {
@@ -90,6 +84,12 @@ function getConfigCount(plugin: PluginDef): string {
return `${configs.length} profile${configs.length !== 1 ? 's' : ''}`
}
+// Search model — DS Input uses string v-model
+const searchModel = computed
({
+ get: () => searchQuery.value,
+ set: (v: string | undefined) => { searchQuery.value = v ?? '' },
+})
+
onMounted(async () => {
const fetches = visiblePlugins.value.map(p => p.fetchFn().catch(() => {}))
await Promise.all(fetches)
@@ -98,88 +98,142 @@ onMounted(async () => {
-
-
-
-
Plugin Configs
-
Configure and manage your server plugins
+
+
+
+
+
+
+
+
+
Plugin management
+
Plugin configs
+
+
-
-
-
-
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
-
{{ plugin.name }}
-
{{ getConfigCount(plugin) }}
+
{{ plugin.name }}
+
{{ getConfigCount(plugin) }}
-
-
- {{ getStatus(plugin).label }}
-
+
{{ getStatus(plugin).label }}
-
{{ plugin.description }}
+
+
{{ plugin.description }}
-
-
-
-
No plugins match your search.
-
+
+
+
+
+
+
diff --git a/frontend/src/views/admin/RaidableBasesView.vue b/frontend/src/views/admin/RaidableBasesView.vue
index afb43fa..7b12a36 100644
--- a/frontend/src/views/admin/RaidableBasesView.vue
+++ b/frontend/src/views/admin/RaidableBasesView.vue
@@ -1,18 +1,12 @@
-
-
-
-
Raidable Bases
-
-
-
- New Config
-
+
+
+
+
+
+
+
+
+
Plugin config
+
Raidable bases
+
+
+
+ New config
-
-
-
+
-
-
+
+
+
+
+ Loading config…
+
+
-
-
-
-
No Raidable Bases Config Selected
-
Create a new config, import from server, or select one from the dropdown above.
-
+
+
- Create First Config
-
-
+
+ Create first config
+
+
+
-
-
-
-
-
-
- {{ tab.label }}
-
-
+
+
+
+
-
-
-
-
Maintained Events
-
Maintained events keep a set number of raid bases on the map at all times. When one is cleared, a new one spawns.
-
-
-
-
-
-
-
Keep spawning bases to maintain the max count
+
+
+
+
+
+
+
Always maintain max events
+
Keep spawning bases to maintain the max count
-
-
-
+
-
-
-
-
-
-
Spawn PVE bases during daytime
+
+
+
Include PVE day
+
Spawn PVE bases during daytime
-
-
-
+
-
-
-
-
-
-
Spawn PVP bases during daytime
+
+
+
Include PVP day
+
Spawn PVP bases during daytime
-
-
-
+
-
-
-
-
-
-
Spawn PVE bases during nighttime
+
+
+
Include PVE night
+
Spawn PVE bases during nighttime
-
-
-
+
-
-
-
-
Maximum number of raid bases on map at once
+
+
-
-
-
Minimum players required before bases spawn
+
+
-
-
-
Chance to randomly spawn PVP bases (0-100)
+
+
+
+
+
+
+
+
+
+
+
Enabled
+
Enable scheduled event spawns
+
+
+
+
+
+
Include PVP day
+
Spawn PVP scheduled bases during day
+
+
-
-
-
-
Scheduled Events
-
Scheduled events spawn raid bases at random intervals. Configure timing and limits below.
-
-
-
-
-
-
-
Enable scheduled event spawns
-
-
-
-
-
-
-
-
-
-
-
Spawn PVP scheduled bases during day
-
-
-
-
-
-
-
-
-
-
-
Minimum time between spawns
+
+
-
-
-
Maximum time between spawns
+
+
-
-
-
Maximum concurrent scheduled bases
+
+
-
-
-
Required players for scheduled events
+
+
+
-
+
-
-
General Settings
-
-
-
-
-
-
-
Use Expansion Mode for spawning calculations
+
+
+
+
+
Expansion mode
+
Use expansion mode for spawning calculations
-
-
-
+
-
-
-
-
-
-
Show base coordinates in chat announcements
+
+