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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/inlines.py +11 -5
- django_cfg/apps/payments/admin/networks_admin.py +12 -1
- django_cfg/apps/payments/admin/payments_admin.py +13 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +62 -14
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +33 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +96 -45
- django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
- django_cfg/apps/payments/config/__init__.py +14 -15
- django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
- django_cfg/apps/payments/config/helpers.py +8 -13
- django_cfg/apps/payments/migrations/0001_initial.py +33 -46
- django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
- django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
- django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
- django_cfg/apps/payments/models/payments.py +94 -0
- django_cfg/apps/payments/services/core/base.py +4 -4
- django_cfg/apps/payments/services/core/payment_service.py +265 -38
- django_cfg/apps/payments/services/providers/base.py +209 -3
- django_cfg/apps/payments/services/providers/models/__init__.py +2 -0
- django_cfg/apps/payments/services/providers/models/base.py +25 -2
- django_cfg/apps/payments/services/providers/nowpayments/models.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +57 -9
- django_cfg/apps/payments/services/providers/registry.py +5 -5
- django_cfg/apps/payments/services/types/requests.py +19 -7
- django_cfg/apps/payments/signals/payment_signals.py +31 -2
- django_cfg/apps/payments/static/payments/js/api-client.js +6 -1
- django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
- django_cfg/apps/payments/static/payments/js/payment-form.js +35 -26
- django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
- django_cfg/apps/payments/urls.py +3 -2
- django_cfg/apps/payments/views/api/currencies.py +3 -0
- django_cfg/apps/payments/views/serializers/currencies.py +18 -5
- django_cfg/apps/tasks/admin/tasks_admin.py +2 -2
- django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
- django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
- django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
- django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
- django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
- django_cfg/apps/tasks/tasks/__init__.py +10 -0
- django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
- django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
- django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
- django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
- django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
- django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
- django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
- django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
- django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
- django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
- django_cfg/apps/tasks/urls.py +2 -2
- django_cfg/apps/tasks/urls_admin.py +2 -2
- django_cfg/apps/tasks/utils/__init__.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +356 -0
- django_cfg/apps/tasks/views/__init__.py +16 -0
- django_cfg/apps/tasks/views/api.py +569 -0
- django_cfg/apps/tasks/views/dashboard.py +58 -0
- django_cfg/core/integration/__init__.py +21 -0
- django_cfg/management/commands/rundramatiq_simulator.py +430 -0
- django_cfg/models/constance.py +0 -11
- django_cfg/models/payments.py +137 -3
- django_cfg/modules/django_tasks.py +54 -21
- django_cfg/registry/core.py +4 -9
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/METADATA +2 -2
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/RECORD +85 -153
- django_cfg/apps/payments/config/constance/__init__.py +0 -22
- django_cfg/apps/payments/config/constance/config_service.py +0 -123
- django_cfg/apps/payments/config/constance/fields.py +0 -69
- django_cfg/apps/payments/config/constance/settings.py +0 -160
- django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +0 -26
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +0 -28
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +0 -30
- django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
- django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
- django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
- django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
- django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
- django_cfg/apps/tasks/templates/tasks/base.html +0 -96
- django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
- django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
- django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
- django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
- django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
- django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
- django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
- django_cfg/apps/tasks/views.py +0 -461
- django_cfg/management/commands/app_agent_diagnose.py +0 -470
- django_cfg/management/commands/app_agent_generate.py +0 -342
- django_cfg/management/commands/app_agent_info.py +0 -308
- django_cfg/management/commands/auto_generate.py +0 -486
- django_cfg/modules/django_app_agent/__init__.py +0 -87
- django_cfg/modules/django_app_agent/agents/__init__.py +0 -40
- django_cfg/modules/django_app_agent/agents/base/__init__.py +0 -24
- django_cfg/modules/django_app_agent/agents/base/agent.py +0 -354
- django_cfg/modules/django_app_agent/agents/base/context.py +0 -236
- django_cfg/modules/django_app_agent/agents/base/executor.py +0 -430
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +0 -12
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +0 -15
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +0 -147
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +0 -99
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +0 -32
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +0 -290
- django_cfg/modules/django_app_agent/agents/interfaces.py +0 -376
- django_cfg/modules/django_app_agent/core/__init__.py +0 -33
- django_cfg/modules/django_app_agent/core/config.py +0 -300
- django_cfg/modules/django_app_agent/core/exceptions.py +0 -359
- django_cfg/modules/django_app_agent/models/__init__.py +0 -71
- django_cfg/modules/django_app_agent/models/base.py +0 -283
- django_cfg/modules/django_app_agent/models/context.py +0 -496
- django_cfg/modules/django_app_agent/models/enums.py +0 -481
- django_cfg/modules/django_app_agent/models/requests.py +0 -500
- django_cfg/modules/django_app_agent/models/responses.py +0 -585
- django_cfg/modules/django_app_agent/pytest.ini +0 -6
- django_cfg/modules/django_app_agent/services/__init__.py +0 -42
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +0 -30
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +0 -133
- django_cfg/modules/django_app_agent/services/app_generator/context.py +0 -40
- django_cfg/modules/django_app_agent/services/app_generator/main.py +0 -202
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +0 -316
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +0 -125
- django_cfg/modules/django_app_agent/services/base.py +0 -437
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +0 -34
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +0 -141
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +0 -276
- django_cfg/modules/django_app_agent/services/context_builder/main.py +0 -272
- django_cfg/modules/django_app_agent/services/context_builder/models.py +0 -40
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +0 -85
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +0 -31
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +0 -311
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +0 -221
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +0 -59
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +0 -94
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +0 -28
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +0 -273
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +0 -111
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +0 -251
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +0 -347
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +0 -356
- django_cfg/modules/django_app_agent/services/report_service.py +0 -332
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +0 -18
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +0 -236
- django_cfg/modules/django_app_agent/services/template_manager/main.py +0 -159
- django_cfg/modules/django_app_agent/services/template_manager/models.py +0 -36
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +0 -100
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +0 -105
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +0 -31
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +0 -44
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +0 -81
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +0 -107
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +0 -139
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +0 -91
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +0 -195
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +0 -35
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +0 -211
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +0 -200
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +0 -25
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +0 -333
- django_cfg/modules/django_app_agent/services/validation_service/main.py +0 -242
- django_cfg/modules/django_app_agent/services/validation_service/models.py +0 -66
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +0 -352
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +0 -272
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +0 -203
- django_cfg/modules/django_app_agent/ui/__init__.py +0 -25
- django_cfg/modules/django_app_agent/ui/cli.py +0 -419
- django_cfg/modules/django_app_agent/ui/rich_components.py +0 -622
- django_cfg/modules/django_app_agent/utils/__init__.py +0 -38
- django_cfg/modules/django_app_agent/utils/logging.py +0 -360
- django_cfg/modules/django_app_agent/utils/validation.py +0 -417
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.9.dist-info → django_cfg-1.3.13.dist-info}/entry_points.txt +0 -0
- {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
|
-
});
|