Skip to content

Commit

Permalink
Add inline editing for CharFields
Browse files Browse the repository at this point in the history
  • Loading branch information
fsbraun committed Sep 16, 2024
1 parent 087c99b commit 2137744
Show file tree
Hide file tree
Showing 10 changed files with 302 additions and 56 deletions.
35 changes: 34 additions & 1 deletion djangocms_text/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,40 @@ class TextConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"

def ready(self):
register(check_ckeditor_settings)
register(check_ckeditor_settings)

from django.contrib.admin import site

registered_inline_fields = ["HTMLField", "CharField"]
inline_models = {}
blacklist_apps = ["auth", "admin", "sessions", "contenttypes", "sites", "cms", "djangocms_text", "djangocms_alias"]
for model, modeladmin in site._registry.items():
if model._meta.app_label in blacklist_apps:
continue
try:
form = modeladmin.get_form(request=None) # Worth a try
except Exception:
form = getattr(modeladmin, "form", None)
if form:
for field_name, field_instance in form.base_fields.items():
if field_instance.__class__.__name__ in registered_inline_fields:
inline_models[
f"{model._meta.app_label}-{model._meta.model_name}-{field_name}"
] = field_instance.__class__.__name__

from cms.plugin_pool import plugin_pool
for plugin in plugin_pool.plugins.values():
model = plugin.model
if model._meta.app_label in blacklist_apps:
continue
form = plugin.form
for field_name, field_instance in form.base_fields.items():
if field_instance.__class__.__name__ in registered_inline_fields:
inline_models[
f"{model._meta.app_label}-{model._meta.model_name}-{field_name}"
] = field_instance.__class__.__name__

self.inline_models = inline_models


def check_ckeditor_settings(app_configs, **kwargs):
Expand Down
20 changes: 17 additions & 3 deletions djangocms_text/cms_toolbars.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from urllib.parse import urlparse, urlunparse

from django.apps import apps
from django.forms import forms
from django.http import QueryDict
from django.templatetags.static import static
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _

from cms.cms_toolbars import CMSToolbar
from cms.toolbar.items import Button, ButtonList
from cms.toolbar.items import Button, ButtonList, TemplateItem
from cms.toolbar_pool import toolbar_pool

from . import settings
Expand Down Expand Up @@ -51,20 +52,33 @@ def inline_editing(self):
return inline_editing

def populate(self):
if self.toolbar.edit_mode_active:
if self.toolbar.edit_mode_active or self.toolbar.structure_mode_active:
item = ButtonList(side=self.toolbar.RIGHT)
item.add_item(
IconButton(
name=_("Toggle inline editing mode for text plugins"),
url=self.get_full_path_with_param(
"inline_editing", int(not self.inline_editing)
),
).replace("/structure/","/edit/"),
active=self.inline_editing,
extra_classes=["cms-icon cms-icon-pencil"],
),
)
self.toolbar.add_item(item)

config = settings.CKEDITOR_SETTINGS # TODO: Change to TEXT_EDITOR_SETTINGS
if "toolbar_HTMLField" in config:
config["toolbar"] = config["toolbar_HTMLField"]
item = TemplateItem(
"cms/toolbar/config.html",
extra_context={
"html_field_config": config,
"allowed_inlines": apps.get_app_config("djangocms_text").inline_models,
},
side=self.toolbar.RIGHT,
)
self.toolbar.add_item(item)

def get_full_path_with_param(self, key, value):
"""
Adds key=value to the query parameters, replacing an existing key if necessary
Expand Down
12 changes: 12 additions & 0 deletions djangocms_text/contrib/text_tinymce/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from djangocms_text.editors import RTEConfig


tinymce = RTEConfig(
name="tinymce",
config="TINYMCE",
js=(
"https://cdn.tiny.cloud/1/no-api-key/tinymce/7/tinymce.min.js",
"djangocms_text/bundles/bundle.tinymce.min.js",
),
css={"all": ("djangocms_text/css/cms.tinymce.css",)},
)
2 changes: 2 additions & 0 deletions djangocms_text/templates/cms/toolbar/config.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{% if html_field_config %}{{ html_field_config|json_script:"cms-cfg-htmlfield-inline-config" }}{% endif %}
{% if allowed_inlines %}{{ allowed_inlines|json_script:"cms-generic-inline-fields" }}{% endif %}
11 changes: 8 additions & 3 deletions private/js/cms.ckeditor5.js
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,10 @@ class CMSCKEditor5Plugin {

// returns the edited html code
getHTML (el) {
return this._editors[el.id].getData();
if (el.id in this._editors) {
return this._editors[el.id].getData();
}
return undefined;
}

// returns the edited content as json
Expand All @@ -231,8 +234,10 @@ class CMSCKEditor5Plugin {

// destroy the editor
destroyEditor (el) {
this._editors[el.id].destroy();
delete this._editors[el.id];
if (el.id in this._editors) {
this._editors[el.id].destroy();
delete this._editors[el.id];
}
}

_init() {
Expand Down
2 changes: 1 addition & 1 deletion private/js/cms.dialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

class CmsDialog {
/**
* Constructor for creating an instance of the class whowing a django CMS modal in a
* Constructor for creating an instance of the class showing a django CMS modal in a
* modal HTML dialog element to show a plugin admin form in an iframe.
*
* The django CMS modal is resizable (thanks to CSS) and movable. It cannot be
Expand Down
Loading

0 comments on commit 2137744

Please sign in to comment.