Files
pantry/app/pages/index.vue
Pantry Lead Agent d4d3d9390c
Some checks failed
Deploy to Coolify / Code Quality (pull_request) Has been cancelled
Deploy to Coolify / Run Tests (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Development (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Production (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Test (pull_request) Has been cancelled
Pull Request Checks / Validate PR (pull_request) Has been cancelled
feat: add TagManager and tag filtering (#30 #31)
Issue #30 - TagManager component:
- Create/delete tags with name, category, icon, color
- Color picker with hex input
- Organized display by category
- Integrated in settings page with tabs

Issue #31 - Tag filter for inventory:
- TagFilter component with multi-select
- Filter button in inventory header
- Active filter display with removable badges
- Filters items by selected tags (OR logic)
- Clean "Clear" button

Updates:
- Extended useTags composable with createTag, deleteTag
- Enhanced settings page with tab navigation
- Improved inventory filtering UX

Closes #30, #31
2026-02-24 00:07:37 +00:00

122 lines
2.9 KiB
Vue

<template>
<div>
<div class="flex items-center justify-between mb-6">
<h1 class="text-3xl font-bold text-gray-900">Inventory</h1>
<div class="flex gap-2">
<UButton
to="/scan"
color="primary"
size="lg"
icon="i-heroicons-qr-code"
>
Scan Item
</UButton>
<UButton
color="white"
size="lg"
icon="i-heroicons-plus"
@click="showAddForm = true"
>
Add Manually
</UButton>
<UButton
color="gray"
size="lg"
icon="i-heroicons-funnel"
@click="showFilters = !showFilters"
>
Filter
</UButton>
</div>
</div>
<!-- Tag Filters -->
<UCard v-if="showFilters" class="mb-6">
<TagsTagFilter v-model="selectedTagFilters" />
</UCard>
<!-- Add Item Form (Overlay) -->
<div v-if="showAddForm" class="fixed inset-0 z-50 flex items-start justify-center pt-20 px-4 bg-black/50">
<div class="w-full max-w-lg">
<AddItemForm
:initial-data="prefilledData"
@close="handleCloseAddForm"
@added="handleItemAdded"
/>
</div>
</div>
<!-- Edit Item Modal -->
<EditItemModal
:item="editingItem"
@close="editingItem = null"
@updated="handleItemUpdated"
/>
<!-- Inventory List -->
<InventoryList
ref="inventoryListRef"
:refresh="refreshKey"
:tag-filters="selectedTagFilters"
@add-item="showAddForm = true"
@edit-item="editingItem = $event"
/>
</div>
</template>
<script setup lang="ts">
definePageMeta({
layout: 'default'
})
const route = useRoute()
const router = useRouter()
const showAddForm = ref(false)
const showFilters = ref(false)
const editingItem = ref<any>(null)
const refreshKey = ref(0)
const inventoryListRef = ref()
const prefilledData = ref<any>(null)
const selectedTagFilters = ref<string[]>([])
// Handle scan-to-add flow (Issue #25)
onMounted(() => {
if (route.query.action === 'add') {
// Pre-fill data from query params (from scan)
prefilledData.value = {
barcode: route.query.barcode as string || undefined,
name: route.query.name as string || undefined,
brand: route.query.brand as string || undefined,
image_url: route.query.image_url as string || undefined,
quantity: route.query.quantity as string || undefined,
}
showAddForm.value = true
// Clean up URL
router.replace({ query: {} })
}
})
const handleCloseAddForm = () => {
showAddForm.value = false
prefilledData.value = null
}
const handleItemAdded = (item: any) => {
showAddForm.value = false
prefilledData.value = null
// Reload the inventory list
inventoryListRef.value?.reload()
}
const handleItemUpdated = (item: any) => {
editingItem.value = null
inventoryListRef.value?.reload()
}
</script>