Add support for merging json data based on dropdown in admin forms
authorMagnus Hagander <magnus@hagander.net>
Wed, 20 Jun 2018 11:40:31 +0000 (13:40 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 20 Jun 2018 11:47:59 +0000 (13:47 +0200)
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
template/confreg/admin_backend_form.html

index d45c38d30f04c3e73dc8d546391f311ee630e485..ee800e887f45f57b2dd65ddf0bfdcaa69cbeba48 100644 (file)
@@ -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 {}
index f2c1cf9275524ee4fbb986edadb78d49ae8ccb2c..f972a6ad5ceb604c69a9786828e37afbe4782129 100644 (file)
@@ -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) {