Coverage for src / lexigram / admin / forms / fields / _registry.py: 86%
35 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:14 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:14 +0800
1from __future__ import annotations
3from typing import Any
5from lexigram.admin.forms.fields._advanced import (
6 ColorField,
7 KeyValueField,
8 MarkdownField,
9 RichTextField,
10 TagsField,
11)
12from lexigram.admin.forms.fields._base import FieldType
13from lexigram.admin.forms.fields._text import (
14 BooleanField,
15 DateField,
16 IntegerField,
17 SelectField,
18 TextAreaField,
19 TextField,
20)
23class FieldRegistry:
24 """Registry for form field types and their corresponding UI widgets."""
26 _registry: dict[FieldType, Any] = {}
27 _custom_widgets: dict[str, Any] = {}
29 @classmethod
30 def register(cls, field_type: FieldType, widget: Any) -> None:
31 cls._registry[field_type] = widget
33 @classmethod
34 def register_custom(cls, name: str, widget: Any) -> None:
35 cls._custom_widgets[name] = widget
37 @classmethod
38 def get_widget(
39 cls,
40 field_type: FieldType,
41 custom_name: str | None = None,
42 ) -> Any:
43 if custom_name and custom_name in cls._custom_widgets:
44 return cls._custom_widgets[custom_name]
45 return cls._registry.get(field_type)
47 @classmethod
48 def has_type(cls, field_type: FieldType) -> bool:
49 return field_type in cls._registry
52FieldRegistry.register(FieldType.TEXT, TextField)
53FieldRegistry.register(FieldType.NUMBER, IntegerField)
54FieldRegistry.register(FieldType.EMAIL, TextField)
55FieldRegistry.register(FieldType.PASSWORD, TextField)
56FieldRegistry.register(FieldType.CHECKBOX, BooleanField)
57FieldRegistry.register(FieldType.SELECT, SelectField)
58FieldRegistry.register(FieldType.DATE, DateField)
59FieldRegistry.register(FieldType.TEXTAREA, TextAreaField)
60FieldRegistry.register(FieldType.RICH_TEXT, RichTextField)
61FieldRegistry.register(FieldType.MARKDOWN, MarkdownField)
62FieldRegistry.register(FieldType.COLOR, ColorField)
63FieldRegistry.register(FieldType.TAGS, TagsField)
64FieldRegistry.register(FieldType.KEY_VALUE, KeyValueField)