/**
* 検索・駅・エリア一覧の件数表示(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,
};
});