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 @@
+
+
+
+
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