/** * 一覧ページ検索サイドバー * 条件検索・掲載中(?view=all): #searchForm(条件検索と同一 DOM) * 駅・エリア: data-station-filter-form(絞り込み専用フォーム) */ (function (root, factory) { if (typeof module === 'object' && module.exports) { module.exports = factory(); } else { root.StationSearchSidebar = factory(); } })(typeof globalThis !== 'undefined' ? globalThis : this, function () { 'use strict'; function escHtml(s) { return String(s == null ? '' : s) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"'); } function publicPathPrefix() { if (typeof globalThis !== 'undefined' && globalThis.RakusumoPublicPath && typeof globalThis.RakusumoPublicPath.getPrefix === 'function') { return globalThis.RakusumoPublicPath.getPrefix(); } if (typeof globalThis !== 'undefined' && typeof globalThis.__RAKUSUMO_PUBLIC_PATH_PREFIX__ === 'string') { return globalThis.__RAKUSUMO_PUBLIC_PATH_PREFIX__; } return ''; } function publicSiteHref(segment) { var pre = publicPathPrefix(); var seg = String(segment == null ? '' : segment).replace(/^\/+|\/+$/g, ''); if (!seg) return pre === '' ? '/' : pre + '/'; return (pre === '' ? '' : pre) + '/' + seg + '/'; } var RENT_MIN_OPTIONS = [ { value: '40000', label: '4万円以上' }, { value: '50000', label: '5万円以上' }, { value: '60000', label: '6万円以上' }, { value: '70000', label: '7万円以上' }, { value: '80000', label: '8万円以上' }, { value: '90000', label: '9万円以上' }, ]; var RENT_MAX_OPTIONS = [ { value: '60000', label: '6万円以下' }, { value: '70000', label: '7万円以下' }, { value: '80000', label: '8万円以下' }, { value: '90000', label: '9万円以下' }, { value: '100000', label: '10万円以下' }, { value: '120000', label: '12万円以下' }, { value: '150000', label: '15万円以下' }, { value: '200000', label: '20万円以下' }, ]; var LAYOUT_OPTIONS = ['1R', '1K', '1DK', '1LDK', '2K', '2DK', '2LDK', '3K', '3DK', '3LDK+']; var WALK_OPTIONS = [ { value: '5', label: '5分以内' }, { value: '7', label: '7分以内' }, { value: '10', label: '10分以内' }, { value: '15', label: '15分以内' }, ]; var BUILT_OPTIONS = [ { value: 'new', label: '新築・築浅' }, { value: '5', label: '築5年以内' }, { value: '10', label: '築10年以内' }, { value: '20', label: '築20年以内' }, { value: '30', label: '築30年以内' }, ]; var WARD_OPTIONS = ['横浜市青葉区', '横浜市緑区', '町田市']; /** フォーム表示用(条件検索と同一) */ var KODAWARI_TILES = [ { name: 'k_pet', label: 'ペット相談・ペット可', feature: 'pet' }, { name: 'k_bt', label: 'バス・トイレ別', feature: 'btSep' }, { name: 'k_parking', label: '駐車場あり', feature: 'parking' }, { name: 'k_autolock', label: 'オートロック', feature: 'autolock' }, { name: 'k_netfree', label: 'ネット無料', feature: 'netfree' }, { name: 'k_laundry', label: '室内洗濯機置場', feature: 'laundry' }, { name: 'k_reheat', label: '追い焚き', feature: 'reheat' }, { name: 'k_sink', label: '独立洗面台', feature: 'sink' }, { name: 'k_ac', label: 'エアコン', feature: 'ac' }, { name: 'k_floor2', label: '2階以上', feature: 'floor2' }, { name: 'k_corner', label: '角部屋', feature: 'corner' }, { name: 'k_nosk', label: '敷金なし', feature: 'nosk' }, { name: 'k_nokey', label: '礼金なし', feature: 'nokey' }, { name: 'k_noskm', label: '敷金・礼金なし', feature: 'noskm' }, ]; function selectOptionsHtml(options, emptyLabel) { return ( '' + options .map(function (o) { return ''; }) .join('') ); } function sidebarCountLoadingHtml() { if (typeof PropertyListCount !== 'undefined' && PropertyListCount.loadingInnerHtml) { return PropertyListCount.loadingInnerHtml(); } return ( '物件を読み込み中…' ); } function kodawariTilesHtml() { return KODAWARI_TILES.map(function (t) { return ( '' ); }).join(''); } function wardTilesHtml() { return WARD_OPTIONS.map(function (w) { return ( '' ); }).join(''); } function layoutTilesHtml() { return LAYOUT_OPTIONS.map(function (lv) { return ( '' ); }).join(''); } function hiddenInputsHtml(hidden) { hidden = hidden || {}; return Object.keys(hidden) .map(function (k) { return ( '' ); }) .join(''); } /** 条件検索 rssg_render_search_filters_form_html と同一構造 */ function renderSearchFiltersFormHtml(opts) { opts = opts || {}; var action = escHtml(opts.formAction || publicSiteHref('search')); var hidden = hiddenInputsHtml(opts.hidden || {}); return ( '
' + hidden + '
' + '

キーワード

' + '' + '' + '
' + (opts.regionFixedHtml || '') + '
' + '

エリア

' + '
' + '市区' + '
' + '

市区は複数選択できます。

' + '
' + wardTilesHtml() + '
' + '

駅・路線

' + '
路線' + '

路線を選ぶと駅を絞れます。

' + '
' + '
' + '
' + '
' + '' + '
' + '' + '
' + '

賃料

' + '
月額賃料' + '
' + '
' + '
' + '
' + '
' + '

間取り

' + '
間取りタイプ' + '
' + layoutTilesHtml() + '
' + '

駅徒歩

' + '
徒歩分数' + '
' + '' + '
' + '

築年数

' + '
築年' + '
' + '' + '
' + '

設備・条件

' + '
こだわり条件' + '
' + '
' + kodawariTilesHtml() + '
' + '
' ); } var STATION_KODAWARI_TILES = [ { name: 'k_pet', label: 'ペット相談・ペット可', feature: 'pet' }, { name: 'k_bt', label: 'バス・トイレ別', feature: 'btSep' }, { name: 'k_parking', label: '駐車場あり', feature: 'parking' }, { name: 'k_autolock', label: 'オートロック', feature: 'autolock' }, { name: 'k_netfree', label: 'ネット無料', feature: 'netfree' }, { name: 'k_laundry', label: '室内洗濯機置場', feature: 'laundry' }, { name: 'k_sink', label: '独立洗面台', feature: 'sink' }, { name: 'k_ac', label: 'エアコン', feature: 'ac' }, { name: 'k_floor2', label: '2階以上', feature: 'floor2' }, { name: 'k_noskm', label: '敷金・礼金なし', feature: 'noskm' }, ]; var AREA_MIN_OPTIONS = [ { value: '20', label: '20㎡以上' }, { value: '25', label: '25㎡以上' }, { value: '30', label: '30㎡以上' }, { value: '40', label: '40㎡以上' }, { value: '50', label: '50㎡以上' }, ]; var AREA_MAX_OPTIONS = [ { value: '30', label: '30㎡以下' }, { value: '40', label: '40㎡以下' }, { value: '50', label: '50㎡以下' }, { value: '60', label: '60㎡以下' }, { value: '80', label: '80㎡以下' }, ]; function stationKodawariTilesHtml() { return STATION_KODAWARI_TILES.map(function (t) { return ( '' ); }).join(''); } /** 駅・エリア用絞り込みフォーム(条件検索フォーム丸ごとではない) */ function renderStationFilterFormHtml(opts) { opts = opts || {}; var regionFixedHtml = ''; if (opts.regionKind === 'area' && opts.regionLabel) { regionFixedHtml = '

エリア

' + '

' + escHtml(opts.regionLabel) + '

'; } return ( '
' + regionFixedHtml + '

賃料

' + '
月額賃料' + '
' + '
' + '
' + '
' + '
' + '

間取り

' + '
間取りタイプ' + '
' + layoutTilesHtml() + '
' + '

駅徒歩

' + '
徒歩分数' + '
' + '' + '
' + '

築年数

' + '
築年' + '
' + '' + '
' + '

専有面積

' + '
面積(㎡)' + '
' + '
' + '
' + '
' + '
' + '

設備・条件

' + '
こだわり条件' + '
' + '
' + stationKodawariTilesHtml() + '
' + '
' + '' + '' + '
' ); } function renderStationFilterSidebarHtml(countNum, opts) { opts = opts || {}; var title = escHtml(opts.title || '絞り込み検索'); var lead = escHtml( opts.lead || (opts.regionKind === 'area' && opts.regionLabel ? '条件を選ぶと、' + opts.regionLabel + 'の物件だけを絞り込めます。' : opts.regionKind === 'station' && opts.regionLabel ? '条件を選ぶと、' + opts.regionLabel + '周辺の物件だけを絞り込めます。' : '賃料・間取り・設備条件で物件を絞り込めます。'), ); var countHtml = typeof countNum === 'number' && countNum >= 0 ? '該当 ' + escHtml(String(countNum)) + '' : sidebarCountLoadingHtml(); return ( '
' + '
' + '

' + title + '

' + '

' + lead + '

' + '

' + countHtml + '

' + '' + '' + '
' + '
' + renderStationFilterFormHtml(opts) + '
' ); } function renderFilterSidebarHtml(countNum, opts) { opts = opts || {}; var title = escHtml(opts.title || '検索条件'); var lead = escHtml( opts.lead || (opts.regionKind === 'area' && opts.regionLabel ? '条件を選ぶと、' + opts.regionLabel + 'の物件だけを絞り込めます。' : opts.regionKind === 'station' && opts.regionLabel ? '条件を選ぶと、' + opts.regionLabel + '周辺の物件だけを絞り込めます。' : '条件を変更すると結果に反映されます。'), ); var regionFixedHtml = ''; if (opts.regionKind === 'area' && opts.regionLabel) { regionFixedHtml = '

エリア

' + '

' + escHtml(opts.regionLabel) + '

'; } else if (opts.regionKind === 'station' && opts.regionLabel) { regionFixedHtml = '

' + '

' + escHtml(opts.regionLabel) + '

'; } var formHtml = renderSearchFiltersFormHtml({ formAction: opts.formAction || publicSiteHref('search'), hidden: opts.hidden || {}, regionFixedHtml: regionFixedHtml, }); return ( '
' + '
' + '

' + title + '

' + '

' + lead + '

' + '

' + sidebarCountLoadingHtml() + '

' + '' + '' + '
' + '
' + formHtml + '
' ); } function kodawariCheckboxNames() { return KODAWARI_TILES.map(function (t) { return t.name; }); } function kodawariFeaturesFromForm(form) { if (!form) return []; var out = []; KODAWARI_TILES.forEach(function (t) { if (!t.feature) return; var el = form.querySelector('[name="' + t.name + '"]'); if (el && el.checked) out.push(t.feature); }); return out; } function setFieldValue(form, sel, v) { if (v == null || v === '') return; var el = form.querySelector(sel); if (el && 'value' in el) el.value = v; } function applyFormFromUrl(form, params, opts) { if (!form || !params) return; opts = opts || {}; form.querySelectorAll('input[type="checkbox"]').forEach(function (inp) { inp.checked = false; }); form.querySelectorAll('select').forEach(function (sel) { sel.value = ''; }); var areaKw = form.querySelector('#areaKw'); if (areaKw) areaKw.value = params.get('areaKw') || params.get('q') || ''; setFieldValue(form, '#rentMin', params.get('rentMin') || ''); setFieldValue(form, '#rentMax', params.get('rentMax') || ''); setFieldValue(form, '#walkMax', params.get('walkMax') || ''); setFieldValue(form, '#built', params.get('built') || params.get('builtAgeMax') || ''); var wardRaw = params.get('ward'); if (wardRaw) { wardRaw.split(',').forEach(function (raw) { var n = decodeURIComponent(String(raw || '').trim()); if (!n) return; var inp = Array.prototype.slice .call(form.querySelectorAll('input[name="ward"]')) .find(function (i) { return i.value === n; }); if (inp) inp.checked = true; }); } var layoutValues = params.getAll('layout'); if (!layoutValues.length && params.get('layout')) layoutValues = [params.get('layout')]; Array.prototype.forEach.call(form.querySelectorAll('input[name="layout"]'), function (inp) { inp.checked = layoutValues.indexOf(inp.value) >= 0; }); kodawariCheckboxNames().forEach(function (k) { var cb = form.querySelector('[name="' + k + '"]'); if (cb) cb.checked = params.get(k) === 'on' || params.get(k) === '1'; }); var stValues = params.getAll('st'); if (!stValues.length && params.get('st')) stValues = [params.get('st')]; Array.prototype.forEach.call(form.querySelectorAll('input[name="st"]'), function (inp) { inp.checked = stValues.indexOf(inp.value) >= 0 || stValues.indexOf(inp.value.replace(/駅$/, '')) >= 0 || stValues.indexOf(inp.value + '駅') >= 0; }); if (opts.lockStation && opts.lockStationLabel) { var lockName = String(opts.lockStationLabel).replace(/駅$/, '') + '駅'; Array.prototype.forEach.call(form.querySelectorAll('input[name="st"]'), function (inp) { inp.checked = inp.value === lockName || inp.value === opts.lockStationLabel; }); } if (opts.lockWard && opts.lockWardLabel) { Array.prototype.forEach.call(form.querySelectorAll('input[name="ward"]'), function (inp) { inp.checked = inp.value === opts.lockWardLabel; }); } syncAccordionOpenState(form); } function syncUrlFromForm(form, baseUrl, opts) { if (!form) return; opts = opts || {}; try { var u = new URL(baseUrl || location.href); var preserve = opts.preserveParams || []; preserve.forEach(function (k) { if (!u.searchParams.has(k) && opts.staticParams && opts.staticParams[k]) { u.searchParams.set(k, opts.staticParams[k]); } }); if (opts.staticParams) { Object.keys(opts.staticParams).forEach(function (k) { u.searchParams.set(k, opts.staticParams[k]); }); } [ 'areaKw', 'rentMin', 'rentMax', 'walkMax', 'built', 'sort', 'q', ].forEach(function (k) { u.searchParams.delete(k); }); u.searchParams.delete('layout'); kodawariCheckboxNames().forEach(function (k) { u.searchParams.delete(k); }); u.searchParams.delete('st'); u.searchParams.delete('ward'); var areaKwEl = form.querySelector('#areaKw'); var areaKw = areaKwEl ? String(areaKwEl.value || '').trim() : ''; if (areaKw) u.searchParams.set('areaKw', areaKw); ['rentMin', 'rentMax', 'walkMax', 'built'].forEach(function (name) { var el = form.querySelector('[name="' + name + '"]'); if (el && el.value) u.searchParams.set(name, el.value); }); Array.prototype.forEach.call(form.querySelectorAll('input[name="layout"]:checked'), function (inp) { u.searchParams.append('layout', inp.value); }); Array.prototype.forEach.call(form.querySelectorAll('input[name="st"]:checked'), function (inp) { u.searchParams.append('st', inp.value); }); Array.prototype.forEach.call(form.querySelectorAll('input[name="ward"]:checked'), function (inp) { u.searchParams.append('ward', inp.value); }); kodawariCheckboxNames().forEach(function (k) { var cb = form.querySelector('[name="' + k + '"]'); if (cb && cb.checked) u.searchParams.set(k, 'on'); }); var qs = u.searchParams.toString(); history.replaceState(null, '', u.pathname + (qs ? '?' + qs : '') + (u.hash || '')); } catch (_e) { /* noop */ } } function formHasActiveFilters(form) { if (!form) return false; var areaKw = form.querySelector('#areaKw'); if (areaKw && String(areaKw.value || '').trim()) return true; if (form.querySelector('input[name="ward"]:checked')) return true; if (form.querySelector('input[name="st"]:checked')) return true; if (form.querySelector('input[name="layout"]:checked')) return true; var selects = ['rentMin', 'rentMax', 'walkMax', 'built', 'areaMin', 'areaMax']; for (var i = 0; i < selects.length; i++) { var el = form.querySelector('[name="' + selects[i] + '"]'); if (el && el.value) return true; } for (var ki = 0; ki < KODAWARI_TILES.length; ki++) { var cb = form.querySelector('[name="' + KODAWARI_TILES[ki].name + '"]'); if (cb && cb.checked) return true; } for (var si = 0; si < STATION_KODAWARI_TILES.length; si++) { var scb = form.querySelector('[name="' + STATION_KODAWARI_TILES[si].name + '"]'); if (scb && scb.checked) return true; } return false; } function accordionBodyHasActiveFields(body) { if (!body) return false; var selects = body.querySelectorAll('select'); for (var i = 0; i < selects.length; i++) { if (String(selects[i].value || '').trim() !== '') return true; } var checks = body.querySelectorAll('input[type="checkbox"]:checked'); for (var j = 0; j < checks.length; j++) { if (checks[j].id === 'stationShowAll') continue; return true; } var textInputs = body.querySelectorAll('input[type="search"], input[type="text"]'); for (var k = 0; k < textInputs.length; k++) { if (String(textInputs[k].value || '').trim() !== '') return true; } return false; } function syncAccordionOpenState(form) { if (!form) return; form.querySelectorAll('.tp-search-acc').forEach(function (det) { var body = det.querySelector('.tp-search-acc__body'); if (accordionBodyHasActiveFields(body)) { det.setAttribute('open', ''); } else { det.removeAttribute('open'); } }); } return { renderFilterSidebarHtml: renderFilterSidebarHtml, renderStationFilterSidebarHtml: renderStationFilterSidebarHtml, renderStationFilterFormHtml: renderStationFilterFormHtml, renderSearchFiltersFormHtml: renderSearchFiltersFormHtml, kodawariFeaturesFromForm: kodawariFeaturesFromForm, kodawariCheckboxNames: kodawariCheckboxNames, applyFormFromUrl: applyFormFromUrl, syncUrlFromForm: syncUrlFromForm, formHasActiveFilters: formHasActiveFilters, syncAccordionOpenState: syncAccordionOpenState, KODAWARI_TILES: KODAWARI_TILES, }; });