diff --git a/fastapi_admin/templates/widgets/inputs/color.html b/fastapi_admin/templates/widgets/inputs/color.html new file mode 100644 index 0000000..a33f9a6 --- /dev/null +++ b/fastapi_admin/templates/widgets/inputs/color.html @@ -0,0 +1,10 @@ +
+ + + {% if help_text %} + + {{ help_text }} + + {% endif %} +
\ No newline at end of file diff --git a/fastapi_admin/widgets/inputs.py b/fastapi_admin/widgets/inputs.py index eb25d6b..0f9ea64 100644 --- a/fastapi_admin/widgets/inputs.py +++ b/fastapi_admin/widgets/inputs.py @@ -14,8 +14,10 @@ from fastapi_admin.widgets import Widget class Input(Widget): template = "widgets/inputs/input.html" - def __init__(self, default: Any = None, null: bool = False, **context): - super().__init__(null=null, **context) + def __init__( + self, help_text: Optional[str] = None, default: Any = None, null: bool = False, **context + ): + super().__init__(null=null, help_text=help_text, **context) self.default = default async def parse_value(self, request: Request, value: Any): @@ -42,7 +44,12 @@ class Text(Input): input_type: Optional[str] = "text" def __init__( - self, default: Any = None, null: bool = False, placeholder: str = "", disabled: bool = False + self, + help_text: Optional[str] = None, + default: Any = None, + null: bool = False, + placeholder: str = "", + disabled: bool = False, ): super().__init__( null=null, @@ -50,14 +57,21 @@ class Text(Input): input_type=self.input_type, placeholder=placeholder, disabled=disabled, + help_text=help_text, ) class Select(Input): template = "widgets/inputs/select.html" - def __init__(self, default: Any = None, null: bool = False, disabled: bool = False): - super().__init__(null=null, default=default, disabled=disabled) + def __init__( + self, + help_text: Optional[str] = None, + default: Any = None, + null: bool = False, + disabled: bool = False, + ): + super().__init__(help_text=help_text, null=null, default=default, disabled=disabled) @abc.abstractmethod async def get_options(self): @@ -82,8 +96,9 @@ class ForeignKey(Select): default: Any = None, null: bool = False, disabled: bool = False, + help_text: Optional[str] = None, ): - super().__init__(default=default, null=null, disabled=disabled) + super().__init__(help_text=help_text, default=default, null=null, disabled=disabled) self.model = model async def get_options(self): @@ -104,8 +119,9 @@ class ManyToMany(Select): self, model: Type[Model], disabled: bool = False, + help_text: Optional[str] = None, ): - super().__init__(disabled=disabled) + super().__init__(help_text=help_text, disabled=disabled) self.model = model async def get_options(self): @@ -134,8 +150,9 @@ class Enum(Select): enum_type: Type = int, null: bool = False, disabled: bool = False, + help_text: Optional[str] = None, ): - super().__init__(default=default, null=null, disabled=disabled) + super().__init__(help_text=help_text, default=default, null=null, disabled=disabled) self.enum = enum self.enum_type = enum_type @@ -156,12 +173,17 @@ class Email(Text): class Json(Input): template = "widgets/inputs/json.html" - def __init__(self, null: bool = False, options: Optional[dict] = None): + def __init__( + self, + help_text: Optional[str] = None, + null: bool = False, + options: Optional[dict] = None, + ): """ options config to jsoneditor, see https://github.com/josdejong/jsoneditor :param options: """ - super().__init__(null=null) + super().__init__(null=null, help_text=help_text) if not options: options = {} self.context.update(options=options) @@ -190,22 +212,25 @@ class File(Input): def __init__( self, - upload_provider: FileUpload, + upload: FileUpload, default: Any = None, null: bool = False, disabled: bool = False, + help_text: Optional[str] = None, ): super().__init__( null=null, default=default, input_type=self.input_type, disabled=disabled, + help_text=help_text, ) - self.upload_provider = upload_provider + self.upload = upload async def parse_value(self, request: Request, value: Optional[UploadFile]): - if value: - return await self.upload_provider.upload(value) + if value and value.filename: + return await self.upload.upload(value) + return "" class Image(File): @@ -215,8 +240,14 @@ class Image(File): class Radio(Select): template = "widgets/inputs/radio.html" - def __init__(self, options: List[Tuple[str, Any]], default: Any = None, disabled: bool = False): - super().__init__(default=default, disabled=disabled) + def __init__( + self, + options: List[Tuple[str, Any]], + help_text: Optional[str] = None, + default: Any = None, + disabled: bool = False, + ): + super().__init__(default=default, disabled=disabled, help_text=help_text) self.options = options async def get_options(self): @@ -242,3 +273,7 @@ class Password(Text): class Number(Text): input_type = "number" + + +class Color(Text): + template = "widgets/inputs/color.html"