django-unfold 0.52.0__tar.gz → 0.54.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. {django_unfold-0.52.0 → django_unfold-0.54.0}/PKG-INFO +1 -1
  2. {django_unfold-0.52.0 → django_unfold-0.54.0}/pyproject.toml +2 -1
  3. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/__init__.py +17 -0
  4. django_unfold-0.54.0/src/unfold/contrib/filters/admin/choice_filters.py +134 -0
  5. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/dropdown_filters.py +3 -3
  6. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/mixins.py +1 -1
  7. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/text_filters.py +2 -2
  8. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/forms.py +41 -3
  9. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
  10. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
  11. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +1 -1
  12. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/decorators.py +10 -4
  13. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/forms.py +2 -1
  14. django_unfold-0.54.0/src/unfold/paginator.py +10 -0
  15. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/sites.py +8 -6
  16. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/admin/js/inlines.js +23 -3
  17. django_unfold-0.54.0/src/unfold/static/unfold/css/styles.css +1 -0
  18. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/styles.css +2 -1
  19. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/auth/user/add_form.html +1 -1
  20. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/change_form.html +9 -8
  21. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/change_list.html +15 -13
  22. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/change_list_results.html +1 -1
  23. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/edit_inline/tabular.html +1 -2
  24. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/pagination.html +4 -20
  25. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/chart/cohort.html +2 -2
  26. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/change_list_filter.html +2 -2
  27. django_unfold-0.54.0/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +33 -0
  28. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_field.html +10 -8
  29. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/field.html +4 -2
  30. django_unfold-0.54.0/src/unfold/templates/unfold/helpers/fieldset_row.html +25 -0
  31. django_unfold-0.54.0/src/unfold/templates/unfold/helpers/form_label.html +7 -0
  32. django_unfold-0.54.0/src/unfold/templates/unfold/helpers/pagination_default.html +23 -0
  33. django_unfold-0.54.0/src/unfold/templates/unfold/helpers/pagination_infinite.html +11 -0
  34. django_unfold-0.54.0/src/unfold/templates/unfold/helpers/site_icon.html +31 -0
  35. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/tab_action.html +18 -3
  36. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +2 -2
  37. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/radio_option.html +1 -1
  38. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templatetags/unfold.py +66 -29
  39. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/utils.py +11 -0
  40. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/widgets.py +2 -0
  41. django_unfold-0.52.0/src/unfold/static/unfold/css/styles.css +0 -1
  42. django_unfold-0.52.0/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +0 -31
  43. django_unfold-0.52.0/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -13
  44. django_unfold-0.52.0/src/unfold/templates/unfold/helpers/form_label.html +0 -7
  45. django_unfold-0.52.0/src/unfold/templates/unfold/helpers/site_icon.html +0 -31
  46. {django_unfold-0.52.0 → django_unfold-0.54.0}/LICENSE.md +0 -0
  47. {django_unfold-0.52.0 → django_unfold-0.54.0}/README.md +0 -0
  48. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/__init__.py +0 -0
  49. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/admin.py +0 -0
  50. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/apps.py +0 -0
  51. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/checks.py +0 -0
  52. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/components.py +0 -0
  53. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/__init__.py +0 -0
  54. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/__init__.py +0 -0
  55. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/autocomplete_filters.py +0 -0
  56. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/datetime_filters.py +0 -0
  57. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/admin/numeric_filters.py +0 -0
  58. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/apps.py +0 -0
  59. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css +0 -0
  60. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  61. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  62. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js +0 -0
  63. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js +0 -0
  64. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
  65. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  66. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  67. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/__init__.py +0 -0
  68. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/apps.py +0 -0
  69. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix.css +0 -0
  70. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  71. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.js +0 -0
  72. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
  73. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  74. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  75. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/forms/widgets.py +0 -0
  76. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  77. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/apps.py +0 -0
  78. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  79. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  80. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  81. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  82. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  83. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  84. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  85. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  86. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/apps.py +0 -0
  87. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/forms.py +0 -0
  88. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
  89. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
  90. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
  91. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  92. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  93. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  94. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  95. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  96. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  97. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  98. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
  99. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  100. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  101. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
  102. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/inlines/__init__.py +0 -0
  103. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/inlines/admin.py +0 -0
  104. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/inlines/apps.py +0 -0
  105. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/inlines/checks.py +0 -0
  106. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/inlines/forms.py +0 -0
  107. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  108. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  109. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  110. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
  111. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
  112. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  113. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/dataclasses.py +0 -0
  114. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/enums.py +0 -0
  115. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/exceptions.py +0 -0
  116. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/fields.py +0 -0
  117. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/mixins/__init__.py +0 -0
  118. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/mixins/action_model_admin.py +0 -0
  119. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/mixins/base_model_admin.py +0 -0
  120. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/overrides.py +0 -0
  121. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/sections.py +0 -0
  122. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/settings.py +0 -0
  123. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +0 -0
  124. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/css/simplebar.css +0 -0
  125. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  126. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  127. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  128. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  129. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  130. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  131. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  132. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/alpine.anchor.js +0 -0
  133. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/alpine.js +0 -0
  134. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/alpine.persist.js +0 -0
  135. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/alpine.resize.js +0 -0
  136. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/alpine.sort.js +0 -0
  137. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/app.js +0 -0
  138. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/chart.js +0 -0
  139. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/htmx.js +0 -0
  140. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/select2.init.js +0 -0
  141. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/static/unfold/js/simplebar.js +0 -0
  142. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/actions.html +0 -0
  143. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/app_index.html +0 -0
  144. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/app_list.html +0 -0
  145. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
  146. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/base.html +0 -0
  147. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/base_site.html +0 -0
  148. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  149. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  150. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  151. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  152. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  153. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
  154. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/filter.html +0 -0
  155. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
  156. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  157. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/index.html +0 -0
  158. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/login.html +0 -0
  159. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  160. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/object_history.html +0 -0
  161. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/search_form.html +0 -0
  162. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/admin/submit_line.html +0 -0
  163. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  164. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/registration/logged_out.html +0 -0
  165. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/registration/password_change_done.html +0 -0
  166. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/registration/password_change_form.html +0 -0
  167. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/button.html +0 -0
  168. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/card.html +0 -0
  169. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  170. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  171. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/container.html +0 -0
  172. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  173. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/icon.html +0 -0
  174. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  175. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/progress.html +0 -0
  176. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  177. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/table.html +0 -0
  178. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/text.html +0 -0
  179. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/title.html +0 -0
  180. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/components/tracker.html +0 -0
  181. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
  182. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  183. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  184. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
  185. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  186. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
  187. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  188. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  189. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/change_list_actions.html +0 -0
  190. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/delete_submit_line.html +0 -0
  191. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/display_dropdown.html +0 -0
  192. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  193. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
  194. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +0 -0
  195. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_error.html +0 -0
  196. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +0 -0
  197. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_row.html +0 -0
  198. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_title.html +0 -0
  199. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/empty_results.html +0 -0
  200. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  201. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
  202. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/fieldset_row_checkbox.html +0 -0
  203. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/fieldset_row_field.html +0 -0
  204. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
  205. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
  206. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  207. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/header_back_button.html +0 -0
  208. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  209. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  210. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  211. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/language_switch.html +0 -0
  212. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages/debug.html +0 -0
  213. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  214. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
  215. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  216. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages/success.html +0 -0
  217. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages/warning.html +0 -0
  218. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  219. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
  220. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/navigation_header.html +0 -0
  221. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  222. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  223. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  224. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  225. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/site_branding.html +0 -0
  226. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/site_dropdown.html +0 -0
  227. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  228. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  229. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/tab_actions.html +0 -0
  230. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/tab_items.html +0 -0
  231. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
  232. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  233. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  234. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
  235. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
  236. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
  237. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/templatetags/preserve_changelist_filters.html +0 -0
  238. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +0 -0
  239. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +0 -0
  240. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
  241. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
  242. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
  243. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  244. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
  245. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
  246. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  247. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  248. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  249. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
  250. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
  251. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templatetags/__init__.py +0 -0
  252. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/templatetags/unfold_list.py +0 -0
  253. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/typing.py +0 -0
  254. {django_unfold-0.52.0 → django_unfold-0.54.0}/src/unfold/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-unfold
3
- Version: 0.52.0
3
+ Version: 0.54.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  License: MIT
6
6
  Keywords: django,admin,tailwind,theme
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-unfold"
3
- version = "0.52.0"
3
+ version = "0.54.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -30,6 +30,7 @@ django = ">=4.2"
30
30
  pytest = "^8.3"
31
31
  pytest-django = "^4.9"
32
32
  tox = "^4.21"
33
+ django-money = "^3.5.3"
33
34
 
34
35
 
35
36
  [tool.poetry.group.dev.dependencies]
@@ -2,6 +2,15 @@ from unfold.contrib.filters.admin.autocomplete_filters import (
2
2
  AutocompleteSelectFilter,
3
3
  AutocompleteSelectMultipleFilter,
4
4
  )
5
+ from unfold.contrib.filters.admin.choice_filters import (
6
+ AllValuesCheckboxFilter,
7
+ BooleanRadioFilter,
8
+ CheckboxFilter,
9
+ ChoicesCheckboxFilter,
10
+ ChoicesRadioFilter,
11
+ RadioFilter,
12
+ RelatedCheckboxFilter,
13
+ )
5
14
  from unfold.contrib.filters.admin.datetime_filters import (
6
15
  RangeDateFilter,
7
16
  RangeDateTimeFilter,
@@ -23,12 +32,20 @@ from unfold.contrib.filters.admin.numeric_filters import (
23
32
  from unfold.contrib.filters.admin.text_filters import FieldTextFilter, TextFilter
24
33
 
25
34
  __all__ = [
35
+ "AllValuesCheckboxFilter",
36
+ "BooleanRadioFilter",
37
+ "CheckboxFilter",
38
+ "ChoicesCheckboxFilter",
39
+ "ChoicesRadioFilter",
40
+ "MultipleRelatedCheckboxFilter",
41
+ "RadioFilter",
26
42
  "ChoicesDropdownFilter",
27
43
  "MultipleChoicesDropdownFilter",
28
44
  "DropdownFilter",
29
45
  "RelatedDropdownFilter",
30
46
  "MultipleDropdownFilter",
31
47
  "MultipleRelatedDropdownFilter",
48
+ "RelatedCheckboxFilter",
32
49
  "FieldTextFilter",
33
50
  "TextFilter",
34
51
  "RangeDateFilter",
@@ -0,0 +1,134 @@
1
+ from collections.abc import Generator
2
+ from typing import Any
3
+
4
+ from django.contrib import admin
5
+ from django.contrib.admin.views.main import ChangeList
6
+ from django.core.validators import EMPTY_VALUES
7
+ from django.db.models import QuerySet
8
+ from django.http import HttpRequest
9
+ from django.utils.translation import gettext_lazy as _
10
+
11
+ from unfold.contrib.filters.admin.mixins import MultiValueMixin, ValueMixin
12
+ from unfold.contrib.filters.forms import CheckboxForm, HorizontalRadioForm, RadioForm
13
+
14
+
15
+ class RadioFilter(admin.SimpleListFilter):
16
+ template = "unfold/filters/filters_field.html"
17
+ form_class = RadioForm
18
+ all_option = ["", _("All")]
19
+
20
+ def choices(self, changelist: ChangeList) -> tuple[dict[str, Any], ...]:
21
+ if self.all_option:
22
+ choices = [self.all_option, *self.lookup_choices]
23
+ else:
24
+ choices = self.lookup_choices
25
+
26
+ return (
27
+ {
28
+ "form": self.form_class(
29
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
30
+ name=self.parameter_name,
31
+ choices=choices,
32
+ data={self.parameter_name: self.value()},
33
+ ),
34
+ },
35
+ )
36
+
37
+
38
+ class CheckboxFilter(RadioFilter):
39
+ form_class = CheckboxForm
40
+ all_option = None
41
+
42
+
43
+ class ChoicesMixin:
44
+ template = "unfold/filters/filters_field.html"
45
+
46
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
47
+ if self.all_option:
48
+ choices = [self.all_option, *self.field.flatchoices]
49
+ else:
50
+ choices = self.field.flatchoices
51
+
52
+ yield {
53
+ "form": self.form_class(
54
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
55
+ name=self.lookup_kwarg,
56
+ choices=choices,
57
+ data={self.lookup_kwarg: self.value()},
58
+ ),
59
+ }
60
+
61
+
62
+ class ChoicesRadioFilter(ValueMixin, ChoicesMixin, admin.ChoicesFieldListFilter):
63
+ form_class = RadioForm
64
+ all_option = ["", _("All")]
65
+
66
+
67
+ class ChoicesCheckboxFilter(ValueMixin, ChoicesMixin, admin.ChoicesFieldListFilter):
68
+ form_class = CheckboxForm
69
+ all_option = None
70
+
71
+
72
+ class BooleanRadioFilter(ValueMixin, admin.BooleanFieldListFilter):
73
+ template = "unfold/filters/filters_field.html"
74
+ form_class = HorizontalRadioForm
75
+ all_option = ["", _("All")]
76
+
77
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
78
+ choices = [
79
+ self.all_option,
80
+ *[
81
+ ("1", _("Yes")),
82
+ ("0", _("No")),
83
+ ],
84
+ ]
85
+
86
+ yield {
87
+ "form": self.form_class(
88
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
89
+ name=self.lookup_kwarg,
90
+ choices=choices,
91
+ data={self.lookup_kwarg: self.value()},
92
+ ),
93
+ }
94
+
95
+
96
+ class RelatedCheckboxFilter(MultiValueMixin, admin.RelatedFieldListFilter):
97
+ template = "unfold/filters/filters_field.html"
98
+ form_class = CheckboxForm
99
+
100
+ def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
101
+ if self.value() not in EMPTY_VALUES:
102
+ return super().queryset(request, queryset)
103
+
104
+ return queryset
105
+
106
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
107
+ yield {
108
+ "form": self.form_class(
109
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
110
+ name=self.lookup_kwarg,
111
+ choices=self.lookup_choices,
112
+ data={self.lookup_kwarg: self.value()},
113
+ ),
114
+ }
115
+
116
+
117
+ class AllValuesCheckboxFilter(MultiValueMixin, admin.AllValuesFieldListFilter):
118
+ template = "unfold/filters/filters_field.html"
119
+ form_class = CheckboxForm
120
+
121
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
122
+ choices = [[i, val] for i, val in enumerate(self.lookup_choices)]
123
+
124
+ if len(choices) == 0:
125
+ return
126
+
127
+ yield {
128
+ "form": self.form_class(
129
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
130
+ name=self.lookup_kwarg,
131
+ choices=[[i, val] for i, val in enumerate(self.lookup_choices)],
132
+ data={self.lookup_kwarg: self.value()},
133
+ ),
134
+ }
@@ -25,7 +25,7 @@ class DropdownFilter(admin.SimpleListFilter):
25
25
  return (
26
26
  {
27
27
  "form": self.form_class(
28
- label=_("By %(filter_title)s") % {"filter_title": self.title},
28
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
29
29
  name=self.parameter_name,
30
30
  choices=[self.all_option, *self.lookup_choices],
31
31
  data={self.parameter_name: self.value()},
@@ -58,7 +58,7 @@ class ChoicesDropdownFilter(ValueMixin, DropdownMixin, admin.ChoicesFieldListFil
58
58
 
59
59
  yield {
60
60
  "form": self.form_class(
61
- label=_("By %(filter_title)s") % {"filter_title": self.title},
61
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
62
62
  name=self.lookup_kwarg,
63
63
  choices=choices,
64
64
  data={self.lookup_kwarg: self.value()},
@@ -88,7 +88,7 @@ class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFil
88
88
  def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
89
89
  yield {
90
90
  "form": self.form_class(
91
- label=_("By %(filter_title)s") % {"filter_title": self.title},
91
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
92
92
  name=self.lookup_kwarg,
93
93
  choices=[self.all_option, *self.lookup_choices],
94
94
  data={self.lookup_kwarg: self.value()},
@@ -141,7 +141,7 @@ class AutocompleteMixin:
141
141
  yield {
142
142
  "form": self.form_class(
143
143
  request=self.request,
144
- label=_("By %(filter_title)s") % {"filter_title": self.title},
144
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
145
145
  name=self.lookup_kwarg,
146
146
  choices=(),
147
147
  field=self.field,
@@ -26,7 +26,7 @@ class TextFilter(admin.SimpleListFilter):
26
26
  {
27
27
  "form": self.form_class(
28
28
  name=self.parameter_name,
29
- label=_("By %(filter_title)s") % {"filter_title": self.title},
29
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
30
30
  data={self.parameter_name: self.value()},
31
31
  ),
32
32
  },
@@ -57,7 +57,7 @@ class FieldTextFilter(ValueMixin, admin.FieldListFilter):
57
57
  return (
58
58
  {
59
59
  "form": self.form_class(
60
- label=_("By %(filter_title)s") % {"filter_title": self.title},
60
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
61
61
  name=self.lookup_kwarg,
62
62
  data={self.lookup_kwarg: self.value()},
63
63
  ),
@@ -1,14 +1,20 @@
1
1
  from django import forms
2
+ from django.contrib.admin.options import HORIZONTAL
2
3
  from django.contrib.admin.widgets import AutocompleteSelect, AutocompleteSelectMultiple
3
4
  from django.db.models import Field as ModelField
4
- from django.forms import ChoiceField, ModelMultipleChoiceField, MultipleChoiceField
5
+ from django.forms import (
6
+ ChoiceField,
7
+ ModelMultipleChoiceField,
8
+ MultipleChoiceField,
9
+ )
5
10
  from django.http import HttpRequest
6
11
  from django.utils.translation import gettext_lazy as _
7
12
 
8
13
  from unfold.admin import ModelAdmin
9
-
10
- from ...widgets import (
14
+ from unfold.widgets import (
11
15
  INPUT_CLASSES,
16
+ UnfoldAdminCheckboxSelectMultiple,
17
+ UnfoldAdminRadioSelectWidget,
12
18
  UnfoldAdminSelectMultipleWidget,
13
19
  UnfoldAdminSelectWidget,
14
20
  UnfoldAdminSplitDateTimeVerticalWidget,
@@ -71,6 +77,38 @@ class AutocompleteDropdownForm(forms.Form):
71
77
  }
72
78
 
73
79
 
80
+ class CheckboxForm(forms.Form):
81
+ field = MultipleChoiceField
82
+ widget = UnfoldAdminCheckboxSelectMultiple
83
+
84
+ def __init__(
85
+ self,
86
+ name: str,
87
+ label: str,
88
+ choices: tuple,
89
+ *args,
90
+ **kwargs,
91
+ ) -> None:
92
+ super().__init__(*args, **kwargs)
93
+
94
+ self.fields[name] = self.field(
95
+ label=label,
96
+ required=False,
97
+ choices=choices,
98
+ widget=self.widget,
99
+ )
100
+
101
+
102
+ class RadioForm(CheckboxForm):
103
+ field = ChoiceField
104
+ widget = UnfoldAdminRadioSelectWidget
105
+
106
+
107
+ class HorizontalRadioForm(RadioForm):
108
+ horizontal = True
109
+ widget = UnfoldAdminRadioSelectWidget(radio_style=HORIZONTAL)
110
+
111
+
74
112
  class DropdownForm(forms.Form):
75
113
  widget = UnfoldAdminSelectWidget(
76
114
  attrs={
@@ -4,7 +4,7 @@
4
4
  <div class="flex flex-col">
5
5
  <h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
- <div class="flex flex-col space-y-4">
7
+ <div class="flex flex-col space-y-2">
8
8
  {% for field in choice.form %}
9
9
  <div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">
10
10
  {{ field }}
@@ -4,7 +4,7 @@
4
4
  <div class="flex flex-col">
5
5
  <h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
- <div class="flex flex-col space-y-4">
7
+ <div class="flex flex-col space-y-2">
8
8
  {% for field in choice.form %}
9
9
  <div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">
10
10
  {{ field }}
@@ -4,7 +4,7 @@
4
4
  {% with choices.0 as choice %}
5
5
  <div class="admin-numeric-filter-wrapper">
6
6
  <h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">
7
- {% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}
7
+ {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}
8
8
  </h3>
9
9
 
10
10
  {% if choice.min is not None and choice.max is not None and choice.step %}
@@ -37,13 +37,19 @@ def action(
37
37
  # Permissions methods have following syntax: has_<some>_permission(self, request, obj=None):
38
38
  # But obj is not examined by default in django admin and it would also require additional
39
39
  # fetch from database, therefore it is not supported yet
40
- has_object_argument = (
41
- func.__name__ in model_admin.actions_detail
42
- or func.__name__ in model_admin.actions_submit_line
40
+ has_detail_action = func.__name__ in model_admin._extract_action_names(
41
+ model_admin.actions_detail
43
42
  )
43
+ has_submit_line_action = (
44
+ func.__name__
45
+ in model_admin._extract_action_names(
46
+ model_admin.actions_submit_line
47
+ )
48
+ )
49
+
44
50
  if not all(
45
51
  has_permission(request, kwargs.get("object_id"))
46
- if has_object_argument
52
+ if has_detail_action or has_submit_line_action
47
53
  else has_permission(request)
48
54
  for has_permission in permission_checks
49
55
  ):
@@ -50,8 +50,9 @@ class ActionForm(forms.Form):
50
50
  "pr-8",
51
51
  "rounded",
52
52
  "text-white",
53
+ "truncate",
53
54
  "*:text-base-700",
54
- "lg:min-w-72",
55
+ "lg:w-72",
55
56
  ]
56
57
  ),
57
58
  "aria-label": _("Select action to run"),
@@ -0,0 +1,10 @@
1
+ from django.core.paginator import Paginator
2
+ from django.utils.functional import cached_property
3
+
4
+
5
+ class InfinitePaginator(Paginator):
6
+ template_name = "unfold/helpers/pagination_infinite.html"
7
+
8
+ @cached_property
9
+ def count(self):
10
+ return 9_999_999_999
@@ -231,14 +231,16 @@ class UnfoldAdminSite(AdminSite):
231
231
  tabs = self._get_value(self._get_config("TABS", request), request) or []
232
232
  results = []
233
233
 
234
- for group in navigation:
234
+ for group in copy.deepcopy(navigation):
235
235
  allowed_items = []
236
236
 
237
237
  for item in group["items"]:
238
- item["active"] = False
239
- item["active"] = self._get_is_active(
240
- request, item.get("link_callback") or item["link"]
241
- )
238
+ if "active" in item:
239
+ item["active"] = self._get_value(item["active"], request)
240
+ else:
241
+ item["active"] = self._get_is_active(
242
+ request, item.get("link_callback") or item["link"]
243
+ )
242
244
 
243
245
  # Checks if any tab item is active and then marks the sidebar link as active
244
246
  for tab in tabs:
@@ -342,7 +344,7 @@ class UnfoldAdminSite(AdminSite):
342
344
  return target
343
345
 
344
346
  def _get_is_active(
345
- self, request: HttpRequest, link: str, is_tab: bool = False
347
+ self, request: HttpRequest, link: Union[str, Callable], is_tab: bool = False
346
348
  ) -> bool:
347
349
  if not isinstance(link, str):
348
350
  link = str(link)
@@ -96,12 +96,23 @@
96
96
  .removeClass(options.emptyCssClass)
97
97
  .addClass(options.formCssClass)
98
98
  .attr("id", options.prefix + "-" + nextIndex);
99
+
99
100
  addInlineDeleteButton(row);
100
101
  row.find("*").each(function () {
101
102
  updateElementIndex(this, options.prefix, totalForms.val());
102
103
  });
104
+
103
105
  // Insert the new form when it has been fully edited.
104
- row.insertBefore($(template));
106
+ // !CHANGED from original
107
+ if ($(template).parent().is("tbody")) {
108
+ row
109
+ .wrap('<tbody class="template"></tbody>')
110
+ .parent()
111
+ .insertBefore($(template).parent());
112
+ } else {
113
+ row.insertBefore($(template));
114
+ }
115
+
105
116
  // Update number of total forms.
106
117
  $(totalForms).val(parseInt(totalForms.val(), 10) + 1);
107
118
  nextIndex += 1;
@@ -183,7 +194,13 @@
183
194
  if (prevRow.length && prevRow.hasClass("row-form-errors")) {
184
195
  prevRow.remove();
185
196
  }
186
- row.remove();
197
+
198
+ // !CHANGED from original
199
+ if (deleteButton.parent().parent().parent().parent().is("tbody")) {
200
+ row.parent().remove();
201
+ } else {
202
+ row.remove();
203
+ }
187
204
  nextIndex -= 1;
188
205
  // Pass the deleted form to the post-delete callback, if provided.
189
206
  if (options.removed) {
@@ -245,8 +262,11 @@
245
262
  }
246
263
 
247
264
  // Create the delete buttons for all unsaved inlines:
265
+ // !CHANGED from original, added parent() and used find() instead of filter()
248
266
  $this
249
- .filter(
267
+ .parent()
268
+ .parent()
269
+ .find(
250
270
  "." +
251
271
  options.formCssClass +
252
272
  ":not(.has_original):not(." +