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