refactor: rename primary_category to external_category
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user