Аудитории: карточка 402 читается однозначно

- описание из таблицы не показываем, если оно сводится к номеру и дням
  («402 четверг пятница») — это дублировало пометку и путало;
- пометка про дни формулируется по-русски: «в таблице: занятия только
  по четвергам и пятницам»;
- убрана вторая строка «в этот день занятий в ней нет» (следовала из первой);
- подсказка в фильтрах вместо «аудитория отмечена как доступные…» — просто
  «с ограничением по дням: N», предложения начинаются с большой буквы.
This commit is contained in:
2026-10-10 13:06:55 +03:00
parent 163278c146
commit b9967ddb24

View File

@@ -436,6 +436,28 @@ function saveRoomsFilter() {
localStorage.setItem(ROOMS_FILTER_KEY, JSON.stringify(roomsState.filter)); localStorage.setItem(ROOMS_FILTER_KEY, JSON.stringify(roomsState.filter));
} }
/** «Четверг» -> «четвергам» (для фразы «по четвергам и пятницам»). */
function weekdayPlural(day) {
if (day.endsWith("ье")) return day.slice(0, -2) + "ьям"; // воскресенье
if (day.endsWith("а")) return day + "м"; // пятница, среда
return day + "ам"; // четверг, вторник
}
function daysPhrase(days) {
const forms = days.map(weekdayPlural);
if (forms.length === 1) return `по ${forms[0]}`;
return `по ${forms.slice(0, -1).join(", ")} и ${forms[forms.length - 1]}`;
}
/** Описание из таблицы, если оно не сводится к номеру и дням (иначе не показываем). */
function roomInfoText(room) {
const info = (room.info || "").trim();
if (!info) return "";
let rest = info.replace(/\d+/g, "");
(room.available_days || []).forEach((day) => { rest = rest.split(day).join(""); });
return rest.replace(/[\s;,.]+/g, "") ? info : "";
}
/** Русское склонение существительного при числе. */ /** Русское склонение существительного при числе. */
function pluralRu(count, one, few, many) { function pluralRu(count, one, few, many) {
const mod10 = count % 10; const mod10 = count % 10;
@@ -659,11 +681,13 @@ function updateRoomsSummary() {
if (roomsState.mode !== "free") { if (roomsState.mode !== "free") {
const restricted = all.filter((r) => !roomAvailableOn(r)).length; const restricted = all.filter((r) => !roomAvailableOn(r)).length;
if (restricted) { if (restricted) {
notes.push(`${pluralRu(restricted, "аудитория отмечена", "аудитории отмечены", "аудиторий отмечено")} как доступные только по отдельным дням`); notes.push(`с ограничением по дням: ${restricted}`);
} }
} }
if (hint) { if (hint) {
hint.textContent = notes.join(". "); hint.textContent = notes
.map((text) => text.charAt(0).toUpperCase() + text.slice(1))
.join(". ");
hint.classList.toggle("hidden", !notes.length); hint.classList.toggle("hidden", !notes.length);
} }
} }
@@ -701,14 +725,13 @@ function roomsCardHead(room) {
const head = document.createElement("div"); const head = document.createElement("div");
head.className = "day-head"; head.className = "day-head";
const attrs = roomAttrsText(room); const attrs = roomAttrsText(room);
const restricted = room.available_days && !roomAvailableOn(room); const info = roomInfoText(room);
head.innerHTML = ` head.innerHTML = `
<div class="room-title"> <div class="room-title">
<span class="day-title">${escapeHTML(room.room)}</span> <span class="day-title">${escapeHTML(room.room)}</span>
${attrs ? `<div class="room-attrs">${escapeHTML(attrs)}</div>` : ""} ${attrs ? `<div class="room-attrs">${escapeHTML(attrs)}</div>` : ""}
${room.info ? `<div class="room-info">${escapeHTML(room.info)}</div>` : ""} ${info ? `<div class="room-info">${escapeHTML(info)}</div>` : ""}
${room.available_days ? `<div class="room-note">в таблице отмечено: только ${escapeHTML(room.available_days.join(", "))}</div>` : ""} ${room.available_days ? `<div class="room-note">в таблице: занятия только ${escapeHTML(daysPhrase(room.available_days))}</div>` : ""}
${restricted ? `<div class="room-note bad">по таблице в этот день занятий в ней нет</div>` : ""}
</div>`; </div>`;
return head; return head;
} }