django-cfg 1.3.7__py3-none-any.whl → 1.3.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +269 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +183 -460
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +153 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  48. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  49. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  50. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  51. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  52. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  53. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  54. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +43 -17
  55. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  56. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  57. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +109 -63
  58. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  59. django_cfg/apps/payments/config/__init__.py +14 -15
  60. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  61. django_cfg/apps/payments/config/helpers.py +8 -13
  62. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  63. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  64. django_cfg/apps/payments/middleware/api_access.py +32 -6
  65. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  66. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  67. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  68. django_cfg/apps/payments/models/balance.py +12 -0
  69. django_cfg/apps/payments/models/currencies.py +106 -32
  70. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  71. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  72. django_cfg/apps/payments/models/payments.py +94 -0
  73. django_cfg/apps/payments/services/core/base.py +4 -4
  74. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  75. django_cfg/apps/payments/services/core/payment_service.py +266 -39
  76. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  77. django_cfg/apps/payments/services/providers/base.py +303 -41
  78. django_cfg/apps/payments/services/providers/models/__init__.py +42 -0
  79. django_cfg/apps/payments/services/providers/models/base.py +145 -0
  80. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  81. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  82. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  83. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  84. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  85. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  86. django_cfg/apps/payments/services/providers/nowpayments/provider.py +557 -0
  87. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  88. django_cfg/apps/payments/services/providers/registry.py +9 -37
  89. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  90. django_cfg/apps/payments/services/types/requests.py +19 -7
  91. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  92. django_cfg/apps/payments/static/payments/js/api-client.js +29 -6
  93. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  94. django_cfg/apps/payments/static/payments/js/payment-form.js +98 -32
  95. django_cfg/apps/payments/tasks/__init__.py +39 -0
  96. django_cfg/apps/payments/tasks/types.py +73 -0
  97. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  98. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  99. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  100. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  101. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  102. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  103. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  104. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  105. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  106. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  107. django_cfg/apps/payments/urls.py +3 -2
  108. django_cfg/apps/payments/urls_admin.py +1 -1
  109. django_cfg/apps/payments/views/api/currencies.py +8 -5
  110. django_cfg/apps/payments/views/overview/services.py +2 -2
  111. django_cfg/apps/payments/views/serializers/currencies.py +22 -8
  112. django_cfg/apps/support/admin/__init__.py +10 -1
  113. django_cfg/apps/support/admin/support_admin.py +338 -141
  114. django_cfg/apps/tasks/admin/__init__.py +11 -0
  115. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  116. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  117. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  118. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  119. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  120. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  121. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  122. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  123. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  124. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  125. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  126. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  127. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  128. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  129. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  130. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  131. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  132. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  133. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  134. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  135. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  136. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  137. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  138. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  139. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  140. django_cfg/apps/tasks/urls.py +2 -2
  141. django_cfg/apps/tasks/urls_admin.py +2 -2
  142. django_cfg/apps/tasks/utils/__init__.py +1 -0
  143. django_cfg/apps/tasks/utils/simulator.py +356 -0
  144. django_cfg/apps/tasks/views/__init__.py +16 -0
  145. django_cfg/apps/tasks/views/api.py +569 -0
  146. django_cfg/apps/tasks/views/dashboard.py +58 -0
  147. django_cfg/config.py +1 -1
  148. django_cfg/core/config.py +10 -5
  149. django_cfg/core/generation.py +1 -1
  150. django_cfg/core/integration/__init__.py +21 -0
  151. django_cfg/management/commands/__init__.py +13 -1
  152. django_cfg/management/commands/migrate_all.py +9 -3
  153. django_cfg/management/commands/migrator.py +11 -6
  154. django_cfg/management/commands/rundramatiq.py +3 -2
  155. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  156. django_cfg/middleware/__init__.py +0 -2
  157. django_cfg/models/api_keys.py +115 -0
  158. django_cfg/models/constance.py +0 -11
  159. django_cfg/models/payments.py +137 -3
  160. django_cfg/modules/django_admin/__init__.py +64 -0
  161. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  162. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  163. django_cfg/modules/django_admin/decorators/display.py +106 -0
  164. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  165. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  166. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  167. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  168. django_cfg/modules/django_admin/models/__init__.py +20 -0
  169. django_cfg/modules/django_admin/models/action_models.py +33 -0
  170. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  171. django_cfg/modules/django_admin/models/base.py +26 -0
  172. django_cfg/modules/django_admin/models/display_models.py +31 -0
  173. django_cfg/modules/django_admin/utils/badges.py +159 -0
  174. django_cfg/modules/django_admin/utils/displays.py +247 -0
  175. django_cfg/modules/django_currency/__init__.py +2 -2
  176. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  177. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  178. django_cfg/modules/django_currency/core/converter.py +12 -12
  179. django_cfg/modules/django_currency/database/__init__.py +2 -2
  180. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  181. django_cfg/modules/django_llm/llm/client.py +10 -2
  182. django_cfg/modules/django_tasks.py +54 -21
  183. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  184. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  185. django_cfg/modules/django_unfold/dashboard.py +14 -13
  186. django_cfg/modules/django_unfold/models/config.py +1 -1
  187. django_cfg/registry/core.py +7 -9
  188. django_cfg/registry/third_party.py +2 -2
  189. django_cfg/template_archive/django_sample.zip +0 -0
  190. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -1
  191. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/RECORD +198 -160
  192. django_cfg/apps/accounts/admin/activity.py +0 -96
  193. django_cfg/apps/accounts/admin/group.py +0 -17
  194. django_cfg/apps/accounts/admin/otp.py +0 -59
  195. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  196. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  197. django_cfg/apps/accounts/admin/user.py +0 -300
  198. django_cfg/apps/agents/core/agent.py +0 -281
  199. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  200. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  201. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  202. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  203. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  204. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  205. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  206. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  207. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  208. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  209. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  210. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  211. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  212. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  213. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  214. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  215. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  216. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  217. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  218. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  219. django_cfg/apps/payments/config/constance/fields.py +0 -69
  220. django_cfg/apps/payments/config/constance/settings.py +0 -160
  221. django_cfg/apps/payments/services/providers/nowpayments.py +0 -478
  222. django_cfg/apps/tasks/admin.py +0 -320
  223. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  224. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  225. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  226. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  227. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  228. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  229. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  230. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  231. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  232. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  233. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  234. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  235. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  236. django_cfg/apps/tasks/views.py +0 -461
  237. django_cfg/management/commands/auto_generate.py +0 -486
  238. django_cfg/middleware/static_nocache.py +0 -55
  239. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  240. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  241. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  242. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  243. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  244. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
  245. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
  246. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/licenses/LICENSE +0 -0
@@ -1,452 +0,0 @@
1
- /**
2
- * Modal System for Dashboard
3
- * Handles modal dialogs and interactive components
4
- */
5
-
6
- class ModalSystem {
7
- constructor() {
8
- this.activeModal = null;
9
- this.init();
10
- }
11
-
12
- /**
13
- * Initialize modal system
14
- */
15
- init() {
16
- this.createModalContainer();
17
- this.setupEventListeners();
18
- }
19
-
20
- /**
21
- * Create modal container
22
- */
23
- createModalContainer() {
24
- if (document.getElementById('modal-container')) return;
25
-
26
- const container = document.createElement('div');
27
- container.id = 'modal-container';
28
- container.className = 'fixed inset-0 z-50 hidden';
29
- document.body.appendChild(container);
30
- }
31
-
32
- /**
33
- * Setup event listeners
34
- */
35
- setupEventListeners() {
36
- // Close modal on escape key
37
- document.addEventListener('keydown', (e) => {
38
- if (e.key === 'Escape' && this.activeModal) {
39
- this.closeModal();
40
- }
41
- });
42
- }
43
-
44
- /**
45
- * Show confirmation modal
46
- * @param {Object} options - Modal options
47
- * @returns {Promise<boolean>} User confirmation
48
- */
49
- showConfirmation(options = {}) {
50
- const {
51
- title = 'Confirm Action',
52
- message = 'Are you sure you want to proceed?',
53
- confirmText = 'Confirm',
54
- cancelText = 'Cancel',
55
- type = 'warning' // warning, danger, info
56
- } = options;
57
-
58
- return new Promise((resolve) => {
59
- const modal = this.createConfirmationModal({
60
- title,
61
- message,
62
- confirmText,
63
- cancelText,
64
- type,
65
- onConfirm: () => {
66
- this.closeModal();
67
- resolve(true);
68
- },
69
- onCancel: () => {
70
- this.closeModal();
71
- resolve(false);
72
- }
73
- });
74
-
75
- this.showModal(modal);
76
- });
77
- }
78
-
79
- /**
80
- * Show info modal
81
- * @param {Object} options - Modal options
82
- */
83
- showInfo(options = {}) {
84
- const {
85
- title = 'Information',
86
- message = '',
87
- okText = 'OK'
88
- } = options;
89
-
90
- return new Promise((resolve) => {
91
- const modal = this.createInfoModal({
92
- title,
93
- message,
94
- okText,
95
- onOk: () => {
96
- this.closeModal();
97
- resolve();
98
- }
99
- });
100
-
101
- this.showModal(modal);
102
- });
103
- }
104
-
105
- /**
106
- * Show worker configuration modal
107
- * @returns {Promise<Object|null>} Worker configuration or null if cancelled
108
- */
109
- showWorkerConfig() {
110
- return new Promise((resolve) => {
111
- const modal = this.createWorkerConfigModal({
112
- onSave: (config) => {
113
- this.closeModal();
114
- resolve(config);
115
- },
116
- onCancel: () => {
117
- this.closeModal();
118
- resolve(null);
119
- }
120
- });
121
-
122
- this.showModal(modal);
123
- });
124
- }
125
-
126
- /**
127
- * Create confirmation modal
128
- * @param {Object} options - Modal options
129
- * @returns {HTMLElement} Modal element
130
- */
131
- createConfirmationModal(options) {
132
- const { title, message, confirmText, cancelText, type, onConfirm, onCancel } = options;
133
-
134
- const iconClass = {
135
- warning: 'text-yellow-600',
136
- danger: 'text-red-600',
137
- info: 'text-blue-600'
138
- }[type] || 'text-yellow-600';
139
-
140
- const iconName = {
141
- warning: 'warning',
142
- danger: 'error',
143
- info: 'info'
144
- }[type] || 'warning';
145
-
146
- const confirmButtonClass = {
147
- warning: 'bg-yellow-600 hover:bg-yellow-700',
148
- danger: 'bg-red-600 hover:bg-red-700',
149
- info: 'bg-blue-600 hover:bg-blue-700'
150
- }[type] || 'bg-yellow-600 hover:bg-yellow-700';
151
-
152
- const modal = document.createElement('div');
153
- modal.innerHTML = `
154
- <div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4">
155
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-xl max-w-md w-full">
156
- <div class="p-6">
157
- <div class="flex items-center mb-4">
158
- <span class="material-icons text-3xl ${iconClass} mr-3">${iconName}</span>
159
- <h3 class="text-lg font-semibold text-gray-900 dark:text-white">${title}</h3>
160
- </div>
161
- <p class="text-gray-600 dark:text-gray-300 mb-6">${message}</p>
162
- <div class="flex space-x-3 justify-end">
163
- <button class="cancel-btn px-4 py-2 text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-lg transition-colors">
164
- ${cancelText}
165
- </button>
166
- <button class="confirm-btn px-4 py-2 text-white ${confirmButtonClass} rounded-lg transition-colors">
167
- ${confirmText}
168
- </button>
169
- </div>
170
- </div>
171
- </div>
172
- </div>
173
- `;
174
-
175
- // Add event listeners
176
- modal.querySelector('.confirm-btn').addEventListener('click', onConfirm);
177
- modal.querySelector('.cancel-btn').addEventListener('click', onCancel);
178
-
179
- // Close on backdrop click
180
- modal.addEventListener('click', (e) => {
181
- if (e.target === modal.firstElementChild) {
182
- onCancel();
183
- }
184
- });
185
-
186
- return modal;
187
- }
188
-
189
- /**
190
- * Create info modal
191
- * @param {Object} options - Modal options
192
- * @returns {HTMLElement} Modal element
193
- */
194
- createInfoModal(options) {
195
- const { title, message, okText, onOk } = options;
196
-
197
- const modal = document.createElement('div');
198
- modal.innerHTML = `
199
- <div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4">
200
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-xl max-w-md w-full">
201
- <div class="p-6">
202
- <div class="flex items-center mb-4">
203
- <span class="material-icons text-3xl text-blue-600 mr-3">info</span>
204
- <h3 class="text-lg font-semibold text-gray-900 dark:text-white">${title}</h3>
205
- </div>
206
- <div class="text-gray-600 dark:text-gray-300 mb-6">${message}</div>
207
- <div class="flex justify-end">
208
- <button class="ok-btn px-4 py-2 text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors">
209
- ${okText}
210
- </button>
211
- </div>
212
- </div>
213
- </div>
214
- </div>
215
- `;
216
-
217
- // Add event listeners
218
- modal.querySelector('.ok-btn').addEventListener('click', onOk);
219
-
220
- // Close on backdrop click
221
- modal.addEventListener('click', (e) => {
222
- if (e.target === modal.firstElementChild) {
223
- onOk();
224
- }
225
- });
226
-
227
- return modal;
228
- }
229
-
230
- /**
231
- * Create worker configuration modal
232
- * @param {Object} options - Modal options
233
- * @returns {HTMLElement} Modal element
234
- */
235
- createWorkerConfigModal(options) {
236
- const { onSave, onCancel } = options;
237
-
238
- const modal = document.createElement('div');
239
- modal.innerHTML = `
240
- <div class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4">
241
- <div class="bg-white dark:bg-gray-800 rounded-xl shadow-xl max-w-md w-full">
242
- <div class="p-6">
243
- <div class="flex items-center mb-4">
244
- <span class="material-icons text-3xl text-green-600 mr-3">settings</span>
245
- <h3 class="text-lg font-semibold text-gray-900 dark:text-white">Worker Configuration</h3>
246
- </div>
247
- <div class="space-y-4 mb-6">
248
- <div>
249
- <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
250
- Number of Processes
251
- </label>
252
- <input type="number" id="modal-processes" min="1" max="10" value="1"
253
- class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white">
254
- <p class="text-xs text-gray-500 dark:text-gray-400 mt-1">
255
- Recommended: 1-4 processes
256
- </p>
257
- </div>
258
- <div>
259
- <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
260
- Threads per Process
261
- </label>
262
- <input type="number" id="modal-threads" min="1" max="20" value="4"
263
- class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white">
264
- <p class="text-xs text-gray-500 dark:text-gray-400 mt-1">
265
- Recommended: 4-16 threads
266
- </p>
267
- </div>
268
- </div>
269
- <div class="flex space-x-3 justify-end">
270
- <button class="cancel-btn px-4 py-2 text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 rounded-lg transition-colors">
271
- Cancel
272
- </button>
273
- <button class="save-btn px-4 py-2 text-white bg-green-600 hover:bg-green-700 rounded-lg transition-colors">
274
- Start Workers
275
- </button>
276
- </div>
277
- </div>
278
- </div>
279
- </div>
280
- `;
281
-
282
- // Add event listeners
283
- modal.querySelector('.save-btn').addEventListener('click', () => {
284
- const processes = parseInt(modal.querySelector('#modal-processes').value);
285
- const threads = parseInt(modal.querySelector('#modal-threads').value);
286
- onSave({ processes, threads });
287
- });
288
-
289
- modal.querySelector('.cancel-btn').addEventListener('click', onCancel);
290
-
291
- // Close on backdrop click
292
- modal.addEventListener('click', (e) => {
293
- if (e.target === modal.firstElementChild) {
294
- onCancel();
295
- }
296
- });
297
-
298
- return modal;
299
- }
300
-
301
- /**
302
- * Show modal
303
- * @param {HTMLElement} modal - Modal element
304
- */
305
- showModal(modal) {
306
- const container = document.getElementById('modal-container');
307
- container.innerHTML = '';
308
- container.appendChild(modal);
309
- container.classList.remove('hidden');
310
- this.activeModal = modal;
311
-
312
- // Focus management
313
- const firstFocusable = modal.querySelector('button, input, select, textarea');
314
- if (firstFocusable) {
315
- firstFocusable.focus();
316
- }
317
- }
318
-
319
- /**
320
- * Close active modal
321
- */
322
- closeModal() {
323
- const container = document.getElementById('modal-container');
324
- container.classList.add('hidden');
325
- container.innerHTML = '';
326
- this.activeModal = null;
327
- }
328
- }
329
-
330
- // Create global modal system instance
331
- window.modals = new ModalSystem();
332
-
333
- // Enhanced dashboard methods using modals
334
- if (window.dashboard) {
335
- // Override confirmation methods to use modals
336
- const originalStartWorkers = window.dashboard.startWorkers;
337
- window.dashboard.startWorkers = async function() {
338
- const config = await window.modals.showWorkerConfig();
339
- if (config) {
340
- try {
341
- await window.tasksAPI.startWorkers(config);
342
- await window.modals.showInfo({
343
- title: 'Success',
344
- message: `Workers started successfully with ${config.processes} processes and ${config.threads} threads per process.`
345
- });
346
- this.loadTabData(this.currentTab);
347
- } catch (error) {
348
- console.error('Failed to start workers:', error);
349
- await window.modals.showInfo({
350
- title: 'Error',
351
- message: 'Failed to start workers. Please check the logs for more details.'
352
- });
353
- }
354
- }
355
- };
356
-
357
- const originalStopWorkers = window.dashboard.stopWorkers;
358
- window.dashboard.stopWorkers = async function() {
359
- const confirmed = await window.modals.showConfirmation({
360
- title: 'Stop Workers',
361
- message: 'Are you sure you want to stop all workers? This will halt task processing.',
362
- confirmText: 'Stop Workers',
363
- type: 'warning'
364
- });
365
-
366
- if (confirmed) {
367
- try {
368
- await window.tasksAPI.stopWorkers();
369
- await window.modals.showInfo({
370
- title: 'Success',
371
- message: 'Workers stopped successfully.'
372
- });
373
- this.loadTabData(this.currentTab);
374
- } catch (error) {
375
- console.error('Failed to stop workers:', error);
376
- await window.modals.showInfo({
377
- title: 'Error',
378
- message: 'Failed to stop workers. Please check the logs for more details.'
379
- });
380
- }
381
- }
382
- };
383
-
384
- const originalClearQueues = window.dashboard.clearQueues;
385
- window.dashboard.clearQueues = async function() {
386
- const confirmed = await window.modals.showConfirmation({
387
- title: 'Clear All Queues',
388
- message: 'This will remove all pending tasks from all queues. This action cannot be undone.',
389
- confirmText: 'Clear Queues',
390
- type: 'danger'
391
- });
392
-
393
- if (confirmed) {
394
- try {
395
- await window.tasksAPI.clearQueues();
396
- await window.modals.showInfo({
397
- title: 'Success',
398
- message: 'All queues cleared successfully.'
399
- });
400
- this.loadTabData(this.currentTab);
401
- } catch (error) {
402
- console.error('Failed to clear queues:', error);
403
- await window.modals.showInfo({
404
- title: 'Error',
405
- message: 'Failed to clear queues. Please check the logs for more details.'
406
- });
407
- }
408
- }
409
- };
410
-
411
- const originalPurgeFailedTasks = window.dashboard.purgeFailedTasks;
412
- window.dashboard.purgeFailedTasks = async function() {
413
- const confirmed = await window.modals.showConfirmation({
414
- title: 'Purge Failed Tasks',
415
- message: 'This will permanently remove all failed tasks from the system. This action cannot be undone.',
416
- confirmText: 'Purge Failed Tasks',
417
- type: 'danger'
418
- });
419
-
420
- if (confirmed) {
421
- try {
422
- await window.tasksAPI.purgeFailedTasks();
423
- await window.modals.showInfo({
424
- title: 'Success',
425
- message: 'Failed tasks purged successfully.'
426
- });
427
- this.loadTabData(this.currentTab);
428
- } catch (error) {
429
- console.error('Failed to purge failed tasks:', error);
430
- await window.modals.showInfo({
431
- title: 'Error',
432
- message: 'Failed to purge failed tasks. Please check the logs for more details.'
433
- });
434
- }
435
- }
436
- };
437
-
438
- // Override simple alert methods
439
- window.dashboard.showSuccess = async function(message) {
440
- await window.modals.showInfo({
441
- title: 'Success',
442
- message: message
443
- });
444
- };
445
-
446
- window.dashboard.showError = async function(message) {
447
- await window.modals.showInfo({
448
- title: 'Error',
449
- message: message
450
- });
451
- };
452
- }
@@ -1,144 +0,0 @@
1
- /**
2
- * Notification System
3
- * Handles toast notifications and alerts
4
- */
5
-
6
- class NotificationManager {
7
- constructor() {
8
- this.container = document.getElementById('notification-container');
9
- this.notifications = new Map();
10
- this.nextId = 1;
11
- }
12
-
13
- /**
14
- * Show a notification
15
- * @param {string} message - Notification message
16
- * @param {string} type - Notification type (success, error, warning, info)
17
- * @param {number} duration - Auto-dismiss duration in ms (0 = no auto-dismiss)
18
- * @returns {number} Notification ID
19
- */
20
- show(message, type = 'info', duration = 5000) {
21
- const id = this.nextId++;
22
- const notification = this.createNotification(id, message, type);
23
-
24
- this.container.appendChild(notification);
25
- this.notifications.set(id, notification);
26
-
27
- // Animate in
28
- requestAnimationFrame(() => {
29
- notification.classList.remove('opacity-0', 'translate-y-2');
30
- notification.classList.add('opacity-100', 'translate-y-0');
31
- });
32
-
33
- // Auto-dismiss
34
- if (duration > 0) {
35
- setTimeout(() => this.dismiss(id), duration);
36
- }
37
-
38
- return id;
39
- }
40
-
41
- /**
42
- * Dismiss a notification
43
- * @param {number} id - Notification ID
44
- */
45
- dismiss(id) {
46
- const notification = this.notifications.get(id);
47
- if (!notification) return;
48
-
49
- // Animate out
50
- notification.classList.remove('opacity-100', 'translate-y-0');
51
- notification.classList.add('opacity-0', 'translate-y-2');
52
-
53
- // Remove from DOM after animation
54
- setTimeout(() => {
55
- if (notification.parentNode) {
56
- notification.parentNode.removeChild(notification);
57
- }
58
- this.notifications.delete(id);
59
- }, 300);
60
- }
61
-
62
- /**
63
- * Create notification element
64
- * @param {number} id - Notification ID
65
- * @param {string} message - Message text
66
- * @param {string} type - Notification type
67
- * @returns {HTMLElement} Notification element
68
- */
69
- createNotification(id, message, type) {
70
- const notification = document.createElement('div');
71
- notification.className = `
72
- max-w-sm w-full bg-white dark:bg-gray-800 shadow-lg rounded-lg pointer-events-auto
73
- ring-1 ring-black ring-opacity-5 overflow-hidden transform transition-all duration-300
74
- opacity-0 translate-y-2
75
- `.trim();
76
-
77
- const colors = {
78
- success: 'text-green-600 dark:text-green-400',
79
- error: 'text-red-600 dark:text-red-400',
80
- warning: 'text-yellow-600 dark:text-yellow-400',
81
- info: 'text-blue-600 dark:text-blue-400'
82
- };
83
-
84
- const icons = {
85
- success: 'check_circle',
86
- error: 'error',
87
- warning: 'warning',
88
- info: 'info'
89
- };
90
-
91
- notification.innerHTML = `
92
- <div class="p-4">
93
- <div class="flex items-start">
94
- <div class="flex-shrink-0">
95
- <span class="material-icons ${colors[type] || colors.info}">${icons[type] || icons.info}</span>
96
- </div>
97
- <div class="ml-3 w-0 flex-1 pt-0.5">
98
- <p class="text-sm font-medium text-gray-900 dark:text-white">${message}</p>
99
- </div>
100
- <div class="ml-4 flex-shrink-0 flex">
101
- <button class="bg-white dark:bg-gray-800 rounded-md inline-flex text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500"
102
- onclick="window.notifications.dismiss(${id})">
103
- <span class="sr-only">Close</span>
104
- <span class="material-icons text-sm">close</span>
105
- </button>
106
- </div>
107
- </div>
108
- </div>
109
- `;
110
-
111
- return notification;
112
- }
113
-
114
- /**
115
- * Convenience methods
116
- */
117
- success(message, duration = 5000) {
118
- return this.show(message, 'success', duration);
119
- }
120
-
121
- error(message, duration = 8000) {
122
- return this.show(message, 'error', duration);
123
- }
124
-
125
- warning(message, duration = 6000) {
126
- return this.show(message, 'warning', duration);
127
- }
128
-
129
- info(message, duration = 5000) {
130
- return this.show(message, 'info', duration);
131
- }
132
-
133
- /**
134
- * Clear all notifications
135
- */
136
- clear() {
137
- this.notifications.forEach((_, id) => this.dismiss(id));
138
- }
139
- }
140
-
141
- // Initialize notification manager when DOM is loaded
142
- document.addEventListener('DOMContentLoaded', () => {
143
- window.notifications = new NotificationManager();
144
- });