69 lines
2.0 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
};
|
|
}
|