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

1"""Resource, table, form, and navigation default configurations.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass 

6from typing import Literal 

7 

8from lexigram.domain import DomainModel 

9from lexigram.validation import Field 

10 

11 

12@dataclass(init=False) 

13class ResourceDefaults(DomainModel): 

14 """Default configuration for all resources.""" 

15 

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) 

25 

26 model_config = {"extra": "forbid"} 

27 

28 

29@dataclass(init=False) 

30class TableDefaults(DomainModel): 

31 """Default configuration for DataTables.""" 

32 

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) 

40 

41 model_config = {"extra": "forbid"} 

42 

43 

44@dataclass(init=False) 

45class FormDefaults(DomainModel): 

46 """Default configuration for Forms.""" 

47 

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) 

53 

54 model_config = {"extra": "forbid"} 

55 

56 

57@dataclass(init=False) 

58class ResourceYAMLConfig(DomainModel): 

59 """Per-resource configuration from YAML.""" 

60 

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 

70 

71 model_config = {"extra": "allow"} 

72 

73 

74@dataclass(init=False) 

75class AdminNavigationGroup(DomainModel): 

76 """Navigation group configuration.""" 

77 

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) 

85 

86 model_config = {"extra": "forbid"}