django-cfg 1.4.87__py3-none-any.whl → 1.4.89__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.

Potentially problematic release.


This version of django-cfg might be problematic. Click here for more details.

Files changed (177) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/centrifugo/views/__init__.py +0 -2
  3. django_cfg/apps/dashboard/permissions.py +48 -0
  4. django_cfg/apps/dashboard/serializers/__init__.py +8 -1
  5. django_cfg/apps/dashboard/serializers/commands.py +29 -0
  6. django_cfg/apps/dashboard/services/__init__.py +2 -0
  7. django_cfg/{modules/django_unfold/callbacks/base.py → apps/dashboard/services/commands_security.py} +28 -90
  8. django_cfg/apps/dashboard/services/commands_service.py +208 -9
  9. django_cfg/apps/dashboard/services/overview_service.py +205 -0
  10. django_cfg/apps/dashboard/views/commands_views.py +92 -4
  11. django_cfg/apps/frontend/test_routing.py +134 -0
  12. django_cfg/apps/frontend/views.py +73 -28
  13. django_cfg/apps/urls.py +0 -1
  14. django_cfg/core/builders/apps_builder.py +0 -58
  15. django_cfg/modules/django_unfold/__init__.py +5 -24
  16. django_cfg/modules/django_unfold/models/__init__.py +0 -23
  17. django_cfg/modules/django_unfold/models/config.py +11 -65
  18. django_cfg/modules/django_unfold/{dashboard.py → navigation.py} +21 -152
  19. django_cfg/modules/django_unfold/tailwind.py +2 -4
  20. django_cfg/pyproject.toml +1 -1
  21. django_cfg/registry/third_party.py +0 -9
  22. django_cfg/routing/callbacks.py +1 -43
  23. django_cfg/static/frontend/admin/404/index.html +1 -1
  24. django_cfg/static/frontend/admin/404.html +1 -1
  25. django_cfg/static/frontend/admin/500/index.html +1 -1
  26. django_cfg/static/frontend/admin/_next/static/{ZJZBgOL9mO1koHrgaaLEV → 0sN9ktsgXH48ygtGSrhfu}/_buildManifest.js +1 -1
  27. django_cfg/static/frontend/admin/_next/static/chunks/{19430.fe7bff7372f8a256.js → 19430.c4c95603c23c17fe.js} +1 -1
  28. django_cfg/static/frontend/admin/_next/static/chunks/50314-9443faa6df24aebf.js +1 -0
  29. django_cfg/static/frontend/admin/_next/static/chunks/94141-bc6d47f419b26b21.js +1 -0
  30. django_cfg/static/frontend/admin/_next/static/chunks/pages/{_app-c336f254967dd101.js → _app-c7dcd3aa616fab68.js} +6 -6
  31. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{cookies-b39c7f22c066e2c6.js → cookies-97d279800f12aab4.js} +1 -1
  32. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{privacy-5aedad0cf3a4f80f.js → privacy-1d5e6cd94689247e.js} +1 -1
  33. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{security-dbd854d0d5d483e2.js → security-55e49700e7a01f5a.js} +1 -1
  34. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{terms-f3e1d2b9e5edf12f.js → terms-14c02bb2d3198352.js} +1 -1
  35. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/{centrifugo-22532c65971225eb.js → centrifugo-f9ecbc3ae0052a03.js} +1 -1
  36. django_cfg/static/frontend/admin/_next/static/chunks/pages/private-d4ccbe1265cbd853.js +1 -0
  37. django_cfg/static/frontend/admin/_next/static/chunks/{webpack-da114020a6b940f5.js → webpack-5a92f81363b62aa7.js} +1 -1
  38. django_cfg/static/frontend/admin/_next/static/css/3063068f0d5a8a00.css +3 -0
  39. django_cfg/static/frontend/admin/_next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  40. django_cfg/static/frontend/admin/_next/static/media/21350d82a1f187e9-s.p.woff2 +0 -0
  41. django_cfg/static/frontend/admin/_next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  42. django_cfg/static/frontend/admin/_next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  43. django_cfg/static/frontend/admin/_next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  44. django_cfg/static/frontend/admin/_next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  45. django_cfg/static/frontend/admin/_next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  46. django_cfg/static/frontend/admin/auth/index.html +1 -1
  47. django_cfg/static/frontend/admin/index.html +1 -1
  48. django_cfg/static/frontend/admin/legal/cookies/index.html +1 -1
  49. django_cfg/static/frontend/admin/legal/privacy/index.html +1 -1
  50. django_cfg/static/frontend/admin/legal/security/index.html +1 -1
  51. django_cfg/static/frontend/admin/legal/terms/index.html +1 -1
  52. django_cfg/static/frontend/admin/private/centrifugo/index.html +1 -1
  53. django_cfg/static/frontend/admin/private/index.html +1 -1
  54. django_cfg/static/frontend/admin/private/profile/index.html +1 -1
  55. django_cfg/static/frontend/admin/private/ui/index.html +2 -2
  56. django_cfg/templates/admin/index.html +1 -1
  57. {django_cfg-1.4.87.dist-info → django_cfg-1.4.89.dist-info}/METADATA +1 -1
  58. {django_cfg-1.4.87.dist-info → django_cfg-1.4.89.dist-info}/RECORD +62 -163
  59. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/css/dashboard.css +0 -260
  60. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/live_channels.mjs +0 -313
  61. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/live_testing.mjs +0 -803
  62. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/main.mjs +0 -341
  63. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/overview.mjs +0 -432
  64. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/testing.mjs +0 -33
  65. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/websocket.mjs +0 -210
  66. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/channels_content.html +0 -46
  67. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/live_channels_content.html +0 -123
  68. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/overview_content.html +0 -45
  69. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/publishes_content.html +0 -84
  70. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/stat_cards.html +0 -53
  71. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/system_status.html +0 -91
  72. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/tab_navigation.html +0 -29
  73. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/testing_tools.html +0 -415
  74. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/layout/base.html +0 -61
  75. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/pages/dashboard.html +0 -58
  76. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/tags/connection_script.html +0 -48
  77. django_cfg/apps/centrifugo/templatetags/__init__.py +0 -1
  78. django_cfg/apps/centrifugo/templatetags/centrifugo_tags.py +0 -81
  79. django_cfg/apps/centrifugo/urls_admin.py +0 -20
  80. django_cfg/apps/centrifugo/views/dashboard.py +0 -28
  81. django_cfg/modules/django_dashboard/__init__.py +0 -23
  82. django_cfg/modules/django_dashboard/components.py +0 -312
  83. django_cfg/modules/django_dashboard/debug.py +0 -174
  84. django_cfg/modules/django_dashboard/management/__init__.py +0 -0
  85. django_cfg/modules/django_dashboard/management/commands/__init__.py +0 -0
  86. django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +0 -109
  87. django_cfg/modules/django_dashboard/sections/__init__.py +0 -1
  88. django_cfg/modules/django_dashboard/sections/base.py +0 -129
  89. django_cfg/modules/django_dashboard/sections/commands.py +0 -33
  90. django_cfg/modules/django_dashboard/sections/documentation.py +0 -393
  91. django_cfg/modules/django_dashboard/sections/overview.py +0 -398
  92. django_cfg/modules/django_dashboard/sections/stats.py +0 -48
  93. django_cfg/modules/django_dashboard/sections/system.py +0 -74
  94. django_cfg/modules/django_dashboard/sections/widgets.py +0 -222
  95. django_cfg/modules/django_unfold/callbacks/__init__.py +0 -9
  96. django_cfg/modules/django_unfold/callbacks/actions.py +0 -51
  97. django_cfg/modules/django_unfold/callbacks/apizones.py +0 -122
  98. django_cfg/modules/django_unfold/callbacks/charts.py +0 -223
  99. django_cfg/modules/django_unfold/callbacks/commands.py +0 -40
  100. django_cfg/modules/django_unfold/callbacks/main.py +0 -322
  101. django_cfg/modules/django_unfold/callbacks/statistics.py +0 -240
  102. django_cfg/modules/django_unfold/callbacks/system.py +0 -180
  103. django_cfg/modules/django_unfold/callbacks/users.py +0 -65
  104. django_cfg/modules/django_unfold/models/dashboard.py +0 -207
  105. django_cfg/modules/django_unfold/models/tabs.py +0 -26
  106. django_cfg/modules/django_unfold/models.py +0 -98
  107. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +0 -102
  108. django_cfg/static/frontend/admin/_next/static/chunks/23004-faae121bbfecc163.js +0 -1
  109. django_cfg/static/frontend/admin/_next/static/chunks/50314-48bd5701f62faf27.js +0 -1
  110. django_cfg/static/frontend/admin/_next/static/chunks/pages/private-fe9faa86ecdb0ce6.js +0 -1
  111. django_cfg/static/frontend/admin/_next/static/css/5f9a37b6e6a72303.css +0 -3
  112. django_cfg/static/frontend/admin/_next/static/media/438aa629764e75f3-s.woff2 +0 -0
  113. django_cfg/static/frontend/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
  114. django_cfg/static/frontend/admin/_next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
  115. django_cfg/static/frontend/admin/_next/static/media/875ae681bfde4580-s.p.woff2 +0 -0
  116. django_cfg/static/frontend/admin/_next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
  117. django_cfg/static/frontend/admin/_next/static/media/e857b654a2caa584-s.woff2 +0 -0
  118. django_cfg/templates/admin/sections/commands_section.html +0 -5
  119. django_cfg/templates/admin/sections/documentation_section.html +0 -5
  120. django_cfg/templates/admin/sections/overview_section.html +0 -5
  121. django_cfg/templates/admin/sections/stats_section.html +0 -5
  122. django_cfg/templates/admin/sections/system_section.html +0 -5
  123. django_cfg/templates/admin/sections/widgets_section.html +0 -11
  124. django_cfg/templates/admin_old/components/action_grid.html +0 -49
  125. django_cfg/templates/admin_old/components/card.html +0 -50
  126. django_cfg/templates/admin_old/components/data_table.html +0 -67
  127. django_cfg/templates/admin_old/components/metric_card.html +0 -39
  128. django_cfg/templates/admin_old/components/modal.html +0 -58
  129. django_cfg/templates/admin_old/components/progress_bar.html +0 -20
  130. django_cfg/templates/admin_old/components/section_header.html +0 -26
  131. django_cfg/templates/admin_old/components/stat_item.html +0 -32
  132. django_cfg/templates/admin_old/components/stats_grid.html +0 -72
  133. django_cfg/templates/admin_old/components/status_badge.html +0 -28
  134. django_cfg/templates/admin_old/components/user_avatar.html +0 -27
  135. django_cfg/templates/admin_old/constance/change_list.html +0 -74
  136. django_cfg/templates/admin_old/constance/includes/default_value.html +0 -24
  137. django_cfg/templates/admin_old/constance/includes/fieldset_header.html +0 -15
  138. django_cfg/templates/admin_old/constance/includes/results_list.html +0 -16
  139. django_cfg/templates/admin_old/constance/includes/setting_row.html +0 -50
  140. django_cfg/templates/admin_old/constance/includes/table_headers.html +0 -10
  141. django_cfg/templates/admin_old/examples/component_class_example.html +0 -156
  142. django_cfg/templates/admin_old/import_export/change_list_export.html +0 -24
  143. django_cfg/templates/admin_old/import_export/change_list_import.html +0 -24
  144. django_cfg/templates/admin_old/import_export/change_list_import_export.html +0 -34
  145. django_cfg/templates/admin_old/index.html +0 -80
  146. django_cfg/templates/admin_old/index_new.html +0 -119
  147. django_cfg/templates/admin_old/layouts/base_dashboard.html +0 -62
  148. django_cfg/templates/admin_old/layouts/dashboard_with_tabs.html +0 -176
  149. django_cfg/templates/admin_old/sections/commands_section.html +0 -549
  150. django_cfg/templates/admin_old/sections/documentation_section.html +0 -152
  151. django_cfg/templates/admin_old/sections/overview_section.html +0 -112
  152. django_cfg/templates/admin_old/sections/stats_section.html +0 -35
  153. django_cfg/templates/admin_old/sections/system_section.html +0 -99
  154. django_cfg/templates/admin_old/sections/widgets_section.html +0 -129
  155. django_cfg/templates/admin_old/snippets/components/activity_tracker.html +0 -70
  156. django_cfg/templates/admin_old/snippets/components/charts_section.html +0 -113
  157. django_cfg/templates/admin_old/snippets/components/django_commands.html +0 -270
  158. django_cfg/templates/admin_old/snippets/components/quick_actions.html +0 -66
  159. django_cfg/templates/admin_old/snippets/components/recent_activity_improved.html +0 -25
  160. django_cfg/templates/admin_old/snippets/components/recent_users_table.html +0 -102
  161. django_cfg/templates/admin_old/snippets/components/stats_cards.html +0 -4
  162. django_cfg/templates/admin_old/snippets/components/stats_tiles.html +0 -92
  163. django_cfg/templates/admin_old/snippets/components/system_health.html +0 -22
  164. django_cfg/templates/admin_old/snippets/components/system_metrics.html +0 -199
  165. django_cfg/templates/admin_old/snippets/components/user_permissions.html +0 -57
  166. django_cfg/templates/admin_old/snippets/tabs/app_stats_tab.html +0 -201
  167. django_cfg/templates/admin_old/snippets/tabs/commands_tab.html +0 -114
  168. django_cfg/templates/admin_old/snippets/tabs/documentation_tab.html +0 -42
  169. django_cfg/templates/admin_old/snippets/tabs/overview_tab.html +0 -116
  170. django_cfg/templates/admin_old/snippets/tabs/stats_tab.html +0 -89
  171. django_cfg/templates/admin_old/snippets/tabs/users_tab.html +0 -51
  172. django_cfg/templates/admin_old/snippets/tabs/widgets_tab.html +0 -38
  173. django_cfg/templates/admin_old/snippets/zones/zones_table.html +0 -176
  174. /django_cfg/static/frontend/admin/_next/static/{ZJZBgOL9mO1koHrgaaLEV → 0sN9ktsgXH48ygtGSrhfu}/_ssgManifest.js +0 -0
  175. {django_cfg-1.4.87.dist-info → django_cfg-1.4.89.dist-info}/WHEEL +0 -0
  176. {django_cfg-1.4.87.dist-info → django_cfg-1.4.89.dist-info}/entry_points.txt +0 -0
  177. {django_cfg-1.4.87.dist-info → django_cfg-1.4.89.dist-info}/licenses/LICENSE +0 -0
@@ -1,50 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Enhanced Card Component following Unfold patterns -->
4
- <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 shadow-xs overflow-hidden {% if hover %}hover:shadow-md hover:border-base-300 dark:hover:border-base-600 transition-all duration-200{% endif %}{% if class %} {{ class }}{% endif %}">
5
-
6
- <!-- Card Header -->
7
- {% if title or header_actions %}
8
- <div class="p-6 border-b border-base-200 dark:border-base-700 {% if header_bg %}{{ header_bg }}{% else %}bg-base-50 dark:bg-base-800{% endif %}">
9
- <div class="flex items-center justify-between">
10
- {% if title %}
11
- <div class="flex items-center space-x-3">
12
- {% if icon %}
13
- <div class="flex items-center justify-center w-8 h-8 bg-{{ icon_color|default:'primary' }}-100 dark:bg-{{ icon_color|default:'primary' }}-900/20 rounded-lg">
14
- <span class="material-icons text-{{ icon_color|default:'primary' }}-600 dark:text-{{ icon_color|default:'primary' }}-400 text-lg">{{ icon }}</span>
15
- </div>
16
- {% endif %}
17
- <div>
18
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">
19
- {{ title }}
20
- </h3>
21
- {% if subtitle %}
22
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">
23
- {{ subtitle }}
24
- </p>
25
- {% endif %}
26
- </div>
27
- </div>
28
- {% endif %}
29
-
30
- {% if header_actions %}
31
- <div class="flex items-center space-x-2">
32
- {{ header_actions }}
33
- </div>
34
- {% endif %}
35
- </div>
36
- </div>
37
- {% endif %}
38
-
39
- <!-- Card Body -->
40
- <div class="p-6{% if compact %} p-4{% endif %}">
41
- {{ content }}
42
- </div>
43
-
44
- <!-- Card Footer -->
45
- {% if footer %}
46
- <div class="px-6 py-4 border-t border-base-200 dark:border-base-700 bg-base-50 dark:bg-base-800">
47
- {{ footer }}
48
- </div>
49
- {% endif %}
50
- </div>
@@ -1,67 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Data Table Component -->
4
- <div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 overflow-hidden shadow-xs">
5
-
6
- <!-- Table Header -->
7
- {% if title or actions %}
8
- <div class="px-6 py-4 border-b border-base-200 dark:border-base-700 bg-base-50 dark:bg-base-800">
9
- <div class="flex items-center justify-between">
10
- {% if title %}
11
- <div class="flex items-center">
12
- {% if icon %}
13
- <span class="material-icons text-primary-600 mr-2">{{ icon }}</span>
14
- {% endif %}
15
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">{{ title }}</h3>
16
- </div>
17
- {% endif %}
18
-
19
- {% if actions %}
20
- <div class="flex items-center space-x-2">
21
- {{ actions }}
22
- </div>
23
- {% endif %}
24
- </div>
25
- </div>
26
- {% endif %}
27
-
28
- <!-- Table Content -->
29
- <div class="overflow-x-auto">
30
- <table class="w-full">
31
- {% if headers %}
32
- <thead class="bg-base-50 dark:bg-base-800">
33
- <tr>
34
- {% for header in headers %}
35
- <th class="px-6 py-3 text-left text-xs font-medium text-font-subtle-light dark:text-font-subtle-dark uppercase tracking-wider">
36
- {{ header }}
37
- </th>
38
- {% endfor %}
39
- </tr>
40
- </thead>
41
- {% endif %}
42
-
43
- <tbody class="bg-white dark:bg-base-900 divide-y divide-base-200 dark:divide-base-700">
44
- {% if rows %}
45
- {% for row in rows %}
46
- <tr class="hover:bg-base-100 dark:hover:bg-base-800 transition-colors duration-150">
47
- {% for cell in row %}
48
- <td class="px-6 py-4 whitespace-nowrap">
49
- {{ cell }}
50
- </td>
51
- {% endfor %}
52
- </tr>
53
- {% endfor %}
54
- {% else %}
55
- <tr>
56
- <td colspan="{{ headers|length|default:'5' }}" class="px-6 py-8 text-center">
57
- <div class="flex flex-col items-center">
58
- <span class="material-icons text-4xl text-base-400 dark:text-base-500 mb-2">{{ empty_icon|default:'inbox' }}</span>
59
- <p class="text-font-subtle-light dark:text-font-subtle-dark">{{ empty_message|default:'No data available' }}</p>
60
- </div>
61
- </td>
62
- </tr>
63
- {% endif %}
64
- </tbody>
65
- </table>
66
- </div>
67
- </div>
@@ -1,39 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Metric Card Component -->
4
- <div class="theme-card rounded-lg p-5 border theme-border hover:shadow-md transition-shadow duration-200">
5
- <div class="flex items-center justify-between">
6
- <div class="flex items-center space-x-3">
7
- <div class="flex-shrink-0">
8
- <span class="material-icons
9
- {% if status == 'healthy' or status == 'success' %}text-green-600 dark:text-green-400
10
- {% elif status == 'warning' %}text-amber-600 dark:text-amber-400
11
- {% elif status == 'error' or status == 'failed' %}text-red-600 dark:text-red-400
12
- {% elif status == 'info' %}text-blue-600 dark:text-blue-400
13
- {% else %}text-blue-600 dark:text-blue-400{% endif %}">
14
- {{ icon }}
15
- </span>
16
- </div>
17
- <div class="min-w-0 flex-1">
18
- <div class="text-sm font-medium theme-text truncate">
19
- {{ title }}
20
- </div>
21
- {% if description %}
22
- <div class="text-xs text-gray-500 dark:text-gray-400 mt-1 truncate">
23
- {{ description }}
24
- </div>
25
- {% endif %}
26
- </div>
27
- </div>
28
-
29
- <div class="flex-shrink-0">
30
- {% include 'admin/components/status_badge.html' with status=status text=status_text %}
31
- </div>
32
- </div>
33
-
34
- {% if progress %}
35
- <div class="mt-4">
36
- {% include 'admin/components/progress_bar.html' with value=progress title=progress_title description=progress_description %}
37
- </div>
38
- {% endif %}
39
- </div>
@@ -1,58 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Reusable Modal Component based on Unfold patterns -->
4
- <div id="{{ modal_id|default:'modal' }}" class="fixed inset-0 bg-black/80 backdrop-blur-sm hidden z-50">
5
- <div class="flex items-center justify-center min-h-screen p-4">
6
- <div class="bg-white dark:bg-base-900 rounded-lg shadow-2xl max-w-{{ max_width|default:'4xl' }} w-full max-h-[80vh] flex flex-col border border-base-200 dark:border-base-700">
7
-
8
- <!-- Modal Header -->
9
- {% if title or closable %}
10
- <div class="flex items-center justify-between p-4 border-b border-base-200 dark:border-base-700 bg-base-50 dark:bg-base-800">
11
- {% if title %}
12
- <div class="flex items-center space-x-3">
13
- {% if icon %}
14
- <div class="flex items-center justify-center w-10 h-10 bg-primary-100 dark:bg-primary-900/20 rounded-lg">
15
- <span class="material-icons text-primary-600 dark:text-primary-400">{{ icon }}</span>
16
- </div>
17
- {% endif %}
18
- <div>
19
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">
20
- {{ title }}
21
- </h3>
22
- {% if subtitle %}
23
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">
24
- {{ subtitle }}
25
- </p>
26
- {% endif %}
27
- </div>
28
- </div>
29
- {% endif %}
30
-
31
- {% if closable %}
32
- <button @click="{{ close_function|default:'close' }}" class="p-2 text-font-subtle-light dark:text-font-subtle-dark hover:text-font-default-light dark:hover:text-font-default-dark hover:bg-base-100 dark:hover:bg-base-700 rounded-lg transition-colors">
33
- <span class="material-icons">close</span>
34
- </button>
35
- {% endif %}
36
- </div>
37
- {% endif %}
38
-
39
- <!-- Modal Body -->
40
- <div class="flex-1 overflow-hidden p-4">
41
- {% if scrollable %}
42
- <div class="bg-base-100 dark:bg-base-800 rounded-lg border border-base-200 dark:border-base-700 h-full overflow-y-auto p-4">
43
- {{ content }}
44
- </div>
45
- {% else %}
46
- {{ content }}
47
- {% endif %}
48
- </div>
49
-
50
- <!-- Modal Footer -->
51
- {% if footer %}
52
- <div class="flex items-center justify-between p-4 border-t border-base-200 dark:border-base-700 bg-base-50 dark:bg-base-800">
53
- {{ footer }}
54
- </div>
55
- {% endif %}
56
- </div>
57
- </div>
58
- </div>
@@ -1,20 +0,0 @@
1
- {#
2
- ⚠️ DEPRECATED: This component is deprecated.
3
-
4
- Use Unfold's built-in progress component instead:
5
- {% component "unfold/components/progress.html" with value=... title=... description=... %}
6
- {% endcomponent %}
7
-
8
- This wrapper will be removed in a future version.
9
- For now it redirects to the Unfold component for backwards compatibility.
10
- #}
11
-
12
- {% load unfold %}
13
-
14
- <!-- Wrapper for backwards compatibility - redirects to Unfold component -->
15
- {% component "unfold/components/progress.html" with
16
- value=value
17
- title=title
18
- description=description
19
- class=class %}
20
- {% endcomponent %}
@@ -1,26 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Section Header Component -->
4
- <div class="flex items-center mb-6">
5
- {% if icon %}
6
- <div class="flex items-center justify-center w-8 h-8 bg-{{ icon_color|default:'primary' }}-100 dark:bg-{{ icon_color|default:'primary' }}-900/20 rounded-lg mr-3">
7
- <span class="material-icons text-{{ icon_color|default:'primary' }}-600 dark:text-{{ icon_color|default:'primary' }}-400 text-lg">{{ icon }}</span>
8
- </div>
9
- {% endif %}
10
-
11
- <h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark">
12
- {{ title }}
13
- </h2>
14
-
15
- {% if badge %}
16
- <span class="ml-auto text-xs text-font-subtle-light dark:text-font-subtle-dark bg-base-100 dark:bg-base-800 px-2 py-1 rounded-full">
17
- {{ badge }}
18
- </span>
19
- {% endif %}
20
-
21
- {% if actions %}
22
- <div class="ml-auto flex items-center space-x-2">
23
- {{ actions }}
24
- </div>
25
- {% endif %}
26
- </div>
@@ -1,32 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Stat Item Component -->
4
- <div class="flex items-center justify-between p-3 bg-base-50 dark:bg-base-800 rounded-lg hover:bg-base-100 dark:hover:bg-base-700 transition-colors duration-150 group">
5
- <div class="flex items-center">
6
- {% if icon %}
7
- <div class="w-8 h-8 rounded-lg flex items-center justify-center mr-3 bg-{{ color|default:'primary' }}-100 dark:bg-{{ color|default:'primary' }}-900/20">
8
- <span class="material-icons text-xs text-{{ color|default:'primary' }}-600 dark:text-{{ color|default:'primary' }}-400">{{ icon }}</span>
9
- </div>
10
- {% endif %}
11
- <div>
12
- <div class="text-sm font-medium text-font-default-light dark:text-font-default-dark">{{ title }}</div>
13
- {% if description %}
14
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ description }}</div>
15
- {% endif %}
16
- </div>
17
- </div>
18
-
19
- <div class="flex items-center gap-3">
20
- <span class="inline-flex items-center px-3 py-1 rounded-full text-xs font-medium bg-{{ color|default:'primary' }}-100 dark:bg-{{ color|default:'primary' }}-900/20 text-{{ color|default:'primary' }}-600 dark:text-{{ color|default:'primary' }}-400">
21
- {{ count|default:0 }}
22
- </span>
23
-
24
- {% if url %}
25
- <a href="{{ url }}"
26
- class="inline-flex items-center gap-1 px-3 py-1 bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-600 text-white rounded-lg text-xs font-medium transition-colors duration-150 group-hover:shadow-sm">
27
- <span class="material-icons text-xs">visibility</span>
28
- <span>View</span>
29
- </a>
30
- {% endif %}
31
- </div>
32
- </div>
@@ -1,72 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Statistics Grid Component -->
4
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-{{ cols|default:'4' }} gap-{{ gap|default:'4' }} {% if class %}{{ class }}{% endif %}">
5
- {% for stat in stats %}
6
- <div class="bg-white dark:bg-base-900 rounded-lg shadow-sm hover:shadow-md transition-all duration-300 border border-base-200 dark:border-base-700 overflow-hidden group">
7
- <div class="p-5">
8
- <div class="flex items-start justify-between">
9
- <div class="flex-1">
10
- <!-- Title -->
11
- <div class="text-xs font-semibold text-font-subtle-light dark:text-font-subtle-dark uppercase tracking-wider mb-2">
12
- {{ stat.title }}
13
- </div>
14
-
15
- <!-- Value -->
16
- <div class="text-2xl font-bold text-font-important-light dark:text-font-important-dark mb-1">
17
- {{ stat.value }}
18
- </div>
19
-
20
- <!-- Change indicator -->
21
- {% if stat.change %}
22
- <div class="flex items-center">
23
- <div class="flex items-center px-2 py-1 rounded-full text-xs font-medium
24
- {% if stat.change_type == 'positive' %}bg-green-100 dark:bg-green-900/20 text-green-600 dark:text-green-400
25
- {% elif stat.change_type == 'negative' %}bg-red-100 dark:bg-red-900/20 text-red-600 dark:text-red-400
26
- {% else %}bg-base-100 dark:bg-base-800 text-font-default-light dark:text-font-default-dark{% endif %}">
27
-
28
- <span class="material-icons text-xs mr-1">
29
- {% if stat.change_type == 'positive' %}arrow_upward
30
- {% elif stat.change_type == 'negative' %}arrow_downward
31
- {% else %}remove{% endif %}
32
- </span>
33
- {{ stat.change }}
34
- </div>
35
- </div>
36
- {% endif %}
37
-
38
- <!-- Description -->
39
- {% if stat.description %}
40
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark mt-1">
41
- {{ stat.description }}
42
- </div>
43
- {% endif %}
44
- </div>
45
-
46
- <!-- Icon -->
47
- {% if stat.icon %}
48
- <div class="flex-shrink-0 ml-3">
49
- <div class="w-10 h-10 flex items-center justify-center group-hover:scale-110 transition-transform duration-300">
50
- <span class="material-icons text-2xl
51
- {% if stat.change_type == 'positive' %}text-green-600 dark:text-green-400
52
- {% elif stat.change_type == 'negative' %}text-red-600 dark:text-red-400
53
- {% else %}text-primary-600 dark:text-primary-400{% endif %}">
54
- {{ stat.icon }}
55
- </span>
56
- </div>
57
- </div>
58
- {% endif %}
59
- </div>
60
- </div>
61
-
62
- <!-- Accent bar -->
63
- {% if stat.show_accent %}
64
- <div class="h-1 w-full
65
- {% if stat.change_type == 'positive' %}bg-gradient-to-r from-green-400 to-green-600
66
- {% elif stat.change_type == 'negative' %}bg-gradient-to-r from-red-400 to-red-600
67
- {% else %}bg-gradient-to-r from-primary-400 to-primary-600{% endif %}">
68
- </div>
69
- {% endif %}
70
- </div>
71
- {% endfor %}
72
- </div>
@@ -1,28 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Status Badge Component -->
4
- <span class="status-badge inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
5
- {% if status == 'active' or status == 'healthy' or status == 'success' %}bg-green-100 dark:bg-green-900/20 text-green-600 dark:text-green-400
6
- {% elif status == 'warning' or status == 'pending' %}bg-amber-100 dark:bg-amber-900/20 text-amber-600 dark:text-amber-400
7
- {% elif status == 'error' or status == 'failed' or status == 'inactive' %}bg-red-100 dark:bg-red-900/20 text-red-600 dark:text-red-400
8
- {% elif status == 'info' or status == 'processing' %}bg-blue-100 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400
9
- {% else %}bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400{% endif %}">
10
-
11
- {% if icon %}
12
- <span class="material-icons text-xs mr-1">{{ icon }}</span>
13
- {% else %}
14
- {% if status == 'active' or status == 'healthy' or status == 'success' %}
15
- <span class="material-icons text-xs mr-1">check_circle</span>
16
- {% elif status == 'warning' or status == 'pending' %}
17
- <span class="material-icons text-xs mr-1">warning</span>
18
- {% elif status == 'error' or status == 'failed' %}
19
- <span class="material-icons text-xs mr-1">error</span>
20
- {% elif status == 'inactive' %}
21
- <span class="material-icons text-xs mr-1">cancel</span>
22
- {% elif status == 'info' or status == 'processing' %}
23
- <span class="material-icons text-xs mr-1">info</span>
24
- {% endif %}
25
- {% endif %}
26
-
27
- {{ text|default:status|title }}
28
- </span>
@@ -1,27 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- User Avatar Component -->
4
- <div class="flex items-center">
5
- <div class="h-{{ size|default:'8' }} w-{{ size|default:'8' }} bg-{{ color|default:'primary' }}-100 dark:bg-{{ color|default:'primary' }}-900/20 rounded-full flex items-center justify-center mr-3">
6
- {% if image %}
7
- <img src="{{ image }}" alt="{{ name }}" class="h-{{ size|default:'8' }} w-{{ size|default:'8' }} rounded-full object-cover">
8
- {% else %}
9
- <span class="text-sm font-medium text-{{ color|default:'primary' }}-600 dark:text-{{ color|default:'primary' }}-400">
10
- {% if name %}{{ name|slice:":1"|upper }}{% elif email %}{{ email|slice:":1"|upper }}{% else %}?{% endif %}
11
- </span>
12
- {% endif %}
13
- </div>
14
-
15
- {% if show_details %}
16
- <div>
17
- <div class="text-sm font-medium text-font-default-light dark:text-font-default-dark">
18
- {% if name %}{{ name|truncatechars:20 }}{% elif email %}{{ email|truncatechars:20 }}{% else %}Unknown User{% endif %}
19
- </div>
20
- {% if email and name %}
21
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">
22
- {{ email|truncatechars:30 }}
23
- </div>
24
- {% endif %}
25
- </div>
26
- {% endif %}
27
- </div>
@@ -1,74 +0,0 @@
1
- {% extends "admin/base_site.html" %}
2
-
3
- {% load admin_list static i18n %}
4
-
5
- {% block extrahead %}
6
- {% url 'admin:jsi18n' as jsi18nurl %}
7
- <script type="text/javascript" src="{{ jsi18nurl|default:'../../jsi18n/' }}"></script>
8
- {{ block.super }}
9
- {{ media.js }}
10
- <script type="text/javascript" src="{% static 'admin/js/constance.js' %}"></script>
11
-
12
- <!-- Constance UI Styles -->
13
- <link rel="stylesheet" href="{% static 'admin/css/constance.css' %}"}
14
- {% endblock %}
15
-
16
- {% block content %}
17
- <div id="content-main" class="constance">
18
- <div id="changelist" class="flex flex-col gap-8 w-full">
19
- <form id="changelist-form" action="" method="post" enctype="multipart/form-data" novalidate class="flex flex-col gap-8 w-full">
20
- {% csrf_token %}
21
-
22
- {% include "unfold/helpers/form_errors.html" with errors=form.non_field_errors %}
23
-
24
- {% for field in form.hidden_fields %}
25
- {{ field }}
26
- {% endfor %}
27
-
28
- <!-- Collapse/Expand All Controls -->
29
- <div class="flex justify-between items-center mb-4" x-data="{ allExpanded: true }">
30
- <div class="text-sm text-base-600 dark:text-base-400">
31
- {% trans "Configuration Settings" %}
32
- </div>
33
- <div class="flex gap-2">
34
- <button type="button"
35
- @click="allExpanded = false; $dispatch('collapse-all')"
36
- class="px-3 py-1 text-xs bg-base-100 hover:bg-base-200 dark:bg-base-800 dark:hover:bg-base-700 border border-base-300 dark:border-base-600 rounded transition-colors">
37
- {% trans "Collapse All" %}
38
- </button>
39
- <button type="button"
40
- @click="allExpanded = true; $dispatch('expand-all')"
41
- class="px-3 py-1 text-xs bg-base-100 hover:bg-base-200 dark:bg-base-800 dark:hover:bg-base-700 border border-base-300 dark:border-base-600 rounded transition-colors">
42
- {% trans "Expand All" %}
43
- </button>
44
- </div>
45
- </div>
46
-
47
- <div class="border border-base-200 rounded-default overflow-x-auto simplebar-horizontal-scrollbar-top dark:border-base-800" data-simplebar data-simplebar-auto-hide="false">
48
- <table class="w-full border-collapse">
49
- {% if fieldsets %}
50
- {% for fieldset in fieldsets %}
51
- {% with config_values=fieldset.config_values %}
52
- {% include "admin/constance/includes/results_list.html" %}
53
- {% endwith %}
54
- {% endfor %}
55
- {% else %}
56
- {% include "admin/constance/includes/results_list.html" %}
57
- {% endif %}
58
-
59
- <tfoot>
60
- <tr>
61
- <td class="border-t border-base-200 px-3 py-2 dark:border-base-800" colspan="100%">
62
- <div class="flex justify-end">
63
- {% trans "Save" as title %}
64
- {% include "unfold/helpers/submit.html" with title=title %}
65
- </div>
66
- </td>
67
- </tr>
68
- </tfoot>
69
- </table>
70
- </div>
71
- </form>
72
- </div>
73
- </div>
74
- {% endblock %}
@@ -1,24 +0,0 @@
1
- {% load i18n %}
2
-
3
- {% if item.default %}
4
- {% if item.default|length > 80 %}
5
- <!-- Long default value with smart truncation -->
6
- <div x-data="{ expanded: false }" class="constance-expandable">
7
- <div x-show="!expanded" @click="expanded = true" class="cursor-pointer hover:bg-base-50 dark:hover:bg-base-800 p-1 rounded transition-colors">
8
- {% include "unfold/helpers/label.html" with text=item.default|truncatechars:60 %}
9
- <br><small class="text-base-400 dark:text-base-500 text-xs">{% trans "Click to expand" %}</small>
10
- </div>
11
- <div x-show="expanded" @click="expanded = false" class="cursor-pointer">
12
- <div class="max-w-xs break-words whitespace-pre-wrap text-xs bg-base-100 dark:bg-base-800 p-2 rounded border border-base-200 dark:border-base-700 shadow-sm">
13
- {{ item.default }}
14
- </div>
15
- <small class="text-base-400 dark:text-base-500 text-xs">{% trans "Click to collapse" %}</small>
16
- </div>
17
- </div>
18
- {% else %}
19
- <!-- Short default value - normal display -->
20
- {% include "unfold/helpers/label.html" with text=item.default %}
21
- {% endif %}
22
- {% else %}
23
- <span class="text-base-400 dark:text-base-500">-</span>
24
- {% endif %}
@@ -1,15 +0,0 @@
1
- {% load i18n %}
2
-
3
- {% if fieldset.title %}
4
- <tr x-on:click="rowsOpen = !rowsOpen" class="cursor-pointer hover:bg-base-25 dark:hover:bg-base-900 transition-colors">
5
- <th class="bg-base-50 border-t border-base-200 font-semibold px-3 py-2 text-left text-font-important-light dark:text-font-important-dark dark:border-base-800 dark:bg-white/[.04] {% if forloop.first %}border-t-0{% endif %}" colspan="100%">
6
- <div class="flex items-center justify-between">
7
- <span>{{ fieldset.title }}</span>
8
-
9
- <span class="material-symbols-outlined select-none transition-transform duration-300 ease-in-out" title="{% trans "Toggle" %}" x-bind:class="rowsOpen ? 'rotate-180' : ''">
10
- expand_more
11
- </span>
12
- </div>
13
- </th>
14
- </tr>
15
- {% endif %}
@@ -1,16 +0,0 @@
1
- {% load admin_list static i18n %}
2
-
3
- <tbody x-data="{ rowsOpen: {% if forloop.first %}true{% else %}false{% endif %} }"
4
- @collapse-all.window="rowsOpen = false"
5
- @expand-all.window="rowsOpen = true">
6
- <!-- Fieldset Header -->
7
- {% include "admin/constance/includes/fieldset_header.html" %}
8
-
9
- <!-- Table Headers -->
10
- {% include "admin/constance/includes/table_headers.html" %}
11
-
12
- <!-- Setting Rows -->
13
- {% for item in config_values %}
14
- {% include "admin/constance/includes/setting_row.html" %}
15
- {% endfor %}
16
- </tbody>
@@ -1,50 +0,0 @@
1
- {% load i18n %}
2
-
3
- <tr class="border-t border-base-200 h-[55px] *:px-3 *:py-2 *:align-middle dark:border-base-800 hover:bg-base-25 dark:hover:bg-base-900 transition-colors" x-show="rowsOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform -translate-y-1" x-transition:enter-end="opacity-100 transform translate-y-0">
4
- <!-- Name/Description Column -->
5
- <td class="font-normal text-left align-top">
6
- <div class="text-sm text-font-default-light dark:text-font-default-dark">
7
- {{ item.help_text|linebreaksbr }}
8
- </div>
9
- </td>
10
-
11
- <!-- Value Column -->
12
- <td class="{% if item.form_field.errors %}group errors{% endif %} align-top">
13
- {{ item.form_field }}
14
- {% include "unfold/helpers/form_errors.html" with errors=item.form_field.errors %}
15
- </td>
16
-
17
- <!-- Default Value Column -->
18
- <td class="align-top">
19
- {% include "admin/constance/includes/default_value.html" %}
20
- </td>
21
-
22
- <!-- Code Column -->
23
- <td class="align-top">
24
- <a class="item-name item-anchor" href="#{{ item.name|slugify }}" tabindex="-1" id="{{ item.name|slugify }}" title="Link to this setting">
25
- {% include "unfold/helpers/label.html" with text=item.name type="info" %}
26
- </a>
27
- </td>
28
-
29
- <!-- Modified Column -->
30
- <td class="align-top text-center">
31
- {% include "unfold/helpers/boolean.html" with value=item.modified %}
32
- </td>
33
-
34
- <!-- Reset Column -->
35
- <td class="w-px align-top text-center">
36
- {% if not item.is_file %}
37
- <a href="#"
38
- tabindex="-1"
39
- class="flex items-center gap-1 reset-link whitespace-nowrap hover:bg-base-100 dark:hover:bg-base-800 p-1 rounded transition-colors"
40
- data-default="{% spaceless %}{% if item.is_checkbox %}{% if item.raw_default %} true {% else %} false {% endif %}{% elif item.is_date %}{{ item.raw_default|date:"U" }}{% elif item.is_datetime %}{{ item.raw_default|date:"U" }}{% else %}{{ item.default }}{% endif %}{% endspaceless %}"
41
- data-field-type="{% spaceless %}{% if item.is_checkbox %}checkbox{% elif item.is_datetime %}datetime{% elif item.is_date %}date{% endif %}{% endspaceless %}"
42
- data-field-id="{{ item.form_field.auto_id }}"
43
- title="{% trans "Reset to default" %}">
44
- <span class="material-symbols-outlined text-base-400 hover:text-base-700 dark:text-base-500 dark:hover:text-base-200 transition-colors">
45
- refresh
46
- </span>
47
- </a>
48
- {% endif %}
49
- </td>
50
- </tr>
@@ -1,10 +0,0 @@
1
- {% load i18n %}
2
-
3
- <tr class="{% if fieldset.title %}border-t{% endif %} border-base-200 dark:border-base-800 *:font-semibold *:px-3 *:py-2 *:text-left *:text-font-important-light dark:*:text-font-important-dark" x-show="rowsOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform -translate-y-2" x-transition:enter-end="opacity-100 transform translate-y-0">
4
- <th class="w-1/4">{% trans "Name" %}</th>
5
- <th class="w-1/3">{% trans "Value" %}</th>
6
- <th class="w-1/5">{% trans "Default" %}</th>
7
- <th class="w-1/6">{% trans "Code" %}</th>
8
- <th class="w-16">{% trans "Modified" %}</th>
9
- <th class="w-12"></th>
10
- </tr>