Skip to content

Commit 6a6ee2a

Browse files
authored
fix: Dropped django-select2 dependency (#197)
1 parent 7b97985 commit 6a6ee2a

File tree

25 files changed

+438
-462
lines changed

25 files changed

+438
-462
lines changed

CHANGELOG.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22
Changelog
33
=========
44

5+
1.3.0 (2024-03-21)
6+
==================
7+
8+
* feat: Add abstract base model `AbstractFrontendUIItem` by @fsbraun in https://github.com/django-cms/djangocms-frontend/pull/195
9+
* feat: Add icons for selected text-enabled plugins by @fsbraun in https://github.com/django-cms/djangocms-frontend/pull/195
10+
* fix: Correct site used when using Link plugin within a static placholder in django CMS 3.x by @fsbraun
11+
* fix: removed Nav Container plugin and fixed Navigation Link plugin by @fsbraun in https://github.com/django-cms/djangocms-frontend/pull/192
12+
* fix: Remove `{% spaceless %}` around `{% block "content" %}` by @fsbraun in https://github.com/django-cms/djangocms-frontend/pull/188
13+
* fix: Improved fieldset layout for Django 4.2+ by @fsbraun in https://github.com/django-cms/djangocms-frontend/pull/185
14+
* fix: Dropped django-select2 dependency
15+
16+
517
1.2.2 (2024-01-13)
618
==================
719

djangocms_frontend/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919
13. Github actions will publish the new package to pypi
2020
"""
2121

22-
__version__ = "1.2.2"
22+
__version__ = "1.3.0"

djangocms_frontend/contrib/link/forms.py

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
import json
2+
from types import SimpleNamespace
3+
14
from django import apps, forms
25
from django.conf import settings as django_settings
3-
from django.contrib.admin.widgets import SELECT2_TRANSLATIONS
6+
from django.contrib.admin.widgets import SELECT2_TRANSLATIONS, AutocompleteMixin
47
from django.contrib.contenttypes.models import ContentType
58
from django.contrib.sites.models import Site
69
from django.core.exceptions import ObjectDoesNotExist, ValidationError
710
from django.db import models
811
from django.db.models.fields.related import ManyToOneRel
12+
from django.urls import reverse
913
from django.utils.encoding import force_str
1014
from django.utils.translation import get_language
1115
from django.utils.translation import gettext as _
12-
from django_select2.forms import HeavySelect2Widget, Select2Widget
1316

1417
# from djangocms_link.validators import IntranetURLValidator
1518
from entangled.forms import EntangledModelForm
@@ -56,30 +59,9 @@ def __init__(self, *args, **kwargs):
5659
)
5760

5861

59-
class Select2jqWidget(HeavySelect2Widget if MINIMUM_INPUT_LENGTH else Select2Widget):
60-
"""Make jQuery available to Select2 widget"""
61-
62+
class Select2jqWidget(AutocompleteMixin, forms.Select):
6263
empty_label = _("Select a destination")
6364

64-
@property
65-
def media(self):
66-
extra = ".min"
67-
i18n_name = SELECT2_TRANSLATIONS.get(get_language())
68-
i18n_file = (
69-
("admin/js/vendor/select2/i18n/%s.js" % i18n_name,) if i18n_name else ()
70-
)
71-
return forms.Media(
72-
js=("admin/js/vendor/select2/select2.full%s.js" % extra,)
73-
+ i18n_file
74-
+ ("djangocms_frontend/js/django_select2.js",),
75-
css={
76-
"screen": (
77-
"admin/css/vendor/select2/select2%s.css" % extra,
78-
"djangocms_frontend/css/select2.css",
79-
),
80-
},
81-
)
82-
8365
def __init__(self, *args, **kwargs):
8466
if MINIMUM_INPUT_LENGTH:
8567
if "attrs" in kwargs:
@@ -88,9 +70,52 @@ def __init__(self, *args, **kwargs):
8870
)
8971
else:
9072
kwargs["attrs"] = {"data-minimum-input-length": MINIMUM_INPUT_LENGTH}
91-
kwargs.setdefault("data_view", "dcf_autocomplete:ac_view")
73+
kwargs.setdefault("admin_site", None)
74+
kwargs.setdefault(
75+
"field",
76+
SimpleNamespace(name="", model=SimpleNamespace(
77+
_meta=SimpleNamespace(app="djangocms_frontend", label="link")
78+
))
79+
) # Fake field properties for autocomplete field (unused by link)
9280
super().__init__(*args, **kwargs)
9381

82+
def get_url(self):
83+
return reverse("dcf_autocomplete:ac_view")
84+
85+
def build_attrs(self, base_attrs, extra_attrs=None):
86+
"""
87+
Set select2's AJAX attributes.
88+
89+
Attributes can be set using the html5 data attribute.
90+
Nested attributes require a double dash as per
91+
https://select2.org/configuration/data-attributes#nested-subkey-options
92+
"""
93+
attrs = super(forms.Select, self).build_attrs(base_attrs, extra_attrs=extra_attrs)
94+
attrs.setdefault("class", "")
95+
i18n_name = getattr(self, "i18n_name", SELECT2_TRANSLATIONS.get(get_language())) # Django 3.2 compat
96+
attrs.update(
97+
{
98+
"data-ajax--cache": "true",
99+
"data-ajax--delay": 250,
100+
"data-ajax--type": "GET",
101+
"data-ajax--url": self.get_url(),
102+
"data-theme": "admin-autocomplete",
103+
"data-app-label": "app",
104+
"data-model-name": "model",
105+
"data-field-name": "field",
106+
"data-allow-clear": json.dumps(not self.is_required),
107+
"data-placeholder": "", # Allows clearing of the input.
108+
"lang": i18n_name,
109+
"class": attrs["class"]
110+
+ (" " if attrs["class"] else "")
111+
+ "admin-autocomplete",
112+
}
113+
)
114+
return attrs
115+
116+
def optgroups(self, name, value, attr=None):
117+
return super(forms.Select, self).optgroups(name, value)
118+
94119

95120
class SmartLinkField(forms.ChoiceField):
96121
widget = Select2jqWidget

djangocms_frontend/contrib/link/helpers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,11 @@ def get_object_for_value(value):
6161
return None
6262

6363

64-
def get_link_choices(request, term="", lang=None, nbsp=""):
64+
def get_link_choices(request, term="", lang=None, nbsp=None):
6565
global _querysets
6666

67+
if nbsp is None:
68+
nbsp = "" if term else "\u2000"
6769
available_objects = []
6870
# Now create our list of cms pages
6971
type_id = ContentType.objects.get_for_model(Page).id

djangocms_frontend/contrib/link/templates/djangocms_frontend/admin/link.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33

44
{% block extrahead %}
55
{{ block.super }}
6+
<style> {# Bugfix for Django admin styling #}
7+
@media screen {
8+
.change-form .select2-dropdown {
9+
background: var(--body-bg);
10+
border: 1px solid var(--border-color);
11+
}
12+
}
13+
</style>
614
<script src="{% static 'djangocms_frontend/js/bundle.link.js' %}"></script>
715
{% endblock %}
816

djangocms_frontend/contrib/link/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def get(self, request, *args, **kwargs):
2222

2323
# TODO Check permissions
2424
# ======================
25-
self.term = kwargs.get("term", request.GET.get("term", ""))
25+
self.term = kwargs.get("term", request.GET.get("term", "")).strip()
2626
results = get_link_choices(request, self.term)
2727
return JsonResponse(
2828
{
3.95 KB
Binary file not shown.

0 commit comments

Comments
 (0)