Files
ACORE/static/assets/js/directory-quick-add.js
T
lokses 78475b58e9 Инфраструктура: Celery, общие утилиты, виджеты, шелл портала
- 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>
2026-07-22 17:31:01 +03:00

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;
});
}