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,152 +0,0 @@
1
- {% load static %}
2
- <link rel="stylesheet" href="{% static 'admin/css/prose-unfold.css' %}">
3
-
4
- <!-- Documentation Section -->
5
- <div class="space-y-6" x-data="toggleSection()">
6
- {% if error %}
7
- <!-- Error State -->
8
- <div class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-default p-6">
9
- <div class="flex items-center space-x-2 text-red-600 dark:text-red-400">
10
- <span class="material-symbols-outlined">error</span>
11
- <span class="font-semibold">Error loading documentation</span>
12
- </div>
13
- <p class="mt-2 text-sm text-red-600 dark:text-red-400">{{ error }}</p>
14
- </div>
15
- {% elif commands_by_module %}
16
- <!-- Commands by App -->
17
- {% for app_key, app in commands_by_module.items %}
18
- <div class="app-block bg-gradient-to-br from-white to-base-50 dark:from-base-800 dark:to-base-900 rounded-default shadow-md border border-base-200 dark:border-base-700 overflow-hidden mb-6">
19
- <!-- App Header (Toggle) -->
20
- <div @click="toggleSection('{{ app_key }}')"
21
- class="cursor-pointer select-none p-6 border-b border-base-200 dark:border-base-700 hover:bg-base-100/50 dark:hover:bg-base-900/30 transition-all duration-200"
22
- data-app="{{ app_key }}">
23
- <div class="w-full flex items-center justify-between">
24
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark flex items-center">
25
- <div class="w-10 h-10 rounded-lg bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center mr-3">
26
- <span class="material-symbols-outlined text-primary-600 dark:text-primary-400">description</span>
27
- </div>
28
- <div>
29
- <div class="flex items-center gap-2">
30
- {{ app.display_name }}
31
- <span class="px-2 py-0.5 text-xs font-medium rounded-full bg-base-200 dark:bg-base-700 text-font-default-light dark:text-font-default-dark app-count">
32
- {{ app.commands|length }}
33
- </span>
34
- </div>
35
- </div>
36
- </h3>
37
- <span
38
- class="material-symbols-outlined text-base-400 dark:text-base-500 transition-transform duration-200 select-none"
39
- x-text="isSectionExpanded('{{ app_key }}') ? 'expand_less' : 'expand_more'"
40
- ></span>
41
- </div>
42
- </div>
43
-
44
- <!-- App Content -->
45
- <div class="app-content bg-base-50/30 dark:bg-base-900/30 p-6 space-y-4"
46
- data-app="{{ app_key }}"
47
- x-show="isSectionExpanded('{{ app_key }}')"
48
- x-cloak>
49
-
50
- <!-- Commands List -->
51
- <div class="space-y-3">
52
- {% for command in app.commands %}
53
- <div class="documentation-card bg-white dark:bg-base-900 rounded-default border border-base-200/60 dark:border-base-700/60 p-4 hover:border-base-300 dark:hover:border-base-600 transition-all duration-200">
54
- <!-- Command Header -->
55
- <div class="flex items-start justify-between mb-3">
56
- <div class="flex-1">
57
- <div class="flex items-center flex-wrap gap-2 mb-2">
58
- <code class="text-sm font-mono bg-base-100 dark:bg-base-800 px-2 py-1 rounded text-primary-600 dark:text-primary-400">
59
- python manage.py {{ command.name }}
60
- </code>
61
- {% if command.is_destructive %}
62
- <span class="text-xs bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 px-2 py-0.5 rounded">
63
- Destructive
64
- </span>
65
- {% endif %}
66
- {% if command.web_executable %}
67
- <span class="text-xs bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400 px-2 py-0.5 rounded">
68
- Web Executable
69
- </span>
70
- {% endif %}
71
- </div>
72
- <p class="text-sm text-font-default-light dark:text-font-default-dark">
73
- {{ command.help }}
74
- </p>
75
- </div>
76
- </div>
77
-
78
- <!-- Command Docstring -->
79
- {% if command.docstring %}
80
- <div class="mt-3 prose prose-unfold max-w-none text-sm">
81
- {{ command.docstring }}
82
- </div>
83
- {% endif %}
84
-
85
- <!-- Arguments -->
86
- {% if command.arguments %}
87
- <div class="mt-4 border-t border-base-200 dark:border-base-700 pt-3">
88
- <h4 class="text-xs font-semibold text-font-important-light dark:text-font-important-dark uppercase mb-2">
89
- Arguments
90
- </h4>
91
- <div class="space-y-2">
92
- {% for arg in command.arguments %}
93
- <div class="flex items-start space-x-2 text-sm">
94
- <code class="font-mono bg-base-100 dark:bg-base-800 px-2 py-0.5 rounded text-xs text-primary-600 dark:text-primary-400 whitespace-nowrap">
95
- {{ arg.options|join:", " }}
96
- </code>
97
- <div class="flex-1">
98
- <span class="text-font-default-light dark:text-font-default-dark">
99
- {{ arg.help }}
100
- </span>
101
- {% if arg.default %}
102
- <span class="text-font-subtle-light dark:text-font-subtle-dark text-xs">
103
- (default: {{ arg.default }})
104
- </span>
105
- {% endif %}
106
- {% if arg.required %}
107
- <span class="text-xs text-red-600 dark:text-red-400 ml-1">
108
- *required
109
- </span>
110
- {% endif %}
111
- </div>
112
- </div>
113
- {% endfor %}
114
- </div>
115
- </div>
116
- {% endif %}
117
- </div>
118
- {% endfor %}
119
- </div>
120
- </div>
121
- </div>
122
- {% endfor %}
123
-
124
- <!-- Summary Stats -->
125
- <div class="bg-white dark:bg-base-800 rounded-default shadow-sm border border-base-200 dark:border-base-700 p-4 mt-6">
126
- <div class="flex items-center justify-center gap-8 text-sm text-font-subtle-light dark:text-font-subtle-dark">
127
- <div class="flex items-center gap-2">
128
- <span class="material-symbols-outlined text-base">folder</span>
129
- <span>{{ total_modules }} module{{ total_modules|pluralize }}</span>
130
- </div>
131
- <div class="flex items-center gap-2">
132
- <span class="material-symbols-outlined text-base">terminal</span>
133
- <span>{{ total_commands }} command{{ total_commands|pluralize }}</span>
134
- </div>
135
- </div>
136
- </div>
137
- {% else %}
138
- <!-- Empty State -->
139
- <div class="bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700 p-12 text-center">
140
- <span class="material-symbols-outlined text-6xl text-base-400 dark:text-base-500 mb-4">inbox</span>
141
- <h3 class="text-lg font-medium text-font-important-light dark:text-font-important-dark mb-2">
142
- No Commands Found
143
- </h3>
144
- <p class="text-font-subtle-light dark:text-font-subtle-dark">
145
- No Django-CFG management commands available.
146
- </p>
147
- </div>
148
- {% endif %}
149
- </div>
150
-
151
- <!-- Load Alpine component -->
152
- <script src="{% static 'admin/js/alpine/toggle-section.js' %}"></script>
@@ -1,112 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Overview Section -->
4
- <div class="space-y-10 flex flex-col gap-8">
5
- <!-- Hero Section with Key Metrics -->
6
- <div>
7
- <div class="flex items-center justify-between mb-6">
8
- <div>
9
- <h1 class="text-2xl font-bold theme-text">{{ title|default:"System Overview" }}</h1>
10
- <p class="text-gray-600 dark:text-gray-300 mt-2">
11
- Real-time monitoring and key performance indicators
12
- </p>
13
- </div>
14
- <div class="flex items-center space-x-2 text-sm text-gray-500 dark:text-gray-400">
15
- <span class="material-icons text-green-500">fiber_manual_record</span>
16
- <span>Live data</span>
17
- </div>
18
- </div>
19
-
20
- <!-- Key Statistics Cards -->
21
- <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
22
- {% for key, value in data.stats.items %}
23
- <div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
24
- <div class="flex items-center justify-between">
25
- <div>
26
- <p class="text-sm text-gray-600 dark:text-gray-400 uppercase">{{ key }}</p>
27
- <p class="text-3xl font-bold theme-text mt-2">{{ value }}</p>
28
- </div>
29
- <span class="material-icons text-blue-500 text-4xl">{{ icon|default:"analytics" }}</span>
30
- </div>
31
- </div>
32
- {% endfor %}
33
- </div>
34
- </div>
35
-
36
- <!-- System Health & Quick Actions -->
37
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
38
- <div class="theme-card rounded-lg shadow-sm border theme-border">
39
- <div class="p-6 border-b theme-border">
40
- <h3 class="text-lg font-semibold theme-text flex items-center">
41
- <span class="material-icons text-green-500 mr-2">favorite</span>
42
- System Health
43
- </h3>
44
- </div>
45
- <div class="p-6">
46
- <div class="space-y-4">
47
- {% for key, value in data.system_health.items %}
48
- <div class="flex items-center justify-between">
49
- <span class="text-gray-700 dark:text-gray-300">{{ key|title }}</span>
50
- <span class="font-mono text-sm theme-text">{{ value }}</span>
51
- </div>
52
- {% endfor %}
53
- </div>
54
- </div>
55
- </div>
56
-
57
- <!-- Quick Actions Card -->
58
- <div class="theme-card rounded-lg border theme-border shadow-sm">
59
- <div class="p-6">
60
- {% include 'admin/snippets/components/quick_actions.html' %}
61
- </div>
62
- </div>
63
- </div>
64
-
65
- <!-- Charts & Recent Activity -->
66
- <div class="space-y-8">
67
- <!-- Charts Section -->
68
- {% include 'admin/snippets/components/charts_section.html' %}
69
-
70
- <!-- Recent Activity Stream -->
71
- <div class="theme-card rounded-lg shadow-sm border theme-border">
72
- <div class="p-6 border-b theme-border">
73
- <h3 class="text-lg font-semibold theme-text flex items-center">
74
- <span class="material-icons text-blue-600 mr-2">timeline</span>
75
- Recent Activity
76
- </h3>
77
- </div>
78
- <div class="p-6">
79
- {% include 'admin/snippets/components/recent_activity_improved.html' %}
80
- </div>
81
- </div>
82
- </div>
83
-
84
- <!-- Secondary Metrics Row -->
85
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
86
- <!-- System Metrics -->
87
- <div class="theme-card rounded-lg border theme-border shadow-sm">
88
- <div class="p-6 border-b theme-border">
89
- <h3 class="text-lg font-semibold theme-text flex items-center">
90
- <span class="material-icons text-blue-500 mr-2">memory</span>
91
- System Metrics
92
- </h3>
93
- </div>
94
- <div class="p-6">
95
- {% include 'admin/snippets/components/system_metrics.html' %}
96
- </div>
97
- </div>
98
-
99
- <!-- Activity Tracker -->
100
- <div class="theme-card rounded-lg border theme-border shadow-sm">
101
- <div class="p-6 border-b theme-border">
102
- <h3 class="text-lg font-semibold theme-text flex items-center">
103
- <span class="material-icons text-blue-600 mr-2">track_changes</span>
104
- Activity Tracker
105
- </h3>
106
- </div>
107
- <div class="p-6">
108
- {% include 'admin/snippets/components/activity_tracker.html' %}
109
- </div>
110
- </div>
111
- </div>
112
- </div>
@@ -1,35 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Statistics Section -->
4
- <div class="space-y-8">
5
- <div class="flex items-center justify-between mb-6">
6
- <div>
7
- <h1 class="text-2xl font-bold theme-text">{{ title|default:"Statistics" }}</h1>
8
- <p class="text-gray-600 dark:text-gray-300 mt-2">
9
- Detailed metrics for each application module
10
- </p>
11
- </div>
12
- </div>
13
-
14
- <!-- App Statistics -->
15
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
16
- {% for app in data.app_stats %}
17
- <div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
18
- <div class="flex items-center justify-between mb-4">
19
- <h3 class="font-semibold theme-text">{{ app.name }}</h3>
20
- <span class="material-icons text-blue-500">{{ app.icon|default:"apps" }}</span>
21
- </div>
22
- <div class="space-y-2">
23
- <div class="flex justify-between text-sm">
24
- <span class="text-gray-600 dark:text-gray-400">Label:</span>
25
- <span class="theme-text">{{ app.label }}</span>
26
- </div>
27
- <div class="flex justify-between text-sm">
28
- <span class="text-gray-600 dark:text-gray-400">Models:</span>
29
- <span class="theme-text font-mono">{{ app.models_count }}</span>
30
- </div>
31
- </div>
32
- </div>
33
- {% endfor %}
34
- </div>
35
- </div>
@@ -1,99 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- System Management Section -->
4
- <div class="space-y-8">
5
- <div class="flex items-center justify-between mb-6">
6
- <div>
7
- <h1 class="text-2xl font-bold theme-text">{{ title|default:"System Management" }}</h1>
8
- <p class="text-gray-600 dark:text-gray-300 mt-2">
9
- System health checks and configuration overview
10
- </p>
11
- </div>
12
- <div class="flex items-center space-x-2">
13
- {% if data.health.status == 'healthy' %}
14
- <span class="material-icons text-green-500">check_circle</span>
15
- <span class="text-sm text-green-600 dark:text-green-400 font-medium">Healthy</span>
16
- {% else %}
17
- <span class="material-icons text-red-500">error</span>
18
- <span class="text-sm text-red-600 dark:text-red-400 font-medium">Issues Detected</span>
19
- {% endif %}
20
- </div>
21
- </div>
22
-
23
- <!-- Health Checks Grid -->
24
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
25
- {% for check_name, check_status in data.health.checks.items %}
26
- <div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
27
- <div class="flex items-center justify-between">
28
- <div>
29
- <p class="text-sm text-gray-600 dark:text-gray-400 uppercase">{{ check_name|title }}</p>
30
- <p class="text-lg font-semibold theme-text mt-2">
31
- {% if check_status %}
32
- <span class="text-green-600 dark:text-green-400">Operational</span>
33
- {% else %}
34
- <span class="text-red-600 dark:text-red-400">Failed</span>
35
- {% endif %}
36
- </p>
37
- </div>
38
- {% if check_status %}
39
- <span class="material-icons text-green-500 text-3xl">check_circle</span>
40
- {% else %}
41
- <span class="material-icons text-red-500 text-3xl">cancel</span>
42
- {% endif %}
43
- </div>
44
- </div>
45
- {% endfor %}
46
- </div>
47
-
48
- <!-- Configuration & Services -->
49
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
50
- <!-- Configuration Card -->
51
- <div class="theme-card rounded-lg shadow-sm border theme-border">
52
- <div class="p-6 border-b theme-border">
53
- <h3 class="text-lg font-semibold theme-text flex items-center">
54
- <span class="material-icons text-blue-500 mr-2">settings</span>
55
- Configuration
56
- </h3>
57
- </div>
58
- <div class="p-6">
59
- <div class="space-y-4">
60
- {% for key, value in data.configuration.items %}
61
- <div class="flex items-center justify-between">
62
- <span class="text-gray-700 dark:text-gray-300">{{ key|title }}</span>
63
- <span class="font-mono text-sm theme-text">{{ value }}</span>
64
- </div>
65
- {% endfor %}
66
- </div>
67
- </div>
68
- </div>
69
-
70
- <!-- Services Status Card -->
71
- <div class="theme-card rounded-lg shadow-sm border theme-border">
72
- <div class="p-6 border-b theme-border">
73
- <h3 class="text-lg font-semibold theme-text flex items-center">
74
- <span class="material-icons text-purple-500 mr-2">cloud</span>
75
- Services
76
- </h3>
77
- </div>
78
- <div class="p-6">
79
- {% if data.services %}
80
- <div class="space-y-3">
81
- {% for service_name, service_status in data.services.items %}
82
- <div class="flex items-center justify-between text-sm">
83
- <span class="theme-text">{{ service_name }}</span>
84
- <div class="status-indicator">
85
- <span class="status-dot {% if service_status %}success{% else %}error{% endif %}"></span>
86
- <span class="text-gray-600 dark:text-gray-400">
87
- {% if service_status %}Active{% else %}Inactive{% endif %}
88
- </span>
89
- </div>
90
- </div>
91
- {% endfor %}
92
- </div>
93
- {% else %}
94
- <p class="text-gray-500 dark:text-gray-400 text-sm">No external services configured</p>
95
- {% endif %}
96
- </div>
97
- </div>
98
- </div>
99
- </div>
@@ -1,129 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Widgets Section -->
4
- <div class="space-y-8">
5
- <!-- Header -->
6
- <div class="flex items-center justify-between mb-6">
7
- <div>
8
- <h1 class="text-2xl font-bold theme-text flex items-center">
9
- <span class="material-icons mr-3 text-blue-500">widgets</span>
10
- {{ title|default:"Dashboard Widgets" }}
11
- </h1>
12
- <p class="text-gray-600 dark:text-gray-300 mt-2">
13
- {% if data.has_widgets %}
14
- Showing {{ data.widgets_count }} widget{{ data.widgets_count|pluralize }}
15
- {% else %}
16
- No widgets configured
17
- {% endif %}
18
- </p>
19
- </div>
20
- </div>
21
-
22
- {% if data.has_widgets %}
23
- <!-- Stats Widgets -->
24
- {% if stats_widgets %}
25
- {% for widget in stats_widgets %}
26
- <div class="theme-card rounded-lg shadow-sm border theme-border mb-6">
27
- <!-- Widget Header -->
28
- <div class="p-6 border-b theme-border">
29
- <h2 class="text-lg font-semibold theme-text flex items-center">
30
- <span class="material-icons text-blue-500 mr-2">dashboard</span>
31
- {{ widget.title }}
32
- </h2>
33
- </div>
34
-
35
- <!-- Widget Content: Stats Cards -->
36
- <div class="p-6">
37
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
38
- {% for card in widget.cards %}
39
- <div class="theme-card p-6 rounded-lg shadow-sm border theme-border">
40
- <div class="flex items-start justify-between mb-4">
41
- <div class="flex-1">
42
- <p class="text-sm text-gray-600 dark:text-gray-400 mb-2">
43
- {{ card.title }}
44
- </p>
45
- <p class="text-2xl font-bold theme-text">
46
- {{ card.value_template }}
47
- </p>
48
- </div>
49
- {% if card.icon %}
50
- <span class="material-icons text-{{ card.color }}-500 text-3xl">
51
- {{ card.icon }}
52
- </span>
53
- {% endif %}
54
- </div>
55
-
56
- {% if card.description %}
57
- <p class="text-xs text-gray-500 dark:text-gray-400 mt-2">
58
- {{ card.description }}
59
- </p>
60
- {% endif %}
61
-
62
- {% if card.change %}
63
- <div class="mt-3 flex items-center">
64
- <span class="text-xs px-2 py-1 rounded
65
- {% if card.change_type == 'positive' %}
66
- bg-green-100 text-green-700 dark:bg-green-900/20 dark:text-green-400
67
- {% elif card.change_type == 'negative' %}
68
- bg-red-100 text-red-700 dark:bg-red-900/20 dark:text-red-400
69
- {% else %}
70
- bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-400
71
- {% endif %}
72
- ">
73
- {{ card.change }}
74
- </span>
75
- </div>
76
- {% endif %}
77
- </div>
78
- {% endfor %}
79
- </div>
80
- </div>
81
- </div>
82
- {% endfor %}
83
- {% endif %}
84
-
85
- <!-- Chart Widgets (if any) -->
86
- {% if chart_widgets %}
87
- {% for widget in chart_widgets %}
88
- <div class="theme-card rounded-lg shadow-sm border theme-border p-6 mb-6">
89
- <h2 class="text-lg font-semibold theme-text mb-4">
90
- {{ widget.title }}
91
- </h2>
92
- <!-- Chart rendering would go here -->
93
- <div class="h-64 flex items-center justify-center text-gray-400">
94
- Chart widget rendering (TODO)
95
- </div>
96
- </div>
97
- {% endfor %}
98
- {% endif %}
99
-
100
- <!-- Custom Widgets (if any) -->
101
- {% if custom_widgets %}
102
- {% for widget in custom_widgets %}
103
- <div class="theme-card rounded-lg shadow-sm border theme-border p-6 mb-6">
104
- <h2 class="text-lg font-semibold theme-text mb-4">
105
- {{ widget.title }}
106
- </h2>
107
- <!-- Custom widget rendering -->
108
- <div class="text-gray-600 dark:text-gray-300">
109
- Custom widget type: {{ widget.type }}
110
- </div>
111
- </div>
112
- {% endfor %}
113
- {% endif %}
114
-
115
- {% else %}
116
- <!-- No Widgets State -->
117
- <div class="theme-card rounded-lg shadow-sm border theme-border p-12 text-center">
118
- <span class="material-icons text-gray-300 dark:text-gray-600 text-6xl mb-4">
119
- widgets
120
- </span>
121
- <h3 class="text-lg font-semibold text-gray-600 dark:text-gray-400 mb-2">
122
- No Widgets Configured
123
- </h3>
124
- <p class="text-sm text-gray-500 dark:text-gray-500">
125
- Widgets can be added in DashboardManager.get_widgets_config()
126
- </p>
127
- </div>
128
- {% endif %}
129
- </div>
@@ -1,70 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Activity Tracker -->
4
- <div class="space-y-4">
5
- <!-- Legend -->
6
- <div class="flex items-center justify-between text-sm text-gray-600 dark:text-gray-400">
7
- <span>Less</span>
8
- <div class="flex items-center space-x-1">
9
- <div class="w-3 h-3 bg-gray-200 dark:bg-gray-700 rounded-sm"></div>
10
- <div class="w-3 h-3 bg-green-200 dark:bg-green-800 rounded-sm"></div>
11
- <div class="w-3 h-3 bg-green-400 dark:bg-green-600 rounded-sm"></div>
12
- <div class="w-3 h-3 bg-green-600 dark:bg-green-500 rounded-sm"></div>
13
- <div class="w-3 h-3 bg-green-800 dark:bg-green-400 rounded-sm"></div>
14
- </div>
15
- <span>More</span>
16
- </div>
17
-
18
- <!-- Activity Tracker Grid -->
19
- {% if activity_tracker %}
20
- <div class="overflow-x-auto pb-2" x-data='activityTracker({{ activity_tracker|safe }})'>
21
- {% else %}
22
- <div class="overflow-x-auto pb-2" x-data='activityTracker([])'>
23
- {% endif %}
24
- <template x-if="hasData">
25
- <!-- GitHub-style heatmap visualization -->
26
- <div class="inline-flex gap-1">
27
- <template x-for="(week, weekIndex) in weeks" :key="weekIndex">
28
- <div class="flex flex-col gap-1">
29
- <template x-for="(day, dayIndex) in week" :key="dayIndex">
30
- <div
31
- class="w-3 h-3 rounded-sm transition-all hover:ring-2 hover:ring-blue-400 cursor-pointer"
32
- :class="getCellColor(day.count)"
33
- :title="getCellTitle(day)"
34
- ></div>
35
- </template>
36
- </div>
37
- </template>
38
- </div>
39
- </template>
40
-
41
- <template x-if="!hasData">
42
- <div class="flex items-center justify-center p-8 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
43
- <div class="text-center">
44
- <span class="material-icons text-4xl text-gray-400 dark:text-gray-500 mb-2">timeline</span>
45
- <p class="text-gray-600 dark:text-gray-400">No activity data available</p>
46
- </div>
47
- </div>
48
- </template>
49
- </div>
50
-
51
- <!-- Load Alpine component -->
52
- {% load static %}
53
- <script src="{% static 'admin/js/alpine/activity-tracker.js' %}"></script>
54
-
55
- <!-- Summary Stats -->
56
- <div class="grid grid-cols-3 gap-4 pt-4 border-t border-gray-200 dark:border-gray-700">
57
- <div class="text-center">
58
- <div class="text-lg font-semibold text-gray-900 dark:text-gray-100">365</div>
59
- <div class="text-xs text-gray-600 dark:text-gray-400">Days tracked</div>
60
- </div>
61
- <div class="text-center">
62
- <div class="text-lg font-semibold text-green-600 dark:text-green-400">52</div>
63
- <div class="text-xs text-gray-600 dark:text-gray-400">Weeks</div>
64
- </div>
65
- <div class="text-center">
66
- <div class="text-lg font-semibold text-blue-600 dark:text-blue-400">{{ activity_tracker|length|default:0 }}</div>
67
- <div class="text-xs text-gray-600 dark:text-gray-400">Data points</div>
68
- </div>
69
- </div>
70
- </div>