Skip to content

Commit

Permalink
Introduce the concept of presets where each preset has its own initia…
Browse files Browse the repository at this point in the history
…lization script
  • Loading branch information
matthiask committed Dec 2, 2024
1 parent ba13447 commit 88fa608
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 21 deletions.
9 changes: 8 additions & 1 deletion django_prose_editor/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class ProseEditorField(models.TextField):
def __init__(self, *args, **kwargs):
self.sanitize = kwargs.pop("sanitize", _actually_empty)
self.config = kwargs.pop("config", {})
self.preset = kwargs.pop("preset", "default")
super().__init__(*args, **kwargs)

def clean(self, value, instance):
Expand All @@ -47,7 +48,11 @@ def deconstruct(self):
return (name, "django.db.models.TextField", args, kwargs)

def formfield(self, **kwargs):
defaults = {"config": self.config, "form_class": ProseEditorFormField} | kwargs
defaults = {
"config": self.config,
"form_class": ProseEditorFormField,
"preset": self.preset,
} | kwargs
return super().formfield(**defaults)


Expand All @@ -56,6 +61,7 @@ class ProseEditorFormField(forms.CharField):

def __init__(self, *args, **kwargs):
config = kwargs.pop("config", {})
preset = kwargs.pop("preset", "default")
widget = kwargs.get("widget")

# We don't know if widget is set, and if it is, we do not know if it is
Expand All @@ -74,3 +80,4 @@ def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)
self.widget.config = config
self.widget.preset = preset
2 changes: 1 addition & 1 deletion django_prose_editor/static/django_prose_editor/init.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 34 additions & 18 deletions django_prose_editor/widgets.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
import json

from django import forms
from django.conf import settings
from django.utils.translation import gettext
from js_asset.js import JS


def _get_presets():
presets = {
"default": {
"script": "django_prose_editor/init.js",
},
}
return presets | getattr(settings, "DJANGO_PROSE_EDITOR_PRESETS", {})


class ProseEditorWidget(forms.Textarea):
def __init__(self, *args, **kwargs):
self.config = kwargs.pop("config", {})
self.preset = kwargs.pop("preset", "default")
super().__init__(*args, **kwargs)

@property
Expand All @@ -24,21 +35,24 @@ def media(self):
"django_prose_editor/editor.js",
{"defer": True},
),
JS(
"django_prose_editor/init.js",
{
"defer": True,
"data-config": json.dumps(
{
"messages": {
"url": gettext("URL"),
"title": gettext("Title"),
"update": gettext("Update"),
"cancel": gettext("Cancel"),
},
}
),
},
*(
JS(
preset["script"],
{
"defer": True,
"data-config": json.dumps(
{
"messages": {
"url": gettext("URL"),
"title": gettext("Title"),
"update": gettext("Update"),
"cancel": gettext("Cancel"),
},
}
),
},
)
for key, preset in _get_presets().items()
),
],
)
Expand All @@ -53,9 +67,11 @@ def get_config(self):

def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
context["widget"]["attrs"]["data-django-prose-editor"] = json.dumps(
self.get_config(),
separators=(",", ":"),
context["widget"]["attrs"][f"data-django-prose-editor-{self.preset}"] = (
json.dumps(
self.get_config(),
separators=(",", ":"),
)
)
return context

Expand Down
2 changes: 1 addition & 1 deletion src/init.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
window.__proseEditor = JSON.parse(document.currentScript.dataset.config)

const marker = "data-django-prose-editor"
const marker = "data-django-prose-editor-default"

function createEditor(textarea) {
if (textarea.closest(".prose-editor")) return
Expand Down

0 comments on commit 88fa608

Please sign in to comment.