diff --git a/openwisp_controller/config/static/config/js/tabs.js b/openwisp_controller/config/static/config/js/tabs.js index a38972ecf..4dd381429 100644 --- a/openwisp_controller/config/static/config/js/tabs.js +++ b/openwisp_controller/config/static/config/js/tabs.js @@ -1,6 +1,6 @@ 'use strict'; django.jQuery(function ($) { - + if ($('.add-form').length || !$('#device_form').length) { return; } @@ -48,7 +48,7 @@ django.jQuery(function ($) { label = $el.find('> fieldset.module > h2, ' + '> .tabular > fieldset.module > h2').text(); tabsContainer.append( - '
  • ' + label + '
  • ' + '
  • ' + label + '
  • ' ); }); diff --git a/openwisp_controller/config/static/config/js/widget.js b/openwisp_controller/config/static/config/js/widget.js index 09a35c1d2..e2eb669ff 100644 --- a/openwisp_controller/config/static/config/js/widget.js +++ b/openwisp_controller/config/static/config/js/widget.js @@ -1,5 +1,7 @@ 'use strict'; (function ($) { + django._schemas = new Map(); + django._jsonEditors = new Map(); var inFullScreenMode = false, prevDefaultValues = {}, defaultValuesUrl = window.location.origin + '/admin/config/device/get-template-default-values/', @@ -200,7 +202,7 @@ disable_edit_json: true, startval: startval, keep_oneof_values: false, - show_errors: 'change', + show_errors: field.data('show-errors') ? field.data('show-errors'): 'change', // if no backend selected use empty schema schema: backend ? schemas[backend] : {} }; @@ -208,6 +210,7 @@ $.extend(options, JSON.parse(field.attr("data-options"))); } editor = new JSONEditor(document.getElementById(id), options); + django._jsonEditors[id] = editor; // initialise advanced json editor here (disable schema validation in VPN admin) advancedEditor = initAdvancedEditor(field, value, options.schema, $('#vpn_form').length === 1); $advancedEl = $('#advanced_editor'); @@ -330,8 +333,9 @@ }; var bindLoadUi = function () { - $.getJSON(django._jsonSchemaWidgetUrl, function (schemas) { - $('.jsoneditor-raw').each(function (i, el) { + $('.jsoneditor-raw:not([name*="__prefix__"])').each(function (i, el) { + $.getJSON($(el).data('schema-url'), function (schemas) { + django._schemas[$(el).data('schema-url')] = schemas; var field = $(el), schema = field.attr("data-schema"), schemaSelector = field.attr("data-schema-selector"); diff --git a/openwisp_controller/config/widgets.py b/openwisp_controller/config/widgets.py index b586946e7..6e6887bbd 100644 --- a/openwisp_controller/config/widgets.py +++ b/openwisp_controller/config/widgets.py @@ -1,6 +1,7 @@ from django import forms from django.contrib.admin.widgets import AdminTextareaWidget from django.template.loader import get_template +from django.urls import reverse class JsonSchemaWidget(AdminTextareaWidget): @@ -45,5 +46,6 @@ def render(self, name, value, attrs=None, renderer=None): attrs = attrs or {} attrs['class'] = 'vLargeTextField jsoneditor-raw' attrs.update(self.extra_attrs) + attrs.update({'data-schema-url': reverse(self.schema_view_name)}) html += super().render(name, value, attrs, renderer) return html