Coverage for src/lexigram/admin/config/defaults.py: 40%
55 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:31 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:31 +0800
1"""Resource, table, form, and navigation default configurations."""
3from __future__ import annotations
5from dataclasses import dataclass
6from typing import Literal
8from lexigram.domain import DomainModel
9from lexigram.validation import Field
12@dataclass(init=False)
13class ResourceDefaults(DomainModel):
14 """Default configuration for all resources."""
16 per_page: int = Field(default=20, ge=1, le=1000)
17 enable_search: bool = Field(default=True)
18 enable_export: bool = Field(default=True)
19 enable_bulk_actions: bool = Field(default=True)
20 action_layout: Literal["horizontal", "vertical", "dropdown"] = Field(
21 default="horizontal",
22 )
23 soft_delete: bool = Field(default=True)
24 timestamp_fields: bool = Field(default=True)
26 model_config = {"extra": "forbid"}
29@dataclass(init=False)
30class TableDefaults(DomainModel):
31 """Default configuration for DataTables."""
33 reorderable_columns: bool = Field(default=False)
34 enable_column_visibility: bool = Field(default=True)
35 sticky_header: bool = Field(default=True)
36 virtualized: bool = Field(default=False)
37 row_height: int = Field(default=48, ge=24, le=120)
38 zebra_stripes: bool = Field(default=True)
39 hover_highlight: bool = Field(default=True)
41 model_config = {"extra": "forbid"}
44@dataclass(init=False)
45class FormDefaults(DomainModel):
46 """Default configuration for Forms."""
48 show_required_indicator: bool = Field(default=True)
49 autosave_enabled: bool = Field(default=False)
50 autosave_interval_ms: int = Field(default=30000, ge=1000)
51 confirm_unsaved_changes: bool = Field(default=True)
52 inline_validation: bool = Field(default=True)
54 model_config = {"extra": "forbid"}
57@dataclass(init=False)
58class ResourceYAMLConfig(DomainModel):
59 """Per-resource configuration from YAML."""
61 enabled: bool = Field(default=True)
62 icon: str | None = None
63 label: str | None = None
64 label_plural: str | None = None
65 per_page: int | None = Field(default=None, ge=1, le=1000)
66 searchable_fields: list[str] | None = None
67 default_sort: str | None = None
68 default_sort_order: Literal["asc", "desc"] = "desc"
69 permissions: dict[str, list[str]] | None = None
71 model_config = {"extra": "allow"}
74@dataclass(init=False)
75class AdminNavigationGroup(DomainModel):
76 """Navigation group configuration."""
78 label: str
79 icon: str | None = None
80 order: int = Field(default=100, ge=0)
81 resources: list[str] = Field(default_factory=list)
82 permission: str | None = None
83 collapsible: bool = Field(default=True)
84 collapsed_by_default: bool = Field(default=False)
86 model_config = {"extra": "forbid"}