42906efd90
- Cultivar/species detail pages rewritten with two-column card layout, attribute tables, em-dash placeholders
- Column toggle + per-page selector on all list pages (families, species, cultivars, suppliers)
- Species list: table/card view toggle with family, layer, N-fixer, uses columns
- Cultivar detail: supplier links with SKU/price/product URL, species info section
- Data sources page (/sources) with attribution for all 10 data sources
- Fixed Cultivar/Species structs with #[serde(default)] for API compatibility
- Added table_controls component (reusable column toggle + per-page selector)
- Removed max-width constraint on content area for full-width tables
- Fixed route conflicts: merged {slug}/{id} into single {ref} routes
- Removed PostgreSQL enum types (plant_layer, drought_tolerance, etc.) in favor of TEXT
- Fixed API per_page parameter support across all list endpoints
30 lines
1.1 KiB
SQL
30 lines
1.1 KiB
SQL
CREATE TABLE suppliers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
slug TEXT NOT NULL UNIQUE,
|
|
name TEXT NOT NULL,
|
|
url TEXT,
|
|
is_organic BOOLEAN NOT NULL DEFAULT FALSE,
|
|
is_demeter BOOLEAN NOT NULL DEFAULT FALSE,
|
|
country TEXT,
|
|
notes TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE cultivar_suppliers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
cultivar_id UUID NOT NULL REFERENCES cultivars(id) ON DELETE CASCADE,
|
|
supplier_id UUID NOT NULL REFERENCES suppliers(id) ON DELETE CASCADE,
|
|
article_number TEXT,
|
|
product_url TEXT,
|
|
price_eur DOUBLE PRECISION,
|
|
pack_size DOUBLE PRECISION,
|
|
pack_unit TEXT,
|
|
last_checked_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(cultivar_id, supplier_id, article_number)
|
|
);
|
|
|
|
CREATE INDEX idx_cs_cultivar ON cultivar_suppliers(cultivar_id);
|
|
CREATE INDEX idx_cs_supplier ON cultivar_suppliers(supplier_id);
|