From c622ecd02aeef2c02f9ab441b18114ea1d9f2837 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Thu, 20 Dec 2018 15:31:25 +0100 Subject: [PATCH] Move javascript for forms into separate JS file In passing also clean up a few things that can be passed directly in the template instead, and simplify things now that we have jquery all the time. --- media/js/forms.js | 36 +++++++++++++++++++++++ pgweb/core/templatetags/pgfilters.py | 17 ++++++++++- pgweb/news/forms.py | 2 +- pgweb/util/helpers.py | 22 +++++++------- templates/base/form.html | 57 ++++-------------------------------- 5 files changed, 68 insertions(+), 66 deletions(-) create mode 100644 media/js/forms.js diff --git a/media/js/forms.js b/media/js/forms.js new file mode 100644 index 00000000..eba6cca2 --- /dev/null +++ b/media/js/forms.js @@ -0,0 +1,36 @@ +$(document).ready(function(){ + $('textarea.markdown-content').each(function(idx, e) { + attach_showdown_preview(e.id, 0); + }); + + $('input.toggle-checkbox').each(function(idx, e) { + $(this).change(function(e) { + update_form_toggles($(this)); + }); + update_form_toggles($(e)); + }); + + $('div.form-group[data-cbtitles]').each(function(idx, e) { + var d = $(e).data('cbtitles'); + $.each(d, function(k,v) { + $(e).find('input[type=checkbox][value=' + k + ']').parent('div').prop('title', v); + }); + }); +}); + +function update_form_toggles(e) { + var toggles = e.data('toggles').split(','); + var invert = e.data('toggle-invert'); + var show = e.is(':checked'); + if (invert) { + show = !show; + } + $.each(toggles, function(i, name) { + var e = $('#id_' + name); + if (show) { + $(e).parents('div.form-group').show(); + } else { + $(e).parents('div.form-group').hide(); + } + }); +} diff --git a/pgweb/core/templatetags/pgfilters.py b/pgweb/core/templatetags/pgfilters.py index 5d606285..8670535e 100644 --- a/pgweb/core/templatetags/pgfilters.py +++ b/pgweb/core/templatetags/pgfilters.py @@ -1,5 +1,8 @@ from django.template.defaultfilters import stringfilter from django import template +import json + + register = template.Library() @register.filter(name='class_name') @@ -8,7 +11,11 @@ def class_name(ob): @register.filter(is_safe=True) def field_class(value, arg): - return value.as_widget(attrs={"class": arg}) + if 'class' in value.field.widget.attrs: + c = arg + ' ' + value.field.widget.attrs['class'] + else: + c = arg + return value.as_widget(attrs={"class": c}) @register.filter(name='hidemail') @stringfilter @@ -44,3 +51,11 @@ def planet_title(obj): # takes a ImportedRSSItem object from a Planet feed and extracts the info # specific to the title of the Planet entry return ":".join(obj.title.split(':')[1:]) + +@register.filter(name='dictlookup') +def dictlookup(value, key): + return value.get(key, None) + +@register.filter(name='json') +def tojson(value): + return json.dumps(value) diff --git a/pgweb/news/forms.py b/pgweb/news/forms.py index 565a0aa1..a779db01 100644 --- a/pgweb/news/forms.py +++ b/pgweb/news/forms.py @@ -18,7 +18,7 @@ class NewsArticleForm(forms.ModelForm): @property def described_checkboxes(self): return { - 'tags': [(t.id, t.description) for t in NewsTag.objects.all()] + 'tags': {t.id: t.description for t in NewsTag.objects.all()} } class Meta: diff --git a/pgweb/util/helpers.py b/pgweb/util/helpers.py index 5377a113..6b3f08de 100644 --- a/pgweb/util/helpers.py +++ b/pgweb/util/helpers.py @@ -52,24 +52,22 @@ def simple_form(instancetype, itemid, request, formclass, formtemplate='base/for if hasattr(form, 'filter_by_user'): form.filter_by_user(request.user) - if hasattr(instancetype, 'markdown_fields'): - markdownfields = instancetype.markdown_fields - else: - markdownfields = None + for fn in form.fields: + if fn in getattr(instancetype, 'markdown_fields', []): + form.fields[fn].widget.attrs.update({'class': 'markdown-content'}) - if hasattr(form, 'described_checkboxes'): - described_checkboxes = form.described_checkboxes - else: - described_checkboxes = None + for togg in getattr(form, 'toggle_fields', []): + form.fields[togg['name']].widget.attrs.update({ + 'data-toggles': ','.join(togg['fields']), + 'data-toggle-invert': togg['invert'] and 'true' or 'false', + 'class': 'toggle-checkbox', + }) return render_pgweb(request, navsection, formtemplate, { 'form': form, 'formitemtype': instance._meta.verbose_name, - 'markdownfields': markdownfields, - 'described_checkboxes': described_checkboxes, 'form_intro': hasattr(form, 'form_intro') and form.form_intro or None, - 'toggle_fields': hasattr(form, 'toggle_fields') and form.toggle_fields or None, - 'jquery': hasattr(form, 'jquery') and form.jquery or None, + 'described_checkboxes': getattr(form, 'described_checkboxes', {}), 'savebutton': (itemid == "new") and "Submit New" or "Save", 'operation': (itemid == "new") and "New" or "Edit", }) diff --git a/templates/base/form.html b/templates/base/form.html index db839f2c..0576a783 100644 --- a/templates/base/form.html +++ b/templates/base/form.html @@ -36,7 +36,7 @@ {% else %}{# field|ischeckbox #} -
+
{% if not field|ismultiplecheckboxes %}
@@ -74,60 +74,13 @@ {% block extrahead %} {{ block.super }} -{%if toggle_fields or described_checkboxes or jquery %} - -{%endif%} -{%if markdownfields%} +{%endblock%} + +{%block extrascript%} - -{%if toggle_fields %} - -{%endif%}{# toggle_fields #} -{%endif%}{# markdownfields #} - + {%if recaptcha%} {%endif%} -- 2.11.4.GIT