/** * 検索・駅・エリア一覧の件数表示(Hero / Sidebar / Result)の正本。 */ (function (root, factory) { if (typeof module === 'object' && module.exports) { module.exports = factory(); } else { root.PropertyListCount = factory(); } })(typeof globalThis !== 'undefined' ? globalThis : this, function () { 'use strict'; var PHASE_LOADING = 'loading'; var PHASE_READY = 'ready'; var PHASE_EMPTY = 'empty'; var PHASE_ERROR = 'error'; var LOADING_TEXT = '物件を読み込み中…'; function esc(s) { return String(s == null ? '' : s) .replace(/&/g, '&') .replace(//g, '>'); } function formatNum(n) { var v = Number(n); if (!Number.isFinite(v) || v < 0) v = 0; try { return v.toLocaleString('ja-JP'); } catch (_e) { return String(v); } } function pillClass(phase) { return 'tp-list-count tp-list-count--' + phase; } function publicAsset(path) { if (typeof globalThis !== 'undefined' && globalThis.RakusumoPublicPath && typeof globalThis.RakusumoPublicPath.asset === 'function') { return globalThis.RakusumoPublicPath.asset(path); } var pre = typeof globalThis !== 'undefined' && typeof globalThis.__RAKUSUMO_PUBLIC_PATH_PREFIX__ === 'string' ? globalThis.__RAKUSUMO_PUBLIC_PATH_PREFIX__ : ''; return (pre === '' ? '' : pre) + '/' + String(path || '').replace(/^\/+/, ''); } var SUMMARY_ICON_BUILDING_SRC = publicAsset('css/img/list-summary-building.png'); var SUMMARY_ICON_MEGAPHONE_SRC = publicAsset('css/img/list-summary-megaphone.png'); function summaryIconBuilding() { return ( '' + '該当物件' + '' ); } function summaryIconMegaphone() { return ( '' + '掲載中' + '' ); } function loadingInnerHtml() { return ( '' + esc(LOADING_TEXT) + '' ); } function loadingSummaryHtml() { return ( '
' + '
' + summaryIconBuilding() + '該当' + '' + esc(LOADING_TEXT) + '
' + '
' + '掲載中' + '' + esc(LOADING_TEXT) + '' + summaryIconMegaphone() + '
' ); } function renderSummaryDualHtml(phase, matched, published) { if (phase === PHASE_LOADING) return loadingSummaryHtml(); if (phase === PHASE_ERROR) { return ( '
' + '

件数を取得できませんでした

' ); } var m = Number(matched); var p = Number(published); if (!Number.isFinite(m) || m < 0) m = 0; if (!Number.isFinite(p) || p < 0) p = m; return ( '
' + '
' + summaryIconBuilding() + '該当 ' + '' + esc(formatNum(m)) + '' + '
' + '
' + '掲載中 ' + '' + esc(formatNum(p)) + '' + '' + summaryIconMegaphone() + '
' ); } function renderMatchedHtml(phase, total) { if (phase === PHASE_LOADING) return loadingInnerHtml(); if (phase === PHASE_ERROR) { return ( '件数を取得できませんでした' ); } var n = phase === PHASE_EMPTY ? 0 : total; return ( '' + '該当 ' + '' + esc(formatNum(n)) + '' + '' + '' ); } function renderResultHtml(phase, total, meta) { meta = meta || {}; if (phase === PHASE_LOADING) return loadingInnerHtml(); if (phase === PHASE_ERROR) { return ( '物件データの読み込みに失敗しました' ); } if (phase === PHASE_EMPTY) { return ( '条件に合う物件がありません' ); } var note = ''; if (meta.pageRooms != null && meta.buildingCount != null) { note = '(このページ ' + esc(formatNum(meta.pageRooms)) + '部屋 / ' + esc(formatNum(meta.buildingCount)) + '棟)'; } else if (meta.note) { note = '' + esc(meta.note) + ''; } return ( '' + '該当 ' + '' + esc(formatNum(total)) + '' + '' + note + '' ); } function resolvePhase(opts) { opts = opts || {}; if (opts.loading) return PHASE_LOADING; if (opts.error) return PHASE_ERROR; if (!opts.loaded) return PHASE_LOADING; var total = Number(opts.total); if (!Number.isFinite(total)) total = 0; if (total === 0) return PHASE_EMPTY; return PHASE_READY; } function normalizeHeroCountHosts() { document.querySelectorAll('p.tp-search-hero__count').forEach(function (p) { var div = document.createElement('div'); div.className = p.className; Array.prototype.slice.call(p.attributes || []).forEach(function (attr) { if (attr.name === 'class') return; div.setAttribute(attr.name, attr.value); }); div.innerHTML = p.innerHTML; var meta = p.parentElement; if (meta && meta.classList && meta.classList.contains('tp-search-hero__meta')) { meta.querySelectorAll(':scope > .tp-list-count-summary').forEach(function (el) { div.appendChild(el); }); } p.replaceWith(div); }); } function purgeLoadingSummaries() { document.querySelectorAll('.tp-list-count-summary--loading').forEach(function (el) { el.remove(); }); document.querySelectorAll('.tp-search-hero__meta > .tp-list-count-summary--loading').forEach(function (el) { el.remove(); }); document.querySelectorAll('.tp-list-count--loading').forEach(function (el) { if (el.closest('.tp-search-hero__count, .tp-search-hero__meta, .tp-search-sidebar-count')) { el.remove(); } }); } function cleanupHeroMetaOrphans() { document.querySelectorAll('.tp-search-hero__meta').forEach(function (meta) { meta.querySelectorAll(':scope > .tp-list-count-summary').forEach(function (el) { el.remove(); }); }); } function setHero(html) { if (!html) return; normalizeHeroCountHosts(); cleanupHeroMetaOrphans(); document.querySelectorAll('.tp-search-hero__count').forEach(function (el) { el.innerHTML = html; }); if ( html.indexOf('tp-list-count-summary--loading') < 0 && html.indexOf('tp-list-count--loading') < 0 ) { purgeLoadingSummaries(); } } function setSidebar(html) { if (!html) return; document.querySelectorAll('.tp-search-sidebar-count').forEach(function (el) { el.innerHTML = html; }); } function setResult(html) { if (!html) return; var resultEl = document.getElementById('searchResultCount'); if (resultEl) resultEl.innerHTML = html; document.querySelectorAll('p.tp-search-result-count[data-station-filter-count]').forEach(function (el) { el.innerHTML = html; }); } function readPublishedFromHeroDataAttr() { if (!document || typeof document.querySelector !== 'function') return NaN; var hero = document.querySelector('.tp-search-hero__count'); if (!hero) return NaN; var publishedAttr = parseInt(String(hero.getAttribute('data-rssg-published-count') || ''), 10); return Number.isFinite(publishedAttr) && publishedAttr >= 0 ? publishedAttr : NaN; } function syncCounts(opts) { opts = opts || {}; var phase = resolvePhase(opts); var total = Number(opts.total); if (!Number.isFinite(total)) total = 0; var published = Number(opts.publishedTotal); if (!Number.isFinite(published)) { published = readPublishedFromHeroDataAttr(); } if (!Number.isFinite(published)) published = total; var meta = opts.meta || {}; var matchedHtml = renderMatchedHtml(phase, total); var resultHtml = renderResultHtml(phase, total, meta); var summaryHtml = renderSummaryDualHtml(phase, total, published); normalizeHeroCountHosts(); if (phase !== PHASE_LOADING) { purgeLoadingSummaries(); } setHero(summaryHtml); setSidebar(matchedHtml); setResult(resultHtml); if (phase !== PHASE_LOADING) { purgeLoadingSummaries(); } } return { PHASE_LOADING: PHASE_LOADING, PHASE_READY: PHASE_READY, PHASE_EMPTY: PHASE_EMPTY, PHASE_ERROR: PHASE_ERROR, LOADING_TEXT: LOADING_TEXT, loadingInnerHtml: loadingInnerHtml, loadingSummaryHtml: loadingSummaryHtml, formatNum: formatNum, resolvePhase: resolvePhase, renderMatchedHtml: renderMatchedHtml, renderResultHtml: renderResultHtml, renderSummaryDualHtml: renderSummaryDualHtml, normalizeHeroCountHosts: normalizeHeroCountHosts, purgeLoadingSummaries: purgeLoadingSummaries, syncCounts: syncCounts, }; });