django-unfold 0.39.0__py3-none-any.whl → 0.41.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. django_unfold-0.41.0.dist-info/METADATA +74 -0
  2. {django_unfold-0.39.0.dist-info → django_unfold-0.41.0.dist-info}/RECORD +53 -50
  3. {django_unfold-0.39.0.dist-info → django_unfold-0.41.0.dist-info}/WHEEL +1 -1
  4. unfold/admin.py +7 -0
  5. unfold/contrib/filters/forms.py +2 -2
  6. unfold/contrib/forms/templates/unfold/forms/array.html +2 -2
  7. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +1 -1
  8. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +1 -1
  9. unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +1 -1
  10. unfold/contrib/guardian/templates/unfold/guardian/group_form.html +2 -2
  11. unfold/contrib/guardian/templates/unfold/guardian/user_form.html +3 -3
  12. unfold/contrib/import_export/templates/admin/import_export/export.html +1 -1
  13. unfold/contrib/import_export/templates/admin/import_export/import.html +1 -1
  14. unfold/contrib/simple_history/templates/simple_history/object_history_form.html +1 -1
  15. unfold/forms.py +7 -8
  16. unfold/sites.py +12 -0
  17. unfold/static/admin/js/inlines.js +439 -0
  18. unfold/static/unfold/css/styles.css +1 -1
  19. unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  20. unfold/static/unfold/fonts/material-symbols/styles.css +1 -2
  21. unfold/static/unfold/js/alpine.sort.js +1 -0
  22. unfold/static/unfold/js/app.js +36 -10
  23. unfold/static/unfold/js/select2.init.js +1 -1
  24. unfold/styles.css +5 -1
  25. unfold/templates/admin/app_index.html +1 -1
  26. unfold/templates/admin/app_list.html +1 -1
  27. unfold/templates/admin/auth/user/change_password.html +1 -1
  28. unfold/templates/admin/base.html +1 -1
  29. unfold/templates/admin/change_form.html +1 -1
  30. unfold/templates/admin/change_list.html +48 -38
  31. unfold/templates/admin/delete_confirmation.html +4 -9
  32. unfold/templates/admin/delete_selected_confirmation.html +4 -8
  33. unfold/templates/admin/edit_inline/stacked.html +68 -66
  34. unfold/templates/admin/edit_inline/tabular.html +143 -134
  35. unfold/templates/admin/login.html +2 -0
  36. unfold/templates/admin/object_history.html +1 -1
  37. unfold/templates/admin/submit_line.html +8 -8
  38. unfold/templates/registration/password_change_done.html +1 -1
  39. unfold/templates/registration/password_change_form.html +1 -1
  40. unfold/templates/unfold/change_list_filter.html +7 -9
  41. unfold/templates/unfold/components/button.html +4 -3
  42. unfold/templates/unfold/components/card.html +1 -1
  43. unfold/templates/unfold/components/progress.html +15 -15
  44. unfold/templates/unfold/components/separator.html +1 -1
  45. unfold/templates/unfold/helpers/app_list.html +2 -2
  46. unfold/templates/unfold/helpers/delete_submit_line.html +11 -0
  47. unfold/templates/unfold/helpers/display_header.html +8 -3
  48. unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
  49. unfold/templates/unfold/helpers/fieldset_row.html +2 -0
  50. unfold/templates/unfold/helpers/welcomemsg.html +1 -1
  51. unfold/templates/unfold/layouts/skeleton.html +1 -0
  52. unfold/templates/unfold/widgets/url.html +7 -5
  53. django_unfold-0.39.0.dist-info/METADATA +0 -70
  54. {django_unfold-0.39.0.dist-info → django_unfold-0.41.0.dist-info}/LICENSE.md +0 -0
@@ -15,154 +15,163 @@
15
15
 
16
16
  {{ inline_admin_formset.formset.non_form_errors }}
17
17
 
18
- <div>
19
- {% if not inline_admin_formset.has_add_permission and inline_admin_formset.forms|length == 0 %}
20
- <p class="mb-6">
21
- {% trans "No records found." %}
22
- </p>
23
- {% else %}
24
- <div class="border border-gray-200 mb-6 overflow-x-auto rounded-md shadow-sm dark:border-gray-800" data-simplebar data-simplebar-auto-hide="false">
25
- <table class="border-spacing-none border-separate w-full">
26
- <thead class="hidden lg:table-header-group">
27
- <tr>
28
- {% for field in inline_admin_formset.fields %}
29
- {% if not field.widget.is_hidden %}
30
- <th class="column-{{ field.name }}{% if field.required %} required{% endif %} align-middle border-b border-gray-200 font-semibold px-3 py-2 text-left text-font-important-light text-sm whitespace-nowrap dark:text-font-important-dark dark:border-gray-800">
31
- <span class="flex flex-row items-center">
32
- {{ field.label|capfirst }}
33
-
34
- {% if field.help_text %}
35
- <span class="cursor-pointer material-symbols-outlined ml-2 text-gray-400 dark:text-gray-500" title="{{ field.help_text|striptags }}">help</span>
36
- {% endif %}
37
- </span>
38
- </th>
39
- {% endif %}
40
- {% endfor %}
41
-
42
- {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
43
- <th class="align-middle border-b border-gray-200 font-semibold px-3 py-2 text-left text-font-important-light text-sm whitespace-nowrap lg:w-px dark:border-gray-800 dark:text-font-important-dark">
44
- {% translate "Delete?" %}
45
- </th>
46
- {% endif %}
18
+ <div class="border border-gray-200 mb-6 overflow-x-auto rounded-md shadow-sm dark:border-gray-800" data-simplebar data-simplebar-auto-hide="false">
19
+ <table class="border-spacing-none border-separate w-full"
20
+ {% if inline_admin_formset.opts.ordering_field %}
21
+ data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}"
22
+ x-on:end="sortRecords"
23
+ x-sort.ghost
24
+ {% endif %}>
25
+ <thead class="hidden lg:table-header-group">
26
+ <tr>
27
+ {% for field in inline_admin_formset.fields %}
28
+ {% if not field.widget.is_hidden %}
29
+ <th class="column-{{ field.name }}{% if field.required %} required{% endif %} align-middle border-b border-gray-200 font-semibold px-3 py-2 text-left text-font-important-light text-sm whitespace-nowrap dark:text-font-important-dark dark:border-gray-800 {% if inline_admin_formset.opts.ordering_field and field.name == inline_admin_formset.opts.ordering_field and inline_admin_formset.opts.hide_ordering_field %}hidden{% endif %}">
30
+ <span class="flex flex-row items-center">
31
+ {{ field.label|capfirst }}
32
+
33
+ {% if field.help_text %}
34
+ <span class="cursor-pointer material-symbols-outlined ml-2 text-gray-400 dark:text-gray-500" title="{{ field.help_text|striptags }}">help</span>
35
+ {% endif %}
36
+ </span>
37
+ </th>
38
+ {% endif %}
39
+ {% endfor %}
40
+
41
+ {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
42
+ <th class="align-middle border-b border-gray-200 font-semibold px-3 py-2 text-left text-font-important-light text-sm whitespace-nowrap lg:w-px dark:border-gray-800 dark:text-font-important-dark">
43
+ {% translate "Delete?" %}
44
+ </th>
45
+ {% endif %}
46
+ </tr>
47
+ </thead>
48
+
49
+ {% for inline_admin_form in inline_admin_formset %}
50
+ <tbody x-sort:item>
51
+ {% if inline_admin_form.form.non_field_errors %}
52
+ <tr class="row-form-errors group inline-tabular">
53
+ <td colspan="{{ inline_admin_form|cell_count }}">
54
+ {% include "unfold/helpers/messages/error.html" with errors=inline_admin_form.form.non_field_errors %}
55
+ </td>
47
56
  </tr>
48
- </thead>
49
-
50
- <tbody>
51
- {% for inline_admin_form in inline_admin_formset %}
52
- {% if inline_admin_form.form.non_field_errors %}
53
- <tr class="row-form-errors group inline-tabular">
54
- <td colspan="{{ inline_admin_form|cell_count }}">
55
- {% include "unfold/helpers/messages/error.html" with errors=inline_admin_form.form.non_field_errors %}
56
- </td>
57
- </tr>
58
- {% endif %}
57
+ {% endif %}
59
58
 
60
- {% if inline_admin_form.original or inline_admin_form.show_url %}
61
- <tr>
62
- <td class="original" colspan="{{ inline_admin_form|cell_count }}">
63
- {% if not inline_admin_formset.opts.hide_title %}
64
- {% if inline_admin_form.original or inline_admin_form.show_url %}
65
- <p class="flex font-medium items-center px-3 pt-2 text-xs">
66
- {% if inline_admin_form.original %}
67
- <span>
68
- {% with inline_title=inline_admin_form.original.get_inline_title %}
69
- {% if inline_title %}
70
- {{ inline_title }}
71
- {% else %}
72
- {{ inline_admin_form.original }}
73
- {% endif %}
74
- {% endwith %}
75
- </span>
76
-
77
- {% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}
78
- <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{{ inline_admin_formset.has_change_permission|yesno:'inlinechangelink,inlineviewlink' }} ml-2 text-primary-600 dark:text-primary-500">
79
- {% if inline_admin_formset.has_change_permission %}
80
- {% translate "Change" %}
81
- {% else %}
82
- {% translate "View" %}
83
- {% endif %}
84
- </a>
59
+ {% if inline_admin_form.original or inline_admin_form.show_url %}
60
+ <tr>
61
+ <td class="original" colspan="{{ inline_admin_form|cell_count }}">
62
+ {% if not inline_admin_formset.opts.hide_title %}
63
+ {% if inline_admin_form.original or inline_admin_form.show_url %}
64
+ <p class="flex font-medium items-center px-3 pt-2 text-xs">
65
+ {% if inline_admin_form.original %}
66
+ <span>
67
+ {% with inline_title=inline_admin_form.original.get_inline_title %}
68
+ {% if inline_title %}
69
+ {{ inline_title }}
70
+ {% else %}
71
+ {{ inline_admin_form.original }}
72
+ {% endif %}
73
+ {% endwith %}
74
+ </span>
75
+
76
+ {% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}
77
+ <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{{ inline_admin_formset.has_change_permission|yesno:'inlinechangelink,inlineviewlink' }} ml-2 text-primary-600 dark:text-primary-500">
78
+ {% if inline_admin_formset.has_change_permission %}
79
+ {% translate "Change" %}
80
+ {% else %}
81
+ {% translate "View" %}
85
82
  {% endif %}
86
- {% endif %}
87
-
88
- {% if inline_admin_form.show_url %}
89
- <a href="{{ inline_admin_form.absolute_url }}" class="font-medium ml-2 text-primary-600 dark:text-primary-500">
90
- {% translate "View on site" %}
91
- </a>
92
- {% endif %}
93
- </p>
83
+ </a>
84
+ {% endif %}
94
85
  {% endif %}
95
- {% endif %}
96
86
 
97
- {% if inline_admin_form.needs_explicit_pk_field %}
98
- {{ inline_admin_form.pk_field.field }}
99
- {% endif %}
87
+ {% if inline_admin_form.show_url %}
88
+ <a href="{{ inline_admin_form.absolute_url }}" class="font-medium ml-2 text-primary-600 dark:text-primary-500">
89
+ {% translate "View on site" %}
90
+ </a>
91
+ {% endif %}
92
+ </p>
93
+ {% endif %}
94
+ {% endif %}
100
95
 
101
- {% if inline_admin_form.fk_field %}
102
- {{ inline_admin_form.fk_field.field }}
103
- {% endif %}
104
- </td>
105
- </tr>
106
- {% endif %}
96
+ {% if inline_admin_form.needs_explicit_pk_field %}
97
+ {{ inline_admin_form.pk_field.field }}
98
+ {% endif %}
107
99
 
108
- <tr class="lg:border-b-0 form-row {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
109
- {% spaceless %}
110
- {% for fieldset in inline_admin_form %}
111
- {% for line in fieldset %}
112
- {% for field in line %}
113
- {% if not field.is_readonly and field.field.is_hidden %}
114
- {{ field.field }}
115
- {% endif %}
116
- {% endfor %}
117
- {% endfor %}
100
+ {% if inline_admin_form.fk_field %}
101
+ {{ inline_admin_form.fk_field.field }}
102
+ {% endif %}
103
+ </td>
104
+ </tr>
105
+ {% endif %}
106
+
107
+ <tr class="lg:border-b-0 form-row {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
108
+ {% spaceless %}
109
+ {% for fieldset in inline_admin_form %}
110
+ {% for line in fieldset %}
111
+ {% for field in line %}
112
+ {% if not field.is_readonly and field.field.is_hidden %}
113
+ {{ field.field }}
114
+ {% endif %}
118
115
  {% endfor %}
119
- {% endspaceless %}
120
-
121
- {% with is_last_row=forloop.last %}
122
- {% for fieldset in inline_admin_form %}
123
- {% for line in fieldset %}
124
- {% with is_last_col=forloop.last %}
125
- {% for field in line %}
126
- {% if field.is_readonly or not field.field.is_hidden %}
127
- <td{% if field.field.name %} class="field-{{ field.field.name }} group field-tabular {% if field.field.errors|length > 0 %} errors{% endif %}{% if inline_admin_form.original %} p-3 lg:py-3{% else %} py-3{% endif %}{% if field.is_checkbox %} align-middle{% else %} align-top{% endif %} {% if is_last_row and not inline_admin_formset.has_add_permission %}{% if is_last_col %}border-0 {% else %}border-b lg:border-0{% endif %}{% else %}border-b{% endif %} border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:pr-4 lg:before:hidden font-normal px-3 text-left text-sm lg:table-cell dark:border-gray-800 {% if field.field.is_hidden %} !hidden{% endif %}"{% endif %} data-label="{{ field.field.label }}">
128
- {% if field.is_readonly %}
129
- {% include "unfold/helpers/field_readonly_value.html" with tabular=1 %}
130
- {% else %}
131
- {{ field.field }}
132
-
133
- {% if field.field.errors|length > 0 %}
134
- <div class="mt-1 text-red-600 text-sm dark:text-red-500">
135
- {% for error in field.field.errors %}
136
- {{ error }}
137
- {% endfor %}
138
- </div>
116
+ {% endfor %}
117
+ {% endfor %}
118
+ {% endspaceless %}
119
+
120
+ {% with is_last_row=forloop.last %}
121
+ {% for fieldset in inline_admin_form %}
122
+ {% for line in fieldset %}
123
+ {% with is_last_col=forloop.last %}
124
+ {% for field in line %}
125
+ {% if field.is_readonly or not field.field.is_hidden %}
126
+ <td{% if field.field.name %} class="field-{{ field.field.name }} group field-tabular {% if field.field.errors|length > 0 %} errors{% endif %}{% if inline_admin_form.original %} p-3 lg:py-3{% else %} py-3{% endif %}{% if field.is_checkbox %} align-middle{% else %} align-top{% endif %} {% if is_last_row and not inline_admin_formset.has_add_permission %}{% if is_last_col %}border-0 {% else %}border-b lg:border-0{% endif %}{% else %}border-b{% endif %} border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:pr-4 lg:before:hidden font-normal px-3 text-left text-sm lg:table-cell dark:border-gray-800 {% if field.field.is_hidden %} !hidden{% endif %} {% if inline_admin_formset.opts.ordering_field and field.field.name == inline_admin_formset.opts.ordering_field and inline_admin_formset.opts.hide_ordering_field %}!hidden{% endif %}"{% endif %} data-label="{{ field.field.label }}">
127
+ <div class="flex flex-row gap-3 items-center">
128
+ {% if forloop.parentloop.counter == 1 and forloop.counter == 1 %}
129
+ {% if inline_admin_formset.opts.ordering_field %}
130
+ {% if inline_admin_form.original %}
131
+ <span class="material-symbols-outlined cursor-pointer" x-sort:handle>drag_indicator</span>
132
+ {% else %}
133
+ <span class="-mr-3" x-sort:handle></span>
139
134
  {% endif %}
140
135
  {% endif %}
141
- </td>
142
- {% endif %}
143
- {% endfor %}
144
- {% endwith %}
145
- {% endfor %}
146
- {% endfor %}
136
+ {% endif %}
147
137
 
148
- {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
149
- <td class="delete {% if inline_admin_form.original %}p-3 lg:py-3{% else %}py-3{% endif %} text-left text-red-600 border-b border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:pr-4 lg:before:hidden font-normal px-3 text-sm lg:align-top lg:table-cell lg:w-px dark:border-gray-800" data-label="{% trans "Remove" %}">
150
- {% if inline_admin_form.original %}
151
- <div class="flex flex-row lg:mt-3">
152
- <div class="ml-auto">
153
- {{ inline_admin_form.deletion_field.field|add_css_class:form_classes.checkbox }}
138
+ {% if field.is_readonly %}
139
+ {% include "unfold/helpers/field_readonly_value.html" with tabular=1 %}
140
+ {% else %}
141
+ {{ field.field }}
142
+
143
+ {% if field.field.errors|length > 0 %}
144
+ <div class="mt-1 text-red-600 text-sm dark:text-red-500">
145
+ {% for error in field.field.errors %}
146
+ {{ error }}
147
+ {% endfor %}
148
+ </div>
149
+ {% endif %}
150
+ {% endif %}
154
151
  </div>
155
- </div>
152
+ </td>
156
153
  {% endif %}
157
- </td>
154
+ {% endfor %}
155
+ {% endwith %}
156
+ {% endfor %}
157
+ {% endfor %}
158
+
159
+ {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
160
+ <td class="delete {% if inline_admin_form.original %}p-3 lg:py-3{% else %}py-3{% endif %} text-left text-red-600 border-b border-gray-200 flex items-center before:capitalize before:content-[attr(data-label)] before:mr-auto before:text-gray-500 before:pr-4 lg:before:hidden font-normal px-3 text-sm lg:align-top lg:table-cell lg:w-px dark:border-gray-800" data-label="{% trans "Remove" %}">
161
+ {% if inline_admin_form.original %}
162
+ <div class="flex flex-row lg:mt-3">
163
+ <div class="ml-auto">
164
+ {{ inline_admin_form.deletion_field.field|add_css_class:form_classes.checkbox }}
165
+ </div>
166
+ </div>
158
167
  {% endif %}
159
- {% endwith %}
160
- </tr>
161
- {% endfor %}
162
- </tbody>
163
- </table>
164
- </div>
165
- {% endif %}
168
+ </td>
169
+ {% endif %}
170
+ {% endwith %}
171
+ </tr>
172
+ </tbody>
173
+ {% endfor %}
174
+ </table>
166
175
  </div>
167
176
  </fieldset>
168
177
  </div>
@@ -32,6 +32,8 @@
32
32
  <span class="block text-primary-600 text-xl dark:text-primary-500">{{ site_title }}</span>
33
33
  </h1>
34
34
 
35
+ {% include "unfold/helpers/messages.html" %}
36
+
35
37
  {% include "unfold/helpers/messages/errornote.html" with errors=form.errors %}
36
38
 
37
39
  {% include "unfold/helpers/messages/error.html" with errors=form.non_field_errors %}
@@ -4,7 +4,7 @@
4
4
  {% block breadcrumbs %}
5
5
  <div class="px-4 lg:px-12">
6
6
  <div class="container mb-12 mx-auto -my-3">
7
- <ul class="flex">
7
+ <ul class="flex flex-wrap">
8
8
  {% url 'admin:index' as link %}
9
9
  {% trans 'Home' as name %}
10
10
  {% include 'unfold/helpers/breadcrumb_item.html' with link=link name=name %}
@@ -1,8 +1,8 @@
1
1
  {% load i18n admin_urls %}
2
2
 
3
- <div {% if not is_popup %}id="submit-row"{% endif %} class="relative z-20 {% if not is_popup %} mt-20 lg:mt-8{% endif %}">
4
- <div class="{% if not is_popup %}bottom-0 fixed left-0 right-0{% endif %}" {% if not is_popup %}x-bind:class="{'xl:left-0': !sidebarDesktopOpen, 'xl:left-72': sidebarDesktopOpen}"{% endif %}>
5
- <div class="bg-white dark:bg-gray-900 {% if not is_popup %}border-t px-4 py-4 relative scrollable-top lg:px-12 dark:border-gray-800{% endif %}">
3
+ <div {% if not is_popup %}id="submit-row"{% endif %} class="relative z-20 {% if not is_popup %} mt-8{% endif %}">
4
+ <div class="{% if not is_popup %}lg:bottom-0 lg:fixed lg:left-0 lg:right-0{% endif %}" {% if not is_popup %}x-bind:class="{'xl:left-0': !sidebarDesktopOpen, 'xl:left-72': sidebarDesktopOpen}"{% endif %}>
5
+ <div class="bg-white dark:bg-gray-900 {% if not is_popup %}lg:border-t lg:py-4 relative scrollable-top lg:px-12 dark:border-gray-800{% endif %}">
6
6
  <div class="container flex flex-col-reverse gap-3 items-center mx-auto lg:flex-row-reverse">
7
7
  {% block submit-row %}
8
8
  {% if show_save %}
@@ -18,7 +18,7 @@
18
18
  {% endfor %}
19
19
 
20
20
  {% if show_save_and_continue %}
21
- <button type="submit" name="_continue" class="border font-medium hidden px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
21
+ <button type="submit" name="_continue" class="border font-medium px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
22
22
  {% if can_change %}
23
23
  {% translate 'Save and continue editing' %}
24
24
  {% else %}
@@ -30,19 +30,19 @@
30
30
  {% if show_close %}
31
31
  {% url opts|admin_urlname:'changelist' as changelist_url %}
32
32
 
33
- <a href="{% add_preserved_filters changelist_url %}" class="border font-medium hidden px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
33
+ <a href="{% add_preserved_filters changelist_url %}" class="border font-medium px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
34
34
  {% translate 'Close' %}
35
35
  </a>
36
36
  {% endif %}
37
37
 
38
38
  {% if show_save_and_add_another %}
39
- <button type="submit" name="_addanother" class="border font-medium hidden px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
39
+ <button type="submit" name="_addanother" class="border font-medium px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
40
40
  {% translate 'Save and add another' %}
41
41
  </button>
42
42
  {% endif %}
43
43
 
44
44
  {% if show_save_as_new %}
45
- <button type="submit" name="_saveasnew" class="border font-medium hidden px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
45
+ <button type="submit" name="_saveasnew" class="border font-medium px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
46
46
  {% translate 'Save as new' %}
47
47
  </button>
48
48
  {% endif %}
@@ -51,7 +51,7 @@
51
51
  {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
52
52
 
53
53
  <p class="deletelink-box mr-auto w-full lg:w-auto">
54
- <a href="{% add_preserved_filters delete_url %}" class="block border border-red-500 font-medium px-3 py-2 rounded-md text-center text-red-500 whitespace-nowrap dark:border-transparent dark:bg-red-500/20 dark:text-red-500">
54
+ <a href="{% add_preserved_filters delete_url %}" class="bg-red-600 flex items-center justify-center font-medium h-9.5 ml-auto px-3 py-2 rounded-md text-white dark:bg-red-500/20 dark:text-red-500">
55
55
  {% translate "Delete" %} {{ opts.verbose_name }}
56
56
  </a>
57
57
  </p>
@@ -7,7 +7,7 @@
7
7
  {% block breadcrumbs %}
8
8
  <div class="px-12">
9
9
  <div class="container mb-12 mx-auto -my-3">
10
- <ul class="flex">
10
+ <ul class="flex flex-wrap">
11
11
  {% url 'admin:index' as link %}
12
12
  {% trans 'Home' as name %}
13
13
  {% include 'unfold/helpers/breadcrumb_item.html' with link=link name=name %}
@@ -7,7 +7,7 @@
7
7
  {% block breadcrumbs %}
8
8
  <div class="px-12">
9
9
  <div class="container mb-12 mx-auto -my-3">
10
- <ul class="flex">
10
+ <ul class="flex flex-wrap">
11
11
  {% url 'admin:index' as link %}
12
12
  {% trans 'Home' as name %}
13
13
  {% include 'unfold/helpers/breadcrumb_item.html' with link=link name=name %}
@@ -1,11 +1,11 @@
1
1
  {% load i18n admin_list %}
2
2
 
3
- <div id="changelist-filter" class="backdrop-blur-sm bg-opacity-80 bg-gray-900 flex fixed inset-0 z-50" x-show="filterOpen">
4
- <label for="show-filters" id="changelist-filter-close" class="flex-grow"></label>
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
5
 
6
- <div class="bg-white flex mx-4 my-4 overflow-hidden rounded shadow-sm w-96 dark:bg-gray-800" x-on:click.outside="filterOpen = false">
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
7
  <div class="flex-grow h-full overflow-auto relative">
8
- <h3 class="border-b flex font-semibold mb-6 px-6 py-4 text-font-important-light text-sm dark:text-font-important-dark dark:border-gray-700">
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
9
  {% trans "Filter" %}
10
10
 
11
11
  {% if cl.is_facets_optional %}
@@ -30,15 +30,14 @@
30
30
  </a>
31
31
  {% endif %}
32
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" x-on:click="filterOpen = false">
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
34
  close
35
35
  </a>
36
36
  </h3>
37
37
 
38
- <div class="px-6{% if cl.model_admin.list_filter_submit %} pb-16{% endif %}">
38
+ <div class="px-4{% if cl.model_admin.list_filter_submit %} {% endif %}">
39
39
  {% if cl.model_admin.list_filter_submit %}
40
40
  <form id="filter-form" method="get">
41
-
42
41
  {% if request.GET.q %}
43
42
  <input type="hidden" name="q" value="{{ request.GET.q }}">
44
43
  {% endif %}
@@ -48,13 +47,12 @@
48
47
  {% endif %}
49
48
  {% endif %}
50
49
 
51
-
52
50
  {% for spec in cl.filter_specs %}
53
51
  {% admin_list_filter cl spec %}
54
52
  {% endfor %}
55
53
 
56
54
  {% if cl.model_admin.list_filter_submit %}
57
- <div class="bg-gray-50 border-gray-200 border-t bottom-4 fixed px-6 py-3 right-4 rounded-b w-96 dark:bg-gray-700 dark:border-gray-600">
55
+ <div class="bottom-4 absolute left-4 right-4 {% if not cl.model_admin.list_filter_sheet %}2xl:left-0 2xl:right-0 2xl:relative 2xl:mt-8{% endif %}">
58
56
  <button type="submit" class="bg-primary-600 block border border-transparent font-medium px-3 py-2 rounded-md self-end text-sm text-white w-full">
59
57
  {% trans "Apply Filters" %}
60
58
  </button>
@@ -1,3 +1,4 @@
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
- {{ children }}
3
- </button>
1
+ <{% if href %}a href="{{ href }}"{% else %}button{% endif%} {% if submit %}type="submit"{% endif%} {% if name %}name="{{ name }}"{% endif %}
2
+ class="border font-medium px-3 py-2 rounded-md text-center whitespace-nowrap {% if variant == "default" %}bg-white dark:border-gray-700 dark:bg-transparent dark:text-white{% else %}bg-primary-600 border-transparent text-white{% endif %}{% if class %} {{ class }}{% endif %}">
3
+ {{ children }}
4
+ </{% if href %}a{% else %}button{% endif%}>
@@ -1,4 +1,4 @@
1
- <div class="border flex flex-col flex-grow overflow-hidden p-6 relative rounded-md shadow-sm dark:border-gray-800{% if class %} {{ class }}{% endif %}">
1
+ <div class="border flex flex-col flex-grow overflow-hidden p-6 relative rounded-md shadow-sm dark:border-gray-800 {% if class %} {{ class }}{% endif %}">
2
2
  {% if title %}
3
3
  <h2 class="border-b font-semibold mb-6 -mt-2 -mx-6 pb-4 px-6 text-font-important-light dark:text-font-important-dark dark:border-gray-800">
4
4
  {{ title }}
@@ -1,21 +1,21 @@
1
1
  <div class="{% if class %}{{ class }}{% endif %}">
2
- <div class="flex flex-row mb-2.5 text-sm">
3
- {% if title %}
4
- <h3 class="text-sm">
5
- {{ title }}
6
- </h3>
2
+ <div class="overflow-hidden relative px-2 py-1 text-sm">
3
+ {% if value %}
4
+ <div class="absolute bottom-0 left-0 rounded top-0 bg-primary-100 z-10 dark:bg-primary-500/20" style="width: {{ value }}%"></div>
7
5
  {% endif %}
8
6
 
9
- {% if description %}
10
- <strong class="font-semibold ml-auto">
11
- {{ description }}
12
- </strong>
13
- {% endif %}
14
- </div>
7
+ <div class="flex flex-row relative z-20">
8
+ {% if title %}
9
+ <h3 class="text-font-default-light dark:text-font-default-dark text-sm">
10
+ {{ title }}
11
+ </h3>
12
+ {% endif %}
15
13
 
16
- <div class="bg-gray-200 flex flex-row h-1 rounded overflow-hidden dark:bg-white/10">
17
- {% if value %}
18
- <div class="bg-primary-500 h-1 rounded-full" style="width: {{ value }}%"></div>
19
- {% endif %}
14
+ {% if description %}
15
+ <strong class="font-semibold text-font-important-light ml-auto dark:text-font-important-dark">
16
+ {{ description }}
17
+ </strong>
18
+ {% endif %}
19
+ </div>
20
20
  </div>
21
21
  </div>
@@ -1 +1 @@
1
- <div class="bg-gray-200 dark:bg-gray-800 dark:border-gray-800 {% if vertical == 1 %}mx-8 w-px{% else%}h-px my-8{% endif %}{% if class %} {{ class }}{% endif %}"></div>
1
+ <div class="bg-gray-200 dark:bg-gray-800 dark:border-gray-800 {% if vertical == 1 %}mx-6 w-px{% else%}h-px my-6{% endif %}{% if class %} {{ class }}{% endif %}"></div>
@@ -27,7 +27,7 @@
27
27
  {% for item in group.items %}
28
28
  {% if item.has_permission %}
29
29
  <li>
30
- <a href="{% if item.link_callback %}{{ item.link_callback }}{% else %}{{ item.link }}{% endif %}" class="flex h-11 items-center -mx-3 px-3 py-2 rounded-md {% if item.active %}bg-gray-100 font-semibold text-primary-600 dark:bg-white/[.06] dark:text-primary-500{% endif %}">
30
+ <a href="{% if item.link_callback %}{{ item.link_callback }}{% else %}{{ item.link }}{% endif %}" class="flex h-11 items-center -mx-3 px-3 py-2 rounded-md hover:text-primary-600 dark:hover:text-primary-500 {% if item.active %}bg-gray-100 font-semibold text-primary-600 dark:bg-white/[.06] dark:text-primary-500{% endif %}">
31
31
  {% if item.icon %}
32
32
  <span class="material-symbols-outlined md-18 mr-3 w-4.5">
33
33
  {{ item.icon }}
@@ -39,7 +39,7 @@
39
39
  </span>
40
40
 
41
41
  {% if item.badge %}
42
- <span class="bg-red-600 font-semibold ml-2 px-1 rounded-sm text-xs text-white">
42
+ <span class="bg-red-600 font-semibold ml-2 px-1 relative rounded-sm text-xs text-white">
43
43
  {% if item.badge_callback %}
44
44
  {{ item.badge_callback }}
45
45
  {% else %}
@@ -0,0 +1,11 @@
1
+ {% load i18n %}
2
+
3
+ <div class="flex flex-col gap-3 items-center w-full lg:flex-row">
4
+ <a href="#" class="border cancel-link flex items-center justify-center font-medium px-3 py-2 rounded-md w-full hover:bg-gray-50 lg:block lg:mb-0 lg:w-auto dark:border-gray-700 dark:text-font-default-dark dark:hover:text-gray-200 dark:hover:bg-gray-900">
5
+ {% translate "No, take me back" %}
6
+ </a>
7
+
8
+ <button type="submit" class="bg-red-600 cursor-pointer flex items-center justify-center font-medium h-9.5 ml-0 px-3 py-2 rounded-md text-white w-full lg:ml-auto lg:w-auto dark:bg-red-500/20 dark:text-red-500">
9
+ {% translate "Yes, I’m sure" %}
10
+ </button>
11
+ </div>
@@ -2,9 +2,14 @@
2
2
 
3
3
  <span class="flex gap-4 items-center">
4
4
  {% if value.3 and value.3.path %}
5
- <span class="bg-center bg-cover bg-white flex font-medium justify-center overflow-hidden dark:bg-gray-900 dark:border-gray-700 {% if value.3.squared %}rounded-sm{% else %}rounded-full{% endif %}{% if not value.3.borderless %} border{% endif %}{% if not value.3.width or not value.3.height %} h-8 max-w-8 min-w-8{% endif %}">
6
- <img loading="lazy" src="{{ value.3.path }}" class="max-w-none object-cover" {% if value.3.width %}width="{{ value.3.width }}"{% endif %} {% if value.3.height %}height="{{ value.3.height }}"{% endif %} alt="{% trans "Record picture" %}" />
7
- </span>
5
+ {% if value.3.as_background %}
6
+ <span class="block bg-center bg-contain bg-no-repeat {% if not value.3.width %}w-16{% endif %} {% if not value.3.height %}h-12{% endif %}" style="background-image: url({{ value.3.path }}); {% if value.3.height %}height: {{ value.3.height }}px;{% endif %} {% if value.3.width %}width: {{ value.3.width }}px;{% endif %}">
7
+ </span>
8
+ {% else %}
9
+ <span class="bg-center bg-cover bg-white flex font-medium justify-center overflow-hidden dark:bg-gray-900 dark:border-gray-700 {% if value.3.squared %}rounded-sm{% else %}rounded-full{% endif %}{% if not value.3.borderless %} border{% endif %}{% if not value.3.width or not value.3.height %} h-8 max-w-8 min-w-8{% endif %}">
10
+ <img loading="lazy" src="{{ value.3.path }}" class="max-w-none object-cover" {% if value.3.width %}width="{{ value.3.width }}"{% endif %} {% if value.3.height %}height="{{ value.3.height }}"{% endif %} alt="{% trans "Record picture" %}" />
11
+ </span>
12
+ {% endif %}
8
13
  {% elif value.2 %}
9
14
  <span class="bg-white border flex font-medium h-8 justify-center items-center rounded-full text-xs uppercase w-8 dark:bg-gray-900 dark:border-gray-700">
10
15
  {{ value.2 }}
@@ -1 +1 @@
1
- <div class="readonly max-w-4xl py-2 text-sm *:rounded-md {% if not adminform.model_admin.compressed_fields and not field.is_image %}bg-gray-50 border font-medium px-3 rounded-md shadow-sm dark:border-gray-700 dark:bg-gray-800{% endif %} {% if field.is_image %}inline-block [&_img]:rounded-md !py-0{% endif %}">{% if value %}{{ value }}{% elif field.contents %}{{ field.contents }}{% else %}-{% endif %}</div>
1
+ <div class="readonly {% if field.is_json %}max-w-4xl{% else %}max-w-2xl{% endif %} py-2 text-sm *:rounded-md {% if not adminform.model_admin.compressed_fields and not field.is_image %}bg-gray-50 border font-medium px-3 rounded-md shadow-sm dark:border-gray-700 dark:bg-gray-800{% endif %} {% if field.is_image %}inline-block [&_img]:rounded-md !py-0{% endif %}">{% if value %}{{ value }}{% elif field.contents %}{{ field.contents }}{% else %}-{% endif %}</div>
@@ -1,4 +1,6 @@
1
+
1
2
  <div class="form-row
3
+ {% for field in line %}{% if inline_admin_formset.opts.ordering_field and field.field.name == inline_admin_formset.opts.ordering_field and inline_admin_formset.opts.hide_ordering_field %} hidden{% endif %}{% endfor %}
2
4
  {% if adminform.model_admin.compressed_fields %} border-b border-gray-200 -mx-3 px-3 pt-3 first:pt-0 dark:border-gray-800 last:border-b-0{% endif %}
3
5
  {% if not line.fields|length == 1 %} flex flex-row flex-wrap gap-x-8{% endif %}
4
6
  {% if not line.has_visible_field %} hidden{% endif %}
@@ -10,7 +10,7 @@
10
10
  </span>
11
11
 
12
12
  {% if cl and cl.full_result_count != cl.result_count %}
13
- <span class="ml-2 text-sm">
13
+ <span class="font-medium ml-2 text-font-subtle-light text-sm dark:text-font-subtle-dark">
14
14
  {% blocktranslate count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktranslate %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktranslate with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktranslate %}{% else %}{% translate "Show all" %}{% endif %}</a>)
15
15
  </span>
16
16
  {% endif %}