django-unfold 0.56.0__py3-none-any.whl → 0.58.0__py3-none-any.whl

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 (45) hide show
  1. {django_unfold-0.56.0.dist-info → django_unfold-0.58.0.dist-info}/METADATA +1 -1
  2. {django_unfold-0.56.0.dist-info → django_unfold-0.58.0.dist-info}/RECORD +45 -41
  3. unfold/contrib/import_export/templates/admin/import_export/base.html +1 -5
  4. unfold/contrib/import_export/templates/admin/import_export/import_form.html +1 -1
  5. unfold/contrib/simple_history/templates/simple_history/object_history_form.html +1 -1
  6. unfold/decorators.py +1 -2
  7. unfold/forms.py +3 -2
  8. unfold/layout.py +19 -1
  9. unfold/sites.py +64 -41
  10. unfold/static/unfold/css/styles.css +2 -2
  11. unfold/styles.css +66 -117
  12. unfold/templates/admin/actions.html +1 -1
  13. unfold/templates/admin/auth/user/change_password.html +1 -1
  14. unfold/templates/admin/submit_line.html +7 -7
  15. unfold/templates/registration/password_change_done.html +1 -1
  16. unfold/templates/registration/password_change_form.html +1 -1
  17. unfold/templates/unfold/components/card.html +23 -23
  18. unfold/templates/unfold/components/progress.html +9 -7
  19. unfold/templates/unfold/components/table.html +5 -5
  20. unfold/templates/unfold/helpers/change_list_filter_actions.html +1 -1
  21. unfold/templates/unfold/helpers/edit_inline/tabular_field.html +1 -1
  22. unfold/templates/unfold/helpers/field.html +2 -2
  23. unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
  24. unfold/templates/unfold/helpers/fieldset_row_checkbox.html +2 -2
  25. unfold/templates/unfold/helpers/fieldset_row_field.html +2 -2
  26. unfold/templates/unfold/helpers/form_errors.html +1 -1
  27. unfold/templates/unfold/helpers/messages/errornote.html +1 -5
  28. unfold/templates/unfold/helpers/navigation.html +1 -1
  29. unfold/templates/unfold/layouts/skeleton.html +1 -1
  30. unfold/templates/unfold/widgets/clearable_file_input.html +3 -3
  31. unfold/templates/unfold/widgets/clearable_file_input_small.html +1 -1
  32. unfold/templates/unfold/widgets/select.html +9 -0
  33. unfold/templates/unfold_crispy/errors_formset.html +3 -0
  34. unfold/templates/unfold_crispy/field.html +1 -1
  35. unfold/templates/unfold_crispy/inputs.html +1 -1
  36. unfold/templates/unfold_crispy/layout/checkbox.html +2 -2
  37. unfold/templates/unfold_crispy/layout/field_errors.html +5 -5
  38. unfold/templates/unfold_crispy/layout/fieldset.html +1 -1
  39. unfold/templates/unfold_crispy/layout/hr.html +13 -0
  40. unfold/templates/unfold_crispy/layout/table_inline_formset.html +23 -19
  41. unfold/templates/unfold_crispy/whole_uni_formset.html +30 -0
  42. unfold/templatetags/unfold.py +14 -0
  43. unfold/widgets.py +32 -2
  44. {django_unfold-0.56.0.dist-info → django_unfold-0.58.0.dist-info}/LICENSE.md +0 -0
  45. {django_unfold-0.56.0.dist-info → django_unfold-0.58.0.dist-info}/WHEEL +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
@@ -52,7 +52,7 @@ unfold/contrib/guardian/templates/unfold/guardian/user_form.html,sha256=JqYF7HiI
52
52
  unfold/contrib/import_export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  unfold/contrib/import_export/apps.py,sha256=SdJu6Qh90VqGWY19FSDhhpUqhTbaIYsJKny3zX5baHI,149
54
54
  unfold/contrib/import_export/forms.py,sha256=kh8psUoTObrRb2wtkYhvRu1D5QM02xWk4UNLQT5lQZA,2038
55
- unfold/contrib/import_export/templates/admin/import_export/base.html,sha256=loL2qcV-f8aAzkHss_I4IkwfgemVW2CjOu_aiBxdwX0,357
55
+ unfold/contrib/import_export/templates/admin/import_export/base.html,sha256=y-J1gzrbkF-72XwKnRIC6zAD1Ud3Lwvs2M0UhS-NirI,262
56
56
  unfold/contrib/import_export/templates/admin/import_export/change_form.html,sha256=TYiMBf8bSJoMiSrHGAa-OwyheVyNG3WyWFNeH2tmZjc,460
57
57
  unfold/contrib/import_export/templates/admin/import_export/change_list_export.html,sha256=vZb2XVoJrDSjM1msiZqkQPMLQGjuqRHuLNdt11hmbQs,164
58
58
  unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html,sha256=pTDeqPKOlCPKH2dxMIfPnWuc2wVDzB7AzL73WbxSnRY,257
@@ -62,7 +62,7 @@ unfold/contrib/import_export/templates/admin/import_export/export.html,sha256=uz
62
62
  unfold/contrib/import_export/templates/admin/import_export/import.html,sha256=uI9me41UQ_iMf1PCPlyGm7MjSqI2lKPhGhUD5IPrDRs,2126
63
63
  unfold/contrib/import_export/templates/admin/import_export/import_confirm.html,sha256=VeGgT1hDunN5c9ijeOvkIezdAmkrsABt5bAnyg5Mu8c,879
64
64
  unfold/contrib/import_export/templates/admin/import_export/import_errors.html,sha256=tgGPoNea7JtuqwVuh-a2TSip7lM8inJvgcVfrsYB_FA,1805
65
- unfold/contrib/import_export/templates/admin/import_export/import_form.html,sha256=lfjgdZDp-C-UiplEcmZVAE2tD25MRt89bAFI087vk54,1000
65
+ unfold/contrib/import_export/templates/admin/import_export/import_form.html,sha256=GkivtNDO5IKuVxwPK1pD0czUsuuXWHGjk2dETO-1pZg,1002
66
66
  unfold/contrib/import_export/templates/admin/import_export/import_preview.html,sha256=365nlrJ36dg4pKGKwIOE9MADWYaHhChp_B2jZG2sBOU,2273
67
67
  unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=K7j5OlWMQUTcSVulJtIraKfWIupSvmN4R5bZ2hH4tRA,5117
68
68
  unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html,sha256=Bc6uD8aHA5YYbZgLAPpGUckFjnxn9uq19YuKKFxTj4Y,887
@@ -74,16 +74,16 @@ unfold/contrib/inlines/forms.py,sha256=s49xrIkQTbvSMsrP4DydXWkpP1v8NCUmQw_Bcoqf0
74
74
  unfold/contrib/simple_history/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  unfold/contrib/simple_history/apps.py,sha256=eF_KVYb60CAnGgWk2Z1YKYGfgA3TJBMr229qI7e2pgU,153
76
76
  unfold/contrib/simple_history/templates/simple_history/object_history.html,sha256=unZQE70be7cK6v0YPlITFeaosmiLt3kiei-pmmCjBg0,1711
77
- unfold/contrib/simple_history/templates/simple_history/object_history_form.html,sha256=8UHx9KppqXECjDKapx4m0roV-hn59Ahk9hQ8yYmaRpM,2296
77
+ unfold/contrib/simple_history/templates/simple_history/object_history_form.html,sha256=1wsz8KTmjsgAthFS2myfcS3QvyeL0-qT8s2w7JINVhQ,2256
78
78
  unfold/contrib/simple_history/templates/simple_history/object_history_list.html,sha256=PWtjuAcxciAI001qIrXLvbUxzCFl_SDAaHA5FhR16Z8,6858
79
79
  unfold/contrib/simple_history/templates/simple_history/submit_line.html,sha256=tJgOgq7lMetWF4DJoBqUYdRSY6EeRivXhOBYlyPXzTk,1750
80
80
  unfold/dataclasses.py,sha256=a-9INnkCAIcnMgoffTcB1rxWCJH33AjhMCWIGWnjWbI,719
81
- unfold/decorators.py,sha256=15X9FdoKkgxweUqIboH7kiDrBheT3uBEFNT-JummEl0,4297
81
+ unfold/decorators.py,sha256=FZ0to60sg9fefOCpYiziG9UbV6mgmiEk0lc1wQyisXc,4302
82
82
  unfold/enums.py,sha256=9sTfyEycMWeoGPBa-ft6ZhQGnW1vkFg108RMBVf9nko,187
83
83
  unfold/exceptions.py,sha256=gcCj1ox61E137bk_0Cqy4YC3SttdPgB-fiJUqpmyHSE,43
84
84
  unfold/fields.py,sha256=J3goIMlP_XOmQ85Xgh2v5MylXSP1o5I7o9_So2FQn2k,7461
85
- unfold/forms.py,sha256=TT5HFqJBR6I1CNdNjXQXNOFIIxQBTtGFApfH7qllnsM,4560
86
- unfold/layout.py,sha256=idG4v0AumFPyy16KUlKtWrs9kyBQIKY_Ln26Lx9DOPg,501
85
+ unfold/forms.py,sha256=xAFNBB_UqZFeg5tV2jK-_rGzwEKR9r9oaxxnpAvw3a8,4606
86
+ unfold/layout.py,sha256=2fPFXDF6kTC9A2liO4P-aeOC3frlbuH7u7d8HLny6ig,1020
87
87
  unfold/mixins/__init__.py,sha256=YlhoDs9Y_DXQ8Ejr3enxuHMS1-Ij9fwukxNwpeOS4Co,190
88
88
  unfold/mixins/action_model_admin.py,sha256=BPajuTGf7zAaZOqIq4shX8VQ3NTxWQpedvG58fmCTjk,12036
89
89
  unfold/mixins/base_model_admin.py,sha256=PR4eqU48yB4CNy9Bjd7fjxbOFiFpZM4etYmBOSaRX_M,4140
@@ -91,12 +91,12 @@ unfold/overrides.py,sha256=ERVY9boZiXgjDYcTEZcIp7KWoeBZ45VM_zN31yAOjyQ,2922
91
91
  unfold/paginator.py,sha256=vWCIfpuWbV3nvIkQOPyD7MLTg2hZplHz3rze42d-qiA,268
92
92
  unfold/sections.py,sha256=Lcg3xCZ76fqjm4vD4x7YdE5VsbTKluL-sX5QTEBlHxA,2379
93
93
  unfold/settings.py,sha256=M5LVVwatGKk6AOZBkBY_vXFntn7ENla9rqMQG0gxb0U,2753
94
- unfold/sites.py,sha256=_bI51vx16-0FYREx6rS01afirpcu8pKzk1-dlTDgByg,16828
94
+ unfold/sites.py,sha256=Roo_hXNB-6X7uENluXh3yT_NPA0W3uv8Nish72QJUb8,17318
95
95
  unfold/static/admin/js/admin/RelatedObjectLookups.js,sha256=alI0-yq7YPDJJJn-yg1ce79-Cv88yQDUrfaGqFZnsaY,9048
96
96
  unfold/static/admin/js/inlines.js,sha256=zcYwLGI_6RHg-gucDbbhp43RRoZd3so8bPk841KFaIE,15573
97
97
  unfold/static/unfold/css/simplebar/LICENSE,sha256=okNJf6UFl2NrEiC4iqORNBa16IKgUgV88acdcl9FbtY,1081
98
98
  unfold/static/unfold/css/simplebar/simplebar.css,sha256=5LLaEM11pKi6JFCOLt4XKuZxTpT9rpdq_tNlaQytFlU,4647
99
- unfold/static/unfold/css/styles.css,sha256=up2DFoChWWVk7TTaQtE-Wq1MQs5FWwFXhmwUaNu45tA,151521
99
+ unfold/static/unfold/css/styles.css,sha256=8MvwCnrFLcXnTXgB39xn4xSNV8o6q2GZIClcPEuHrzg,158422
100
100
  unfold/static/unfold/fonts/inter/Inter-Bold.woff2,sha256=-oiBJ7baAVtlVp8DUfO1w5GtkokElR8cIOn4RiqNleo,114840
101
101
  unfold/static/unfold/fonts/inter/Inter-Medium.woff2,sha256=D_PpRhThST61VjFP0keubEqFp3g7TMhr5TmUDPg_Kkg,114348
102
102
  unfold/static/unfold/fonts/inter/Inter-Regular.woff2,sha256=4G9rG8VTqupORmgCPtCrChRxKcMQf1Ebx9A9NhsK4IU,111268
@@ -120,12 +120,12 @@ unfold/static/unfold/js/htmx/htmx.js,sha256=acrv0NqSJpBm5yXX_hdeJrnVDJYuMFZFnAxH
120
120
  unfold/static/unfold/js/select2.init.js,sha256=l0O8ggw_CkAw-QtH3qEzC8xWk0mR9QHjy4VzAjMwiQQ,1109
121
121
  unfold/static/unfold/js/simplebar/LICENSE,sha256=okNJf6UFl2NrEiC4iqORNBa16IKgUgV88acdcl9FbtY,1081
122
122
  unfold/static/unfold/js/simplebar/simplebar.js,sha256=t-uG1FAD6ZoiMeN--wac0XRS7SxoDVG6zvRnGuEp7X8,27176
123
- unfold/styles.css,sha256=A3R6Tvg4rWLBz5kJprwYCMsMUGPPsR6_Q-EoS4sHXRI,21799
124
- unfold/templates/admin/actions.html,sha256=K3-2nomhrwcFRJ5hiANa5lNUzx-9xmJKtfBHYyDE8So,3082
123
+ unfold/styles.css,sha256=4jfRd3it5Xllssqjc4xcAItlSAmbsF5tsOBut6cK4m0,21729
124
+ unfold/templates/admin/actions.html,sha256=iuuubcAILkOoYBgV6cpXqFIyZUh4zMqyFp0JaDFlPKU,3096
125
125
  unfold/templates/admin/app_index.html,sha256=LRR07CLcZVsYpisCOncWdMSACARNstcDt536Oydnt60,1239
126
126
  unfold/templates/admin/app_list.html,sha256=2JbGENeKAVqYGYwm2Yv7I0lzQrLz0xRND18kPiMIi_Q,2861
127
127
  unfold/templates/admin/auth/user/add_form.html,sha256=tZgg6UoKxJ7zL6T99PLHlLBwd4LlDI2mGn6d5hmtsPs,486
128
- unfold/templates/admin/auth/user/change_password.html,sha256=FMWWHfOlV_-DWrkSI_eIjaH8SKSuYeCAVUads32Fg9M,2912
128
+ unfold/templates/admin/auth/user/change_password.html,sha256=028v1dfQTlSmdr-WCuV4lBOmFa7Oo38CsYhsXEe8ANI,2831
129
129
  unfold/templates/admin/base.html,sha256=lXL_Hdhfflcpd_qxZ6o7GVBdAt3kZAtnnETiYrVHKfc,2460
130
130
  unfold/templates/admin/base_site.html,sha256=UOsecaCycpyn_ygJNIKO7MQtDFJuHv--r83-mzaVY30,300
131
131
  unfold/templates/admin/change_form.html,sha256=pdH089m7iaEDMUxKCWg5OSQmte0nU2Ir8gxFzrwtwB4,5611
@@ -147,13 +147,13 @@ unfold/templates/admin/nav_sidebar.html,sha256=xvCaXOamXawmf80NhE0OwjjjuNwoyoePS
147
147
  unfold/templates/admin/object_history.html,sha256=t-iJFQnpstowwsabGGA-FQjmcT1KIKhKLKbQ3iVELkk,4832
148
148
  unfold/templates/admin/pagination.html,sha256=Jc8kqZp2LMZ1xdJCGg2O5YB1lgcUG9nm-sXTWaW9Ckc,897
149
149
  unfold/templates/admin/search_form.html,sha256=ebd6ccOASaIUQsOZ0mVkcoB-EiKLqkN7y7cEm3fwsL8,1360
150
- unfold/templates/admin/submit_line.html,sha256=GVkso30iUK8bj5qwknqBQwTeNw6XdwX9OzGBK0Nroog,4538
150
+ unfold/templates/admin/submit_line.html,sha256=GvknbdmXXEw93BIQ8azUHhnQ1AcojExgGiSr0XaNg2A,4658
151
151
  unfold/templates/auth/widgets/read_only_password_hash.html,sha256=MlaNXJ2PLEbv8Nd01BBp-AQEfMB13LNxD_DzRemXhCg,775
152
152
  unfold/templates/registration/logged_out.html,sha256=oIdaqGcvIdBih3yNnUkXSEpvofRsBJ77obldnhcnP2U,997
153
- unfold/templates/registration/password_change_done.html,sha256=svhVNS7A28cJy-UE9-koF6yhPsRph6DeLi3wCB3Yg8I,1085
154
- unfold/templates/registration/password_change_form.html,sha256=nVOKTdUFdgDhkWT-tQRbBAZvnXkwbJn7pbgJ_qktgO0,2240
153
+ unfold/templates/registration/password_change_done.html,sha256=ITV6Fug4S6YG3WG-O1cm-sDAXTHEXPcNZ_w2x1IQFu8,1006
154
+ unfold/templates/registration/password_change_form.html,sha256=-8AauxUHWHXVaokG269UsETY_FHKqU83Zx38ZzrAA1A,2159
155
155
  unfold/templates/unfold/components/button.html,sha256=19z4DHnhVmq2wL2WyvoZxtNu8xGCAKXGuDa2snZTF50,630
156
- unfold/templates/unfold/components/card.html,sha256=sUi6Van8EHbuTpnRdxqpv6sqcQK0_BiooJlY1iTdtPo,1187
156
+ unfold/templates/unfold/components/card.html,sha256=N9ld_SWpXdmaqAea9bboy0bTg1YqIkAhsJmOj7nd0qs,1353
157
157
  unfold/templates/unfold/components/chart/bar.html,sha256=nDdDCUXvFd793OpNgNPQo0vBmvYngMsQyPHVTf1vfOw,297
158
158
  unfold/templates/unfold/components/chart/cohort.html,sha256=L00WR-igYv0C3t2yT_nZqeI-M5gVHpoaGv5RooRojqU,2402
159
159
  unfold/templates/unfold/components/chart/line.html,sha256=DHaZUFTlCs5cX7ioYdTzoN4ITHWNcEoNSUp7v3hlo_E,298
@@ -161,9 +161,9 @@ unfold/templates/unfold/components/container.html,sha256=WBk1rGHnTsObi3pJCpL3dfF
161
161
  unfold/templates/unfold/components/flex.html,sha256=_hBsQLJ6-7MfEfXNp5Wy-ykNtPMnnNg_io2IMGegn3s,134
162
162
  unfold/templates/unfold/components/icon.html,sha256=Qlhcf41FOwNVJ-nvA0RJ_Dn6JW6PUFXO6tOR3Xtf6e8,99
163
163
  unfold/templates/unfold/components/navigation.html,sha256=eVpuQ_yTxIv6JVL8sM21Wy-sBfGviIdEsQbEWPgw5WQ,903
164
- unfold/templates/unfold/components/progress.html,sha256=wPMiAKtKw4mwVXmiE7qNiyc-_Xy5HrGQ1GujtmmvTbU,816
164
+ unfold/templates/unfold/components/progress.html,sha256=5D9z7PDo68jI_33e-MVPM0V3tywswn5fWc_x39XKQ_4,972
165
165
  unfold/templates/unfold/components/separator.html,sha256=yvHywT_MFkx5dNC2K53OFHRGxLDsEjRpptujXyGeoTY,168
166
- unfold/templates/unfold/components/table.html,sha256=sNCP1K9uU-nJFOiztRLjNAzrLrSOvm6OeWYbHOQ74LI,3116
166
+ unfold/templates/unfold/components/table.html,sha256=VVMTrrDy_Oq09MG9aNAsnMZfXSp23K2sAMRnbjzOZmI,3355
167
167
  unfold/templates/unfold/components/text.html,sha256=-GjxvdiaBQIaNfPSzT6SSIwnc3R27FkSDQMoF3FDPso,102
168
168
  unfold/templates/unfold/components/title.html,sha256=aMYSO30ybFYqPnqwlJVh2uNmcgnVrRycZkHTjJTjpX8,171
169
169
  unfold/templates/unfold/components/tracker.html,sha256=krlvsb06lpfdOIANsyrBOoLq1sgv6rXUGr-7MmP5Le0,292
@@ -177,26 +177,26 @@ unfold/templates/unfold/helpers/boolean.html,sha256=kcSZr3siQeBWIy_jsx1tFf4m6IB3
177
177
  unfold/templates/unfold/helpers/breadcrumb_item.html,sha256=9T6ojN7LOXIlgwSwlIwHgy5U22eQYtarCqcmzsQIoPU,201
178
178
  unfold/templates/unfold/helpers/change_list_actions.html,sha256=XceGYsclqM5atPtN8NC3dffHh_R78mt-OD9QLONqdr8,651
179
179
  unfold/templates/unfold/helpers/change_list_filter.html,sha256=WwU-AG4U5qZQ_sFs1z_jaaYBWqIv3ASmtKIQIhAp2gs,1908
180
- unfold/templates/unfold/helpers/change_list_filter_actions.html,sha256=cUkmKFnZB97gmofQugQfWWPS6szqEE9-p_rsEc5tjrw,2022
180
+ unfold/templates/unfold/helpers/change_list_filter_actions.html,sha256=K32esRWcttvg8_9YvFMDurvUhL71SHjpqBSJv-ll0Po,2037
181
181
  unfold/templates/unfold/helpers/delete_submit_line.html,sha256=7SNS0axGytvUih9KxtOzy9ZC5rwG9u99iQxlnUZQfdE,700
182
182
  unfold/templates/unfold/helpers/display_dropdown.html,sha256=IpOy8-hww4arAVjPIRsHrip30J3IEd2p-2BzD3BjIaA,2906
183
183
  unfold/templates/unfold/helpers/display_header.html,sha256=2u-5Vc3mA6rS3ZlOWm3WRNLUX1wmZy4OSmGY2mdPZYs,1714
184
184
  unfold/templates/unfold/helpers/display_label.html,sha256=LS9DWzYjHkYLV27sZDwyXlg2sLJ0AlId9FbjnXpsbfg,317
185
185
  unfold/templates/unfold/helpers/edit_inline/tabular_delete.html,sha256=wr8zmSUhKcoxxms6gJsBqBrANFTOXELYUvlr3XjnjnE,931
186
186
  unfold/templates/unfold/helpers/edit_inline/tabular_error.html,sha256=8XGlgUJ47JllmXhwPZDlcl81NzZmvuBIp8FZBWoeu9Q,336
187
- unfold/templates/unfold/helpers/edit_inline/tabular_field.html,sha256=drhsFWMcVQ8J7-Z9dY2h50CucV8ExFXlQEET3xJRWTo,1007
187
+ unfold/templates/unfold/helpers/edit_inline/tabular_field.html,sha256=QETtgDYirbFBMCRH0sRU8IkODS0fBouA6crZ_K4ufTA,1007
188
188
  unfold/templates/unfold/helpers/edit_inline/tabular_heading.html,sha256=ER8R64wnKOu26WTwP4_Wxt-LRB_zRkXLhheZ_utVvKY,1523
189
189
  unfold/templates/unfold/helpers/edit_inline/tabular_row.html,sha256=eCyWEYvvDDCr9SR4_0ua5-GqCLIlFzgQYIZP0ip8cp8,2145
190
190
  unfold/templates/unfold/helpers/edit_inline/tabular_title.html,sha256=2sk1TRzpmwy8PPPMNdf6CJx0zVSk-I2q3yX8uEPjuxE,2710
191
191
  unfold/templates/unfold/helpers/empty_results.html,sha256=Sbp1dOgazpbSwyiX1CT-Arbe51V79MhV8w9IAiHRIE0,1963
192
- unfold/templates/unfold/helpers/field.html,sha256=awM8lUlERpPSSz9TczWrMvxXzY8jGbEvix0JzWvHMVE,979
192
+ unfold/templates/unfold/helpers/field.html,sha256=2q2M4dfisKJ9v8jt8gcq-iRf74t6H9W6xg16scZNF70,979
193
193
  unfold/templates/unfold/helpers/field_readonly.html,sha256=4qtXjWE7SA2qZSTYLOv0lT4pQfD0TE34mvWQJY7jhS8,237
194
- unfold/templates/unfold/helpers/field_readonly_value.html,sha256=RSfdz7RfOwRR4N1EUlSqde2majmyG8rDt3X1zNsfsCc,488
194
+ unfold/templates/unfold/helpers/field_readonly_value.html,sha256=FI_CFEsCN7ELQux9gF-IaZ7nT7jyzidqwR2Med-E52g,504
195
195
  unfold/templates/unfold/helpers/fieldset_row.html,sha256=LriorPLXU4VmqstjX1oBc3T49H8CbhCrRxwQ7YfUSkI,1219
196
- unfold/templates/unfold/helpers/fieldset_row_checkbox.html,sha256=FC-EIVk7mv8pjVmsUmiqxRygI5b7iggwhn4s6eMBAjc,1467
197
- unfold/templates/unfold/helpers/fieldset_row_field.html,sha256=ujJFSP9wRdwjlQZCDWHUzw4bohtKi7uV8vGJlV5rOko,638
196
+ unfold/templates/unfold/helpers/fieldset_row_checkbox.html,sha256=z4aRab--zJS2PC0jfKPez85IptKGRrqgkPpwW6_IKoo,1467
197
+ unfold/templates/unfold/helpers/fieldset_row_field.html,sha256=cqLT1fHsCCszOHxvYlDFDTAd-6RRoOjdqfdBdhFgHOo,647
198
198
  unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=NRmkr_vWnEyIFZ1xLpJf_VW1H3xcDlIhMFBuElp3dIo,1468
199
- unfold/templates/unfold/helpers/form_errors.html,sha256=EwerIJptSCWXvtAJ1IZKfEn98qlShBIGavsTThbklAs,266
199
+ unfold/templates/unfold/helpers/form_errors.html,sha256=mrv2_J7RPcLfVtoN1UHh3rfUyOSZpHl67wk1UGqtPcY,266
200
200
  unfold/templates/unfold/helpers/form_label.html,sha256=7FfaXfviQmqKpsA1E7NSwM8rJiMNLl9e73XQram0Pfs,249
201
201
  unfold/templates/unfold/helpers/header.html,sha256=hTLE7_1VCCp-XqmU4xBrFA4Rtb0-8q-I7goP1sOGKg0,1123
202
202
  unfold/templates/unfold/helpers/header_back_button.html,sha256=lNZcYZzQRZdNSI70UrxJ-pq7xnxifziZXtSK1FoPy_U,416
@@ -206,12 +206,12 @@ unfold/templates/unfold/helpers/label.html,sha256=DRs0B08SmIvNY0QcFy78xDiI0hAKyf
206
206
  unfold/templates/unfold/helpers/language_switch.html,sha256=Y3VxZW0JhqBImLQf2PY11gA_J1CWhbo5LouxoNgzawU,1516
207
207
  unfold/templates/unfold/helpers/messages/debug.html,sha256=OIWKZp04zxWPmVaKZaEtzrikZq1kVruncYRKiKrHWds,153
208
208
  unfold/templates/unfold/helpers/messages/error.html,sha256=16-4bslrpgXR1fTk8bmRUItIbnQcU5XjDgI1xesoKcc,600
209
- unfold/templates/unfold/helpers/messages/errornote.html,sha256=bOnZkPBrQrbAXDdwJ591KOkFtWK2WA_keOOjJFVGFDI,401
209
+ unfold/templates/unfold/helpers/messages/errornote.html,sha256=3RVj4BIdft3yEUOdzmli0QPQ_l9hUAOTpHIfL4ZOpMg,356
210
210
  unfold/templates/unfold/helpers/messages/info.html,sha256=4SCFtg3p6F33ZHJhYoIm2VVO5UPdW0ef04mTTqIdcD0,153
211
211
  unfold/templates/unfold/helpers/messages/success.html,sha256=UWHpRJTvVhXiYC9-AvJ9HeEZJj-poejFgy7EgLvwpf8,157
212
212
  unfold/templates/unfold/helpers/messages/warning.html,sha256=UldycPr8wdyp5vdjlkfs_yHCEvNg9PgspyzTALAjdDY,161
213
213
  unfold/templates/unfold/helpers/messages.html,sha256=ISkUlIDraDAVBwASkX1tFXHo8TY1vHKmmhh8BAg123E,915
214
- unfold/templates/unfold/helpers/navigation.html,sha256=HSUKJdIIpaalBaUXzaKRbnV9QYNcRyCJayPTRJ5b97Y,503
214
+ unfold/templates/unfold/helpers/navigation.html,sha256=IPE9Z48XTuI2q72sNJcFTPXDn8_F2FhzgvipTymnFck,526
215
215
  unfold/templates/unfold/helpers/navigation_header.html,sha256=08_LTuJF6MrG0hK6lUI9daCP5kQr5Q7FwY7Pl4kFxJQ,1474
216
216
  unfold/templates/unfold/helpers/pagination.html,sha256=N5TQDlj5kgJLj02oRiaX8W62jQtZVNoWfI2hXdpuY1g,439
217
217
  unfold/templates/unfold/helpers/pagination_current_item.html,sha256=4cZ2KLVcP0Y7xuGyXgexDQ07r94cgM5Gnmtv11dkRPQ,69
@@ -234,16 +234,17 @@ unfold/templates/unfold/helpers/userlinks.html,sha256=oZqiwCxG_zRecAbzYrr8_hQvkn
234
234
  unfold/templates/unfold/helpers/welcomemsg.html,sha256=Ickay1zuj2A6SE9WmEfFqSKvzmrm_nAH6mJz5_JEQuY,1935
235
235
  unfold/templates/unfold/layouts/base.html,sha256=e9T-vuPvrySHf23LLwRuTQXUg0Q4x-6gmT_yXghqc-I,278
236
236
  unfold/templates/unfold/layouts/base_simple.html,sha256=qUZ9YM24UHgWbmTl61zgN4_ty49P1FZJQ2siNbwnFnQ,1244
237
- unfold/templates/unfold/layouts/skeleton.html,sha256=dnOr58bAEHDLqLgETUGLwKIlmSngHUwTfbM2-nB_6ZQ,4683
237
+ unfold/templates/unfold/layouts/skeleton.html,sha256=2AWjJx6TxpYbXldwrXRbtyp9XTpAu6O0U_zcJtfYfWs,4684
238
238
  unfold/templates/unfold/templatetags/preserve_changelist_filters.html,sha256=sx2jUhogNY4emBhY8PqxQ6mXifbXQb_IQI9Hd0boJI0,111
239
- unfold/templates/unfold/widgets/clearable_file_input.html,sha256=q4XYreNwkXlUVdlYjqlYdfeOaBZsC89NBVYXmGms-GQ,2163
240
- unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=u0sjRIMJ5mguZmh9vXH_VwXNgc5jpkXCWzRU8O1s-GA,2608
239
+ unfold/templates/unfold/widgets/clearable_file_input.html,sha256=8dXZnc6z2D2K08hqHsQwR5UJffcIRnmYBT02zmCOr9A,2191
240
+ unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=zhnaDz72mJgMrq-nCPCMuR5tEJaFVfJyOJUAzR6tQWc,2624
241
241
  unfold/templates/unfold/widgets/date.html,sha256=ih9wj8koTaHb9s1NGUmyN9rHvSAmqCMbti9ONDOIujg,122
242
242
  unfold/templates/unfold/widgets/foreign_key_raw_id.html,sha256=4r7ha4I9vMp9Ls7WIbWxF1xuLGLWli7gIZoZAH3Bcyg,1114
243
243
  unfold/templates/unfold/widgets/radio.html,sha256=7Mgc92mMwJdVLjCxoGj5lo76KNaN5dKKktV3vzmbeqA,652
244
244
  unfold/templates/unfold/widgets/radio_option.html,sha256=wVg6zIB0O44vwBgQCCphPuCXeh-gaDg6ed-0gcf5kg4,324
245
245
  unfold/templates/unfold/widgets/range.html,sha256=Zhfj2VTusS3nZjOYR7slcjk1JtFK0psZbaSCw6TDY1I,294
246
246
  unfold/templates/unfold/widgets/related_widget_wrapper.html,sha256=8poy8kZRGPqmY4gSXkEZt7vevBomrKoe2Lg5zsjpwiU,3919
247
+ unfold/templates/unfold/widgets/select.html,sha256=Qx1YUMj2Yq43DaAbDeRcQv-9M8jlIV00NF6970axb7Y,708
247
248
  unfold/templates/unfold/widgets/split_datetime.html,sha256=Hfv2PoHxPmV_21DmBFmMcR4WVP9vTV9SrfjVdliRci8,1074
248
249
  unfold/templates/unfold/widgets/split_datetime_vertical.html,sha256=39lZsRyRcKr8DIcy9oL39zC8nAHZTHwW6gyTYOKePrQ,806
249
250
  unfold/templates/unfold/widgets/split_money.html,sha256=AFLUBmzGbY-RXgsfz7gaDxVRhplaIPhXjg_hWYo9xcY,352
@@ -252,32 +253,35 @@ unfold/templates/unfold/widgets/time.html,sha256=ih9wj8koTaHb9s1NGUmyN9rHvSAmqCM
252
253
  unfold/templates/unfold/widgets/url.html,sha256=IRLgW44VTKN7UrSWeywJwaxQhfG5jhhXuT-KTadKX58,304
253
254
  unfold/templates/unfold_crispy/display_form.html,sha256=tGyr8hvMlnKkm2ILbVj0enj6IrjtqiKo6nO9Z-zHE2Q,270
254
255
  unfold/templates/unfold_crispy/errors.html,sha256=bzTXuZh_UkQLb4sPaa0En5Uopveoe573TaEOM9OQVcw,132
255
- unfold/templates/unfold_crispy/field.html,sha256=fLCQZEiiLo9Mo5Yva3l_kKGnTgjMbOxiwRV8tGt9pzg,1613
256
- unfold/templates/unfold_crispy/inputs.html,sha256=WXHpn1BhM08EqyLkW3dsufXjPWGNZkoUWT_BCJMYMpY,302
256
+ unfold/templates/unfold_crispy/errors_formset.html,sha256=D52cx_PmIF9KSTO8WmQu0m2atpDfLIt79SPKz9LmjSE,136
257
+ unfold/templates/unfold_crispy/field.html,sha256=K8B4K28oMI914QiD_21g6NO_86_9T66t7Amxomja12c,1681
258
+ unfold/templates/unfold_crispy/inputs.html,sha256=6aMXsUY26q_JcIVYgd6X4lwbwbagWj68KHyAYk_fCN4,238
257
259
  unfold/templates/unfold_crispy/layout/attrs.html,sha256=LsLlfKenzHKl6n25m4Ers2NepLSA_RBy9AqezKZ7rH8,173
258
260
  unfold/templates/unfold_crispy/layout/baseinput.html,sha256=GjMxXoqpnxCPkPC1E3v_crzlxDb_hHMf_UgJYfqSsYE,440
259
261
  unfold/templates/unfold_crispy/layout/button.html,sha256=evlO80en9FkbW3UayLPTNUZXAYvgr3slSAsGPKXs96M,67
260
262
  unfold/templates/unfold_crispy/layout/buttonholder.html,sha256=ruHqViROk7nh4luckA8-mcfmnYBqsVM85e8j0rOi3cU,415
261
- unfold/templates/unfold_crispy/layout/checkbox.html,sha256=X_a8_1VOzQU8gcY7fJOHrMNj5Mdg5LirVSkaWda_eCk,735
263
+ unfold/templates/unfold_crispy/layout/checkbox.html,sha256=V1YGDcYfn4spUHx6M5ux8fzfY7vrWCPCO2UfqFyAKos,769
262
264
  unfold/templates/unfold_crispy/layout/column.html,sha256=Bob4xRcbJOHScDjSjLMRIMNf4lonNmm8F_JOm2azTik,172
263
265
  unfold/templates/unfold_crispy/layout/div.html,sha256=RE9qQ2w2I2zpi7Z7xzVmVO03UXq0yZvMw-W7rVJkEdw,174
264
- unfold/templates/unfold_crispy/layout/field_errors.html,sha256=pEn-c6Bfdg54vRm2FxmM8BGbvN0O2R92bnj_gL81X_Q,274
265
- unfold/templates/unfold_crispy/layout/fieldset.html,sha256=hbsM_wCgdcvlZ9D6t1jHACbBf7nbV9-5Ycq-TylJ8QY,589
266
+ unfold/templates/unfold_crispy/layout/field_errors.html,sha256=N0eNJo4OvYzFHPD6vX2gSZWabm46W1GP011sd_dua1I,291
267
+ unfold/templates/unfold_crispy/layout/fieldset.html,sha256=batc1TDIHvtzX9ZchvSyH3r3q9s7bgr7DpxEfnwvvjk,601
266
268
  unfold/templates/unfold_crispy/layout/help_text.html,sha256=FY0UQv5FsoOFhrqvbILEfZE78Hj30r73YHCtg_MWNeY,207
267
269
  unfold/templates/unfold_crispy/layout/help_text_and_errors.html,sha256=Um14wIg0FHthNM0mKE9VdptTrC-lTTcrDUO-UbbXxhY,108
270
+ unfold/templates/unfold_crispy/layout/hr.html,sha256=_u0V0lIdK3PLREGspx3zywhUQHcFeY7BuMUbaLyN1WU,321
268
271
  unfold/templates/unfold_crispy/layout/radio_checkbox_select.html,sha256=pUlHC6j-fH62fAMiAZW-4BWXGD0RocHOKCmLtHN9pP8,997
269
272
  unfold/templates/unfold_crispy/layout/row.html,sha256=MgGCI9s2mEn8C6xc78fb2Y4BsW6sbsKvgEd6aVRlFsg,184
270
- unfold/templates/unfold_crispy/layout/table_inline_formset.html,sha256=JFFPJDWjOMFBggChhpgWN1a5-Cpy9Xn2Zzl8T00VfbA,4573
273
+ unfold/templates/unfold_crispy/layout/table_inline_formset.html,sha256=6c0C5jZYGuQQoJsd_mu0aHs-Jq7OzzFbUTTqyAniYB4,4705
271
274
  unfold/templates/unfold_crispy/uni_form.html,sha256=l9UNCUrIycgJ0p_B6qhtO_YxdARy3aq8qYY5h5BheSo,312
272
275
  unfold/templates/unfold_crispy/whole_uni_form.html,sha256=ufXRKCIGqkqKFOsh166rpKUnHpFMyBV4eYUCRhs3iws,475
276
+ unfold/templates/unfold_crispy/whole_uni_formset.html,sha256=CYksfG2hRUdi5n691KW2ih-FfBxpOU4qVBfbOvcu1zs,873
273
277
  unfold/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
- unfold/templatetags/unfold.py,sha256=f2RL7bdR3qsX-ayRjgxXuclUv5vC-cSlArqfsRva-dI,17031
278
+ unfold/templatetags/unfold.py,sha256=ht7dnFDANrzly8guUMES-PRR4S5e82I8fuWMD0bDieg,17297
275
279
  unfold/templatetags/unfold_list.py,sha256=ayShOYEXcV3o7wKt3t2aFTWvg62Mb-WGlxjYVGgk3a0,14344
276
280
  unfold/typing.py,sha256=i7LM2LiwYTAjT5-OLDUPVn5b9X-DMmHnjlZG2toWwSE,692
277
281
  unfold/utils.py,sha256=SJikRuAuJN0bE9rfzUujZwycTRrzQm14Hk0zB0EwivU,6164
278
282
  unfold/views.py,sha256=FuYnMrlg6SegLUDDN6An__yZj8rchD_iBK8myieYhkA,1492
279
- unfold/widgets.py,sha256=FtWmqbe1ArScJMXmTJF7mXdCIzLN09fEJw17niaFqB0,22205
280
- django_unfold-0.56.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
281
- django_unfold-0.56.0.dist-info/METADATA,sha256=6-GSi2O5lDukR6fZA46lqPgG6YODNZXOOeSvC9kwuRQ,7951
282
- django_unfold-0.56.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
283
- django_unfold-0.56.0.dist-info/RECORD,,
283
+ unfold/widgets.py,sha256=ZpwWbxEwgIqf-rZEaU71UwGwyuGyxE5TofaytXxxFEg,23062
284
+ django_unfold-0.58.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
285
+ django_unfold-0.58.0.dist-info/METADATA,sha256=bnstJhcMtmg1VBaWRfJO9Mt12BRJp6F_ikTi513G5nI,7951
286
+ django_unfold-0.58.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
287
+ django_unfold-0.58.0.dist-info/RECORD,,
@@ -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 %}
unfold/decorators.py CHANGED
@@ -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(
unfold/forms.py CHANGED
@@ -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
  [
unfold/layout.py CHANGED
@@ -1,4 +1,6 @@
1
- from crispy_forms.layout import BaseInput
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
2
4
 
3
5
  from unfold.widgets import BUTTON_CLASSES
4
6
 
@@ -21,3 +23,19 @@ class Submit(ButtonClassesMixin, BaseInput):
21
23
 
22
24
  class Button(ButtonClassesMixin, BaseInput):
23
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
+ )
unfold/sites.py CHANGED
@@ -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