{# <div id="recommendationsDebug">
{#<div id="queryData" style="display: none;"></div><a href="javascript:void(0);" id="showQueryBtn">Показать запрос</a>#!}
<div id="profileViewsData">
<h6 style="color: #1ea471">Просмотры анкет на сайте</h6>
{% set profile_debug_data = profile_recommendations_debug_views() %}
{% include "Recommendations/_profile_recommendations_debug_profile_data_table.html.twig" %}
</div>
<div id="favouritesData">
<h6 style="color: #0d5aa7">Избранные</h6>
{% set profile_debug_data = profile_recommendations_debug_favourites() %}
{% include "Recommendations/_profile_recommendations_debug_profile_data_table.html.twig" %}
</div>
{% include "Recommendations/_profile_recommendations_debug_coeffs_data_table.html.twig" %}
<h6 style="color: #bd2130">Коэффициенты</h6>
<div id="coeffsData"></div>
{% include "Recommendations/_profile_recommendations_debug_viewed_profiles_data_table.html.twig" %}
<h6 style="color: #856404">Просмотренные рекомендации</h6>
<div id="viewedRecommendationsData"></div>
</div> #}
{% set isHiddenPlacement = hidden is defined and hidden %}
<div class="recommended{{ componentClass is defined ? ' ' ~ componentClass : '' }}"{{ isHiddenPlacement ? ' style="display:none"' : '' }} id="profileRecommendations">
<h2 class="border-line">Рекомендуемые</h2>
<div class="recommended-list d-flex" id="profileRecommendationsContainer">
{% for i in 1..6 %}
<div class="recommended-item recommended-item--skeleton">
<div class="recommended-profile">
<div class="d-block recommended-link">
<div class="recommended-heading skeleton"></div>
<div class="recommended-avatar skeleton"></div>
</div>
<div class="d-flex align-items-center recommended-info skeleton"></div>
<div class="d-flex align-items-center recommended-metro skeleton"></div>
</div>
</div>
{% endfor %}
</div>
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
const sortLines = (data) => {
{#// Инициализация объекта для хранения станций в соответствии с их типом#}
const sortedStations = data.reduce((acc, station) => {
if (station.name.startsWith('МЦД-')) {
acc.mcd.push(station);
} else if (station.name === 'МЦК') {
acc.mck.push(station);
} else {
acc.ordinary.push(station);
}
return acc;
}, { ordinary: [], mcd: [], mck: [] });
{#// Сортировка станций МЦД по номеру#}
sortedStations.mcd.sort((a, b) => {
const numA = parseInt(a.name.split('МЦД-')[1]);
const numB = parseInt(b.name.split('МЦД-')[1]);
return numA - numB;
});
{#// Объединение отсортированных станций#}
const result = [
...sortedStations.ordinary,
...sortedStations.mcd,
...sortedStations.mck
];
return result;
};
const iconMetroSingle = ({color, iconId, width = '18'}) => {
return `<svg class="modal-list__icon" width="${width}" height="18">
<use style="fill:#${color}" class="icon-container--element" xlink:href="#${iconId}"></use>
</svg>`
};
const iconMetroDouble = ({color1, color2}) => `
<svg class="modal-list__icon" width="17" height="16" fill="none">
<path fill="#8E8E8E" d="M3.7 8.83h-.77v1.04h3.94V8.83H5.7l.76-2.59L8.5 9.96l2.03-3.72.76 2.6h-1.16v1.03h3.94V8.83h-.78L10.7 2 8.5 6.51 6.3 2 3.7 8.83Z"/>
<rect width="7" height="3" x=".5" y="11.02" fill="#${color1}" rx="1.5"/>
<rect width="7" height="3" x="9.5" y="11" fill="#${color2}" rx="1.5"/>
</svg>`;
const iconMetroTriple = ({color1, color2, color3}) => `<svg class="modal-list__icon" width="17" height="16" fill="none">
<path fill="#8E8E8E" d="M3.7 8.83h-.77v1.04h3.94V8.83H5.7l.76-2.59L8.5 9.96l2.03-3.72.76 2.6h-1.16v1.03h3.94V8.83h-.78L10.7 2 8.5 6.51 6.3 2 3.7 8.83Z"/>
<rect width="4" height="3" x=".5" y="11.02" fill="#${color1}" rx="1.5"/>
<rect width="4" height="3" x="6.5" y="11.02" fill="#${color2}" rx="1.5"/>
<path fill="#${color3}" d="M12.5 12.5c0-.83.67-1.5 1.5-1.5h1a1.5 1.5 0 0 1 0 3h-1a1.5 1.5 0 0 1-1.5-1.5Z"/>
</svg>`;
const getAllData = (s) => [s.color, s.name];
const getIconId = (name) => name.toLowerCase().includes('мцк') ? 'mck' : (name.toLowerCase().includes('мцд') ? 'mcd-' + name.split('-')[1] : 'metro');
const getIconWidth = (name) => name.toLowerCase().includes('мцд') ? '22' : '16';
const wrapperIcon = (str) => `<span class="modal-list__icons d-flex">${str}</span>`;
const wrapperLink = (html, _name) => `<a class="modal-list__icons d-flex" href="${window._mp.stations[_name]}">${html}</a>`;
function iconGen2({name, dataLines}) {
{#//for test#}
const root = document.getElementById('icon-test-gen2');
const lines = sortLines(dataLines);
const count = lines.length;
{#// Если линия 1шт#}
if (count === 1){
{#// Получаем данные по цветам и названиям линии#}
const [color, line_name] = getAllData(lines[0]);
{#// Иконка может быть обычным метро, мцд с номером или мцк#}
const iconId = getIconId(line_name);
const width = getIconWidth(line_name);
return wrapperLink(wrapperIcon(iconMetroSingle({color, iconId, width})+ name), name);
{#//return wrapperIcon(iconMetroSingle({color, iconId, width}));#}
} else if (count === 2) {
const [[color1, name1], [color2, name2]] = lines.map(getAllData);
const iconId1 = getIconId(name1);
const iconId2 = getIconId(name2);
{#// Если обе иконки это метро#}
if (iconId1 === 'metro' && iconId2 === 'metro') {
return wrapperLink(wrapperIcon(`${iconMetroDouble({color1, color2})} ${name}`), name);
} else {
const width1 = getIconWidth(name1);
const width2 = getIconWidth(name2);
return wrapperLink(wrapperIcon(`${iconMetroSingle({ color: color1, iconId: iconId1, width: width1 })}${iconMetroSingle({ color: color2, iconId: iconId2, width: width2 })} ${name}`), name);
}
} else if (count === 3) {
const [[color1, name1], [color2, name2], [color3, name3]] = lines.map(getAllData);
const iconId1 = getIconId(name1);
const iconId2 = getIconId(name2);
const iconId3 = getIconId(name3);
if (iconId1 === 'metro' && iconId2 === 'metro' && iconId3 === 'metro') {
return wrapperLink(wrapperIcon(`${iconMetroTriple({color1, color2, color3})} ${name}`), name);
} else if (iconId1 === 'metro' && iconId2 === 'metro') {
const width3 = getIconWidth(name3);
return wrapperLink(wrapperIcon(`${iconMetroDouble({color1, color2})}${iconMetroSingle({ color: color3, iconId: iconId3, width: width3 })} ${name}`), name);
} else {
const width1 = getIconWidth(name1);
const width2 = getIconWidth(name2);
const width3 = getIconWidth(name3);
return wrapperLink(wrapperIcon(`${iconMetroSingle({ color: color1, iconId: iconId1, width: width1 })}${iconMetroSingle({ color: color2, iconId: iconId2, width: width2 })}${iconMetroSingle({ color: color3, iconId: iconId3, width: width3 })} ${name}`), name);
}
} else if (count === 4) {
const [[color1, name1], [color2, name2], [color3, name3], [color4, name4]] = lines.map(getAllData);
const iconId1 = getIconId(name1);
const iconId2 = getIconId(name2);
const iconId3 = getIconId(name3);
const iconId4 = getIconId(name4);
if (iconId1 === 'metro' && iconId2 === 'metro' && iconId3 === 'metro') {
const width4 = getIconWidth(name4);
return wrapperLink(wrapperIcon(`${iconMetroTriple({color1, color2, color3})}${iconMetroSingle({ color: color4, iconId: iconId4, width: width4 })} ${name}`), name);
} else if (iconId1 === 'metro' && iconId2 === 'metro') {
const width3 = getIconWidth(name3);
const width4 = getIconWidth(name4);
return wrapperLink(wrapperIcon(`${iconMetroDouble({color1, color2})}${iconMetroSingle({ color: color3, iconId: iconId3, width: width3 })}${iconMetroSingle({ color: color4, iconId: iconId4, width: width4 })} ${name}`), name);
} else {
const width1 = getIconWidth(name1);
const width2 = getIconWidth(name2);
const width3 = getIconWidth(name3);
const width4 = getIconWidth(name4);
return wrapperLink(wrapperIcon(`${iconMetroSingle({ color: color1, iconId: iconId1, width: width1 })}${iconMetroSingle({ color: color2, iconId: iconId2, width: width2 })}${iconMetroSingle({ color: color3, iconId: iconId3, width: width3 })}${iconMetroSingle({ color: color4, iconId: iconId4, width: width4 })} ${name}`), name);
}
}
return wrapperLink(name, name);
}
function fetchRecommendations() {
{% set gender = 'profile_list.list_by_gender' in app.request.get('_route') ? app.request.get('gender')|gender_value_by_uri : gender_female() %}
let url = '{{ path('recommendations.get', {city:app.request.get('city').uriIdentity, count: 6, imageSize: '357x500', exclude: (excludeRecommendationProfileIds is iterable ? excludeRecommendationProfileIds : [])|join(','), gender: gender }) }}';
let filter = JSON.parse('{{ recommendationSpec ? recommendationSpec.spec.toEsQueryObject|json_encode|raw : {}|json_encode|raw }}');
const profileContainer = document.getElementById('profileRecommendations');
window.Recommendation.updateSettings({
rootId: 'profileRecommendations',
url,
filter,
callback: (response) => {
let template = '';
const container = document.querySelector('#profileRecommendationsContainer');
container.innerHTML = '';
response.profiles.forEach(function(profile) {
const {station, price, phone} = profile;
template = `
<a class="d-block recommended-link" href="${profile.url}" target="_blank">
<p class="recommended-heading">
${profile.approved ? `<svg class="icon">
<use xlink:href="{{ asset('assets_domain/images/icons/svg-library.svg', 'nodomainConfig') }}#icon-verify-new"></use>
</svg>` : ''}
<span class="recommended-name"><span class="name">${profile.name}</span>, <span class="age">${profile.age}</span></span>
</p>
<div class="recommended-avatar">
<img class="recommended-avatar-img" src="${profile.image}" alt="" width="281" height="394" loading="lazy">
</div>
</a>
<div class="d-flex align-items-center recommended-info">
<div class="recommended-phone phone">${phone}</div>
${price ? `<div class="ml-auto recommended-price price">от ${price.toLocaleString('ru')}</div>` : ''}
</div>
<div class="d-flex align-items-center recommended-metro">
${station ? `<div class="metro-item d-flex">${iconGen2({name: station.name, dataLines: station.lines})}</div>` : ''}
</div>
`;
const node = document.createElement('div');
node.className = 'recommended-item';
node.dataset.profileId = profile.id;
node.innerHTML = `<div class="recommended-profile">${template}</div>`;
container.appendChild(node);
});
profileContainer.style.display = 'block';
document.dispatchEvent(new CustomEvent('recommendations:loaded', {detail: {id: 'recommendations'}}));
}
});
{% if not isHiddenPlacement %}window.Recommendation.loadRecommendations();{% endif %}
}
window.ObserverJakka({
id: 'recommendations',
callback: () => {
fetchRecommendations();
},
options: {
rootMargin: '120px'
}
});
});
</script>