78475b58e9
- acore: Celery-приложение (брокер из env, eager без брокера), настройки CELERY_*, регистрация всех новых приложений в INSTALLED_APPS, маршруты - core/utils: render_page (HTMX-фрагмент/полный layout), is_owner/ is_owner_or_staff; templatetags common_tags (initials, clean_excerpt, is_it_staff); UpdateLastSeenMiddleware - static: people-picker (дерево отделов с аватарками), searchable-select (одиночный выбор с поиском), directory-quick-add, it-manager, pagination; тема Tailwind v4 пересобрана, лого - templates: новый шелл index.html (мобильный сайдбар, темы, фон, user-dropdown) и login с брендингом Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
2.2 KiB
JavaScript
49 lines
2.2 KiB
JavaScript
/**
|
|
* "Додати новий..." прямо в <select> довідника (тип обладнання, бренд,
|
|
* тип/пріоритет заявки і т.д.) — без переходу в Django admin.
|
|
*
|
|
* Розмітка: останній <option value="__new__">+ Додати новий...</option>,
|
|
* onchange="dqaHandleChange(this, '<directory_type_code>', '<code|id>')".
|
|
* valueField визначає, що саме кладеться в option.value/select.value після
|
|
* додавання — 'code' (типова більшість полів) або 'id' (напр. brand_id).
|
|
*/
|
|
function dqaHandleChange(selectEl, typeCode, valueField) {
|
|
if (selectEl.value !== '__new__') return;
|
|
|
|
var name = window.prompt('Назва нового варіанту:');
|
|
if (!name || !name.trim()) {
|
|
selectEl.selectedIndex = 0;
|
|
return;
|
|
}
|
|
|
|
var csrfInput = document.querySelector('input[name=csrfmiddlewaretoken]');
|
|
var formData = new FormData();
|
|
formData.append('type_code', typeCode);
|
|
formData.append('name', name.trim());
|
|
|
|
fetch('/directory/quick-add/', {
|
|
method: 'POST',
|
|
headers: { 'X-CSRFToken': csrfInput ? csrfInput.value : '' },
|
|
body: formData,
|
|
})
|
|
.then(function (r) { return r.json().then(function (data) { return { ok: r.ok, data: data }; }); })
|
|
.then(function (result) {
|
|
if (!result.ok || result.data.error) {
|
|
alert('Не вдалося додати: ' + (result.data.error || 'помилка сервера'));
|
|
selectEl.selectedIndex = 0;
|
|
return;
|
|
}
|
|
var value = valueField === 'id' ? result.data.id : result.data.code;
|
|
var newOption = document.createElement('option');
|
|
newOption.value = value;
|
|
newOption.textContent = result.data.name;
|
|
var addOption = selectEl.querySelector('option[value="__new__"]');
|
|
selectEl.insertBefore(newOption, addOption);
|
|
selectEl.value = value;
|
|
})
|
|
.catch(function () {
|
|
alert('Помилка мережі, спробуйте ще раз');
|
|
selectEl.selectedIndex = 0;
|
|
});
|
|
}
|