diff --git a/docs/en/docs/reference/widget/input.md b/docs/en/docs/reference/widget/input.md index d5044ea..00a882d 100644 --- a/docs/en/docs/reference/widget/input.md +++ b/docs/en/docs/reference/widget/input.md @@ -30,12 +30,16 @@ Html email input. ## Json -Display a json editor widget. +Display a json editor widget, based on [jsoneditor](https://github.com/josdejong/jsoneditor). ## TextArea Html textarea input. +## Editor + +Based on [quilljs](https://github.com/quilljs/quill), display a rich editor input. + ## DateTime Html datetime input. diff --git a/examples/resources.py b/examples/resources.py index bda31ae..ebf0346 100644 --- a/examples/resources.py +++ b/examples/resources.py @@ -92,7 +92,7 @@ class Content(Dropdown): "is_reviewed", "type", Field(name="image", label="Image", display=displays.Image(width="40")), - "body", + Field(name="body", label='Body', input_=inputs.Editor()), "created_at", ] diff --git a/fastapi_admin/templates/widgets/inputs/editor.html b/fastapi_admin/templates/widgets/inputs/editor.html new file mode 100644 index 0000000..5e6c1a9 --- /dev/null +++ b/fastapi_admin/templates/widgets/inputs/editor.html @@ -0,0 +1,52 @@ + +
+ + +
+
+ {% if help_text %} + + {{ help_text }} + + {% endif %} +
+ + diff --git a/fastapi_admin/templates/widgets/inputs/select.html b/fastapi_admin/templates/widgets/inputs/select.html index 6db1f4b..cfac0dc 100644 --- a/fastapi_admin/templates/widgets/inputs/select.html +++ b/fastapi_admin/templates/widgets/inputs/select.html @@ -8,11 +8,13 @@ {% endif %} >{{ option[0] }} {% endfor %} + {% if help_text %} +
+ + {{ help_text }} + +
+ {% endif %} {% include "components/select.html" %} - {% if help_text %} - - {{ help_text }} - - {% endif %} {% endwith %} diff --git a/fastapi_admin/widgets/inputs.py b/fastapi_admin/widgets/inputs.py index 988a3d9..54f9949 100644 --- a/fastapi_admin/widgets/inputs.py +++ b/fastapi_admin/widgets/inputs.py @@ -15,7 +15,7 @@ class Input(Widget): template = "widgets/inputs/input.html" def __init__( - self, help_text: Optional[str] = None, default: Any = None, null: bool = False, **context + 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 @@ -44,12 +44,12 @@ class Text(Input): input_type: Optional[str] = "text" def __init__( - self, - help_text: Optional[str] = None, - 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, @@ -65,11 +65,11 @@ class Select(Input): template = "widgets/inputs/select.html" def __init__( - self, - help_text: Optional[str] = None, - default: Any = None, - null: bool = False, - disabled: bool = False, + 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) @@ -91,12 +91,12 @@ class Select(Input): class ForeignKey(Select): def __init__( - self, - model: Type[Model], - default: Any = None, - null: bool = False, - disabled: bool = False, - help_text: Optional[str] = None, + self, + model: Type[Model], + default: Any = None, + null: bool = False, + disabled: bool = False, + help_text: Optional[str] = None, ): super().__init__(help_text=help_text, default=default, null=null, disabled=disabled) self.model = model @@ -116,10 +116,10 @@ class ManyToMany(Select): template = "widgets/inputs/many_to_many.html" def __init__( - self, - model: Type[Model], - disabled: bool = False, - help_text: Optional[str] = None, + self, + model: Type[Model], + disabled: bool = False, + help_text: Optional[str] = None, ): super().__init__(help_text=help_text, disabled=disabled) self.model = model @@ -144,13 +144,13 @@ class ManyToMany(Select): class Enum(Select): def __init__( - self, - enum: Type[EnumCLS], - default: Any = None, - enum_type: Type = int, - null: bool = False, - disabled: bool = False, - help_text: Optional[str] = None, + self, + enum: Type[EnumCLS], + default: Any = None, + enum_type: Type = int, + null: bool = False, + disabled: bool = False, + help_text: Optional[str] = None, ): super().__init__(help_text=help_text, default=default, null=null, disabled=disabled) self.enum = enum @@ -174,10 +174,10 @@ class Json(Input): template = "widgets/inputs/json.html" def __init__( - self, - help_text: Optional[str] = None, - null: bool = False, - options: Optional[dict] = None, + self, + help_text: Optional[str] = None, + null: bool = False, + options: Optional[dict] = None, ): """ options config to jsoneditor, see https://github.com/josdejong/jsoneditor @@ -199,6 +199,10 @@ class TextArea(Text): input_type = "textarea" +class Editor(Text): + template = "widgets/inputs/editor.html" + + class DateTime(Text): input_type = "datetime" @@ -211,12 +215,12 @@ class File(Input): input_type = "file" def __init__( - self, - upload: FileUpload, - default: Any = None, - null: bool = False, - disabled: bool = False, - help_text: Optional[str] = None, + self, + upload: FileUpload, + default: Any = None, + null: bool = False, + disabled: bool = False, + help_text: Optional[str] = None, ): super().__init__( null=null, @@ -242,11 +246,11 @@ class Radio(Select): template = "widgets/inputs/radio.html" def __init__( - self, - options: List[Tuple[str, Any]], - help_text: Optional[str] = None, - default: Any = None, - disabled: bool = False, + 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