From b9967ddb249fde87fe7d71dd136ac4f1329b1c3d Mon Sep 17 00:00:00 2001 From: Vladislav Kopnin Date: Sat, 10 Oct 2026 13:06:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D1=83=D0=B4=D0=B8=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B8:=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B0=20402=20=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D1=82=D1=81=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B7=D0=BD=D0=B0=D1=87=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - описание из таблицы не показываем, если оно сводится к номеру и дням («402 четверг пятница») — это дублировало пометку и путало; - пометка про дни формулируется по-русски: «в таблице: занятия только по четвергам и пятницам»; - убрана вторая строка «в этот день занятий в ней нет» (следовала из первой); - подсказка в фильтрах вместо «аудитория отмечена как доступные…» — просто «с ограничением по дням: N», предложения начинаются с большой буквы. --- src/frontend/static/app.js | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/frontend/static/app.js b/src/frontend/static/app.js index ad2bbd5..28cf9b0 100644 --- a/src/frontend/static/app.js +++ b/src/frontend/static/app.js @@ -436,6 +436,28 @@ function saveRoomsFilter() { 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) { const mod10 = count % 10; @@ -659,11 +681,13 @@ function updateRoomsSummary() { if (roomsState.mode !== "free") { const restricted = all.filter((r) => !roomAvailableOn(r)).length; if (restricted) { - notes.push(`${pluralRu(restricted, "аудитория отмечена", "аудитории отмечены", "аудиторий отмечено")} как доступные только по отдельным дням`); + notes.push(`с ограничением по дням: ${restricted}`); } } 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); } } @@ -701,14 +725,13 @@ function roomsCardHead(room) { const head = document.createElement("div"); head.className = "day-head"; const attrs = roomAttrsText(room); - const restricted = room.available_days && !roomAvailableOn(room); + const info = roomInfoText(room); head.innerHTML = `
${escapeHTML(room.room)} ${attrs ? `
${escapeHTML(attrs)}
` : ""} - ${room.info ? `
${escapeHTML(room.info)}
` : ""} - ${room.available_days ? `
в таблице отмечено: только ${escapeHTML(room.available_days.join(", "))}
` : ""} - ${restricted ? `
по таблице в этот день занятий в ней нет
` : ""} + ${info ? `
${escapeHTML(info)}
` : ""} + ${room.available_days ? `
в таблице: занятия только ${escapeHTML(daysPhrase(room.available_days))}
` : ""}
`; return head; }