aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/components
diff options
context:
space:
mode:
authorYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-11-02 09:01:49 +0900
committerYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-11-02 09:01:49 +0900
commit9f2147a8d34015c841668cbbb34427ae969d0b52 (patch)
tree0f7f9c658ca14979678cdd6445751b9e7cad0f7a /src/components
parent5c6a79f7869b0da7a03be265686fc35ea110b0e0 (diff)
hp-archive: 図書館のイベント掲載と絞り込みを追加
- 小平市立図書館の月間カレンダーから、おはなし会・絵本のへやなど16件を掲載 - 「図書館」カテゴリボタンを追加し、カレンダー下部に絞り込み中の表示を追加 - 11月5日の公共施設マネジメント調査特別委員会を視察(傍聴なし)に修正 - 図書館イベントの日付更新スクリプトと、X投稿用のキャプチャスクリプトを追加
Diffstat (limited to 'src/components')
-rw-r--r--src/components/ScheduleInteractive.astro30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/components/ScheduleInteractive.astro b/src/components/ScheduleInteractive.astro
index 58574ce..6bcbb1c 100644
--- a/src/components/ScheduleInteractive.astro
+++ b/src/components/ScheduleInteractive.astro
@@ -15,6 +15,10 @@
const COUNCIL_KEY = 'council';
const isCouncil = (e: { type: string; name: string }) =>
e.type === 'meeting' && e.name.includes('小平市議会');
+ // 図書館のイベントは出典に図書館のページ(info.html?id=…)のリンクが入っている。
+ const LIBRARY_KEY = 'library';
+ const isLibrary = (e: { source?: string }) =>
+ (e.source ?? '').includes('library.kodaira.ed.jp/viewer/info.html');
const WEEKDAYS = ['日', '月', '火', '水', '木', '金', '土'];
const WEEKDAY_MAP = { 日: 0, 月: 1, 火: 2, 水: 3, 木: 4, 金: 5, 土: 6 };
@@ -150,6 +154,8 @@
const dateText = cells[0].textContent.trim();
const name = cells[1].textContent.trim();
const timeText = cells[2].textContent.trim();
+ // 出典欄はリンク先URLで判定するため、HTML を保持する(textContent には href が入らない)。
+ const source = cells[4] ? cells[4].innerHTML : '';
const rowId = `${type}-row-${i}`;
row.id = rowId;
@@ -186,6 +192,7 @@
categoryLabel,
rowId,
dateText,
+ source,
});
});
}
@@ -247,6 +254,7 @@
function matchesCategory(e) {
if (activeCategory === 'all') return true;
if (activeCategory === COUNCIL_KEY) return isCouncil(e);
+ if (activeCategory === LIBRARY_KEY) return isLibrary(e);
// 「審議会等」は市議会を除く(市議会は別のボタンで絞り込む)。
if (activeCategory === MEETING_ICON) return e.type === 'meeting' && !isCouncil(e);
return e.category === activeCategory;
@@ -325,6 +333,11 @@
).join('')}
${cells.join('')}
</div>
+ <p class="schedule-cal-filter-note">${
+ activeCategory === 'all'
+ ? '絞り込みなし(すべての予定を表示)'
+ : `絞り込み中:${filterLabel()}`
+ }</p>
`;
calendarEl.querySelectorAll('.schedule-cal-day[data-date]').forEach((btn) => {
@@ -407,11 +420,20 @@
function categoryLabel(category) {
if (category === COUNCIL_KEY) return '市議会';
+ if (category === LIBRARY_KEY) return '図書館';
if (category === MEETING_ICON) return '審議会等';
const def = CATEGORY_DEFS.find((c) => c.icon === category);
return def ? def.label : '交流・地域';
}
+ // 「🏛️ 市議会」「📖 図書館」のように、アイコン付きで現在の絞り込みを表す
+ function filterLabel() {
+ if (activeCategory === COUNCIL_KEY) return `${MEETING_ICON} 市議会`;
+ if (activeCategory === LIBRARY_KEY) return '📖 図書館';
+ if (activeCategory === MEETING_ICON) return `${MEETING_ICON} 審議会等`;
+ return `${activeCategory} ${categoryLabel(activeCategory)}`;
+ }
+
function ensureStatus(container, type) {
const id = `${type}-filter-status`;
let status = document.getElementById(id);
@@ -434,7 +456,7 @@
const filtered = activeCategory !== 'all';
status.classList.toggle('is-filtered', filtered);
const text = filtered
- ? `${tableLabel}:「${activeCategory === COUNCIL_KEY ? categoryLabel(activeCategory) : `${activeCategory} ${categoryLabel(activeCategory)}`}」で絞り込み中:${visible}件/全${total}件`
+ ? `${tableLabel}:「${filterLabel()}」で絞り込み中:${visible}件/全${total}件`
: `${tableLabel}:全${total}件を表示しています(絞り込みなし)`;
status.innerHTML = `<span class="schedule-table-status-text">${text}</span>`;
if (filtered) {
@@ -512,6 +534,12 @@
label: '審議会等',
count: meetingEntries.length,
},
+ {
+ category: LIBRARY_KEY,
+ icon: '📖',
+ label: '図書館',
+ count: entries.filter(isLibrary).length,
+ },
...CATEGORY_DEFS.map((c) => ({
category: c.icon,
icon: c.icon,