refactor: rename primary_category to external_category

This commit is contained in:
2026-01-14 02:59:11 +03:00
parent 1fb280607a
commit e7672588c6
12 changed files with 306 additions and 85 deletions

View File

@@ -22,6 +22,8 @@
const selectedItemsBreakdownSpan = document.getElementById('selectedItemsBreakdown');
const modeHint = document.getElementById('bulkCategoryModeHint');
const categoryListSection = document.getElementById('bulkCategoryListSection');
const externalCategorySelect = document.getElementById('externalCategorySelect');
const clearExternalCategory = document.getElementById('clearExternalCategory');
/**
* Initialize the bulk category modal functionality
@@ -58,6 +60,28 @@
});
}
// Listen for external category changes
if (externalCategorySelect) {
externalCategorySelect.addEventListener('change', () => {
hideError();
if (externalCategorySelect.value) {
clearExternalCategory.checked = false;
}
updateApplyButtonState();
});
}
// Listen for clear external category checkbox
if (clearExternalCategory) {
clearExternalCategory.addEventListener('change', () => {
hideError();
if (clearExternalCategory.checked) {
externalCategorySelect.value = '';
}
updateApplyButtonState();
});
}
// Listen for modal close to reset state
modal.addEventListener('hidden.bs.modal', resetModalState);
@@ -90,6 +114,14 @@
// Reset state
selectedCategoryIds.clear();
hideError();
// Reset external category
if (externalCategorySelect) {
externalCategorySelect.value = '';
}
if (clearExternalCategory) {
clearExternalCategory.checked = false;
}
// Open modal and load categories
modalInstance.show();
@@ -330,13 +362,16 @@
}
const mode = getCurrentMode();
const hasExternalCategory = externalCategorySelect && externalCategorySelect.value;
const shouldClearExternal = clearExternalCategory && clearExternalCategory.checked;
if (mode === 'clear') {
// В режиме очистки категории не требуются
// В режиме очистки M2M категорий не требуются
// Но можно также очистить внешнюю категорию
applyBtn.disabled = false;
} else {
// Для add/replace нужна хотя бы одна выбранная категория
applyBtn.disabled = selectedCategoryIds.size === 0;
// Для add/replace нужна хотя бы одна выбранная категория ИЛИ внешняя категория ИЛИ очистка
applyBtn.disabled = selectedCategoryIds.size === 0 && !hasExternalCategory && !shouldClearExternal;
}
}
@@ -346,17 +381,27 @@
async function handleApply() {
const mode = getCurrentMode();
const selectedItems = getSelectedItems();
const externalCategoryId = externalCategorySelect ? externalCategorySelect.value : null;
const shouldClearExternal = clearExternalCategory && clearExternalCategory.checked;
if (selectedItems.length === 0) {
showError('Нет выбранных товаров');
return;
}
// Режим очистки категорий
// Проверка: если выбрана внешняя категория и стоит чекбокс очистки
if (externalCategoryId && shouldClearExternal) {
showError('Нельзя одновременно выбрать и очистить внешнюю категорию');
return;
}
// Режим очистки M2M категорий
if (mode === 'clear') {
const confirmed = confirm(
`Вы уверены, что хотите удалить ВСЕ категории у ${selectedItems.length} выбранных товаров?\n\nЭто действие нельзя отменить!`
);
let confirmMsg = `Вы уверены, что хотите удалить ВСЕ категории у ${selectedItems.length} выбранных товаров?\n\nЭто действие нельзя отменить!`;
if (shouldClearExternal) {
confirmMsg += '\n\nТакже будет очищена внешняя категория для интеграций.';
}
const confirmed = confirm(confirmMsg);
if (!confirmed) {
return;
}
@@ -374,6 +419,11 @@
action_mode: 'clear'
};
// Добавляем external_category_id только если нужно очистить
if (shouldClearExternal) {
requestData.external_category_id = null;
}
applyBtn.disabled = true;
applyBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Применение...';
@@ -436,18 +486,25 @@
}
// Режим add/replace
if (selectedCategoryIds.size === 0) {
showError('Выберите хотя бы одну категорию');
if (selectedCategoryIds.size === 0 && !externalCategoryId && !shouldClearExternal) {
showError('Выберите хотя бы одну категорию или внешнюю категорию');
return;
}
const actionMode = mode === 'replace' ? 'replace' : 'add';
const requestData = {
items: selectedItems,
category_ids: Array.from(selectedCategoryIds),
action_mode: actionMode
};
// Добавляем внешнюю категорию если выбрана
if (externalCategoryId) {
requestData.external_category_id = parseInt(externalCategoryId);
} else if (shouldClearExternal) {
requestData.clear_external_category = true;
}
const csrfToken = getCsrfToken();
if (!csrfToken) {
@@ -610,6 +667,14 @@
addModeRadio.checked = true;
}
// Сбрасываем внешнюю категорию
if (externalCategorySelect) {
externalCategorySelect.value = '';
}
if (clearExternalCategory) {
clearExternalCategory.checked = false;
}
updateModeUI();
updateApplyButtonState();
}