django-unfold 0.56.0__tar.gz → 0.58.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 (294) hide show
  1. {django_unfold-0.56.0 → django_unfold-0.58.0}/PKG-INFO +1 -1
  2. {django_unfold-0.56.0 → django_unfold-0.58.0}/pyproject.toml +5 -6
  3. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +1 -5
  4. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +1 -1
  5. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +1 -1
  6. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/decorators.py +1 -2
  7. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/forms.py +3 -2
  8. django_unfold-0.58.0/src/unfold/layout.py +41 -0
  9. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/sites.py +64 -41
  10. django_unfold-0.58.0/src/unfold/static/unfold/css/styles.css +2 -0
  11. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/styles.css +66 -117
  12. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/actions.html +1 -1
  13. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/auth/user/change_password.html +1 -1
  14. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/submit_line.html +7 -7
  15. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/registration/password_change_done.html +1 -1
  16. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/registration/password_change_form.html +1 -1
  17. django_unfold-0.58.0/src/unfold/templates/unfold/components/card.html +27 -0
  18. django_unfold-0.58.0/src/unfold/templates/unfold/components/progress.html +23 -0
  19. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/table.html +5 -5
  20. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +1 -1
  21. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_field.html +1 -1
  22. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/field.html +2 -2
  23. django_unfold-0.58.0/src/unfold/templates/unfold/helpers/field_readonly_value.html +1 -0
  24. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/fieldset_row_checkbox.html +2 -2
  25. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/fieldset_row_field.html +2 -2
  26. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/form_errors.html +1 -1
  27. django_unfold-0.58.0/src/unfold/templates/unfold/helpers/messages/errornote.html +7 -0
  28. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/navigation.html +1 -1
  29. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/layouts/skeleton.html +1 -1
  30. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +3 -3
  31. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +1 -1
  32. django_unfold-0.58.0/src/unfold/templates/unfold/widgets/select.html +9 -0
  33. django_unfold-0.58.0/src/unfold/templates/unfold_crispy/errors_formset.html +3 -0
  34. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/field.html +1 -1
  35. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/inputs.html +1 -1
  36. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/checkbox.html +2 -2
  37. django_unfold-0.58.0/src/unfold/templates/unfold_crispy/layout/field_errors.html +7 -0
  38. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/fieldset.html +1 -1
  39. django_unfold-0.58.0/src/unfold/templates/unfold_crispy/layout/hr.html +13 -0
  40. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/table_inline_formset.html +23 -19
  41. django_unfold-0.58.0/src/unfold/templates/unfold_crispy/whole_uni_formset.html +30 -0
  42. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templatetags/unfold.py +14 -0
  43. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/widgets.py +32 -2
  44. django_unfold-0.56.0/src/unfold/layout.py +0 -23
  45. django_unfold-0.56.0/src/unfold/static/unfold/css/styles.css +0 -2
  46. django_unfold-0.56.0/src/unfold/templates/unfold/components/card.html +0 -27
  47. django_unfold-0.56.0/src/unfold/templates/unfold/components/progress.html +0 -21
  48. django_unfold-0.56.0/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -1
  49. django_unfold-0.56.0/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -11
  50. django_unfold-0.56.0/src/unfold/templates/unfold_crispy/layout/field_errors.html +0 -7
  51. {django_unfold-0.56.0 → django_unfold-0.58.0}/LICENSE.md +0 -0
  52. {django_unfold-0.56.0 → django_unfold-0.58.0}/README.md +0 -0
  53. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/__init__.py +0 -0
  54. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/admin.py +0 -0
  55. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/apps.py +0 -0
  56. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/checks.py +0 -0
  57. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/components.py +0 -0
  58. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/__init__.py +0 -0
  59. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/__init__.py +0 -0
  60. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/__init__.py +0 -0
  61. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/autocomplete_filters.py +0 -0
  62. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/choice_filters.py +0 -0
  63. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/datetime_filters.py +0 -0
  64. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/dropdown_filters.py +0 -0
  65. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/mixins.py +0 -0
  66. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/numeric_filters.py +0 -0
  67. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/admin/text_filters.py +0 -0
  68. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/apps.py +0 -0
  69. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/forms.py +0 -0
  70. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider/LICENSE +0 -0
  71. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider/nouislider.min.css +0 -0
  72. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  73. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  74. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider/LICENSE +0 -0
  75. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider/nouislider.min.js +0 -0
  76. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/js/wnumb/LICENSE +0 -0
  77. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/static/unfold/filters/js/wnumb/wNumb.min.js +0 -0
  78. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +0 -0
  79. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +0 -0
  80. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
  81. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  82. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  83. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
  84. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/__init__.py +0 -0
  85. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/apps.py +0 -0
  86. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix/LICENSE +0 -0
  87. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix/trix.css +0 -0
  88. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix/LICENSE +0 -0
  89. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix/trix.js +0 -0
  90. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  91. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
  92. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  93. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  94. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/forms/widgets.py +0 -0
  95. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  96. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/apps.py +0 -0
  97. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  98. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  99. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  100. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  101. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  102. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  103. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  104. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  105. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/apps.py +0 -0
  106. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/forms.py +0 -0
  107. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
  108. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
  109. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  110. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  111. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  112. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  113. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  114. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  115. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  116. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  117. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  118. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
  119. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/inlines/__init__.py +0 -0
  120. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/inlines/admin.py +0 -0
  121. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/inlines/apps.py +0 -0
  122. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/inlines/checks.py +0 -0
  123. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/inlines/forms.py +0 -0
  124. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  125. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  126. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  127. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
  128. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  129. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/dataclasses.py +0 -0
  130. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/enums.py +0 -0
  131. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/exceptions.py +0 -0
  132. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/fields.py +0 -0
  133. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/mixins/__init__.py +0 -0
  134. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/mixins/action_model_admin.py +0 -0
  135. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/mixins/base_model_admin.py +0 -0
  136. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/overrides.py +0 -0
  137. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/paginator.py +0 -0
  138. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/sections.py +0 -0
  139. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/settings.py +0 -0
  140. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +0 -0
  141. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/admin/js/inlines.js +0 -0
  142. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/css/simplebar/LICENSE +0 -0
  143. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/css/simplebar/simplebar.css +0 -0
  144. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  145. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  146. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  147. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  148. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/inter/LICENSE +0 -0
  149. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  150. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/material-symbols/LICENSE +0 -0
  151. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  152. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  153. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/alpine/LICENSE +0 -0
  154. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/alpine/alpine.anchor.js +0 -0
  155. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/alpine/alpine.js +0 -0
  156. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/alpine/alpine.persist.js +0 -0
  157. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/alpine/alpine.resize.js +0 -0
  158. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/alpine/alpine.sort.js +0 -0
  159. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/app.js +0 -0
  160. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/chart/LICENSE +0 -0
  161. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/chart/chart.js +0 -0
  162. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/htmx/LICENSE +0 -0
  163. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/htmx/htmx.js +0 -0
  164. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/select2.init.js +0 -0
  165. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/simplebar/LICENSE +0 -0
  166. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/static/unfold/js/simplebar/simplebar.js +0 -0
  167. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/app_index.html +0 -0
  168. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/app_list.html +0 -0
  169. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
  170. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/base.html +0 -0
  171. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/base_site.html +0 -0
  172. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/change_form.html +0 -0
  173. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  174. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/change_list.html +0 -0
  175. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  176. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/change_list_results.html +0 -0
  177. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  178. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  179. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  180. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
  181. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/edit_inline/tabular.html +0 -0
  182. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/filter.html +0 -0
  183. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
  184. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  185. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/index.html +0 -0
  186. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/login.html +0 -0
  187. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  188. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/object_history.html +0 -0
  189. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/pagination.html +0 -0
  190. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/admin/search_form.html +0 -0
  191. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  192. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/registration/logged_out.html +0 -0
  193. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/button.html +0 -0
  194. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  195. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/chart/cohort.html +0 -0
  196. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  197. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/container.html +0 -0
  198. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  199. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/icon.html +0 -0
  200. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  201. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  202. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/text.html +0 -0
  203. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/title.html +0 -0
  204. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/components/tracker.html +0 -0
  205. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
  206. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  207. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  208. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
  209. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  210. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
  211. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  212. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  213. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/change_list_actions.html +0 -0
  214. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/change_list_filter.html +0 -0
  215. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/delete_submit_line.html +0 -0
  216. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/display_dropdown.html +0 -0
  217. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  218. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
  219. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +0 -0
  220. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_error.html +0 -0
  221. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +0 -0
  222. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_row.html +0 -0
  223. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_title.html +0 -0
  224. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/empty_results.html +0 -0
  225. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  226. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
  227. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
  228. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/form_label.html +0 -0
  229. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  230. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/header_back_button.html +0 -0
  231. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  232. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  233. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  234. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/language_switch.html +0 -0
  235. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/messages/debug.html +0 -0
  236. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  237. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  238. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/messages/success.html +0 -0
  239. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/messages/warning.html +0 -0
  240. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  241. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/navigation_header.html +0 -0
  242. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/pagination.html +0 -0
  243. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  244. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/pagination_default.html +0 -0
  245. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  246. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/pagination_infinite.html +0 -0
  247. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  248. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  249. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/site_branding.html +0 -0
  250. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/site_dropdown.html +0 -0
  251. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
  252. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  253. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  254. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/tab_action.html +0 -0
  255. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/tab_actions.html +0 -0
  256. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/tab_items.html +0 -0
  257. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
  258. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  259. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  260. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
  261. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
  262. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
  263. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/templatetags/preserve_changelist_filters.html +0 -0
  264. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
  265. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
  266. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
  267. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/radio_option.html +0 -0
  268. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  269. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
  270. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
  271. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  272. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  273. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  274. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
  275. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
  276. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/display_form.html +0 -0
  277. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/errors.html +0 -0
  278. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/attrs.html +0 -0
  279. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/baseinput.html +0 -0
  280. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/button.html +0 -0
  281. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/buttonholder.html +0 -0
  282. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/column.html +0 -0
  283. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/div.html +0 -0
  284. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/help_text.html +0 -0
  285. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/help_text_and_errors.html +0 -0
  286. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/radio_checkbox_select.html +0 -0
  287. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/layout/row.html +0 -0
  288. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/uni_form.html +0 -0
  289. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templates/unfold_crispy/whole_uni_form.html +0 -0
  290. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templatetags/__init__.py +0 -0
  291. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/templatetags/unfold_list.py +0 -0
  292. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/typing.py +0 -0
  293. {django_unfold-0.56.0 → django_unfold-0.58.0}/src/unfold/utils.py +0 -0
  294. {django_unfold-0.56.0 → django_unfold-0.58.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.56.0
3
+ Version: 0.58.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.56.0"
3
+ version = "0.58.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -28,13 +28,12 @@ django = ">=4.2"
28
28
 
29
29
  [tool.poetry.group.test.dependencies]
30
30
  pytest = "^8.3"
31
- pytest-django = "^4.9"
32
- tox = "^4.21"
33
- django-money = "^3.5.3"
34
-
31
+ pytest-django = "^4.11"
32
+ tox = "^4.26"
33
+ django-money = "^3.5"
35
34
 
36
35
  [tool.poetry.group.dev.dependencies]
37
- python-semantic-release = "^8.7"
36
+ python-semantic-release = "^9.21"
38
37
 
39
38
  [tool.ruff]
40
39
  fix = true
@@ -1,11 +1,7 @@
1
1
  {% extends "admin/base_site.html" %}
2
2
  {% load admin_modify admin_urls i18n static %}
3
3
 
4
- {% block extrastyle %}
5
- {{ block.super }}
6
-
7
- <link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />
8
- {% endblock %}
4
+ {% block extrastyle %}{{ block.super }}{% endblock %}
9
5
 
10
6
  {% block bodyclass %}
11
7
  {{ block.super }} {{ opts.app_label }}-{{ opts.object_name.lower }} change-form
@@ -6,7 +6,7 @@
6
6
 
7
7
  {% include "admin/import_export/resource_fields_list.html" with import_or_export="import" %}
8
8
 
9
- <fieldset class="border border-base-200 mb-8 rounded-default pt-3 px-3 shadow-xs dark:border-base-800">
9
+ <fieldset class="border border-base-200 mb-8 rounded-default pt-2.5 px-3 shadow-xs dark:border-base-800">
10
10
  {% for field in form %}
11
11
  {% if field.field.widget.attrs.readonly %}
12
12
  {% include "unfold/helpers/field_readonly.html" with title=field.label value=field.field.value %}
@@ -43,7 +43,7 @@
43
43
  {% endblock %}
44
44
 
45
45
  {% block form_top %}
46
- <p class="px-3 py-3 rounded-default text-sm last:mb-8 er-amber-600/10 bg-blue-50 mb-8 text-blue-500 dark:bg-blue-500/20 dark:border-blue-500/10">
46
+ <p class="px-3 py-3 rounded-default text-sm last:mb-8 bg-blue-50 mb-8 text-blue-500 dark:bg-blue-500/20">
47
47
  {% if not revert_disabled %}
48
48
  {% blocktrans %}Press the 'Revert' button below to revert to this version of the object.{% endblocktrans %}
49
49
  {% endif %}
@@ -8,8 +8,7 @@ from django.db.models.expressions import BaseExpression, Combinable
8
8
  from django.http import HttpRequest, HttpResponse
9
9
 
10
10
  from unfold.enums import ActionVariant
11
-
12
- from .typing import ActionFunction
11
+ from unfold.typing import ActionFunction
13
12
 
14
13
 
15
14
  def action(
@@ -22,11 +22,12 @@ from django.http import HttpRequest
22
22
  from django.utils.safestring import mark_safe
23
23
  from django.utils.translation import gettext_lazy as _
24
24
 
25
- from .widgets import (
25
+ from unfold.widgets import (
26
26
  BASE_INPUT_CLASSES,
27
27
  INPUT_CLASSES,
28
28
  UnfoldAdminPasswordInput,
29
29
  UnfoldAdminRadioSelectWidget,
30
+ UnfoldAdminSelectWidget,
30
31
  )
31
32
 
32
33
 
@@ -37,7 +38,7 @@ class UnfoldReadOnlyPasswordHashWidget(ReadOnlyPasswordHashWidget):
37
38
  class ActionForm(forms.Form):
38
39
  action = forms.ChoiceField(
39
40
  label="",
40
- widget=forms.Select(
41
+ widget=UnfoldAdminSelectWidget(
41
42
  {
42
43
  "class": " ".join(
43
44
  [
@@ -0,0 +1,41 @@
1
+ from crispy_forms.layout import BaseInput, LayoutObject
2
+ from crispy_forms.utils import TEMPLATE_PACK
3
+ from django.template.loader import render_to_string
4
+
5
+ from unfold.widgets import BUTTON_CLASSES
6
+
7
+
8
+ class ButtonClassesMixin:
9
+ def __init__(self, *args, css_class=None, **kwargs):
10
+ classes = BUTTON_CLASSES
11
+
12
+ if css_class:
13
+ classes.append(css_class)
14
+
15
+ self.field_classes = " ".join(classes)
16
+
17
+ super().__init__(*args, **kwargs)
18
+
19
+
20
+ class Submit(ButtonClassesMixin, BaseInput):
21
+ input_type = "submit"
22
+
23
+
24
+ class Button(ButtonClassesMixin, BaseInput):
25
+ input_type = "button"
26
+
27
+
28
+ class Hr(LayoutObject):
29
+ template = "unfold_crispy/layout/hr.html"
30
+
31
+ def __init__(self, title=None, *args, **kwargs):
32
+ self.title = title
33
+ super().__init__(*args, **kwargs)
34
+
35
+ def render(self, form, context, template_pack=TEMPLATE_PACK, **kwargs):
36
+ return render_to_string(
37
+ self.template,
38
+ {
39
+ "title": self.title,
40
+ },
41
+ )
@@ -243,58 +243,58 @@ class UnfoldAdminSite(AdminSite):
243
243
  results = []
244
244
 
245
245
  for group in copy.deepcopy(navigation):
246
- allowed_items = []
247
-
248
- for item in group["items"]:
249
- if "active" in item:
250
- item["active"] = self._get_value(item["active"], request)
251
- else:
252
- item["active"] = self._get_is_active(
253
- request, item.get("link_callback") or item["link"]
254
- )
246
+ group["items"] = self._get_navigation_items(request, group["items"], tabs)
247
+ results.append(group)
255
248
 
256
- # Checks if any tab item is active and then marks the sidebar link as active
257
- for tab in tabs:
258
- has_primary_link = False
259
- has_tab_link_active = False
249
+ return results
260
250
 
261
- for tab_item in tab["items"]:
262
- if item["link"] == tab_item["link"]:
263
- has_primary_link = True
264
- continue
251
+ def _get_navigation_items(
252
+ self, request: HttpRequest, items: list[dict], tabs: list[dict] = None
253
+ ) -> list:
254
+ allowed_items = []
265
255
 
266
- if self._get_is_active(
267
- request, tab_item.get("link_callback") or tab_item["link"]
268
- ):
269
- has_tab_link_active = True
270
- break
256
+ for item in items:
257
+ link = item.get("link")
271
258
 
272
- if has_primary_link and has_tab_link_active:
273
- item["active"] = True
259
+ if "active" in item:
260
+ item["active"] = self._get_value(item["active"], request)
261
+ else:
262
+ item["active"] = self._get_is_active(
263
+ request, item.get("link_callback") or link
264
+ )
274
265
 
275
- if isinstance(item["link"], Callable):
276
- item["link_callback"] = lazy(item["link"])(request)
266
+ # Checks if any tab item is active and then marks the sidebar link as active
267
+ if (
268
+ tabs
269
+ and (is_active := self._get_is_tab_active(request, tabs, link))
270
+ and is_active
271
+ ):
272
+ item["active"] = True
277
273
 
278
- # Permission callback
279
- item["has_permission"] = self._call_permission_callback(
280
- item.get("permission"), request
281
- )
274
+ # Link callback
275
+ if isinstance(link, Callable):
276
+ item["link_callback"] = lazy(link)(request)
282
277
 
283
- # Badge callbacks
284
- if "badge" in item and isinstance(item["badge"], str):
285
- try:
286
- callback = import_string(item["badge"])
287
- item["badge_callback"] = lazy(callback)(request)
288
- except ImportError:
289
- pass
278
+ # Permission callback
279
+ item["has_permission"] = self._call_permission_callback(
280
+ item.get("permission"), request
281
+ )
290
282
 
291
- allowed_items.append(item)
283
+ # Badge callbacks
284
+ if "badge" in item and isinstance(item["badge"], str):
285
+ try:
286
+ callback = import_string(item["badge"])
287
+ item["badge_callback"] = lazy(callback)(request)
288
+ except ImportError:
289
+ pass
292
290
 
293
- group["items"] = allowed_items
291
+ # Process nested items
292
+ if "items" in item:
293
+ item["items"] = self._get_navigation_items(request, item["items"])
294
294
 
295
- results.append(group)
295
+ allowed_items.append(item)
296
296
 
297
- return results
297
+ return allowed_items
298
298
 
299
299
  def get_tabs_list(self, request: HttpRequest) -> list[dict[str, Any]]:
300
300
  tabs = copy.deepcopy(self._get_config("TABS", request))
@@ -381,6 +381,29 @@ class UnfoldAdminSite(AdminSite):
381
381
 
382
382
  return False
383
383
 
384
+ def _get_is_tab_active(
385
+ self, request: HttpRequest, tabs: list[dict], link: str
386
+ ) -> bool:
387
+ for tab in tabs:
388
+ has_primary_link = False
389
+ has_tab_link_active = False
390
+
391
+ for tab_item in tab["items"]:
392
+ if link == tab_item["link"]:
393
+ has_primary_link = True
394
+ continue
395
+
396
+ if self._get_is_active(
397
+ request, tab_item.get("link_callback") or tab_item["link"]
398
+ ):
399
+ has_tab_link_active = True
400
+ break
401
+
402
+ if has_primary_link and has_tab_link_active:
403
+ return True
404
+
405
+ return False
406
+
384
407
  def _get_config(self, key: str, *args) -> Any:
385
408
  config = get_config(self.settings_name)
386
409