Add source
This commit is contained in:
142
web/admin/templates/create_task.html
Normal file
142
web/admin/templates/create_task.html
Normal file
@@ -0,0 +1,142 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Создать задачу - TGLoader Admin{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1><i class="bi bi-plus-circle me-2"></i>Создать задачу на загрузку</h1>
|
||||
<a href="/admin/tasks" class="btn btn-outline-secondary">
|
||||
<i class="bi bi-arrow-left me-2"></i>Назад к задачам
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Информация о лимитах -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h6 class="text-muted">Активные задачи</h6>
|
||||
<h3>{{ active_tasks_count }} / {{ max_concurrent_tasks }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if max_file_size %}
|
||||
<div class="col-md-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h6 class="text-muted">Макс. размер файла</h6>
|
||||
<h3>{{ (max_file_size / (1024*1024))|round(1) }} MB</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if max_duration %}
|
||||
<div class="col-md-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h6 class="text-muted">Макс. длительность</h6>
|
||||
<h3>{{ max_duration }} мин</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Форма создания задачи -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Новая задача</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="createTaskForm">
|
||||
{% if csrf_token %}
|
||||
<input type="hidden" name="csrf_token" id="csrf_token" value="{{ csrf_token }}">
|
||||
{% endif %}
|
||||
<div class="mb-3">
|
||||
<label for="url" class="form-label">URL для загрузки</label>
|
||||
<input type="url" class="form-control" id="url" name="url"
|
||||
placeholder="https://www.youtube.com/watch?v=..." required>
|
||||
<small class="form-text text-muted">
|
||||
Поддерживаются YouTube, Instagram, прямые ссылки и другие платформы
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit" class="btn btn-primary btn-lg">
|
||||
<i class="bi bi-cloud-download me-2"></i>Создать задачу
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% block extra_js %}
|
||||
<script>
|
||||
function showAlert(message, type = 'success') {
|
||||
const alertDiv = document.createElement('div');
|
||||
alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
|
||||
alertDiv.innerHTML = `
|
||||
${message}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
`;
|
||||
const cardBody = document.querySelector('.card-body');
|
||||
cardBody.insertBefore(alertDiv, cardBody.firstChild);
|
||||
setTimeout(() => alertDiv.remove(), 5000);
|
||||
}
|
||||
|
||||
let isSubmitting = false; // Флаг для предотвращения двойной отправки
|
||||
|
||||
document.getElementById('createTaskForm').addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
// Защита от двойной отправки
|
||||
if (isSubmitting) {
|
||||
return;
|
||||
}
|
||||
|
||||
const form = e.target;
|
||||
const formData = new FormData(form);
|
||||
const submitBtn = form.querySelector('button[type="submit"]');
|
||||
|
||||
// Получаем CSRF токен из формы или мета-тега
|
||||
const csrfTokenInput = document.getElementById('csrf_token');
|
||||
const csrfToken = csrfTokenInput ? csrfTokenInput.value :
|
||||
(document.querySelector('meta[name="csrf-token"]')?.content || '');
|
||||
|
||||
isSubmitting = true;
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Создание...';
|
||||
|
||||
try {
|
||||
const response = await fetch('/admin/api/tasks/create', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {
|
||||
'X-CSRF-Token': csrfToken || ''
|
||||
}
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
showAlert(data.message, 'success');
|
||||
setTimeout(() => {
|
||||
window.location.href = '/admin/tasks';
|
||||
}, 1500);
|
||||
} else {
|
||||
showAlert(data.message, 'danger');
|
||||
isSubmitting = false;
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.innerHTML = '<i class="bi bi-cloud-download me-2"></i>Создать задачу';
|
||||
}
|
||||
} catch (error) {
|
||||
showAlert('Ошибка при создании задачи', 'danger');
|
||||
isSubmitting = false;
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.innerHTML = '<i class="bi bi-cloud-download me-2"></i>Создать задачу';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user