# --- Mock Data for Demo ---
MOCK_PRODUCTS = [
{"id": 1, "name": "MacBook Pro 16\"", "category": "Laptops", "price": 2499.00, "stock": 45, "status": "In Stock"},
{"id": 2, "name": "iPhone 15 Pro", "category": "Phones", "price": 999.00, "stock": 120, "status": "In Stock"},
{"id": 3, "name": "iPad Air", "category": "Tablets", "price": 599.00, "stock": 0, "status": "Out of Stock"},
{"id": 4, "name": "AirPods Pro", "category": "Audio", "price": 249.00, "stock": 200, "status": "In Stock"},
{"id": 5, "name": "Apple Watch Ultra", "category": "Wearables", "price": 799.00, "stock": 30, "status": "Low Stock"},
{"id": 6, "name": "Magic Keyboard", "category": "Accessories", "price": 299.00, "stock": 85, "status": "In Stock"},
{"id": 7, "name": "Studio Display", "category": "Monitors", "price": 1599.00, "stock": 12, "status": "Low Stock"},
{"id": 8, "name": "Mac Mini M2", "category": "Desktops", "price": 599.00, "stock": 60, "status": "In Stock"},
{"id": 9, "name": "HomePod Mini", "category": "Audio", "price": 99.00, "stock": 150, "status": "In Stock"},
{"id": 10, "name": "AirTag 4-Pack", "category": "Accessories", "price": 99.00, "stock": 0, "status": "Out of Stock"},
]
# Status chip styles
PRODUCT_STATUS_CLASSES = {
"In Stock": "chip small success",
"Low Stock": "chip small warning",
"Out of Stock": "chip small error"
}
# Column configuration with renderers and form config
product_columns = [
{
"key": "name",
"label": "Product",
"searchable": True,
"renderer": lambda v, row: Strong(v),
"form": {"type": "text", "required": True}
},
{
"key": "category",
"label": "Category",
"searchable": True,
"form": {
"type": "select",
"options": ["Laptops", "Phones", "Tablets", "Audio", "Wearables", "Accessories", "Monitors", "Desktops"]
}
},
{
"key": "price",
"label": "Price",
"renderer": lambda v, row: Span(f"${v:,.2f}", cls="bold"),
"form": {"type": "number", "min": 0, "step": 0.01}
},
{
"key": "stock",
"label": "Stock",
"renderer": lambda v, row: Span(str(v), cls=f"badge {'error' if v == 0 else 'warning' if v < 20 else 'success'}") if isinstance(v, int) else v,
"form": {"type": "number", "min": 0, "step": 1}
},
{
"key": "status",
"label": "Status",
"searchable": True,
"renderer": lambda v, row: Span(v, cls=PRODUCT_STATUS_CLASSES.get(v, "chip small")),
"form": {"type": "select", "options": ["In Stock", "Low Stock", "Out of Stock"]}
}
]
# --- In-memory store (simulates database) ---
DEMO_PRODUCTS = list(MOCK_PRODUCTS)
# All callbacks receive request as first parameter
def demo_get_all(req):
"""Get all products. In multi-tenant app: req.state.tenant_db.t.products()"""
return DEMO_PRODUCTS
def demo_get_by_id(req, id):
"""Get product by ID. In multi-tenant app: req.state.tenant_db.t.products[id]"""
return next((p for p in DEMO_PRODUCTS if p["id"] == id), None)
def demo_create(req, data):
"""Create product. In multi-tenant app: req.state.tenant_db.t.products.insert(data)"""
new_id = max(p["id"] for p in DEMO_PRODUCTS) + 1
record = {"id": new_id, **data}
DEMO_PRODUCTS.append(record)
return record
def demo_update(req, id, data):
"""Update product. In multi-tenant app: tbl.update({'id': id, **data})"""
for i, p in enumerate(DEMO_PRODUCTS):
if p["id"] == id:
DEMO_PRODUCTS[i] = {"id": id, **data}
return DEMO_PRODUCTS[i]
return None
def demo_delete(req, id):
"""Delete product. In multi-tenant app: req.state.tenant_db.t.products.delete(id)"""
global DEMO_PRODUCTS
DEMO_PRODUCTS = [p for p in DEMO_PRODUCTS if p["id"] != id]
return True
# --- DataTableResource: One object replaces ~100 lines of route handlers ---
products_resource = DataTableResource(
app=app,
base_route="/products",
columns=product_columns,
get_all=demo_get_all,
get_by_id=demo_get_by_id,
create=demo_create,
update=demo_update,
delete=demo_delete,
title="Products",
search_placeholder="Search products...",
create_label="Add Product",
space="no-space"
)
# --- Preview helper ---
def ex_products():
"""Preview the DataTableResource table."""
mock_req = type('MockRequest', (), {'query_params': {}, 'headers': {}})()
return products_resource._handle_table(mock_req)
preview(ex_products())