django-unfold 0.38.0__py3-none-any.whl → 0.39.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- {django_unfold-0.38.0.dist-info → django_unfold-0.39.0.dist-info}/METADATA +1 -1
- {django_unfold-0.38.0.dist-info → django_unfold-0.39.0.dist-info}/RECORD +10 -9
- unfold/admin.py +2 -0
- unfold/forms.py +5 -1
- unfold/static/admin/js/admin/RelatedObjectLookups.js +295 -0
- unfold/static/unfold/js/app.js +3 -1
- unfold/templates/admin/change_form.html +8 -1
- unfold/templates/unfold/components/button.html +1 -1
- {django_unfold-0.38.0.dist-info → django_unfold-0.39.0.dist-info}/LICENSE.md +0 -0
- {django_unfold-0.38.0.dist-info → django_unfold-0.39.0.dist-info}/WHEEL +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
unfold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
unfold/admin.py,sha256=
|
2
|
+
unfold/admin.py,sha256=H7zKInqAGsGJbIrX0EC7GZKyXVjZ0olWBzvkIFlKpR8,19694
|
3
3
|
unfold/apps.py,sha256=SlBXPYrUd2uXn67qFbRvbXSUk3XFWrF4-5WELgDCvho,381
|
4
4
|
unfold/checks.py,sha256=Smgji9w19hnYjJElJ_FJnnyTEAE-E-OUB6otHu7lasY,1670
|
5
5
|
unfold/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -68,9 +68,10 @@ unfold/dataclasses.py,sha256=4PAWLVlUhyGMq1Mwai7afCgrRO0Inulw0opFUKVEOBk,483
|
|
68
68
|
unfold/decorators.py,sha256=jyjE2sunazp8gK1QIsNRJGEEDwO7RDKWDKnOI3GDWZE,3338
|
69
69
|
unfold/exceptions.py,sha256=gcCj1ox61E137bk_0Cqy4YC3SttdPgB-fiJUqpmyHSE,43
|
70
70
|
unfold/fields.py,sha256=yhtpDfqycpOxqdQlbncCg9qhELxGk3AtXizkZyzzH0g,7410
|
71
|
-
unfold/forms.py,sha256=
|
71
|
+
unfold/forms.py,sha256=xm1xSZJBTqnTTDQymkvfzHs7RaeANC4LzB86LNDA9hU,4218
|
72
72
|
unfold/settings.py,sha256=8rjtIipRX3IrkmsSy5OrbheGhjmkYvKxueihSRIM9c8,2111
|
73
73
|
unfold/sites.py,sha256=yr66aXr1UYSZw9I9VRKpmkQxUtUP9336zs1GZJWJqis,13505
|
74
|
+
unfold/static/admin/js/admin/RelatedObjectLookups.js,sha256=alI0-yq7YPDJJJn-yg1ce79-Cv88yQDUrfaGqFZnsaY,9048
|
74
75
|
unfold/static/unfold/css/simplebar.css,sha256=5LLaEM11pKi6JFCOLt4XKuZxTpT9rpdq_tNlaQytFlU,4647
|
75
76
|
unfold/static/unfold/css/styles.css,sha256=Qfovqaj0HIvTY7IjpOjq8B08_99KX4kXl-lRBiEmBF4,97177
|
76
77
|
unfold/static/unfold/fonts/inter/Inter-Bold.woff2,sha256=O88EyjAeRPE_QEyKBKpK5wf2epUOEu8wwjj5bnhCZqE,46552
|
@@ -83,7 +84,7 @@ unfold/static/unfold/fonts/material-symbols/styles.css,sha256=U0oiGd2DS7LXnbuqgs
|
|
83
84
|
unfold/static/unfold/js/alpine.anchor.js,sha256=2Jg9aUq749pjFynzr_H1NK3lf-nXrbHMtO9wvlWJyIQ,15524
|
84
85
|
unfold/static/unfold/js/alpine.js,sha256=NY2a-7GrW--i9IBhowd25bzXcH9BCmBrqYX5i8OxwDQ,44659
|
85
86
|
unfold/static/unfold/js/alpine.persist.js,sha256=jFBwr6faTqqhp3sVi4_VTxJ0FpaF9YGZN1ZGLl_5QYM,837
|
86
|
-
unfold/static/unfold/js/app.js,sha256=
|
87
|
+
unfold/static/unfold/js/app.js,sha256=VirG6nw5PPnKMxQqd3eGfmzWH_MaoutOTPxWHfMo7-M,7440
|
87
88
|
unfold/static/unfold/js/chart.js,sha256=22W6cFERR-CElMOKRgMMicueMVP0Vf7FBEBYH8Z8tCk,200633
|
88
89
|
unfold/static/unfold/js/htmx.js,sha256=XOLqvnZiyEx46EW9vaJTBUaaWg8CGVVfXJkVsUmJbpI,42820
|
89
90
|
unfold/static/unfold/js/select2.init.js,sha256=SzpjSL1mD9tHedjSeXlmEwHjuuyqlnpilpSeEEKeYLE,265
|
@@ -96,7 +97,7 @@ unfold/templates/admin/auth/user/add_form.html,sha256=L0ylU7BLEIoZc3nS4Rq6DA0H94
|
|
96
97
|
unfold/templates/admin/auth/user/change_password.html,sha256=-Wa9ml3yss-kDz0YQxCiwoxs91KQD8eetCt5l6xekWM,2892
|
97
98
|
unfold/templates/admin/base.html,sha256=RptiEpgXZ6seYrPu-1Stoe8ECHpi9PjkJjFheGecYF0,2358
|
98
99
|
unfold/templates/admin/base_site.html,sha256=FM8OOaXsQqJlYapeJvBznXCOt7poMiWrweTWcsMHzeI,365
|
99
|
-
unfold/templates/admin/change_form.html,sha256=
|
100
|
+
unfold/templates/admin/change_form.html,sha256=2EKrHLNmKdg2cTmHW9N9Om6zpOxBDIzkOb6UoMKtr6U,4981
|
100
101
|
unfold/templates/admin/change_form_object_tools.html,sha256=eyeH-i2HgEM0Yi-OJA2D1VnKJyC19A_my1IDGxxoP8Y,593
|
101
102
|
unfold/templates/admin/change_list.html,sha256=DzC236cq-B8uXnb6F4bzgcQFwMLI3uKOIHNyjVtCKA0,4977
|
102
103
|
unfold/templates/admin/change_list_object_tools.html,sha256=cmMiT2nT20Ph5yfpj9aHPr76Z-JP4aSXp0o-Rnad28s,147
|
@@ -121,7 +122,7 @@ unfold/templates/registration/logged_out.html,sha256=cg4YjMbVtuMdOJD3hkkJZntv0G8
|
|
121
122
|
unfold/templates/registration/password_change_done.html,sha256=bTZHs1KsGcRgT6WI5exF4ANFEXatgI24rIeENxJZl6Q,1070
|
122
123
|
unfold/templates/registration/password_change_form.html,sha256=zzmqFHfMExS7czgEBdEtetXk2Ae_7jzaID7CpE_xlgo,2225
|
123
124
|
unfold/templates/unfold/change_list_filter.html,sha256=9wP_sZF8uKmJhegPC3Z-7ZZXLwVIYDrjzzgTNxLuFbc,3344
|
124
|
-
unfold/templates/unfold/components/button.html,sha256=
|
125
|
+
unfold/templates/unfold/components/button.html,sha256=mVb_THznqpga1onh-TGr7B679I3zDazvXBdUVOMx7Og,220
|
125
126
|
unfold/templates/unfold/components/card.html,sha256=3DtjaeMvLNUBzbnnUn7zU15V2X_k2HBdxSV55S31IoA,1086
|
126
127
|
unfold/templates/unfold/components/chart/bar.html,sha256=nDdDCUXvFd793OpNgNPQo0vBmvYngMsQyPHVTf1vfOw,297
|
127
128
|
unfold/templates/unfold/components/chart/line.html,sha256=DHaZUFTlCs5cX7ioYdTzoN4ITHWNcEoNSUp7v3hlo_E,298
|
@@ -197,7 +198,7 @@ unfold/typing.py,sha256=1P8PWM2oeaceUJtA5j071RbKEBpHYaux441u7Hd6wv4,643
|
|
197
198
|
unfold/utils.py,sha256=hs16AzAEtKb_tdTpLXuz3NqYhtP5JipSc_lkv5ULbbY,4921
|
198
199
|
unfold/views.py,sha256=hQCyeeMa9kcJV1IZeeYqj8PGW7J4QWME8n-5n0UGmiU,1003
|
199
200
|
unfold/widgets.py,sha256=HXihQ-dCvlN8uvHq1B1tzJlyBt4x800k4_5X14eiqKg,17086
|
200
|
-
django_unfold-0.
|
201
|
-
django_unfold-0.
|
202
|
-
django_unfold-0.
|
203
|
-
django_unfold-0.
|
201
|
+
django_unfold-0.39.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
|
202
|
+
django_unfold-0.39.0.dist-info/METADATA,sha256=_pgRxPBfnskJzqIiE0NyxPkeLH9R4vH9kgsfjehTcyU,4685
|
203
|
+
django_unfold-0.39.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
204
|
+
django_unfold-0.39.0.dist-info/RECORD,,
|
unfold/admin.py
CHANGED
@@ -235,6 +235,8 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
|
|
235
235
|
list_filter_submit = False
|
236
236
|
list_fullwidth = False
|
237
237
|
list_disable_select_all = False
|
238
|
+
change_form_before_template = None
|
239
|
+
change_form_after_template = None
|
238
240
|
compressed_fields = False
|
239
241
|
readonly_preprocess_fields = {}
|
240
242
|
warn_unsaved_form = False
|
unfold/forms.py
CHANGED
@@ -10,9 +10,13 @@ from django.contrib.admin.forms import (
|
|
10
10
|
from django.contrib.auth.forms import (
|
11
11
|
AdminPasswordChangeForm as BaseAdminPasswordChangeForm,
|
12
12
|
)
|
13
|
+
|
14
|
+
try:
|
15
|
+
from django.contrib.auth.forms import AdminUserCreationForm as BaseUserCreationForm
|
16
|
+
except ImportError:
|
17
|
+
from django.contrib.auth.forms import UserCreationForm as BaseUserCreationForm
|
13
18
|
from django.contrib.auth.forms import ReadOnlyPasswordHashWidget
|
14
19
|
from django.contrib.auth.forms import UserChangeForm as BaseUserChangeForm
|
15
|
-
from django.contrib.auth.forms import UserCreationForm as BaseUserCreationForm
|
16
20
|
from django.http import HttpRequest
|
17
21
|
from django.utils.safestring import mark_safe
|
18
22
|
from django.utils.translation import gettext_lazy as _
|
@@ -0,0 +1,295 @@
|
|
1
|
+
/*global SelectBox, interpolate*/
|
2
|
+
// Handles related-objects functionality: lookup link for raw_id_fields
|
3
|
+
// and Add Another links.
|
4
|
+
"use strict";
|
5
|
+
{
|
6
|
+
const $ = django.jQuery;
|
7
|
+
let popupIndex = 0;
|
8
|
+
const relatedWindows = [];
|
9
|
+
|
10
|
+
function dismissChildPopups() {
|
11
|
+
relatedWindows.forEach(function (win) {
|
12
|
+
if (!win.closed) {
|
13
|
+
win.dismissChildPopups();
|
14
|
+
win.close();
|
15
|
+
}
|
16
|
+
});
|
17
|
+
}
|
18
|
+
|
19
|
+
function setPopupIndex() {
|
20
|
+
if (document.getElementsByName("_popup").length > 0) {
|
21
|
+
const index = window.name.lastIndexOf("__") + 2;
|
22
|
+
popupIndex = parseInt(window.name.substring(index));
|
23
|
+
} else {
|
24
|
+
popupIndex = 0;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
function addPopupIndex(name) {
|
29
|
+
return name + "__" + (popupIndex + 1);
|
30
|
+
}
|
31
|
+
|
32
|
+
function removePopupIndex(name) {
|
33
|
+
return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), "");
|
34
|
+
}
|
35
|
+
|
36
|
+
function showAdminPopup(triggeringLink, name_regexp, add_popup) {
|
37
|
+
const name = addPopupIndex(triggeringLink.id.replace(name_regexp, ""));
|
38
|
+
const href = new URL(triggeringLink.href);
|
39
|
+
if (add_popup) {
|
40
|
+
href.searchParams.set("_popup", 1);
|
41
|
+
}
|
42
|
+
const win = window.open(
|
43
|
+
href,
|
44
|
+
name,
|
45
|
+
"height=768,width=1024,resizable=yes,scrollbars=yes"
|
46
|
+
);
|
47
|
+
relatedWindows.push(win);
|
48
|
+
win.focus();
|
49
|
+
return false;
|
50
|
+
}
|
51
|
+
|
52
|
+
function showRelatedObjectLookupPopup(triggeringLink) {
|
53
|
+
return showAdminPopup(triggeringLink, /^lookup_/, true);
|
54
|
+
}
|
55
|
+
|
56
|
+
function dismissRelatedLookupPopup(win, chosenId) {
|
57
|
+
const name = removePopupIndex(win.name);
|
58
|
+
const elem = document.getElementById(name);
|
59
|
+
if (elem.classList.contains("vManyToManyRawIdAdminField") && elem.value) {
|
60
|
+
elem.value += "," + chosenId;
|
61
|
+
} else {
|
62
|
+
document.getElementById(name).value = chosenId;
|
63
|
+
}
|
64
|
+
const index = relatedWindows.indexOf(win);
|
65
|
+
if (index > -1) {
|
66
|
+
relatedWindows.splice(index, 1);
|
67
|
+
}
|
68
|
+
win.close();
|
69
|
+
}
|
70
|
+
|
71
|
+
function showRelatedObjectPopup(triggeringLink) {
|
72
|
+
return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
|
73
|
+
}
|
74
|
+
|
75
|
+
function updateRelatedObjectLinks(triggeringLink) {
|
76
|
+
const $this = $(triggeringLink);
|
77
|
+
const siblings = $this.nextAll(
|
78
|
+
".view-related, .change-related, .delete-related"
|
79
|
+
);
|
80
|
+
if (!siblings.length) {
|
81
|
+
return;
|
82
|
+
}
|
83
|
+
const value = $this.val();
|
84
|
+
if (value) {
|
85
|
+
siblings.each(function () {
|
86
|
+
const elm = $(this);
|
87
|
+
elm.attr(
|
88
|
+
"href",
|
89
|
+
elm.attr("data-href-template").replace("__fk__", value)
|
90
|
+
);
|
91
|
+
elm.removeAttr("aria-disabled");
|
92
|
+
});
|
93
|
+
} else {
|
94
|
+
siblings.removeAttr("href");
|
95
|
+
siblings.attr("aria-disabled", true);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
function updateRelatedSelectsOptions(
|
100
|
+
currentSelect,
|
101
|
+
win,
|
102
|
+
objId,
|
103
|
+
newRepr,
|
104
|
+
newId,
|
105
|
+
skipIds = []
|
106
|
+
) {
|
107
|
+
// After create/edit a model from the options next to the current
|
108
|
+
// select (+ or :pencil:) update ForeignKey PK of the rest of selects
|
109
|
+
// in the page.
|
110
|
+
|
111
|
+
const path = win.location.pathname;
|
112
|
+
// Extract the model from the popup url '.../<model>/add/' or
|
113
|
+
// '.../<model>/<id>/change/' depending the action (add or change).
|
114
|
+
const modelName = path.split("/")[path.split("/").length - (objId ? 4 : 3)];
|
115
|
+
// Select elements with a specific model reference and context of "available-source".
|
116
|
+
const selectsRelated = document.querySelectorAll(
|
117
|
+
`[data-model-ref="${modelName}"] [data-context="available-source"]`
|
118
|
+
);
|
119
|
+
|
120
|
+
selectsRelated.forEach(function (select) {
|
121
|
+
if (
|
122
|
+
currentSelect === select ||
|
123
|
+
(skipIds && skipIds.includes(select.id))
|
124
|
+
) {
|
125
|
+
return;
|
126
|
+
}
|
127
|
+
|
128
|
+
let option = select.querySelector(`option[value="${objId}"]`);
|
129
|
+
|
130
|
+
if (!option) {
|
131
|
+
option = new Option(newRepr, newId);
|
132
|
+
select.options.add(option);
|
133
|
+
// Update SelectBox cache for related fields.
|
134
|
+
if (
|
135
|
+
window.SelectBox !== undefined &&
|
136
|
+
!SelectBox.cache[currentSelect.id]
|
137
|
+
) {
|
138
|
+
SelectBox.add_to_cache(select.id, option);
|
139
|
+
SelectBox.redisplay(select.id);
|
140
|
+
}
|
141
|
+
return;
|
142
|
+
}
|
143
|
+
|
144
|
+
option.textContent = newRepr;
|
145
|
+
option.value = newId;
|
146
|
+
});
|
147
|
+
}
|
148
|
+
|
149
|
+
function dismissAddRelatedObjectPopup(win, newId, newRepr) {
|
150
|
+
const name = removePopupIndex(win.name);
|
151
|
+
const elem = document.getElementById(name);
|
152
|
+
if (elem) {
|
153
|
+
const elemName = elem.nodeName.toUpperCase();
|
154
|
+
if (elemName === "SELECT") {
|
155
|
+
elem.options[elem.options.length] = new Option(
|
156
|
+
newRepr,
|
157
|
+
newId,
|
158
|
+
true,
|
159
|
+
true
|
160
|
+
);
|
161
|
+
updateRelatedSelectsOptions(elem, win, null, newRepr, newId);
|
162
|
+
} else if (elemName === "INPUT") {
|
163
|
+
if (
|
164
|
+
elem.classList.contains("vManyToManyRawIdAdminField") &&
|
165
|
+
elem.value
|
166
|
+
) {
|
167
|
+
elem.value += "," + newId;
|
168
|
+
} else {
|
169
|
+
elem.value = newId;
|
170
|
+
}
|
171
|
+
}
|
172
|
+
// Trigger a change event to update related links if required.
|
173
|
+
$(elem).trigger("change");
|
174
|
+
} else {
|
175
|
+
const toId = name + "_to";
|
176
|
+
const toElem = document.getElementById(toId);
|
177
|
+
const o = new Option(newRepr, newId);
|
178
|
+
SelectBox.add_to_cache(toId, o);
|
179
|
+
SelectBox.redisplay(toId);
|
180
|
+
if (toElem && toElem.nodeName.toUpperCase() === "SELECT") {
|
181
|
+
const skipIds = [name + "_from"];
|
182
|
+
updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
const index = relatedWindows.indexOf(win);
|
186
|
+
if (index > -1) {
|
187
|
+
relatedWindows.splice(index, 1);
|
188
|
+
}
|
189
|
+
win.close();
|
190
|
+
}
|
191
|
+
|
192
|
+
function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
|
193
|
+
const id = removePopupIndex(win.name.replace(/^edit_/, ""));
|
194
|
+
const selectsSelector = interpolate("#%s, #%s_from, #%s_to", [id, id, id]);
|
195
|
+
const selects = $(selectsSelector);
|
196
|
+
selects
|
197
|
+
.find("option")
|
198
|
+
.each(function () {
|
199
|
+
if (this.value === objId) {
|
200
|
+
this.textContent = newRepr;
|
201
|
+
this.value = newId;
|
202
|
+
}
|
203
|
+
})
|
204
|
+
.trigger("change");
|
205
|
+
updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId);
|
206
|
+
selects
|
207
|
+
.next()
|
208
|
+
.find(".select2-selection__rendered")
|
209
|
+
.each(function () {
|
210
|
+
// The element can have a clear button as a child.
|
211
|
+
// Use the lastChild to modify only the displayed value.
|
212
|
+
this.lastChild.textContent = newRepr;
|
213
|
+
this.title = newRepr;
|
214
|
+
});
|
215
|
+
const index = relatedWindows.indexOf(win);
|
216
|
+
if (index > -1) {
|
217
|
+
relatedWindows.splice(index, 1);
|
218
|
+
}
|
219
|
+
win.close();
|
220
|
+
}
|
221
|
+
|
222
|
+
function dismissDeleteRelatedObjectPopup(win, objId) {
|
223
|
+
const id = removePopupIndex(win.name.replace(/^delete_/, ""));
|
224
|
+
const selectsSelector = interpolate("#%s, #%s_from, #%s_to", [id, id, id]);
|
225
|
+
const selects = $(selectsSelector);
|
226
|
+
selects
|
227
|
+
.find("option")
|
228
|
+
.each(function () {
|
229
|
+
if (this.value === objId) {
|
230
|
+
$(this).remove();
|
231
|
+
}
|
232
|
+
})
|
233
|
+
.trigger("change");
|
234
|
+
const index = relatedWindows.indexOf(win);
|
235
|
+
if (index > -1) {
|
236
|
+
relatedWindows.splice(index, 1);
|
237
|
+
}
|
238
|
+
win.close();
|
239
|
+
}
|
240
|
+
|
241
|
+
window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup;
|
242
|
+
window.dismissRelatedLookupPopup = dismissRelatedLookupPopup;
|
243
|
+
window.showRelatedObjectPopup = showRelatedObjectPopup;
|
244
|
+
window.updateRelatedObjectLinks = updateRelatedObjectLinks;
|
245
|
+
window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
|
246
|
+
window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
|
247
|
+
window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
|
248
|
+
window.dismissChildPopups = dismissChildPopups;
|
249
|
+
|
250
|
+
// Kept for backward compatibility
|
251
|
+
window.showAddAnotherPopup = showRelatedObjectPopup;
|
252
|
+
window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
|
253
|
+
|
254
|
+
window.addEventListener("unload", function (evt) {
|
255
|
+
window.dismissChildPopups();
|
256
|
+
});
|
257
|
+
|
258
|
+
$(document).ready(function () {
|
259
|
+
setPopupIndex();
|
260
|
+
$("a[data-popup-opener]").on("click", function (event) {
|
261
|
+
event.preventDefault();
|
262
|
+
opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener"));
|
263
|
+
});
|
264
|
+
$("body").on(
|
265
|
+
"click",
|
266
|
+
'.related-widget-wrapper-link[data-popup="yes"]',
|
267
|
+
function (e) {
|
268
|
+
e.preventDefault();
|
269
|
+
if (this.href) {
|
270
|
+
const event = $.Event("django:show-related", { href: this.href });
|
271
|
+
$(this).trigger(event);
|
272
|
+
if (!event.isDefaultPrevented()) {
|
273
|
+
showRelatedObjectPopup(this);
|
274
|
+
}
|
275
|
+
}
|
276
|
+
}
|
277
|
+
);
|
278
|
+
$("body").on("change", ".related-widget-wrapper select", function (e) {
|
279
|
+
const event = $.Event("django:update-related");
|
280
|
+
$(this).trigger(event);
|
281
|
+
if (!event.isDefaultPrevented()) {
|
282
|
+
updateRelatedObjectLinks(this);
|
283
|
+
}
|
284
|
+
});
|
285
|
+
$(".related-widget-wrapper select").trigger("change");
|
286
|
+
$("body").on("click", ".related-lookup", function (e) {
|
287
|
+
e.preventDefault();
|
288
|
+
const event = $.Event("django:lookup-related");
|
289
|
+
$(this).trigger(event);
|
290
|
+
if (!event.isDefaultPrevented()) {
|
291
|
+
showRelatedObjectLookupPopup(this);
|
292
|
+
}
|
293
|
+
});
|
294
|
+
});
|
295
|
+
}
|
unfold/static/unfold/js/app.js
CHANGED
@@ -124,7 +124,9 @@ const fileInputUpdatePath = () => {
|
|
124
124
|
input.addEventListener("change", (e) => {
|
125
125
|
const parts = e.target.value.split("\\");
|
126
126
|
const placeholder =
|
127
|
-
input.parentNode.parentNode.querySelector(
|
127
|
+
input.parentNode.parentNode.parentNode.querySelector(
|
128
|
+
"input[type=text]"
|
129
|
+
);
|
128
130
|
placeholder.setAttribute("value", parts[parts.length - 1]);
|
129
131
|
});
|
130
132
|
});
|
@@ -64,6 +64,10 @@
|
|
64
64
|
<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}{% if form_url %}action="{{ form_url }}" {% endif %}method="post" id="{{ opts.model_name }}_form" {% if adminform.model_admin.warn_unsaved_form %}class="warn-unsaved-form"{% endif %} novalidate>
|
65
65
|
{% csrf_token %}
|
66
66
|
|
67
|
+
{% if adminform.model_admin.change_form_before_template %}
|
68
|
+
{% include adminform.model_admin.change_form_before_template %}
|
69
|
+
{% endif %}
|
70
|
+
|
67
71
|
{% block form_top %}{% endblock %}
|
68
72
|
|
69
73
|
<div>
|
@@ -94,11 +98,14 @@
|
|
94
98
|
{% for inline_admin_formset in inline_admin_formsets %}
|
95
99
|
{% include inline_admin_formset.opts.template %}
|
96
100
|
{% endfor %}
|
97
|
-
|
98
101
|
{% endblock %}
|
99
102
|
|
100
103
|
{% block after_related_objects %}{% endblock %}
|
101
104
|
|
105
|
+
{% if adminform.model_admin.change_form_after_template %}
|
106
|
+
{% include adminform.model_admin.change_form_after_template %}
|
107
|
+
{% endif %}
|
108
|
+
|
102
109
|
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
|
103
110
|
|
104
111
|
{% block admin_change_form_document_ready %}
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<button {% if submit %}type="submit"{% endif%} class="bg-primary-600 border border-transparent font-medium px-3 py-2 rounded-md text-sm text-white">
|
1
|
+
<button {% if submit %}type="submit"{% endif%} {% if name %}name="{{ name }}"{% endif %} class="bg-primary-600 border border-transparent font-medium px-3 py-2 rounded-md text-sm text-white">
|
2
2
|
{{ children }}
|
3
3
|
</button>
|
File without changes
|
File without changes
|