Corp/backend/static/js/components/deptRoleEditor.js

69 lines
2.0 KiB
JavaScript

/**
* deptRoleEditor.js
* Валидация и управление редактором роли в отделе
* Активирует кнопку OK только при изменении значения
*
* @module deptRoleEditor
* @version 1.0.0
*/
/**
* Инициализация редакторов ролей в отделах
* Находит все формы .dept-editor и активирует валидацию
* @returns {Object} Публичный API
*/
export function initDeptRoleEditor() {
const editors = document.querySelectorAll('.dept-editor form');
if (!editors.length) {
console.log('deptRoleEditor: no editors found');
return null;
}
const instances = [];
editors.forEach(form => {
const select = form.querySelector('select[name="role_id"]');
const okBtn = form.querySelector('.dept-role-save');
if (!select || !okBtn) return;
const initial = select.value ?? '';
// Функция проверки изменений
const checkChanges = () => {
okBtn.disabled = (select.value === initial);
};
// Начальная проверка и подписка на изменения
checkChanges();
select.addEventListener('change', checkChanges);
instances.push({ form, select, okBtn, initial });
});
// Инициализация tooltips для редакторов (если Bootstrap доступен)
if (window.bootstrap?.Tooltip) {
document.querySelectorAll('.dept-editor-wrap.collapse').forEach(col => {
col.addEventListener('shown.bs.collapse', () => {
col.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(el => {
if (!el._tooltip) {
el._tooltip = new bootstrap.Tooltip(el);
}
});
});
});
}
console.log(`deptRoleEditor: initialized ${instances.length} editor(s)`);
return {
instances,
refresh: () => {
instances.forEach(({ select, okBtn, initial }) => {
okBtn.disabled = (select.value === initial);
});
}
};
}