From dcc56e2e0326c20e787244dfba9b06be37df8de9 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Wed, 20 Jun 2018 13:40:31 +0200 Subject: [PATCH] Add support for merging json data based on dropdown in admin forms This makes it possible to have different default values for a json field depending on what's picked in a different dropdown. Values are merged with whatever is in the field already if the dropdown is changed, not overwritten. --- postgresqleu/confreg/backendforms.py | 4 ++++ template/confreg/admin_backend_form.html | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/postgresqleu/confreg/backendforms.py b/postgresqleu/confreg/backendforms.py index d45c38d..ee800e8 100644 --- a/postgresqleu/confreg/backendforms.py +++ b/postgresqleu/confreg/backendforms.py @@ -97,6 +97,10 @@ class BackendForm(ConcurrentProtectedModelForm): def fix_fields(self): pass + @property + def get_json_merge_data(self): + pass + @classmethod def get_initial(self): return {} diff --git a/template/confreg/admin_backend_form.html b/template/confreg/admin_backend_form.html index f2c1cf9..f972a6a 100644 --- a/template/confreg/admin_backend_form.html +++ b/template/confreg/admin_backend_form.html @@ -29,12 +29,33 @@ $('#id_{{f}}').addClass('jsoneditor'); editor.renderer.setShowGutter(textarea.data('gutter')); editor.getSession().setValue(textarea.val()); editor.getSession().setMode("ace/mode/json"); + textarea.data('jsoneditor', editor); textarea.closest('form').submit(function() { textarea.val(editor.getSession().getValue()); }) }); +{%if form.json_merge_data %} + var mergedata = {{form.json_merge_data|safe}}; + $.each(mergedata, function(i,v) { + $('#'+v['source']).change(function(e) { + var val = e.target.value; + var mergewith = v['map'][val]; + var editor = $('#'+v['target']).data('jsoneditor'); + try { + current = JSON.parse(editor.getSession().getValue()); + } + catch { + /* If current JSON is invalid, we can't merge. So just give up */ + return; + } + var dest = $.extend({}, mergewith, current); + editor.setValue(JSON.stringify(dest, null, 2), -1); + }); + }); + +{%endif%} $('.backend-vat-field').each(function(i, e) { $(e).change(function(e) { -- 2.39.5