diff --git a/app.js b/app.js
index 0694d96..0397103 100644
--- a/app.js
+++ b/app.js
@@ -98,13 +98,11 @@ function bindEvents(){
});
// Кнопки
- document.getElementById('btnAdd').addEventListener('click', ()=>openEditor());
+ document.getElementById('btnAdd').addEventListener('click', addRow);
document.getElementById('btnFields').addEventListener('click', openFields);
document.getElementById('btnExport').addEventListener('click', exportCSV);
document.getElementById('btnImport').addEventListener('click', ()=>document.getElementById('importFile').click());
document.getElementById('importFile').addEventListener('change', importJSON);
- document.getElementById('btnSave').addEventListener('click', saveEditor);
- document.getElementById('btnDelete').addEventListener('click', deleteEditor);
document.getElementById('btnAddField').addEventListener('click', addCustomField);
document.getElementById('newFieldType').addEventListener('change', e=>{
document.getElementById('newFieldOptions').hidden = e.target.value!=='select';
@@ -118,11 +116,15 @@ function bindEvents(){
document.getElementById('filterCategory').addEventListener('change', e=>{ filters.category=e.target.value; renderTable(); });
document.getElementById('filterBase').addEventListener('change', e=>{ filters.base=e.target.value; renderTable(); });
+ // Инлайн-редактирование таблицы (делегирование событий)
+ document.getElementById('tableBody').addEventListener('input', onCellInput);
+ document.getElementById('tableBody').addEventListener('change', onCellInput);
+
// Закрытие модалок по клику на фон
document.querySelectorAll('.modal-overlay').forEach(ov=>{
ov.addEventListener('click', e=>{ if(e.target===ov) ov.hidden=true; });
});
- document.addEventListener('keydown', e=>{ if(e.key==='Escape'){ closeEditor(); closeFields(); } });
+ document.addEventListener('keydown', e=>{ if(e.key==='Escape'){ closeFields(); } });
}
/* ---------- Выпуски фильтров ---------- */
@@ -141,7 +143,7 @@ function uniqueValues(key){
}
/* ---------- Рендер всего ---------- */
-function renderAll(){ renderStats(); renderTable(); buildFilterOptions(); }
+function renderAll(){ renderStats(); renderDatalists(); renderTable(); buildFilterOptions(); buildReportFieldOptions(); }
/* ---------- Карточки статистики ---------- */
function renderStats(){
@@ -164,26 +166,24 @@ function statCard(label,value,sub,cls){
return `
${label}
${value}
${sub||''}
`;
}
-/* ---------- Таблица ---------- */
+/* ---------- Таблица (инлайн-редактирование) ---------- */
function renderTable(){
const head = document.getElementById('tableHead');
const body = document.getElementById('tableBody');
const empty = document.getElementById('emptyState');
+ const fields = allFields();
- // Колонки: ФИО, Степень, Категория, База, Сертификат, действия
- head.innerHTML = `
- ФИО | Научная степень | Категория |
- Клиническая база | Сертификат | Действия | `;
+ // Заголовок: все поля + колонка действий
+ head.innerHTML = fields.map(f=>`${esc(f.label)}${f.required?' *':''} | `).join('') + ' | ';
const rows = filtered();
if(rows.length===0){
document.getElementById('teacherTable').style.display = state.teachers.length===0 ? 'none':'table';
- empty.hidden = state.teachers.length!==0;
if(state.teachers.length!==0){
empty.hidden=false; empty.querySelector('p').textContent='Ничего не найдено по фильтрам.';
empty.querySelector('button').style.display='none';
} else {
- empty.querySelector('p').textContent='Пока нет ни одного преподавателя.';
+ empty.hidden=false; empty.querySelector('p').textContent='Пока нет ни одного преподавателя.';
empty.querySelector('button').style.display='';
}
document.getElementById('countPill').textContent='';
@@ -194,15 +194,11 @@ function renderTable(){
empty.hidden=true;
body.innerHTML = rows.map(t=>`
-
- | ${esc(t.fullName||'—')} |
- ${degreeBadge(t.academicDegree)} |
- ${t.category && t.category!=='Нет' ? `${esc(t.category)}` : '—'} |
- ${esc(t.clinicalBase||'—')} |
- ${t.specialistCertificate ? `✓ есть` : '—'} |
+
+ ${fields.map(f=>`| ${cellInput(f,t)} | `).join('')}
-
+
|
@@ -211,6 +207,70 @@ function renderTable(){
document.getElementById('countPill').textContent = `Показано: ${rows.length} из ${state.teachers.length}`;
}
+// Поле ввода прямо в ячейке таблицы
+function cellInput(f, t){
+ const val = t[f.key] ?? '';
+ const name = f.key;
+ if(f.type==='textarea')
+ return ``;
+ if(f.type==='date')
+ return ``;
+ if(f.type==='number')
+ return ``;
+ if(f.type==='checkbox')
+ return ``;
+ if(f.type==='select')
+ return ``;
+ return ``;
+}
+
+// Один