django-cfg 1.4.88__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 (146) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/centrifugo/views/__init__.py +0 -2
  3. django_cfg/apps/dashboard/services/__init__.py +2 -0
  4. django_cfg/apps/dashboard/services/overview_service.py +205 -0
  5. django_cfg/apps/frontend/test_routing.py +134 -0
  6. django_cfg/apps/frontend/views.py +69 -28
  7. django_cfg/apps/urls.py +0 -1
  8. django_cfg/core/builders/apps_builder.py +0 -58
  9. django_cfg/modules/django_unfold/__init__.py +5 -24
  10. django_cfg/modules/django_unfold/models/__init__.py +0 -23
  11. django_cfg/modules/django_unfold/models/config.py +11 -65
  12. django_cfg/modules/django_unfold/{dashboard.py → navigation.py} +21 -152
  13. django_cfg/modules/django_unfold/tailwind.py +2 -4
  14. django_cfg/pyproject.toml +1 -1
  15. django_cfg/registry/third_party.py +0 -9
  16. django_cfg/routing/callbacks.py +1 -43
  17. django_cfg/static/frontend/admin/404/index.html +1 -1
  18. django_cfg/static/frontend/admin/404.html +1 -1
  19. django_cfg/static/frontend/admin/500/index.html +1 -1
  20. django_cfg/static/frontend/admin/_next/static/{D_d9HRw5Yn7BRHAX5q89_ → 0sN9ktsgXH48ygtGSrhfu}/_buildManifest.js +1 -1
  21. django_cfg/static/frontend/admin/_next/static/chunks/50314-9443faa6df24aebf.js +1 -0
  22. django_cfg/static/frontend/admin/_next/static/chunks/pages/{_app-1c0fff0f59a6d683.js → _app-c7dcd3aa616fab68.js} +1 -1
  23. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/{centrifugo-44a8313fa040e9ad.js → centrifugo-f9ecbc3ae0052a03.js} +1 -1
  24. django_cfg/static/frontend/admin/auth/index.html +1 -1
  25. django_cfg/static/frontend/admin/index.html +1 -1
  26. django_cfg/static/frontend/admin/legal/cookies/index.html +1 -1
  27. django_cfg/static/frontend/admin/legal/privacy/index.html +1 -1
  28. django_cfg/static/frontend/admin/legal/security/index.html +1 -1
  29. django_cfg/static/frontend/admin/legal/terms/index.html +1 -1
  30. django_cfg/static/frontend/admin/private/centrifugo/index.html +1 -1
  31. django_cfg/static/frontend/admin/private/index.html +1 -1
  32. django_cfg/static/frontend/admin/private/profile/index.html +1 -1
  33. django_cfg/static/frontend/admin/private/ui/index.html +2 -2
  34. {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/METADATA +1 -1
  35. {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/RECORD +39 -143
  36. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/css/dashboard.css +0 -260
  37. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/live_channels.mjs +0 -313
  38. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/live_testing.mjs +0 -803
  39. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/main.mjs +0 -341
  40. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/overview.mjs +0 -432
  41. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/testing.mjs +0 -33
  42. django_cfg/apps/centrifugo/static/django_cfg_centrifugo/js/dashboard/websocket.mjs +0 -210
  43. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/channels_content.html +0 -46
  44. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/live_channels_content.html +0 -123
  45. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/overview_content.html +0 -45
  46. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/publishes_content.html +0 -84
  47. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/stat_cards.html +0 -53
  48. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/system_status.html +0 -91
  49. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/tab_navigation.html +0 -29
  50. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/components/testing_tools.html +0 -415
  51. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/layout/base.html +0 -61
  52. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/pages/dashboard.html +0 -58
  53. django_cfg/apps/centrifugo/templates/django_cfg_centrifugo/tags/connection_script.html +0 -48
  54. django_cfg/apps/centrifugo/templatetags/__init__.py +0 -1
  55. django_cfg/apps/centrifugo/templatetags/centrifugo_tags.py +0 -81
  56. django_cfg/apps/centrifugo/urls_admin.py +0 -20
  57. django_cfg/apps/centrifugo/views/dashboard.py +0 -28
  58. django_cfg/modules/django_dashboard/__init__.py +0 -23
  59. django_cfg/modules/django_dashboard/components.py +0 -312
  60. django_cfg/modules/django_dashboard/debug.py +0 -174
  61. django_cfg/modules/django_dashboard/management/__init__.py +0 -0
  62. django_cfg/modules/django_dashboard/management/commands/__init__.py +0 -0
  63. django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +0 -109
  64. django_cfg/modules/django_dashboard/sections/__init__.py +0 -1
  65. django_cfg/modules/django_dashboard/sections/base.py +0 -129
  66. django_cfg/modules/django_dashboard/sections/commands.py +0 -33
  67. django_cfg/modules/django_dashboard/sections/documentation.py +0 -393
  68. django_cfg/modules/django_dashboard/sections/overview.py +0 -398
  69. django_cfg/modules/django_dashboard/sections/stats.py +0 -48
  70. django_cfg/modules/django_dashboard/sections/system.py +0 -74
  71. django_cfg/modules/django_dashboard/sections/widgets.py +0 -222
  72. django_cfg/modules/django_unfold/callbacks/__init__.py +0 -9
  73. django_cfg/modules/django_unfold/callbacks/actions.py +0 -51
  74. django_cfg/modules/django_unfold/callbacks/apizones.py +0 -122
  75. django_cfg/modules/django_unfold/callbacks/base.py +0 -290
  76. django_cfg/modules/django_unfold/callbacks/charts.py +0 -223
  77. django_cfg/modules/django_unfold/callbacks/commands.py +0 -40
  78. django_cfg/modules/django_unfold/callbacks/main.py +0 -322
  79. django_cfg/modules/django_unfold/callbacks/statistics.py +0 -240
  80. django_cfg/modules/django_unfold/callbacks/system.py +0 -180
  81. django_cfg/modules/django_unfold/callbacks/users.py +0 -65
  82. django_cfg/modules/django_unfold/models/dashboard.py +0 -207
  83. django_cfg/modules/django_unfold/models/tabs.py +0 -26
  84. django_cfg/modules/django_unfold/models.py +0 -98
  85. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +0 -102
  86. django_cfg/static/frontend/admin/_next/static/chunks/50314-5ec79b293c2283dd.js +0 -1
  87. django_cfg/templates/admin/sections/commands_section.html +0 -5
  88. django_cfg/templates/admin/sections/documentation_section.html +0 -5
  89. django_cfg/templates/admin/sections/overview_section.html +0 -5
  90. django_cfg/templates/admin/sections/stats_section.html +0 -5
  91. django_cfg/templates/admin/sections/system_section.html +0 -5
  92. django_cfg/templates/admin/sections/widgets_section.html +0 -11
  93. django_cfg/templates/admin_old/components/action_grid.html +0 -49
  94. django_cfg/templates/admin_old/components/card.html +0 -50
  95. django_cfg/templates/admin_old/components/data_table.html +0 -67
  96. django_cfg/templates/admin_old/components/metric_card.html +0 -39
  97. django_cfg/templates/admin_old/components/modal.html +0 -58
  98. django_cfg/templates/admin_old/components/progress_bar.html +0 -20
  99. django_cfg/templates/admin_old/components/section_header.html +0 -26
  100. django_cfg/templates/admin_old/components/stat_item.html +0 -32
  101. django_cfg/templates/admin_old/components/stats_grid.html +0 -72
  102. django_cfg/templates/admin_old/components/status_badge.html +0 -28
  103. django_cfg/templates/admin_old/components/user_avatar.html +0 -27
  104. django_cfg/templates/admin_old/constance/change_list.html +0 -74
  105. django_cfg/templates/admin_old/constance/includes/default_value.html +0 -24
  106. django_cfg/templates/admin_old/constance/includes/fieldset_header.html +0 -15
  107. django_cfg/templates/admin_old/constance/includes/results_list.html +0 -16
  108. django_cfg/templates/admin_old/constance/includes/setting_row.html +0 -50
  109. django_cfg/templates/admin_old/constance/includes/table_headers.html +0 -10
  110. django_cfg/templates/admin_old/examples/component_class_example.html +0 -156
  111. django_cfg/templates/admin_old/import_export/change_list_export.html +0 -24
  112. django_cfg/templates/admin_old/import_export/change_list_import.html +0 -24
  113. django_cfg/templates/admin_old/import_export/change_list_import_export.html +0 -34
  114. django_cfg/templates/admin_old/index.html +0 -80
  115. django_cfg/templates/admin_old/index_new.html +0 -119
  116. django_cfg/templates/admin_old/layouts/base_dashboard.html +0 -62
  117. django_cfg/templates/admin_old/layouts/dashboard_with_tabs.html +0 -176
  118. django_cfg/templates/admin_old/sections/commands_section.html +0 -549
  119. django_cfg/templates/admin_old/sections/documentation_section.html +0 -152
  120. django_cfg/templates/admin_old/sections/overview_section.html +0 -112
  121. django_cfg/templates/admin_old/sections/stats_section.html +0 -35
  122. django_cfg/templates/admin_old/sections/system_section.html +0 -99
  123. django_cfg/templates/admin_old/sections/widgets_section.html +0 -129
  124. django_cfg/templates/admin_old/snippets/components/activity_tracker.html +0 -70
  125. django_cfg/templates/admin_old/snippets/components/charts_section.html +0 -113
  126. django_cfg/templates/admin_old/snippets/components/django_commands.html +0 -270
  127. django_cfg/templates/admin_old/snippets/components/quick_actions.html +0 -66
  128. django_cfg/templates/admin_old/snippets/components/recent_activity_improved.html +0 -25
  129. django_cfg/templates/admin_old/snippets/components/recent_users_table.html +0 -102
  130. django_cfg/templates/admin_old/snippets/components/stats_cards.html +0 -4
  131. django_cfg/templates/admin_old/snippets/components/stats_tiles.html +0 -92
  132. django_cfg/templates/admin_old/snippets/components/system_health.html +0 -22
  133. django_cfg/templates/admin_old/snippets/components/system_metrics.html +0 -199
  134. django_cfg/templates/admin_old/snippets/components/user_permissions.html +0 -57
  135. django_cfg/templates/admin_old/snippets/tabs/app_stats_tab.html +0 -201
  136. django_cfg/templates/admin_old/snippets/tabs/commands_tab.html +0 -114
  137. django_cfg/templates/admin_old/snippets/tabs/documentation_tab.html +0 -42
  138. django_cfg/templates/admin_old/snippets/tabs/overview_tab.html +0 -116
  139. django_cfg/templates/admin_old/snippets/tabs/stats_tab.html +0 -89
  140. django_cfg/templates/admin_old/snippets/tabs/users_tab.html +0 -51
  141. django_cfg/templates/admin_old/snippets/tabs/widgets_tab.html +0 -38
  142. django_cfg/templates/admin_old/snippets/zones/zones_table.html +0 -176
  143. /django_cfg/static/frontend/admin/_next/static/{D_d9HRw5Yn7BRHAX5q89_ → 0sN9ktsgXH48ygtGSrhfu}/_ssgManifest.js +0 -0
  144. {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/WHEEL +0 -0
  145. {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/entry_points.txt +0 -0
  146. {django_cfg-1.4.88.dist-info → django_cfg-1.4.89.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +0,0 @@
1
- {% comment %}
2
- Commands Section - Legacy Template
3
- Dashboard is now rendered by Next.js in the iframe.
4
- {% endcomment %}
5
- <div class="hidden"></div>
@@ -1,5 +0,0 @@
1
- {% comment %}
2
- Documentation Section - Legacy Template
3
- Dashboard is now rendered by Next.js in the iframe.
4
- {% endcomment %}
5
- <div class="hidden"></div>
@@ -1,5 +0,0 @@
1
- {% comment %}
2
- Overview Section - Legacy Template
3
- Dashboard is now rendered by Next.js in the iframe.
4
- {% endcomment %}
5
- <div class="hidden"></div>
@@ -1,5 +0,0 @@
1
- {% comment %}
2
- Stats Section - Legacy Template
3
- Dashboard is now rendered by Next.js in the iframe.
4
- {% endcomment %}
5
- <div class="hidden"></div>
@@ -1,5 +0,0 @@
1
- {% comment %}
2
- System Section - Legacy Template
3
- Dashboard is now rendered by Next.js in the iframe.
4
- {% endcomment %}
5
- <div class="hidden"></div>
@@ -1,11 +0,0 @@
1
- {% comment %}
2
- Widgets Section - Legacy Template
3
- This template is kept for backward compatibility with django_dashboard callbacks.
4
- The actual dashboard is now rendered by Next.js in the iframe.
5
- {% endcomment %}
6
-
7
- <!-- Empty section - widgets are rendered in Next.js iframe -->
8
- <div class="hidden">
9
- <!-- This section is intentionally empty -->
10
- <!-- Dashboard widgets are now rendered by Next.js Admin Panel -->
11
- </div>
@@ -1,49 +0,0 @@
1
- {% load unfold %}
2
-
3
- <!-- Action Grid Component -->
4
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
5
- {% for action in actions %}
6
- <a href="{{ action.link }}"
7
- class="group flex items-center p-4 theme-card rounded-lg border theme-border hover:border-blue-600 dark:hover:border-blue-500 hover:shadow-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
8
-
9
- <!-- Icon -->
10
- <div class="flex-shrink-0 mr-4">
11
- <div class="p-2 rounded-lg transition-colors duration-200
12
- {% if action.color == 'primary' %}bg-blue-100 dark:bg-blue-900/20 group-hover:bg-blue-200 dark:group-hover:bg-blue-800/30
13
- {% elif action.color == 'success' %}bg-green-100 dark:bg-green-900/20 group-hover:bg-green-200 dark:group-hover:bg-green-800/30
14
- {% elif action.color == 'warning' %}bg-amber-100 dark:bg-amber-900/20 group-hover:bg-amber-200 dark:group-hover:bg-amber-800/30
15
- {% elif action.color == 'danger' %}bg-red-100 dark:bg-red-900/20 group-hover:bg-red-200 dark:group-hover:bg-red-800/30
16
- {% else %}bg-gray-100 dark:bg-gray-800 group-hover:bg-gray-200 dark:group-hover:bg-gray-700{% endif %}">
17
-
18
- <span class="material-icons text-lg
19
- {% if action.color == 'primary' %}text-blue-600 dark:text-blue-400
20
- {% elif action.color == 'success' %}text-green-600 dark:text-green-400
21
- {% elif action.color == 'warning' %}text-amber-600 dark:text-amber-400
22
- {% elif action.color == 'danger' %}text-red-600 dark:text-red-400
23
- {% else %}text-gray-600 dark:text-gray-400{% endif %}">
24
- {{ action.icon }}
25
- </span>
26
- </div>
27
- </div>
28
-
29
- <!-- Content -->
30
- <div class="flex-1 min-w-0">
31
- <h3 class="text-sm font-medium theme-text group-hover:text-blue-600 dark:group-hover:text-blue-500 transition-colors duration-200">
32
- {{ action.title }}
33
- </h3>
34
- {% if action.description %}
35
- <p class="text-xs text-gray-500 dark:text-gray-400 mt-1 line-clamp-2">
36
- {{ action.description }}
37
- </p>
38
- {% endif %}
39
- </div>
40
-
41
- <!-- Arrow -->
42
- <div class="flex-shrink-0 ml-2">
43
- <span class="material-icons text-gray-400 dark:text-gray-500 group-hover:text-blue-600 dark:group-hover:text-blue-500 transition-colors duration-200">
44
- arrow_forward
45
- </span>
46
- </div>
47
- </a>
48
- {% endfor %}
49
- </div>
@@ -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 %}