django-unfold 0.43.0__py3-none-any.whl → 0.45.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. {django_unfold-0.43.0.dist-info → django_unfold-0.45.0.dist-info}/METADATA +5 -3
  2. {django_unfold-0.43.0.dist-info → django_unfold-0.45.0.dist-info}/RECORD +129 -117
  3. {django_unfold-0.43.0.dist-info → django_unfold-0.45.0.dist-info}/WHEEL +1 -1
  4. unfold/contrib/filters/admin.py +5 -5
  5. unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
  6. unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
  7. unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +1 -1
  8. unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +1 -1
  9. unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +3 -3
  10. unfold/contrib/forms/templates/unfold/forms/array.html +3 -3
  11. unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +25 -25
  12. unfold/contrib/forms/widgets.py +5 -5
  13. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +1 -1
  14. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +2 -2
  15. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +2 -2
  16. unfold/contrib/guardian/templates/unfold/guardian/group_form.html +8 -8
  17. unfold/contrib/guardian/templates/unfold/guardian/user_form.html +8 -8
  18. unfold/contrib/import_export/templates/admin/import_export/change_form.html +1 -1
  19. unfold/contrib/import_export/templates/admin/import_export/export.html +4 -4
  20. unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +4 -4
  21. unfold/contrib/import_export/templates/admin/import_export/import_errors.html +2 -2
  22. unfold/contrib/import_export/templates/admin/import_export/import_form.html +2 -2
  23. unfold/contrib/import_export/templates/admin/import_export/import_preview.html +5 -5
  24. unfold/contrib/import_export/templates/admin/import_export/import_validation.html +8 -8
  25. unfold/contrib/simple_history/templates/simple_history/object_history.html +2 -2
  26. unfold/contrib/simple_history/templates/simple_history/object_history_form.html +1 -1
  27. unfold/contrib/simple_history/templates/simple_history/object_history_list.html +9 -9
  28. unfold/contrib/simple_history/templates/simple_history/submit_line.html +4 -4
  29. unfold/forms.py +15 -2
  30. unfold/settings.py +20 -7
  31. unfold/sites.py +23 -8
  32. unfold/static/admin/js/inlines.js +5 -3
  33. unfold/static/unfold/css/styles.css +1 -1
  34. unfold/static/unfold/js/alpine.resize.js +1 -0
  35. unfold/static/unfold/js/app.js +51 -70
  36. unfold/static/unfold/js/htmx.js +1 -1
  37. unfold/styles.css +75 -71
  38. unfold/templates/admin/actions.html +19 -17
  39. unfold/templates/admin/app_list.html +3 -3
  40. unfold/templates/admin/auth/user/add_form.html +1 -1
  41. unfold/templates/admin/auth/user/change_password.html +2 -2
  42. unfold/templates/admin/base.html +1 -1
  43. unfold/templates/admin/change_list.html +24 -30
  44. unfold/templates/admin/change_list_results.html +40 -6
  45. unfold/templates/admin/date_hierarchy.html +1 -1
  46. unfold/templates/admin/delete_confirmation.html +7 -7
  47. unfold/templates/admin/delete_selected_confirmation.html +7 -7
  48. unfold/templates/admin/edit_inline/stacked.html +4 -4
  49. unfold/templates/admin/edit_inline/tabular.html +8 -151
  50. unfold/templates/admin/filter.html +7 -7
  51. unfold/templates/admin/includes/fieldset.html +2 -2
  52. unfold/templates/admin/includes/object_delete_summary.html +1 -1
  53. unfold/templates/admin/login.html +15 -13
  54. unfold/templates/admin/nav_sidebar.html +1 -8
  55. unfold/templates/admin/object_history.html +7 -7
  56. unfold/templates/admin/pagination.html +36 -30
  57. unfold/templates/admin/search_form.html +11 -9
  58. unfold/templates/admin/submit_line.html +11 -11
  59. unfold/templates/auth/widgets/read_only_password_hash.html +1 -1
  60. unfold/templates/registration/logged_out.html +3 -3
  61. unfold/templates/registration/password_change_done.html +1 -1
  62. unfold/templates/registration/password_change_form.html +1 -1
  63. unfold/templates/unfold/components/button.html +1 -1
  64. unfold/templates/unfold/components/card.html +4 -4
  65. unfold/templates/unfold/components/chart/cohort.html +1 -1
  66. unfold/templates/unfold/components/navigation.html +2 -2
  67. unfold/templates/unfold/components/separator.html +1 -1
  68. unfold/templates/unfold/components/table.html +6 -6
  69. unfold/templates/unfold/components/tracker.html +1 -1
  70. unfold/templates/unfold/helpers/account_links.html +6 -6
  71. unfold/templates/unfold/helpers/actions_row.html +5 -5
  72. unfold/templates/unfold/helpers/add_link.html +1 -1
  73. unfold/templates/unfold/helpers/app_list.html +10 -10
  74. unfold/templates/unfold/helpers/app_list_default.html +10 -10
  75. unfold/templates/unfold/helpers/boolean.html +1 -1
  76. unfold/templates/unfold/helpers/breadcrumb_item.html +1 -1
  77. unfold/templates/unfold/helpers/change_list_actions.html +13 -0
  78. unfold/templates/unfold/helpers/change_list_filter.html +31 -0
  79. unfold/templates/unfold/helpers/change_list_filter_actions.html +23 -0
  80. unfold/templates/unfold/helpers/delete_submit_line.html +2 -2
  81. unfold/templates/unfold/helpers/display_header.html +3 -3
  82. unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +13 -0
  83. unfold/templates/unfold/helpers/edit_inline/tabular_error.html +8 -0
  84. unfold/templates/unfold/helpers/edit_inline/tabular_field.html +25 -0
  85. unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +25 -0
  86. unfold/templates/unfold/helpers/edit_inline/tabular_row.html +27 -0
  87. unfold/templates/unfold/helpers/edit_inline/tabular_title.html +49 -0
  88. unfold/templates/unfold/helpers/field_readonly.html +1 -1
  89. unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
  90. unfold/templates/unfold/helpers/fieldset_row.html +5 -73
  91. unfold/templates/unfold/helpers/fieldset_row_checkbox.html +45 -0
  92. unfold/templates/unfold/helpers/fieldset_row_field.html +21 -0
  93. unfold/templates/unfold/helpers/fieldsets_tabs.html +2 -2
  94. unfold/templates/unfold/helpers/header.html +1 -1
  95. unfold/templates/unfold/helpers/history.html +4 -4
  96. unfold/templates/unfold/helpers/label.html +1 -1
  97. unfold/templates/unfold/helpers/language_switch.html +3 -3
  98. unfold/templates/unfold/helpers/messages/debug.html +1 -1
  99. unfold/templates/unfold/helpers/messages/error.html +1 -1
  100. unfold/templates/unfold/helpers/messages/errornote.html +1 -1
  101. unfold/templates/unfold/helpers/messages/info.html +1 -1
  102. unfold/templates/unfold/helpers/messages/success.html +1 -1
  103. unfold/templates/unfold/helpers/messages/warning.html +1 -1
  104. unfold/templates/unfold/helpers/navigation.html +3 -11
  105. unfold/templates/unfold/helpers/navigation_header.html +13 -0
  106. unfold/templates/unfold/helpers/pagination_ellipsis.html +1 -1
  107. unfold/templates/unfold/helpers/search.html +5 -5
  108. unfold/templates/unfold/helpers/search_results.html +2 -2
  109. unfold/templates/unfold/helpers/site_icon.html +7 -5
  110. unfold/templates/unfold/helpers/site_logo.html +1 -1
  111. unfold/templates/unfold/helpers/submit.html +1 -1
  112. unfold/templates/unfold/helpers/tab_action.html +2 -2
  113. unfold/templates/unfold/helpers/tab_list.html +9 -9
  114. unfold/templates/unfold/helpers/theme_switch.html +5 -5
  115. unfold/templates/unfold/helpers/userlinks.html +4 -0
  116. unfold/templates/unfold/helpers/welcomemsg.html +7 -3
  117. unfold/templates/unfold/layouts/base_simple.html +2 -2
  118. unfold/templates/unfold/layouts/skeleton.html +11 -5
  119. unfold/templates/unfold/widgets/clearable_file_input.html +6 -6
  120. unfold/templates/unfold/widgets/clearable_file_input_small.html +7 -7
  121. unfold/templates/unfold/widgets/foreign_key_raw_id.html +1 -1
  122. unfold/templates/unfold/widgets/radio.html +1 -1
  123. unfold/templates/unfold/widgets/range.html +1 -1
  124. unfold/templates/unfold/widgets/related_widget_wrapper.html +4 -4
  125. unfold/templates/unfold/widgets/textarea_expandable.html +1 -1
  126. unfold/templatetags/unfold.py +104 -0
  127. unfold/templatetags/unfold_list.py +9 -4
  128. unfold/widgets.py +31 -28
  129. unfold/templates/unfold/change_list_filter.html +0 -57
  130. {django_unfold-0.43.0.dist-info → django_unfold-0.45.0.dist-info}/LICENSE.md +0 -0
@@ -270,3 +270,107 @@ def preserve_changelist_filters(context: Context) -> Dict[str, Dict[str, str]]:
270
270
  }
271
271
 
272
272
  return {"params": preserved_params}
273
+
274
+
275
+ @register.simple_tag(takes_context=True)
276
+ def fieldset_rows_classes(context: Context) -> str:
277
+ classes = [
278
+ "aligned",
279
+ ]
280
+
281
+ if not context.get("stacked"):
282
+ classes.extend(
283
+ [
284
+ "border",
285
+ "border-base-200",
286
+ "mb-8",
287
+ "rounded",
288
+ "shadow-sm",
289
+ "dark:border-base-800",
290
+ ]
291
+ )
292
+
293
+ return " ".join(set(classes))
294
+
295
+
296
+ @register.simple_tag(takes_context=True)
297
+ def fieldset_row_classes(context: Context) -> str:
298
+ classes = [
299
+ "field-row",
300
+ "group/row",
301
+ ]
302
+
303
+ formset = context.get("inline_admin_formset", None)
304
+ adminform = context.get("adminform", None)
305
+ line = context.get("line")
306
+
307
+ # Hide the field in case of ordering field for sorting
308
+ for field in line:
309
+ if (
310
+ formset
311
+ and hasattr(field.field, "name")
312
+ and field.field.name == formset.opts.ordering_field
313
+ and formset.opts.hide_ordering_field
314
+ ):
315
+ classes.append("hidden")
316
+
317
+ # Compressed fields special styling
318
+ if adminform and adminform.model_admin.compressed_fields:
319
+ classes.extend(
320
+ [
321
+ "lg:border-b",
322
+ "lg:border-base-200",
323
+ "dark:lg:border-base-800",
324
+ "last:lg:border-b-0",
325
+ ]
326
+ )
327
+
328
+ if len(line.fields) > 1:
329
+ classes.extend(
330
+ [
331
+ "flex",
332
+ "flex-row",
333
+ "flex-wrap",
334
+ ]
335
+ )
336
+
337
+ if not line.has_visible_field:
338
+ classes.append("hidden")
339
+
340
+ return " ".join(set(classes))
341
+
342
+
343
+ @register.simple_tag(takes_context=True)
344
+ def fieldset_line_classes(context: Context) -> str:
345
+ classes = [
346
+ "field-line",
347
+ "flex",
348
+ "flex-col",
349
+ "flex-grow",
350
+ "group/line",
351
+ "p-3",
352
+ ]
353
+ field = context.get("field")
354
+ adminform = context.get("adminform")
355
+
356
+ if hasattr(field.field, "name") and field.field.name:
357
+ classes.append(f"field-{field.field.name}")
358
+
359
+ if hasattr(field, "errors") and field.errors():
360
+ classes.append("errors")
361
+
362
+ if adminform.model_admin.compressed_fields:
363
+ classes.extend(
364
+ [
365
+ "border-b",
366
+ "border-base-200",
367
+ "group-[.last]/row:border-b-0",
368
+ "lg:border-b-0",
369
+ "lg:border-l",
370
+ "lg:flex-row",
371
+ "dark:border-base-800",
372
+ "first:lg:border-l-0",
373
+ ]
374
+ )
375
+
376
+ return " ".join(set(classes))
@@ -42,7 +42,7 @@ ROW_CLASSES = [
42
42
  "align-middle",
43
43
  "flex",
44
44
  "border-t",
45
- "border-gray-200",
45
+ "border-base-200",
46
46
  "font-normal",
47
47
  "gap-4",
48
48
  "min-w-0",
@@ -55,13 +55,15 @@ ROW_CLASSES = [
55
55
  "before:content-[attr(data-label)]",
56
56
  "before:items-center",
57
57
  "before:font-semibold",
58
+ "before:text-font-important-light",
58
59
  "before:mr-auto",
59
60
  "first:border-t-0",
60
61
  "lg:before:hidden",
61
62
  "lg:first:border-t",
62
63
  "lg:py-3",
63
64
  "lg:table-cell",
64
- "dark:border-gray-800",
65
+ "dark:border-base-800",
66
+ "dark:before:text-font-important-dark",
65
67
  ]
66
68
 
67
69
  CHECKBOX_CLASSES = [
@@ -77,11 +79,13 @@ CHECKBOX_CLASSES = [
77
79
  "before:content-[attr(data-label)]",
78
80
  "before:font-semibold",
79
81
  "before:mr-auto",
82
+ "before:text-font-important-light",
80
83
  "lg:before:hidden",
81
84
  "lg:border-t",
82
- "lg:border-gray-200",
85
+ "lg:border-base-200",
83
86
  "lg:table-cell",
84
- "dark:lg:border-gray-800",
87
+ "dark:lg:border-base-800",
88
+ "dark:before:text-font-important-dark",
85
89
  ]
86
90
 
87
91
 
@@ -369,6 +373,7 @@ def result_list(context: Dict[str, Any], cl: ChangeList) -> Dict[str, Any]:
369
373
  "num_sorted_fields": num_sorted_fields,
370
374
  "results": list(results(cl)),
371
375
  "actions_row": context.get("actions_row"),
376
+ "has_add_permission": cl.model_admin.has_add_permission(context["request"]),
372
377
  }
373
378
 
374
379
 
unfold/widgets.py CHANGED
@@ -52,10 +52,12 @@ CHECKBOX_LABEL_CLASSES = [
52
52
 
53
53
  BASE_CLASSES = [
54
54
  "border",
55
+ "border-base-200",
55
56
  "bg-white",
56
57
  "font-medium",
57
58
  "min-w-20",
58
- "rounded-md",
59
+ "placeholder-base-400",
60
+ "rounded",
59
61
  "shadow-sm",
60
62
  "text-font-default-light",
61
63
  "text-sm",
@@ -65,8 +67,8 @@ BASE_CLASSES = [
65
67
  "focus:outline-none",
66
68
  "group-[.errors]:border-red-600",
67
69
  "group-[.errors]:focus:ring-red-200",
68
- "dark:bg-gray-900",
69
- "dark:border-gray-700",
70
+ "dark:bg-base-900",
71
+ "dark:border-base-700",
70
72
  "dark:text-font-default-dark",
71
73
  "dark:focus:border-primary-600",
72
74
  "dark:focus:ring-primary-700",
@@ -88,7 +90,7 @@ DATETIME_CLASSES = [*BASE_INPUT_CLASSES, "min-w-52"]
88
90
 
89
91
  COLOR_CLASSES = [*BASE_CLASSES, "h-9.5", "px-2", "py-2", "w-32"]
90
92
 
91
- INPUT_CLASSES_READONLY = [*BASE_INPUT_CLASSES, "bg-gray-50"]
93
+ INPUT_CLASSES_READONLY = [*BASE_INPUT_CLASSES, "bg-base-50"]
92
94
 
93
95
  TEXTAREA_CLASSES = [
94
96
  *BASE_INPUT_CLASSES,
@@ -123,20 +125,20 @@ PROSE_CLASSES = [
123
125
  "prose-sm",
124
126
  "prose-blockquote:border-l-4",
125
127
  "prose-blockquote:not-italic",
126
- "prose-pre:bg-gray-50",
128
+ "prose-pre:bg-base-50",
127
129
  "prose-pre:rounded",
128
130
  "prose-headings:font-medium",
129
131
  "prose-a:text-primary-600",
130
132
  "prose-headings:font-medium",
131
- "prose-headings:text-gray-700",
133
+ "prose-headings:text-base-700",
132
134
  "prose-ol:list-decimal",
133
135
  "prose-ul:list-disc",
134
- "prose-strong:text-gray-700",
135
- "dark:prose-pre:bg-gray-800",
136
- "dark:prose-blockquote:border-gray-700",
137
- "dark:prose-blockquote:text-gray-300",
138
- "dark:prose-headings:text-gray-200",
139
- "dark:prose-strong:text-gray-200",
136
+ "prose-strong:text-base-700",
137
+ "dark:prose-pre:bg-base-800",
138
+ "dark:prose-blockquote:border-base-700",
139
+ "dark:prose-blockquote:text-base-300",
140
+ "dark:prose-headings:text-base-200",
141
+ "dark:prose-strong:text-base-200",
140
142
  ]
141
143
 
142
144
  CHECKBOX_CLASSES = [
@@ -144,16 +146,16 @@ CHECKBOX_CLASSES = [
144
146
  "bg-white",
145
147
  "block",
146
148
  "border",
147
- "border-gray-300",
149
+ "border-base-300",
148
150
  "cursor-pointer",
149
151
  "h-4",
150
152
  "relative",
151
- "rounded",
153
+ "rounded-[4px]",
152
154
  "shadow-sm",
153
155
  "w-4",
154
- "hover:border-gray-400",
155
- "dark:bg-gray-700",
156
- "dark:border-gray-500",
156
+ "hover:border-base-400",
157
+ "dark:bg-base-700",
158
+ "dark:border-base-500",
157
159
  "dark:after:checked:text-white",
158
160
  "focus:outline",
159
161
  "focus:outline-1",
@@ -173,7 +175,7 @@ CHECKBOX_CLASSES = [
173
175
  "after:text-white",
174
176
  "after:transition-all",
175
177
  "after:w-4",
176
- "after:dark:text-gray-700",
178
+ "after:dark:text-base-700",
177
179
  "checked:bg-primary-600",
178
180
  "checked:border-primary-600",
179
181
  "checked:transition-all",
@@ -185,21 +187,21 @@ RADIO_CLASSES = [
185
187
  "bg-white",
186
188
  "block",
187
189
  "border",
188
- "border-gray-300",
190
+ "border-base-300",
189
191
  "cursor-pointer",
190
192
  "h-4",
191
193
  "relative",
192
194
  "rounded-full",
193
195
  "w-4",
194
- "dark:bg-gray-700",
195
- "dark:border-gray-500",
196
- "hover:border-gray-400",
196
+ "dark:bg-base-700",
197
+ "dark:border-base-500",
198
+ "hover:border-base-400",
197
199
  "focus:outline",
198
200
  "focus:outline-1",
199
201
  "focus:outline-offset-2",
200
202
  "focus:outline-primary-500",
201
203
  "after:absolute",
202
- "after:bg-white",
204
+ "after:bg-transparent",
203
205
  "after:content-['']",
204
206
  "after:flex",
205
207
  "after:h-2",
@@ -215,18 +217,19 @@ RADIO_CLASSES = [
215
217
  "after:-translate-y-1/2",
216
218
  "after:text-sm",
217
219
  "after:w-2",
218
- "after:dark:text-gray-700",
220
+ "after:dark:text-base-700",
219
221
  "after:dark:bg-transparent",
220
222
  "checked:bg-primary-600",
221
223
  "checked:border-primary-600",
222
224
  "checked:transition-all",
223
225
  "checked:after:bg-white",
224
- "checked:after:dark:bg-gray-200",
226
+ "checked:after:dark:bg-base-900",
227
+ "checked:hover:border-base-900/20",
225
228
  ]
226
229
 
227
230
  SWITCH_CLASSES = [
228
231
  "appearance-none",
229
- "bg-gray-300",
232
+ "bg-base-300",
230
233
  "cursor-pointer",
231
234
  "h-5",
232
235
  "relative",
@@ -246,7 +249,7 @@ SWITCH_CLASSES = [
246
249
  "after:w-3",
247
250
  "checked:bg-green-500",
248
251
  "checked:after:left-4",
249
- "dark:bg-gray-600",
252
+ "dark:bg-base-600",
250
253
  "dark:checked:bg-green-700",
251
254
  ]
252
255
 
@@ -519,7 +522,7 @@ class UnfoldAdminRadioSelectWidget(AdminRadioSelect):
519
522
  radio_style = VERTICAL
520
523
 
521
524
  self.radio_style = radio_style
522
- self.attrs = {"class": " ".join(RADIO_CLASSES)}
525
+ self.attrs["class"] = " ".join([*RADIO_CLASSES, self.attrs.get("class", "")])
523
526
 
524
527
  def get_context(self, *args, **kwargs) -> Dict[str, Any]:
525
528
  context = super().get_context(*args, **kwargs)
@@ -1,57 +0,0 @@
1
- {% load i18n admin_list unfold %}
2
-
3
- <div id="changelist-filter" class="backdrop-blur-sm bg-opacity-80 bg-gray-900 flex inset-0 z-50 fixed {% if not cl.model_admin.list_filter_sheet %}2xl:bg-transparent 2xl:relative 2xl:!block 2xl:z-10{% endif %}" x-show="filterOpen">
4
- <label for="show-filters" id="changelist-filter-close" class="flex-grow {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = false"></label>
5
-
6
- <div class="bg-white flex m-4 overflow-hidden rounded shadow-sm w-80 dark:bg-gray-800 {% if not cl.model_admin.list_filter_sheet %} 2xl:border 2xl:sticky 2xl:top-4 2xl:dark:border-gray-800 2xl:bg-transparent 2xl:dark:!bg-transparent 2xl:m-0{% endif %}">
7
- <div class="flex-grow h-full overflow-auto relative">
8
- <h3 class="border-b flex font-semibold mb-4 px-4 py-4 text-font-important-light text-sm dark:text-font-important-dark dark:border-gray-800">
9
- {% trans "Filter" %}
10
-
11
- {% if cl.is_facets_optional %}
12
- <span id="changelist-filter-extra-actions" class="font-normal ml-3 text-primary-600 text-sm dark:text-primary-500">
13
- {% if cl.is_facets_optional %}
14
- {% if cl.add_facets %}
15
- <a href="{{ cl.remove_facet_link }}" class="hidelink">
16
- {% trans "Hide counts" %}
17
- </a>
18
- {% else %}
19
- <a href="{{ cl.add_facet_link }}" class="viewlink">
20
- {% trans "Show counts" %}
21
- </a>
22
- {% endif %}
23
- {% endif %}
24
- </span>
25
- {% endif %}
26
-
27
- {% if cl.has_active_filters %}
28
- <a href="{{ cl.clear_all_filters_qs }}" class="font-normal ml-3 text-sm text-red-600 dark:text-red-500">
29
- {% trans "Clear all filters" %}
30
- </a>
31
- {% endif %}
32
-
33
- <a class="cursor-pointer material-symbols-outlined md-18 ml-auto pl-4 text-gray-400 transition-colors hover:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400 {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = false">
34
- close
35
- </a>
36
- </h3>
37
-
38
- <div class="px-4{% if cl.model_admin.list_filter_submit %} {% endif %}">
39
- {% if cl.model_admin.list_filter_submit %}
40
- <form id="filter-form" method="get">
41
- {% preserve_filters %}
42
- {% endif %}
43
-
44
- {% for spec in cl.filter_specs %}
45
- {% admin_list_filter cl spec %}
46
- {% endfor %}
47
-
48
- {% if cl.model_admin.list_filter_submit %}
49
- <button type="submit" class="bg-primary-600 block border border-transparent font-medium mb-4 mt-8 px-3 py-2 rounded-md self-end text-sm text-white w-full">
50
- {% trans "Apply Filters" %}
51
- </button>
52
- </form>
53
- {% endif %}
54
- </div>
55
- </div>
56
- </div>
57
- </div>