django-cfg 1.3.9__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 (187) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/payments/admin/networks_admin.py +12 -1
  3. django_cfg/apps/payments/admin/payments_admin.py +13 -0
  4. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +62 -14
  5. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  6. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  7. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  8. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  9. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  10. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  11. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  12. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +33 -3
  13. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  14. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +96 -45
  15. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  16. django_cfg/apps/payments/config/__init__.py +14 -15
  17. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  18. django_cfg/apps/payments/config/helpers.py +8 -13
  19. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  20. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  21. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  22. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  23. django_cfg/apps/payments/models/payments.py +94 -0
  24. django_cfg/apps/payments/services/core/base.py +4 -4
  25. django_cfg/apps/payments/services/core/payment_service.py +265 -38
  26. django_cfg/apps/payments/services/providers/base.py +209 -3
  27. django_cfg/apps/payments/services/providers/models/__init__.py +2 -0
  28. django_cfg/apps/payments/services/providers/models/base.py +25 -2
  29. django_cfg/apps/payments/services/providers/nowpayments/models.py +2 -2
  30. django_cfg/apps/payments/services/providers/nowpayments/provider.py +57 -9
  31. django_cfg/apps/payments/services/providers/registry.py +5 -5
  32. django_cfg/apps/payments/services/types/requests.py +19 -7
  33. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  34. django_cfg/apps/payments/static/payments/js/api-client.js +6 -1
  35. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  36. django_cfg/apps/payments/static/payments/js/payment-form.js +35 -26
  37. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  38. django_cfg/apps/payments/urls.py +3 -2
  39. django_cfg/apps/payments/views/api/currencies.py +3 -0
  40. django_cfg/apps/payments/views/serializers/currencies.py +18 -5
  41. django_cfg/apps/tasks/admin/tasks_admin.py +2 -2
  42. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  43. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  44. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  45. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  46. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  47. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  48. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  49. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  50. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  51. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  52. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  53. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  54. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  55. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  56. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  57. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  58. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  59. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  60. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  61. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  62. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  63. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  64. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  65. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  66. django_cfg/apps/tasks/urls.py +2 -2
  67. django_cfg/apps/tasks/urls_admin.py +2 -2
  68. django_cfg/apps/tasks/utils/__init__.py +1 -0
  69. django_cfg/apps/tasks/utils/simulator.py +356 -0
  70. django_cfg/apps/tasks/views/__init__.py +16 -0
  71. django_cfg/apps/tasks/views/api.py +569 -0
  72. django_cfg/apps/tasks/views/dashboard.py +58 -0
  73. django_cfg/core/integration/__init__.py +21 -0
  74. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  75. django_cfg/models/constance.py +0 -11
  76. django_cfg/models/payments.py +137 -3
  77. django_cfg/modules/django_tasks.py +54 -21
  78. django_cfg/registry/core.py +4 -9
  79. django_cfg/template_archive/django_sample.zip +0 -0
  80. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -2
  81. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/RECORD +84 -152
  82. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  83. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  84. django_cfg/apps/payments/config/constance/fields.py +0 -69
  85. django_cfg/apps/payments/config/constance/settings.py +0 -160
  86. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +0 -26
  87. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +0 -28
  88. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +0 -30
  89. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  90. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  91. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  92. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  93. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  94. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  95. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  96. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  97. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  98. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  99. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  100. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  101. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  102. django_cfg/apps/tasks/views.py +0 -461
  103. django_cfg/management/commands/app_agent_diagnose.py +0 -470
  104. django_cfg/management/commands/app_agent_generate.py +0 -342
  105. django_cfg/management/commands/app_agent_info.py +0 -308
  106. django_cfg/management/commands/auto_generate.py +0 -486
  107. django_cfg/modules/django_app_agent/__init__.py +0 -87
  108. django_cfg/modules/django_app_agent/agents/__init__.py +0 -40
  109. django_cfg/modules/django_app_agent/agents/base/__init__.py +0 -24
  110. django_cfg/modules/django_app_agent/agents/base/agent.py +0 -354
  111. django_cfg/modules/django_app_agent/agents/base/context.py +0 -236
  112. django_cfg/modules/django_app_agent/agents/base/executor.py +0 -430
  113. django_cfg/modules/django_app_agent/agents/generation/__init__.py +0 -12
  114. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +0 -15
  115. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +0 -147
  116. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +0 -99
  117. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +0 -32
  118. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +0 -290
  119. django_cfg/modules/django_app_agent/agents/interfaces.py +0 -376
  120. django_cfg/modules/django_app_agent/core/__init__.py +0 -33
  121. django_cfg/modules/django_app_agent/core/config.py +0 -300
  122. django_cfg/modules/django_app_agent/core/exceptions.py +0 -359
  123. django_cfg/modules/django_app_agent/models/__init__.py +0 -71
  124. django_cfg/modules/django_app_agent/models/base.py +0 -283
  125. django_cfg/modules/django_app_agent/models/context.py +0 -496
  126. django_cfg/modules/django_app_agent/models/enums.py +0 -481
  127. django_cfg/modules/django_app_agent/models/requests.py +0 -500
  128. django_cfg/modules/django_app_agent/models/responses.py +0 -585
  129. django_cfg/modules/django_app_agent/pytest.ini +0 -6
  130. django_cfg/modules/django_app_agent/services/__init__.py +0 -42
  131. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +0 -30
  132. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +0 -133
  133. django_cfg/modules/django_app_agent/services/app_generator/context.py +0 -40
  134. django_cfg/modules/django_app_agent/services/app_generator/main.py +0 -202
  135. django_cfg/modules/django_app_agent/services/app_generator/structure.py +0 -316
  136. django_cfg/modules/django_app_agent/services/app_generator/validation.py +0 -125
  137. django_cfg/modules/django_app_agent/services/base.py +0 -437
  138. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +0 -34
  139. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +0 -141
  140. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +0 -276
  141. django_cfg/modules/django_app_agent/services/context_builder/main.py +0 -272
  142. django_cfg/modules/django_app_agent/services/context_builder/models.py +0 -40
  143. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +0 -85
  144. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +0 -31
  145. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +0 -311
  146. django_cfg/modules/django_app_agent/services/project_scanner/main.py +0 -221
  147. django_cfg/modules/django_app_agent/services/project_scanner/models.py +0 -59
  148. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +0 -94
  149. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +0 -28
  150. django_cfg/modules/django_app_agent/services/questioning_service/main.py +0 -273
  151. django_cfg/modules/django_app_agent/services/questioning_service/models.py +0 -111
  152. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +0 -251
  153. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +0 -347
  154. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +0 -356
  155. django_cfg/modules/django_app_agent/services/report_service.py +0 -332
  156. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +0 -18
  157. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +0 -236
  158. django_cfg/modules/django_app_agent/services/template_manager/main.py +0 -159
  159. django_cfg/modules/django_app_agent/services/template_manager/models.py +0 -36
  160. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +0 -100
  161. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +0 -105
  162. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +0 -31
  163. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +0 -44
  164. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +0 -81
  165. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +0 -107
  166. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +0 -139
  167. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +0 -91
  168. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +0 -195
  169. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +0 -35
  170. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +0 -211
  171. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +0 -200
  172. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +0 -25
  173. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +0 -333
  174. django_cfg/modules/django_app_agent/services/validation_service/main.py +0 -242
  175. django_cfg/modules/django_app_agent/services/validation_service/models.py +0 -66
  176. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +0 -352
  177. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +0 -272
  178. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +0 -203
  179. django_cfg/modules/django_app_agent/ui/__init__.py +0 -25
  180. django_cfg/modules/django_app_agent/ui/cli.py +0 -419
  181. django_cfg/modules/django_app_agent/ui/rich_components.py +0 -622
  182. django_cfg/modules/django_app_agent/utils/__init__.py +0 -38
  183. django_cfg/modules/django_app_agent/utils/logging.py +0 -360
  184. django_cfg/modules/django_app_agent/utils/validation.py +0 -417
  185. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
  186. {django_cfg-1.3.9.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
  187. {django_cfg-1.3.9.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
- });