diff --git a/.ai_agency/memory/backlog.json b/.ai_agency/memory/backlog.json index 62168f3..cb26464 100644 --- a/.ai_agency/memory/backlog.json +++ b/.ai_agency/memory/backlog.json @@ -138,5 +138,19 @@ "به‌روزرسانی sitemap.ts برای شامل شدن تمام slugs واقعی محصولات دیتابیس", "اعتبارسنجی فایل robots.ts برای موتورهای جستجو" ] + }, + { + "id": "TASK-111", + "title": "افزودن فیلتر محصولات در صفحه لیست مکمل‌ها بر اساس نسخه دامپزشکی و گروه‌بندی تخصصی", + "priority": "HIGH", + "assigned_role": "05_dev_frontend", + "status": "pending", + "max_file_count": 3, + "estimated_minutes": 15, + "dependency_task_ids": [], + "acceptance_criteria": [ + "افزودن فیلتر محصولات نیازمند نسخه در ArchivePage و SearchResultsPage", + "امکان فیلتر سریع مکمل‌های خانگی بدون نسخه در کنار مکمل‌های تجویزی" + ] } ] diff --git a/.ai_agency/memory/state.json b/.ai_agency/memory/state.json index f3343a5..7ea5149 100644 --- a/.ai_agency/memory/state.json +++ b/.ai_agency/memory/state.json @@ -1,11 +1,11 @@ { "project_name": "Canina Veterinary E-Commerce", "project_mode": "BROWNFIELD", - "status": "COMPLETED", + "status": "IN_PROGRESS", "checkpoint": { - "stage": "DEEP_ENGINEERING_PHASE_COMPLETED", - "active_agent": "06_qa_engineer", - "current_ticket_id": null, + "stage": "TASK_EXECUTION", + "active_agent": "05_dev_frontend", + "current_ticket_id": "TASK-111", "sub_step_index": 10, "total_sub_steps": 10 }, diff --git a/frontend/application/components/ArchivePage.tsx b/frontend/application/components/ArchivePage.tsx index 6cbb81a..99a9d64 100644 --- a/frontend/application/components/ArchivePage.tsx +++ b/frontend/application/components/ArchivePage.tsx @@ -229,6 +229,7 @@ export default function ArchivePage({ initialSymptoms?: string }) { const router = useRouter(); + const [prescriptionFilter, setPrescriptionFilter] = useState<"all" | "prescription" | "otc">("all"); const [selectedCategory, setSelectedCategory] = useState(initialCategory); const [selectedPet, setSelectedPet] = useState(initialPetType as any); const [activeSymptoms, setActiveSymptoms] = useState(initialSymptoms ? initialSymptoms.split(',') : []); @@ -343,6 +344,13 @@ export default function ArchivePage({ result = result.filter(p => p.symptoms && p.symptoms.some(s => activeSymptoms.includes(s))); } + // Filter by prescription requirement (OTC vs Prescription) + if (prescriptionFilter === "prescription") { + result = result.filter(p => p.requiresRx || p.category === "special-care"); + } else if (prescriptionFilter === "otc") { + result = result.filter(p => !p.requiresRx && p.category !== "special-care"); + } + setFilteredProducts(result); setMeta(res.meta); } catch (error) { @@ -355,7 +363,7 @@ export default function ArchivePage({ useEffect(() => { fetchProducts(); - }, [selectedCategory, selectedPet, searchQuery, activeSymptoms]); + }, [selectedCategory, selectedPet, searchQuery, activeSymptoms, prescriptionFilter]); const toggleSymptom = (s: string) => { setActiveSymptoms(prev => prev.includes(s) ? prev.filter(item => item !== s) : [...prev, s]); @@ -418,6 +426,27 @@ export default function ArchivePage({
+ {/* Prescription / Household Filter */} +
+ نوع دسترسی و نسخه +
+ {[ + { id: "all", label: "همه داروها و مکمل‌ها" }, + { id: "otc", label: "مکمل‌های خانگی (بدون نیاز به نسخه)" }, + { id: "prescription", label: "داروها و مکمل‌های تخصصی (با نسخه)" }, + ].map(type => ( + + ))} +
+
+ {/* Pet Type */}
نوع پت diff --git a/frontend/application/lib/data/products.ts b/frontend/application/lib/data/products.ts index dc6b604..d8f4806 100644 --- a/frontend/application/lib/data/products.ts +++ b/frontend/application/lib/data/products.ts @@ -50,6 +50,7 @@ export interface Product { symptoms: string[]; suitableFor: PetType; specialBadge?: string; + requiresRx?: boolean; contraindications?: string[]; onSetOfAction?: string; expectedResults?: { icon: string; text: string }[];