django-unfold 0.43.0__py3-none-any.whl → 0.44.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.43.0.dist-info → django_unfold-0.44.0.dist-info}/METADATA +1 -1
- {django_unfold-0.43.0.dist-info → django_unfold-0.44.0.dist-info}/RECORD +129 -117
- {django_unfold-0.43.0.dist-info → django_unfold-0.44.0.dist-info}/WHEEL +1 -1
- unfold/contrib/filters/admin.py +5 -5
- unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
- unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +1 -1
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +1 -1
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +3 -3
- unfold/contrib/forms/templates/unfold/forms/array.html +3 -3
- unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +25 -25
- unfold/contrib/forms/widgets.py +5 -5
- unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +1 -1
- unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +2 -2
- unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +2 -2
- unfold/contrib/guardian/templates/unfold/guardian/group_form.html +8 -8
- unfold/contrib/guardian/templates/unfold/guardian/user_form.html +8 -8
- unfold/contrib/import_export/templates/admin/import_export/change_form.html +1 -1
- unfold/contrib/import_export/templates/admin/import_export/export.html +4 -4
- unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +4 -4
- unfold/contrib/import_export/templates/admin/import_export/import_errors.html +2 -2
- unfold/contrib/import_export/templates/admin/import_export/import_form.html +2 -2
- unfold/contrib/import_export/templates/admin/import_export/import_preview.html +5 -5
- unfold/contrib/import_export/templates/admin/import_export/import_validation.html +8 -8
- unfold/contrib/simple_history/templates/simple_history/object_history.html +2 -2
- unfold/contrib/simple_history/templates/simple_history/object_history_form.html +1 -1
- unfold/contrib/simple_history/templates/simple_history/object_history_list.html +9 -9
- unfold/contrib/simple_history/templates/simple_history/submit_line.html +4 -4
- unfold/forms.py +13 -2
- unfold/settings.py +20 -7
- unfold/sites.py +23 -8
- unfold/static/admin/js/inlines.js +2 -2
- unfold/static/unfold/css/styles.css +1 -1
- unfold/static/unfold/js/alpine.resize.js +1 -0
- unfold/static/unfold/js/app.js +52 -71
- unfold/static/unfold/js/htmx.js +1 -1
- unfold/styles.css +67 -71
- unfold/templates/admin/actions.html +19 -17
- unfold/templates/admin/app_list.html +3 -3
- unfold/templates/admin/auth/user/add_form.html +1 -1
- unfold/templates/admin/auth/user/change_password.html +2 -2
- unfold/templates/admin/base.html +1 -1
- unfold/templates/admin/change_list.html +24 -30
- unfold/templates/admin/change_list_results.html +40 -6
- unfold/templates/admin/date_hierarchy.html +1 -1
- unfold/templates/admin/delete_confirmation.html +7 -7
- unfold/templates/admin/delete_selected_confirmation.html +7 -7
- unfold/templates/admin/edit_inline/stacked.html +4 -4
- unfold/templates/admin/edit_inline/tabular.html +8 -151
- unfold/templates/admin/filter.html +7 -7
- unfold/templates/admin/includes/fieldset.html +2 -2
- unfold/templates/admin/includes/object_delete_summary.html +1 -1
- unfold/templates/admin/login.html +4 -4
- unfold/templates/admin/nav_sidebar.html +1 -8
- unfold/templates/admin/object_history.html +7 -7
- unfold/templates/admin/pagination.html +36 -30
- unfold/templates/admin/search_form.html +11 -9
- unfold/templates/admin/submit_line.html +11 -11
- unfold/templates/auth/widgets/read_only_password_hash.html +1 -1
- unfold/templates/registration/logged_out.html +3 -3
- unfold/templates/registration/password_change_done.html +1 -1
- unfold/templates/registration/password_change_form.html +1 -1
- unfold/templates/unfold/components/button.html +1 -1
- unfold/templates/unfold/components/card.html +4 -4
- unfold/templates/unfold/components/chart/cohort.html +1 -1
- unfold/templates/unfold/components/navigation.html +2 -2
- unfold/templates/unfold/components/separator.html +1 -1
- unfold/templates/unfold/components/table.html +6 -6
- unfold/templates/unfold/components/tracker.html +1 -1
- unfold/templates/unfold/helpers/account_links.html +6 -6
- unfold/templates/unfold/helpers/actions_row.html +5 -5
- unfold/templates/unfold/helpers/add_link.html +1 -1
- unfold/templates/unfold/helpers/app_list.html +10 -10
- unfold/templates/unfold/helpers/app_list_default.html +10 -10
- unfold/templates/unfold/helpers/boolean.html +1 -1
- unfold/templates/unfold/helpers/breadcrumb_item.html +1 -1
- unfold/templates/unfold/helpers/change_list_actions.html +13 -0
- unfold/templates/unfold/helpers/change_list_filter.html +31 -0
- unfold/templates/unfold/helpers/change_list_filter_actions.html +23 -0
- unfold/templates/unfold/helpers/delete_submit_line.html +2 -2
- unfold/templates/unfold/helpers/display_header.html +3 -3
- unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +13 -0
- unfold/templates/unfold/helpers/edit_inline/tabular_error.html +8 -0
- unfold/templates/unfold/helpers/edit_inline/tabular_field.html +25 -0
- unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +25 -0
- unfold/templates/unfold/helpers/edit_inline/tabular_row.html +27 -0
- unfold/templates/unfold/helpers/edit_inline/tabular_title.html +49 -0
- unfold/templates/unfold/helpers/field_readonly.html +1 -1
- unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
- unfold/templates/unfold/helpers/fieldset_row.html +5 -73
- unfold/templates/unfold/helpers/fieldset_row_checkbox.html +45 -0
- unfold/templates/unfold/helpers/fieldset_row_field.html +21 -0
- unfold/templates/unfold/helpers/fieldsets_tabs.html +2 -2
- unfold/templates/unfold/helpers/header.html +1 -1
- unfold/templates/unfold/helpers/history.html +4 -4
- unfold/templates/unfold/helpers/label.html +1 -1
- unfold/templates/unfold/helpers/language_switch.html +3 -3
- unfold/templates/unfold/helpers/messages/debug.html +1 -1
- unfold/templates/unfold/helpers/messages/error.html +1 -1
- unfold/templates/unfold/helpers/messages/errornote.html +1 -1
- unfold/templates/unfold/helpers/messages/info.html +1 -1
- unfold/templates/unfold/helpers/messages/success.html +1 -1
- unfold/templates/unfold/helpers/messages/warning.html +1 -1
- unfold/templates/unfold/helpers/navigation.html +3 -11
- unfold/templates/unfold/helpers/navigation_header.html +13 -0
- unfold/templates/unfold/helpers/pagination_ellipsis.html +1 -1
- unfold/templates/unfold/helpers/search.html +5 -5
- unfold/templates/unfold/helpers/search_results.html +2 -2
- unfold/templates/unfold/helpers/site_icon.html +7 -5
- unfold/templates/unfold/helpers/site_logo.html +1 -1
- unfold/templates/unfold/helpers/submit.html +1 -1
- unfold/templates/unfold/helpers/tab_action.html +2 -2
- unfold/templates/unfold/helpers/tab_list.html +9 -9
- unfold/templates/unfold/helpers/theme_switch.html +5 -5
- unfold/templates/unfold/helpers/userlinks.html +4 -0
- unfold/templates/unfold/helpers/welcomemsg.html +7 -3
- unfold/templates/unfold/layouts/base_simple.html +2 -2
- unfold/templates/unfold/layouts/skeleton.html +11 -5
- unfold/templates/unfold/widgets/clearable_file_input.html +6 -6
- unfold/templates/unfold/widgets/clearable_file_input_small.html +7 -7
- unfold/templates/unfold/widgets/foreign_key_raw_id.html +1 -1
- unfold/templates/unfold/widgets/radio.html +1 -1
- unfold/templates/unfold/widgets/range.html +1 -1
- unfold/templates/unfold/widgets/related_widget_wrapper.html +4 -4
- unfold/templates/unfold/widgets/textarea_expandable.html +1 -1
- unfold/templatetags/unfold.py +104 -0
- unfold/templatetags/unfold_list.py +9 -4
- unfold/widgets.py +31 -28
- unfold/templates/unfold/change_list_filter.html +0 -57
- {django_unfold-0.43.0.dist-info → django_unfold-0.44.0.dist-info}/LICENSE.md +0 -0
@@ -54,16 +54,32 @@
|
|
54
54
|
{% endblock %}
|
55
55
|
|
56
56
|
{% block content %}
|
57
|
-
<div id="content-main">
|
57
|
+
<div id="content-main" x-data="{ filterOpen: false }">
|
58
58
|
{% if cl.formset and cl.formset.errors %}
|
59
59
|
{% include "unfold/helpers/messages/errornote.html" with errors=cl.formset.errors %}
|
60
60
|
|
61
61
|
{{ cl.formset.non_form_errors }}
|
62
62
|
{% endif %}
|
63
63
|
|
64
|
-
<div class="flex -
|
65
|
-
|
66
|
-
|
64
|
+
<div class="flex flex-col gap-4 mb-4 sm:flex-row">
|
65
|
+
{% block search %}
|
66
|
+
{% search_form cl %}
|
67
|
+
{% endblock %}
|
68
|
+
|
69
|
+
{% block filters %}
|
70
|
+
{% if cl.has_filters %}
|
71
|
+
<a class="{% if cl.has_active_filters %}bg-primary-600 border-primary-600 text-white{% else %}bg-white border-base-200 dark:bg-base-900 dark:border-base-700{% endif %} border cursor-pointer flex font-medium group items-center px-3 py-2 rounded shadow-sm text-sm lg:ml-auto md:mt-0 {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = true" x-on:keydown.escape.window="filterOpen = false">
|
72
|
+
{% trans "Filters" %}
|
73
|
+
|
74
|
+
<span class="material-symbols-outlined md-18 ml-auto -mr-1 pl-4 {% if cl.has_active_filters %}text-white{% else %}text-base-400 group-hover:text-base-500 dark:group-hover:text-base-400 dark:text-base-500{% endif %}">filter_list</span>
|
75
|
+
</a>
|
76
|
+
{% endif %}
|
77
|
+
{% endblock %}
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<div class="flex -mx-4 module{% if cl.has_filters %} filtered{% endif %}" id="changelist" x-data="{ changeListWidth: 0 }">
|
81
|
+
<div class="changelist-form-container flex flex-row flex-grow gap-6 min-w-0 px-4">
|
82
|
+
<div class="flex-grow min-w-0 lg:pb-16" x-resize="changeListWidth = $width">
|
67
83
|
{% block date_hierarchy %}
|
68
84
|
{% if cl.date_hierarchy %}
|
69
85
|
{% date_hierarchy cl %}
|
@@ -74,37 +90,15 @@
|
|
74
90
|
{% include cl.model_admin.list_before_template %}
|
75
91
|
{% endif %}
|
76
92
|
|
77
|
-
<form id="changelist-form" method="post"{% if cl.formset and cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>
|
93
|
+
<form id="changelist-form" class="group" method="post"{% if cl.formset and cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>
|
78
94
|
{% csrf_token %}
|
79
95
|
|
80
96
|
{% if cl.formset %}
|
81
|
-
|
97
|
+
{{ cl.formset.management_form }}
|
82
98
|
{% endif %}
|
83
99
|
|
84
100
|
{% block result_list %}
|
85
|
-
{%
|
86
|
-
{% if cl.search_fields or action_form or cl.has_filters %}
|
87
|
-
<div class="bg-gray-50 flex flex-col gap-3 mb-4 p-3 rounded-md lg:flex-row dark:bg-gray-800">
|
88
|
-
{% block search %}
|
89
|
-
{% search_form cl %}
|
90
|
-
{% endblock %}
|
91
|
-
|
92
|
-
{% if action_form %}
|
93
|
-
{% admin_actions %}
|
94
|
-
{% endif %}
|
95
|
-
|
96
|
-
{% block filters %}
|
97
|
-
{% if cl.has_filters %}
|
98
|
-
<a class="{% if cl.has_active_filters %}bg-primary-600 border-primary-600 text-white{% else %}bg-white dark:bg-gray-900 dark:border-gray-700{% endif %} border cursor-pointer flex font-medium group items-center px-3 py-2 rounded-md shadow-sm text-sm lg:ml-auto md:mt-0 {% if not cl.model_admin.list_filter_sheet %}2xl:hidden{% endif %}" x-on:click="filterOpen = true" x-on:keydown.escape.window="filterOpen = false">
|
99
|
-
{% trans "Filters" %}
|
100
|
-
|
101
|
-
<span class="material-symbols-outlined md-18 ml-auto -mr-1 pl-4 {% if cl.has_active_filters %}text-white{% else %}text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-400 dark:text-gray-500{% endif %}">filter_list</span>
|
102
|
-
</a>
|
103
|
-
{% endif %}
|
104
|
-
{% endblock %}
|
105
|
-
</div>
|
106
|
-
{% endif %}
|
107
|
-
{% endif %}
|
101
|
+
{% include "unfold/helpers/change_list_actions.html" %}
|
108
102
|
|
109
103
|
{% unfold_result_list cl %}
|
110
104
|
|
@@ -120,7 +114,7 @@
|
|
120
114
|
</div>
|
121
115
|
|
122
116
|
{% if cl.has_filters %}
|
123
|
-
{% include "unfold/change_list_filter.html" %}
|
117
|
+
{% include "unfold/helpers/change_list_filter.html" %}
|
124
118
|
{% endif %}
|
125
119
|
</div>
|
126
120
|
</div>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
{% load i18n %}
|
1
|
+
{% load admin_urls i18n %}
|
2
2
|
|
3
3
|
{% if result_hidden_fields %}
|
4
4
|
<div class="hiddenfields">
|
@@ -7,8 +7,8 @@
|
|
7
7
|
{% endif %}
|
8
8
|
|
9
9
|
{% if results %}
|
10
|
-
<div class="overflow-x-auto lg:border lg:
|
11
|
-
<table id="result_list" class="block border-
|
10
|
+
<div class="-mx-1 px-1 overflow-x-auto lg:border lg:border-base-200 lg:mx-0 lg:px-0 lg:rounded lg:shadow-sm lg:dark:border-base-800 {% if cl.model_admin.list_horizontal_scrollbar_top %}simplebar-horizontal-scrollbar-top{% endif %}" data-simplebar data-simplebar-auto-hide="false">
|
11
|
+
<table id="result_list" class="block border-base-200 border-spacing-none border-separate w-full lg:table">
|
12
12
|
<thead>
|
13
13
|
<tr>
|
14
14
|
{% for header in result_headers %}
|
@@ -39,7 +39,7 @@
|
|
39
39
|
{% if header.sortable %}
|
40
40
|
{% if header.sort_priority > 0 %}
|
41
41
|
<div class="sortoptions flex items-center ml-2">
|
42
|
-
<a href="{{ header.url_toggle }}" class="flex items-center leading-none text-
|
42
|
+
<a href="{{ header.url_toggle }}" class="flex items-center leading-none text-base-400 hover:text-base-500 dark:text-base-500 dark:hover:text-base-400 toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% translate "Toggle sorting" %}">
|
43
43
|
{% if header.ascending %}
|
44
44
|
<span class="block material-symbols-outlined">arrow_circle_down</span>
|
45
45
|
{% else %}
|
@@ -47,7 +47,7 @@
|
|
47
47
|
{% endif %}
|
48
48
|
</a>
|
49
49
|
|
50
|
-
<a class="sortremove flex items-center leading-none ml-1 text-
|
50
|
+
<a class="sortremove flex items-center leading-none ml-1 text-base-400 dark:text-base-500 transition-all hover:text-red-700 dark:hover:text-red-500" href="{{ header.url_remove }}" title="{% translate "Remove from sorting" %}">
|
51
51
|
<span class="block material-symbols-outlined">cancel</span>
|
52
52
|
</a>
|
53
53
|
</div>
|
@@ -75,7 +75,7 @@
|
|
75
75
|
</tr>
|
76
76
|
{% endif %}
|
77
77
|
|
78
|
-
<tr class="{% cycle '' 'bg-
|
78
|
+
<tr class="{% cycle '' 'bg-base-50 dark:bg-white/[.02]' %} block border mb-3 rounded shadow-sm lg:table-row lg:border-none lg:mb-0 lg:shadow-none dark:border-base-800">
|
79
79
|
{% for item in result %}
|
80
80
|
{{ item }}
|
81
81
|
{% endfor %}
|
@@ -85,4 +85,38 @@
|
|
85
85
|
</tbody>
|
86
86
|
</table>
|
87
87
|
</div>
|
88
|
+
{% else %}
|
89
|
+
{% url cl.opts|admin_urlname:"add" as add_url %}
|
90
|
+
{% blocktranslate with name=cl.opts.verbose_name asvar title %}Add {{ name }}{% endblocktranslate %}
|
91
|
+
|
92
|
+
<div class="border border-base-200 flex flex-col items-center px-8 py-24 rounded shadow-sm dark:border-base-800">
|
93
|
+
<div class="bg-base-100 flex h-24 items-center justify-center mb-8 rounded-full w-24 dark:bg-base-800">
|
94
|
+
<span class="material-symbols-outlined text-base-500 !text-5xl dark:text-base-400">inbox</span>
|
95
|
+
</div>
|
96
|
+
|
97
|
+
<h2 class="font-semibold mb-1 text-xl text-font-important-light dark:text-font-important-dark">
|
98
|
+
{% trans "No results found" %}
|
99
|
+
</h2>
|
100
|
+
|
101
|
+
<p class="mb-6 text-center">
|
102
|
+
{% trans "This page yielded into no results. Create a new item or reset your filters." %}
|
103
|
+
</p>
|
104
|
+
|
105
|
+
{% if has_add_permission or cl.has_filters %}
|
106
|
+
<div class="flex flex-col gap-4 justify-center w-full lg:flex-row">
|
107
|
+
{% if has_add_permission %}
|
108
|
+
<a href="{% add_preserved_filters add_url is_popup to_field %}" class="bg-primary-600 flex flex-row font-medium gap-2 items-center h-9.5 justify-center px-3 py-2 rounded text-white w-full lg:w-auto">
|
109
|
+
<span class="material-symbols-outlined text-white">add</span> {{ title }}
|
110
|
+
</a>
|
111
|
+
{% endif %}
|
112
|
+
|
113
|
+
|
114
|
+
{% if cl.has_filters %}
|
115
|
+
<a href="{{ cl.clear_all_filters_qs }}" class="border border-base-200 flex flex-row font-medium gap-2 group/button h-9.5 items-center justify-center px-3 py-2 rounded transition-all w-full hover:text-primary-600 lg:w-auto dark:border-base-700 dark:hover:bg-base-900 dark:hover:text-primary-500">
|
116
|
+
<span class="material-symbols-outlined group-hover/button:text-primary-600 dark:group-hover/button:text-base-500 text-base-400 dark:text-base-500">filter_list_off</span> {% trans "Reset filters" %}
|
117
|
+
</a>
|
118
|
+
{% endif %}
|
119
|
+
</div>
|
120
|
+
{% endif %}
|
121
|
+
</div>
|
88
122
|
{% endif %}
|
@@ -6,7 +6,7 @@
|
|
6
6
|
{% if back %}
|
7
7
|
<li class="date-back px-2">
|
8
8
|
<a href="{{ back.link }}" class="flex group items-center hover:text-primary-600 dark:hover:text-primary-500">
|
9
|
-
<span class="material-symbols-outlined md-16 mr-2 text-
|
9
|
+
<span class="material-symbols-outlined md-16 mr-2 text-base-400 group-hover:text-primary-600 dark:group-hover:text-primary-500">arrow_back</span> {{ back.title }}
|
10
10
|
</a>
|
11
11
|
</li>
|
12
12
|
{% endif %}
|
@@ -32,12 +32,12 @@
|
|
32
32
|
|
33
33
|
{% block content %}
|
34
34
|
{% if perms_lacking %}
|
35
|
-
<div class="border border-
|
35
|
+
<div class="border border-base-200 rounded shadow-sm dark:border-base-800">
|
36
36
|
<p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
|
37
37
|
{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}
|
38
38
|
</p>
|
39
39
|
|
40
|
-
<div class="border-
|
40
|
+
<div class="border-base-200 border-t p-4 dark:border-base-800">
|
41
41
|
<ul class="leading-relaxed">
|
42
42
|
{% for obj in perms_lacking %}
|
43
43
|
<li>
|
@@ -48,12 +48,12 @@
|
|
48
48
|
</div>
|
49
49
|
</div>
|
50
50
|
{% elif protected %}
|
51
|
-
<div class="border border-
|
51
|
+
<div class="border border-base-200 rounded shadow-sm dark:border-base-800">
|
52
52
|
<p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
|
53
53
|
{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktranslate %}
|
54
54
|
</p>
|
55
55
|
|
56
|
-
<div class="border-t border-
|
56
|
+
<div class="border-t border-base-200 order-t p-4 dark:border-base-800">
|
57
57
|
<ul class="leading-relaxed">
|
58
58
|
{% for obj in protected %}
|
59
59
|
<li>
|
@@ -64,14 +64,14 @@
|
|
64
64
|
</div>
|
65
65
|
</div>
|
66
66
|
{% else %}
|
67
|
-
<div class="border border-
|
67
|
+
<div class="border border-base-200 rounded shadow-sm dark:border-base-800">
|
68
68
|
<p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
|
69
69
|
{% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktranslate %}
|
70
70
|
</p>
|
71
71
|
|
72
72
|
{% include "admin/includes/object_delete_summary.html" %}
|
73
73
|
|
74
|
-
<div class="border-
|
74
|
+
<div class="border-base-200 border-t p-4 dark:border-base-800">
|
75
75
|
<h2 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
|
76
76
|
{% translate "Objects" %}
|
77
77
|
</h2>
|
@@ -81,7 +81,7 @@
|
|
81
81
|
</ul>
|
82
82
|
</div>
|
83
83
|
|
84
|
-
<form method="post" class="border-
|
84
|
+
<form method="post" class="border-base-200 border-t px-4 py-3 dark:border-base-800">
|
85
85
|
{% csrf_token %}
|
86
86
|
|
87
87
|
<div class="flex items-center">
|
@@ -37,20 +37,20 @@
|
|
37
37
|
{% blocktranslate %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}
|
38
38
|
</p>
|
39
39
|
|
40
|
-
<div class="border-t border-
|
41
|
-
<ul class="leading-relaxed dark:border-
|
40
|
+
<div class="border-t border-base-200 p-4 dark:border-base-800">
|
41
|
+
<ul class="leading-relaxed dark:border-base-800">
|
42
42
|
{% for obj in perms_lacking %}
|
43
43
|
<li>{{ obj }}</li>
|
44
44
|
{% endfor %}
|
45
45
|
</ul>
|
46
46
|
</div>
|
47
47
|
{% elif protected %}
|
48
|
-
<div class="border border-
|
48
|
+
<div class="border border-base-200 rounded shadow-sm dark:border-base-800">
|
49
49
|
<p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
|
50
50
|
{% blocktranslate %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktranslate %}
|
51
51
|
</p>
|
52
52
|
|
53
|
-
<div class="border-t border-
|
53
|
+
<div class="border-t border-base-200 p-4 dark:border-base-800">
|
54
54
|
<ul class="leading-relaxed">
|
55
55
|
{% for obj in protected %}
|
56
56
|
<li>{{ obj }}</li>
|
@@ -59,14 +59,14 @@
|
|
59
59
|
</div>
|
60
60
|
</div>
|
61
61
|
{% else %}
|
62
|
-
<div class="border border-
|
62
|
+
<div class="border border-base-200 rounded shadow-sm dark:border-base-800">
|
63
63
|
<p class="font-semibold p-4 text-font-important-light dark:text-font-important-dark">
|
64
64
|
{% blocktranslate %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktranslate %}
|
65
65
|
</p>
|
66
66
|
|
67
67
|
{% include "admin/includes/object_delete_summary.html" %}
|
68
68
|
|
69
|
-
<div class="border-t border-
|
69
|
+
<div class="border-t border-base-200 p-4 dark:border-base-800">
|
70
70
|
<h2 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
|
71
71
|
{% translate "Objects" %}
|
72
72
|
</h2>
|
@@ -78,7 +78,7 @@
|
|
78
78
|
{% endfor %}
|
79
79
|
</div>
|
80
80
|
|
81
|
-
<form method="post" class="border-t border-
|
81
|
+
<form method="post" class="border-t border-base-200 px-4 py-3 dark:border-base-800">
|
82
82
|
{% csrf_token %}
|
83
83
|
|
84
84
|
<div class="flex items-center">
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<fieldset class="module relative {{ inline_admin_formset.classes }}" aria-labelledby="{{ inline_admin_formset.formset.prefix }}-heading">
|
5
5
|
{% if inline_admin_formset.is_collapsible %}<details><summary>{% endif %}
|
6
6
|
|
7
|
-
<h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="inline-heading bg-
|
7
|
+
<h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="inline-heading bg-base-100 font-semibold mb-6 px-4 py-3 rounded text-font-important-light lg:-mx-4 dark:bg-white/[.02] dark:text-font-important-dark {% if inline_admin_formset.opts.tab %}hidden{% endif %} {% if inline_admin_formset.is_collapsible %} cursor-pointer{% endif %}">
|
8
8
|
{% if inline_admin_formset.formset.max_num == 1 %}
|
9
9
|
{{ inline_admin_formset.opts.verbose_name|capfirst }}
|
10
10
|
{% else %}
|
@@ -17,7 +17,7 @@
|
|
17
17
|
{{ inline_admin_formset.formset.management_form }}
|
18
18
|
{% include "unfold/helpers/messages/error.html" with errors=inline_admin_formset.formset.non_form_errors %}
|
19
19
|
|
20
|
-
<div class="border border-
|
20
|
+
<div class="border border-base-200 mb-6 overflow-hidden rounded shadow-sm w-full dark:border-base-800 *:border-t first:*:border-t-0 *:border-base-200 dark:*:border-base-800"
|
21
21
|
{% if inline_admin_formset.opts.ordering_field %}
|
22
22
|
data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}" x-on:end="sortRecords" x-sort.ghost
|
23
23
|
{% endif %}>
|
@@ -25,7 +25,7 @@
|
|
25
25
|
{% for inline_admin_form in inline_admin_formset %}
|
26
26
|
<div x-sort:item class="inline-related group inline-stacked {% 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 last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
|
27
27
|
{% if not inline_admin_formset.opts.hide_title or inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
|
28
|
-
<h3 class="bg-
|
28
|
+
<h3 class="bg-base-50 border-b border-base-200 flex font-medium items-center gap-2 px-3 py-2 text-sm dark:bg-white/[.02] dark:border-base-800">
|
29
29
|
{% if inline_admin_formset.opts.ordering_field %}
|
30
30
|
{% if inline_admin_form.original %}
|
31
31
|
<span class="material-symbols-outlined cursor-pointer" x-sort:handle>drag_indicator</span>
|
@@ -83,7 +83,7 @@
|
|
83
83
|
{% include "unfold/helpers/messages/error.html" with errors=inline_admin_form.form.non_field_errors %}
|
84
84
|
|
85
85
|
{% for fieldset in inline_admin_form %}
|
86
|
-
<div class="
|
86
|
+
<div class="{% if inline_admin_formset.opts.hide_title %}{% if not inline_admin_formset.formset.can_delete or not inline_admin_formset.has_delete_permission %}pt-3{% endif %}{% endif %}">
|
87
87
|
{% include 'admin/includes/fieldset.html' with stacked=1 %}
|
88
88
|
</div>
|
89
89
|
{% endfor %}
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<fieldset class="module relative {{ inline_admin_formset.classes }} min-w-0" aria-labelledby="{{ inline_admin_formset.formset.prefix }}-heading">
|
8
8
|
{% if inline_admin_formset.is_collapsible %}<details><summary>{% endif %}
|
9
9
|
|
10
|
-
<h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="bg-
|
10
|
+
<h2 id="{{ inline_admin_formset.formset.prefix }}-heading" class="bg-base-100 border border-transparent font-semibold mb-6 px-4 py-3 rounded text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:text-font-important-dark {% if inline_admin_formset.opts.tab %}hidden{% endif %} {% if inline_admin_formset.is_collapsible %} cursor-pointer{% endif %}">
|
11
11
|
{% if inline_admin_formset.formset.max_num == 1 %}
|
12
12
|
{{ inline_admin_formset.opts.verbose_name|capfirst }}
|
13
13
|
{% else %}
|
@@ -19,160 +19,17 @@
|
|
19
19
|
|
20
20
|
{{ inline_admin_formset.formset.non_form_errors }}
|
21
21
|
|
22
|
-
<div class="border border-
|
23
|
-
<table class="
|
24
|
-
|
25
|
-
data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}"
|
26
|
-
x-on:end="sortRecords"
|
27
|
-
x-sort.ghost
|
28
|
-
{% endif %}>
|
29
|
-
<thead class="hidden lg:table-header-group">
|
30
|
-
<tr>
|
31
|
-
{% for field in inline_admin_formset.fields %}
|
32
|
-
{% if not field.widget.is_hidden %}
|
33
|
-
<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 %}">
|
34
|
-
<span class="flex flex-row items-center">
|
35
|
-
{{ field.label|capfirst }}
|
36
|
-
|
37
|
-
{% if field.help_text %}
|
38
|
-
<span class="cursor-pointer material-symbols-outlined ml-2 text-gray-400 dark:text-gray-500" title="{{ field.help_text|striptags }}">help</span>
|
39
|
-
{% endif %}
|
40
|
-
</span>
|
41
|
-
</th>
|
42
|
-
{% endif %}
|
43
|
-
{% endfor %}
|
44
|
-
|
45
|
-
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
|
46
|
-
<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">
|
47
|
-
{% translate "Delete?" %}
|
48
|
-
</th>
|
49
|
-
{% endif %}
|
50
|
-
</tr>
|
51
|
-
</thead>
|
22
|
+
<div class="border border-base-200 mb-6 overflow-x-auto rounded shadow-sm dark:border-base-800" data-simplebar data-simplebar-auto-hide="false">
|
23
|
+
<table class="tabular-table w-full" {% if inline_admin_formset.opts.ordering_field %}data-ordering-field="{{ inline_admin_formset.opts.ordering_field }}" x-on:end="sortRecords" x-sort.ghost{% endif %}>
|
24
|
+
{% include "unfold/helpers/edit_inline/tabular_heading.html" %}
|
52
25
|
|
53
26
|
{% for inline_admin_form in inline_admin_formset %}
|
54
|
-
<tbody x-sort:item>
|
55
|
-
{%
|
56
|
-
<tr class="row-form-errors group inline-tabular">
|
57
|
-
<td colspan="{{ inline_admin_form|cell_count }}">
|
58
|
-
{% include "unfold/helpers/messages/error.html" with errors=inline_admin_form.form.non_field_errors %}
|
59
|
-
</td>
|
60
|
-
</tr>
|
61
|
-
{% endif %}
|
62
|
-
|
63
|
-
{% if inline_admin_form.original or inline_admin_form.show_url %}
|
64
|
-
<tr>
|
65
|
-
<td class="original" colspan="{{ inline_admin_form|cell_count }}">
|
66
|
-
{% if not inline_admin_formset.opts.hide_title %}
|
67
|
-
{% if inline_admin_form.original or inline_admin_form.show_url %}
|
68
|
-
<p class="flex font-medium items-center px-3 pt-2 text-xs">
|
69
|
-
{% if inline_admin_form.original %}
|
70
|
-
<span>
|
71
|
-
{% with inline_title=inline_admin_form.original.get_inline_title %}
|
72
|
-
{% if inline_title %}
|
73
|
-
{{ inline_title }}
|
74
|
-
{% else %}
|
75
|
-
{{ inline_admin_form.original }}
|
76
|
-
{% endif %}
|
77
|
-
{% endwith %}
|
78
|
-
</span>
|
79
|
-
|
80
|
-
{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}
|
81
|
-
<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">
|
82
|
-
{% if inline_admin_formset.has_change_permission %}
|
83
|
-
{% translate "Change" %}
|
84
|
-
{% else %}
|
85
|
-
{% translate "View" %}
|
86
|
-
{% endif %}
|
87
|
-
</a>
|
88
|
-
{% endif %}
|
89
|
-
{% endif %}
|
90
|
-
|
91
|
-
{% if inline_admin_form.show_url %}
|
92
|
-
<a href="{{ inline_admin_form.absolute_url }}" class="font-medium ml-2 text-primary-600 dark:text-primary-500">
|
93
|
-
{% translate "View on site" %}
|
94
|
-
</a>
|
95
|
-
{% endif %}
|
96
|
-
</p>
|
97
|
-
{% endif %}
|
98
|
-
{% endif %}
|
99
|
-
|
100
|
-
{% if inline_admin_form.needs_explicit_pk_field %}
|
101
|
-
{{ inline_admin_form.pk_field.field }}
|
102
|
-
{% endif %}
|
103
|
-
|
104
|
-
{% if inline_admin_form.fk_field %}
|
105
|
-
{{ inline_admin_form.fk_field.field }}
|
106
|
-
{% endif %}
|
107
|
-
</td>
|
108
|
-
</tr>
|
109
|
-
{% endif %}
|
110
|
-
|
111
|
-
<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 %}">
|
112
|
-
{% spaceless %}
|
113
|
-
{% for fieldset in inline_admin_form %}
|
114
|
-
{% for line in fieldset %}
|
115
|
-
{% for field in line %}
|
116
|
-
{% if not field.is_readonly and field.field.is_hidden %}
|
117
|
-
{{ field.field }}
|
118
|
-
{% endif %}
|
119
|
-
{% endfor %}
|
120
|
-
{% endfor %}
|
121
|
-
{% endfor %}
|
122
|
-
{% endspaceless %}
|
123
|
-
|
124
|
-
{% with is_last_row=forloop.last %}
|
125
|
-
{% for fieldset in inline_admin_form %}
|
126
|
-
{% for line in fieldset %}
|
127
|
-
{% with is_last_col=forloop.last %}
|
128
|
-
{% for field in line %}
|
129
|
-
{% if field.is_readonly or not field.field.is_hidden %}
|
130
|
-
<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 }}">
|
131
|
-
<div class="flex flex-row gap-3 items-center">
|
132
|
-
{% if forloop.parentloop.counter == 1 and forloop.counter == 1 %}
|
133
|
-
{% if inline_admin_formset.opts.ordering_field %}
|
134
|
-
{% if inline_admin_form.original %}
|
135
|
-
<span class="material-symbols-outlined cursor-pointer" x-sort:handle>drag_indicator</span>
|
136
|
-
{% else %}
|
137
|
-
<span class="-mr-3" x-sort:handle></span>
|
138
|
-
{% endif %}
|
139
|
-
{% endif %}
|
140
|
-
{% endif %}
|
141
|
-
|
142
|
-
{% if field.is_readonly %}
|
143
|
-
{% include "unfold/helpers/field_readonly_value.html" with tabular=1 %}
|
144
|
-
{% else %}
|
145
|
-
{{ field.field }}
|
27
|
+
<tbody class="{% if inline_admin_form.original or inline_admin_form.show_url %}has_original {% else %}template{% endif %}" x-sort:item>
|
28
|
+
{% include "unfold/helpers/edit_inline/tabular_error.html" %}
|
146
29
|
|
147
|
-
|
148
|
-
<div class="mt-1 text-red-600 text-sm dark:text-red-500">
|
149
|
-
{% for error in field.field.errors %}
|
150
|
-
{{ error }}
|
151
|
-
{% endfor %}
|
152
|
-
</div>
|
153
|
-
{% endif %}
|
154
|
-
{% endif %}
|
155
|
-
</div>
|
156
|
-
</td>
|
157
|
-
{% endif %}
|
158
|
-
{% endfor %}
|
159
|
-
{% endwith %}
|
160
|
-
{% endfor %}
|
161
|
-
{% endfor %}
|
30
|
+
{% include "unfold/helpers/edit_inline/tabular_title.html" %}
|
162
31
|
|
163
|
-
|
164
|
-
<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" %}">
|
165
|
-
{% if inline_admin_form.original %}
|
166
|
-
<div class="flex flex-row lg:mt-3">
|
167
|
-
<div class="ml-auto">
|
168
|
-
{{ inline_admin_form.deletion_field.field|add_css_class:form_classes.checkbox }}
|
169
|
-
</div>
|
170
|
-
</div>
|
171
|
-
{% endif %}
|
172
|
-
</td>
|
173
|
-
{% endif %}
|
174
|
-
{% endwith %}
|
175
|
-
</tr>
|
32
|
+
{% include "unfold/helpers/edit_inline/tabular_row.html" %}
|
176
33
|
</tbody>
|
177
34
|
{% endfor %}
|
178
35
|
</table>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{% load i18n unfold %}
|
2
2
|
|
3
|
-
<div
|
3
|
+
<div>
|
4
4
|
<h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
|
5
5
|
{% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}
|
6
6
|
</h3>
|
@@ -12,20 +12,20 @@
|
|
12
12
|
{% endfor %}
|
13
13
|
|
14
14
|
{% if spec|class_name == "BooleanFieldListFilter" %}
|
15
|
-
<ul class="border
|
15
|
+
<ul class="flex border min-w-20 rounded shadow-sm text-font-default-light dark:border-base-700 dark:text-font-default-dark w-full">
|
16
16
|
{% for choice in choices %}
|
17
|
-
<li class="{% if choice.selected %}font-
|
18
|
-
<a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}">
|
17
|
+
<li class="basis-1/3 border-r border-base-200 flex-grow truncate last:border-r-0 dark:border-base-700 {% if choice.selected %}font-semibold text-primary-600 dark:text-primary-500 {% else %}hover:text-base-700 dark:hover:text-base-200{% endif %}">
|
18
|
+
<a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}" class="block px-3 py-2 text-center hover:text-primary-600 dark:hover:text-primary-500">
|
19
19
|
{{ choice.display }}
|
20
20
|
</a>
|
21
21
|
</li>
|
22
22
|
{% endfor %}
|
23
23
|
</ul>
|
24
24
|
{% else %}
|
25
|
-
<ul class="border
|
25
|
+
<ul class="border flex flex-col rounded shadow-sm dark:border-base-700">
|
26
26
|
{% for choice in choices %}
|
27
|
-
<li class="
|
28
|
-
<a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}">
|
27
|
+
<li class="border-b border-base-200 last:border-b-0 dark:border-base-700 {% if choice.selected %}font-semibold text-primary-600 dark:text-primary-500 {% else %}hover:text-base-700 dark:hover:text-base-200{% endif %}">
|
28
|
+
<a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}" class="block px-3 py-2 hover:text-primary-600 dark:hover:text-primary-500">
|
29
29
|
{{ choice.display }}
|
30
30
|
</a>
|
31
31
|
</li>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<fieldset class="module{% if fieldset.classes %} {{ fieldset.classes }}{% endif %}" {% if stacked != 1 %}x-show="activeTab == 'general'"{% endif %}>
|
4
4
|
{% if fieldset.name and "tab" not in fieldset.classes %}
|
5
|
-
<h2 class="bg-
|
5
|
+
<h2 class="bg-base-100 font-semibold mb-6 px-4 py-3 rounded text-font-important-light text-sm lg:-mx-4 dark:bg-white/[.02] dark:text-font-important-dark">
|
6
6
|
{{ fieldset.name }}
|
7
7
|
</h2>
|
8
8
|
{% endif %}
|
@@ -13,7 +13,7 @@
|
|
13
13
|
</div>
|
14
14
|
{% endif %}
|
15
15
|
|
16
|
-
<div class="
|
16
|
+
<div class="{% fieldset_rows_classes %}">
|
17
17
|
{% for line in fieldset %}
|
18
18
|
{% include "unfold/helpers/fieldset_row.html" %}
|
19
19
|
{% endfor %}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{% load i18n %}
|
2
2
|
|
3
|
-
<div class="border-
|
3
|
+
<div class="border-base-200 border-t p-4 dark:border-base-800">
|
4
4
|
<h2 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
|
5
5
|
{% translate "Summary" %}
|
6
6
|
</h2>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
{{ form.media }}
|
8
8
|
{% endblock %}
|
9
9
|
|
10
|
-
{% block bodyclass %}{{ block.super }}bg-
|
10
|
+
{% block bodyclass %}{{ block.super }}bg-base-50 login dark:bg-base-900{% endblock %}
|
11
11
|
|
12
12
|
{% block usertools %}{% endblock %}
|
13
13
|
|
@@ -24,7 +24,7 @@
|
|
24
24
|
{% endblock %}
|
25
25
|
|
26
26
|
{% block base %}
|
27
|
-
<div class="flex min-h-screen">
|
27
|
+
<div id="page" class="flex min-h-screen">
|
28
28
|
<div class="flex flex-grow items-center justify-center mx-auto px-4 relative">
|
29
29
|
<div class="w-full sm:w-96">
|
30
30
|
<h1 class="font-semibold mb-10">
|
@@ -59,7 +59,7 @@
|
|
59
59
|
{% url 'admin_password_reset' as password_reset_url %}
|
60
60
|
|
61
61
|
<div class="submit-row">
|
62
|
-
<button type="submit" class="bg-primary-600 border border-transparent flex flex-row font-semibold group items-center justify-center py-2 rounded
|
62
|
+
<button type="submit" class="bg-primary-600 border border-transparent flex flex-row font-semibold group items-center justify-center py-2 rounded text-sm text-white w-full">
|
63
63
|
{% translate 'Log in' %}
|
64
64
|
|
65
65
|
<i class="material-symbols-outlined ml-2 relative right-0 text-lg transition-all group-hover:-right-1">arrow_forward</i>
|
@@ -68,7 +68,7 @@
|
|
68
68
|
|
69
69
|
{% if password_reset_url %}
|
70
70
|
<div class="password-reset-link">
|
71
|
-
<a href="{{ password_reset_url }}" class="border font-medium hidden mt-4 px-3 py-2 rounded
|
71
|
+
<a href="{{ password_reset_url }}" class="border border-base-200 font-medium hidden mt-4 px-3 py-2 rounded text-center text-sm text-base-500 transition-all w-full hover:bg-base-50 lg:block lg:w-auto dark:border-base-700 dark:text-font-default-dark dark:hover:text-base-200 dark:hover:bg-base-900">
|
72
72
|
{% translate 'Forgotten your password or username?' %}
|
73
73
|
</a>
|
74
74
|
</div>
|