Skip to content

Commit 4090856

Browse files
committed
Fix rendering issue on django 2.2
- Update bootstrap to v 4.5.x - Add option to mark json editor fieldset independent or shared - Add css to handle li marker - Add spectre theme and set as default - Updated Readme
1 parent 9d09d34 commit 4090856

File tree

12 files changed

+80
-17
lines changed

12 files changed

+80
-17
lines changed

CONTRIBUTORS.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ Contributors
66
* mlevental (https://github.com/mlevental)
77
* tapapax (https://github.com/tapapax)
88
* Riccardo Magliocchetti (https://github.com/xrmx)
9+
* Karan Gupta (https://github.com/karangupta31)

README.md

+27
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,30 @@ class JSONModelAdmin(admin.ModelAdmin):
8282
return form
8383
```
8484

85+
86+
## Fieldsets and Rendering Fix
87+
To fix django css issues, due to the fieldset "aligned" css class, we have added 2 options.
88+
89+
JSONEditorWidget can be initialised with independent_fieldset (True/False). If you are putting the json editor in
90+
a seperate fieldset (preferred), you should pass independent_fieldset = True
91+
92+
```python
93+
class JSONModelAdminForm(forms.ModelForm):
94+
class Meta:
95+
model = JSONModel
96+
fields = '__all__'
97+
widgets = {
98+
'data': JSONEditorWidget(DATA_SCHEMA, collapsed=False, independent_fieldset=True),
99+
}
100+
```
101+
Having an independent fieldset allows the relative position of the fields to be maintained as is.
102+
103+
independent_fieldset=True removes the "aligned" class from the parent fieldset, which can break the rendering for other fields
104+
if the json editor is not put in an independent fieldset.
105+
106+
In case you do not create independent fieldset and don't pass independent_fieldset=True, then the initialization of the
107+
editor would push the editor out of the default fieldset, which would break the default ordering of fields,
108+
and also push the editor at the end of the page.
109+
110+
See example app.
111+

django_admin_json_editor/admin.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
class JSONEditorWidget(forms.Widget):
99
template_name = 'django_admin_json_editor/editor.html'
1010

11-
def __init__(self, schema, collapsed=True, sceditor=False, editor_options=None):
11+
def __init__(self, schema, collapsed=True, sceditor=False, editor_options=None, independent_fieldset=False):
1212
super(JSONEditorWidget, self).__init__()
1313
self._schema = schema
1414
self._collapsed = collapsed
1515
self._sceditor = sceditor
16-
16+
self._independent_fieldset = independent_fieldset
1717
self._editor_options = {
18-
'theme': 'bootstrap4',
19-
'iconlib': 'fontawesome4',
18+
'theme': 'spectre',
19+
'iconlib': 'spectre',
2020
}
2121
self._editor_options.update(editor_options or {})
2222

@@ -36,22 +36,29 @@ def render(self, name, value, attrs=None, renderer=None):
3636
'name': name,
3737
'data': value,
3838
'editor_options': json.dumps(editor_options),
39+
'independent_fieldset': self._independent_fieldset
3940
}
4041
return mark_safe(render_to_string(self.template_name, context))
4142

4243
@property
4344
def media(self):
4445
css = {
4546
'all': [
46-
'django_admin_json_editor/fontawesome/css/font-awesome.min.css',
4747
'django_admin_json_editor/style.css',
4848
]
4949
}
5050
js = [
5151
'django_admin_json_editor/jsoneditor/jsoneditor.min.js',
5252
]
5353

54-
if self._editor_options['theme'] == 'bootstrap4':
54+
if self._editor_options['iconlib'] == 'fontawesome':
55+
css['all'].append('django_admin_json_editor/fontawesome/css/font-awesome.min.css')
56+
elif self._editor_options['iconlib'] == 'spectre':
57+
css['all'].append('django_admin_json_editor/spectre/spectre-icons.min.css')
58+
if self._editor_options['theme'] == 'spectre':
59+
css['all'].append('django_admin_json_editor/spectre/spectre.min.css')
60+
css['all'].append('django_admin_json_editor/spectre/spectre-exp.min.css')
61+
elif self._editor_options['theme'] == 'bootstrap4':
5562
css['all'].append('django_admin_json_editor/bootstrap/css/bootstrap.min.css')
5663
js.append('django_admin_json_editor/jquery/jquery-3.5.1.slim.min.js')
5764
js.append('django_admin_json_editor/bootstrap/js/bootstrap.bundle.min.js')

django_admin_json_editor/static/django_admin_json_editor/bootstrap/css/bootstrap.min.css

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_admin_json_editor/static/django_admin_json_editor/bootstrap/js/bootstrap.bundle.min.js

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_admin_json_editor/static/django_admin_json_editor/spectre/spectre-exp.min.css

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_admin_json_editor/static/django_admin_json_editor/spectre/spectre-icons.min.css

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_admin_json_editor/static/django_admin_json_editor/spectre/spectre.min.css

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

django_admin_json_editor/static/django_admin_json_editor/style.css

+6-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,9 @@ div.sceditor-container {
88
float: left;
99
width: 100% !important;
1010
margin-bottom: 10px;
11-
}
11+
}
12+
13+
/*Remove django list styling*/
14+
ul li {
15+
list-style-type: none;
16+
}

django_admin_json_editor/templates/django_admin_json_editor/editor.html

+10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
<div id="{{ name }}_editor"></div>
22

33
<script>
4+
$ = django.jQuery
45
var container = document.getElementById("{{ name }}_editor");
6+
var parent_fieldset = $("#{{ name }}_editor").closest("fieldset");
7+
{% if independent_fieldset %} // Preferred way to keep relative positions of the fields
8+
// Removes the aligned class from the parent fieldset to remove the affects of "aligned" class on the editor
9+
parent_fieldset.removeClass("aligned")
10+
{% else %}
11+
// Moves json editor outside of django fieldset to remove the affect of "aligned" class (but changes the relative position of fields)
12+
parent_fieldset.after($("#{{ name }}_editor").parent())
13+
{% endif %}
14+
515
var options = {{ editor_options|safe }};
616
var {{ name }}_editor = new JSONEditor(container, options);
717
{{ name }}_editor.on('change', function () {

example/app/admin.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,24 @@ class Meta:
6464
model = JSONModel
6565
fields = '__all__'
6666
widgets = {
67-
'data': JSONEditorWidget(DATA_SCHEMA, collapsed=False),
67+
'data': JSONEditorWidget(DATA_SCHEMA, collapsed=False, independent_fieldset=True),
6868
}
6969

7070

7171
@admin.register(JSONModel)
7272
class JSONModelAdmin(admin.ModelAdmin):
7373
form = JSONModelAdminForm
7474

75+
# Giving the JSON Editor independent field set
76+
def get_fieldsets(self, *args, **kwargs):
77+
fieldsets = super(JSONModelAdmin, self).get_fieldsets(*args, **kwargs)
78+
default_field = fieldsets[0][1]['fields']
79+
new_fields = ('data',)
80+
# Removing used fields
81+
[default_field.remove(field) for field in new_fields]
82+
fieldsets.append((None, {'fields': new_fields}))
83+
return fieldsets
84+
7585

7686
@admin.register(ArrayJSONModel)
7787
class ArrayJSONModelAdmin(admin.ModelAdmin):

example/example.png

-54 KB
Loading

0 commit comments

Comments
 (0)