feat(shopping): tags sur les articles du catalogue

- Migration 006 : colonne tags TEXT[] sur shopping.products
- Modèle SQLAlchemy + schémas Pydantic mis à jour (ProductCreate/Update/Response)
- Interface TypeScript Product/ProductCreate/ProductUpdate avec tags?: string[]
- CatalogueModal : chip input (Entrée/virgule pour ajouter, clic pour supprimer, Backspace pour retirer le dernier)
- Recherche dans le catalogue et le bottom sheet étendue aux tags (insensible aux accents)
- Tags affichés en pills dans la liste du catalogue

v0.4.12

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 12:57:25 +02:00
parent 8e878e2e5a
commit aa9ac2a6ea
7 changed files with 123 additions and 8 deletions
@@ -0,0 +1,26 @@
"""Ajout colonne tags (TEXT[]) sur shopping.products
Revision ID: 006
Revises: 005
Create Date: 2026-05-25
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ARRAY
revision = '006'
down_revision = '005'
branch_labels = None
depends_on = None
def upgrade():
op.add_column(
'products',
sa.Column('tags', ARRAY(sa.Text()), nullable=True),
schema='shopping',
)
def downgrade():
op.drop_column('products', 'tags', schema='shopping')
+2 -1
View File
@@ -2,7 +2,7 @@ import uuid
from datetime import datetime, date
from decimal import Decimal
from sqlalchemy import String, Text, Integer, TIMESTAMP, Date, Numeric, Boolean, ForeignKey, text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.dialects.postgresql import UUID, ARRAY
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.database import Base
@@ -26,6 +26,7 @@ class Product(Base):
frequency_score: Mapped[int] = mapped_column(Integer, server_default=text("0"))
last_purchased_at: Mapped[date | None] = mapped_column(Date)
avg_interval_days: Mapped[Decimal | None] = mapped_column(Numeric(8, 1))
tags: Mapped[list[str] | None] = mapped_column(ARRAY(Text()), nullable=True)
owner_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True))
created_at: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=text("now()"))
+3
View File
@@ -40,6 +40,7 @@ class ProductCreate(BaseModel):
default_store_id: uuid.UUID | None = None
image_path: str | None = None
thumbnail_path: str | None = None
tags: list[str] | None = None
class ProductUpdate(BaseModel):
@@ -54,6 +55,7 @@ class ProductUpdate(BaseModel):
default_store_id: uuid.UUID | None = None
image_path: str | None = None
thumbnail_path: str | None = None
tags: list[str] | None = None
class ProductResponse(BaseModel):
@@ -73,6 +75,7 @@ class ProductResponse(BaseModel):
avg_interval_days: Decimal | None
image_path: str | None
thumbnail_path: str | None
tags: list[str] | None
class ListItemCreate(BaseModel):