Ersatzteil-Finder

Teile für Ihr CEYLAN-Dönermesser

Gerät wählen – Kreismesser, Netzgerät, Baugruppen und Einzelteile erscheinen sortiert auf einen Blick.

(function () { var DEVICES = { devran: { label: 'DEVRAN', query: 'DEVRAN', dia: '80', ng: ['3', '4', '5'] }, heran: { label: 'HERAN 2', query: 'HERAN', dia: '80', ng: ['3', '4'] }, seymen: { label: 'SEYMEN', query: 'SEYMEN', dia: '90', ng: ['3', '4', '5'] }, saran: { label: 'SARAN', query: 'SARAN', dia: '80', ng: ['5'] } }; var CAT_DEVICE = [84, 85, 86, 87, 88]; var CAT_ASSEMBLY = [89]; var CAT_PARTS = [90, 350, 352]; var SHOW = 8; var cache = {}; var current = null; function q(s, r) { return (r || document).querySelector(s); } function qa(s, r) { return Array.prototype.slice.call((r || document).querySelectorAll(s)); } function el(tag, cls, text) { var e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; } function low(s) { return String(s || '').toLowerCase(); } function inCat(x, list) { return x.cats.some(function (c) { return list.indexOf(c) > -1; }); } function search(query) { if (cache[query]) return cache[query]; cache[query] = fetch('/rest/io/item/search?query=' + encodeURIComponent(query) + '&itemsPerPage=60', { headers: { 'Accept': 'application/json' }, credentials: 'same-origin' }) .then(function (r) { if (!r.ok) throw new Error('http'); return r.json(); }) .then(function (json) { return ((((json || {}).data || {}).itemList || {}).documents || []).map(function (doc) { var d = doc.data || {}, img = ((d.images || {}).all || [])[0] || {}, path = (d.texts || {}).urlPath || '', id = (d.item || {}).id; return { id: String(id || ''), name: (d.texts || {}).name1 || '', number: (d.variation || {}).name || '', price: ((((d.prices || {}).default || {}).price) || {}).formatted || '', image: img.urlMiddle || img.urlPreview || '', url: path && id ? '/' + path.replace(/^\//, '') + '/a-' + id : '', cats: (d.defaultCategories || []).map(function (c) { return Number(c.id); }) }; }).filter(function (x) { return x.url && x.name; }); }) .catch(function () { delete cache[query]; return []; }); return cache[query]; } function merge(lists) { var seen = {}, out = []; lists.forEach(function (l) { l.forEach(function (x) { if (!seen[x.id]) { seen[x.id] = 1; out.push(x); } }); }); return out; } function build(dev, all) { var m = low(dev.query); var reDia = new RegExp('ø\\s*' + dev.dia + '\\b', 'i'); var reNg = new RegExp('\\bng\\s?(' + dev.ng.join('|') + ')\\b', 'i'); var used = {}; function take(list) { return list.filter(function (x) { if (used[x.id]) return false; used[x.id] = 1; return true; }); } function mentionsModel(x) { return low(x.name).indexOf(m) > -1; } var blades = take(all.filter(function (x) { return /kreismesser/i.test(x.name) && reDia.test(x.name); })); blades.sort(function (a, b) { var sa = mentionsModel(a) || /ceylan/i.test(a.name), sb = mentionsModel(b) || /ceylan/i.test(b.name); return sb - sa; }); var devices = take(all.filter(function (x) { return (inCat(x, CAT_DEVICE) || /elektrisches dönermesser/i.test(x.name)) && mentionsModel(x); })); var power = take(all.filter(function (x) { return /netzger(ä|a)t|netzteil/i.test(x.name) && reNg.test(x.name) || (inCat(x, [350]) && reNg.test(x.name)); })); var assemblies = take(all.filter(function (x) { return inCat(x, CAT_ASSEMBLY) && mentionsModel(x); })); var parts = take(all.filter(function (x) { return inCat(x, CAT_PARTS) && !/kreismesser/i.test(x.name) && (mentionsModel(x) || /alle ceylan|ceylan mod|für dönermesser|ceylan dö/i.test(x.name)); })); return [ { id: 'kreismesser', label: 'Kreismesser Ø ' + dev.dia, items: blades, more: '/schneidetechnik/kreismesser' }, { id: 'baugruppen', label: 'Baugruppen', items: assemblies, more: '/ersatzteile-service/doenermesser-baugruppen' }, { id: 'einzelteile', label: 'Einzelteile & Zubehör', items: parts, more: '/ersatzteile-service/doenermesser-einzelteile' }, { id: 'netzgeraet', label: 'Netzgerät & Elektrik', items: power, more: '/ersatzteile-service/elektro-ersatzteile' }, { id: 'geraete', label: 'Komplettgeräte', items: devices, more: '/schneidetechnik/elektrische-doenermesser' } ].filter(function (g) { return g.items.length; }); } function card(it) { var li = el('li', 'cy-finder__card'); li.setAttribute('data-cy-text', low(it.name + ' ' + it.number)); var a = el('a', 'cy-finder__link'); a.href = it.url; var fig = el('span', 'cy-finder__img'); if (it.image) { var img = el('img'); img.src = it.image; img.alt = ''; img.loading = 'lazy'; fig.appendChild(img); } a.appendChild(fig); var meta = el('span', 'cy-finder__meta'); meta.appendChild(el('span', 'cy-finder__num', it.number)); meta.appendChild(el('span', 'cy-finder__name', it.name)); if (it.price) meta.appendChild(el('span', 'cy-finder__price', it.price)); a.appendChild(meta); li.appendChild(a); return li; } function render(dev, groups) { var root = q('#cy-finder'), wrap = q('[data-cy-finder-groups]', root), jump = q('[data-cy-finder-jump]', root); wrap.textContent = ''; jump.textContent = ''; var total = 0; groups.forEach(function (g) { total += g.items.length; var a = el('a', 'cy-finder__jump-link'); a.href = '#cy-finder-' + g.id; a.appendChild(el('span', null, g.label)); a.appendChild(el('span', 'cy-finder__jump-count', String(g.items.length))); jump.appendChild(a); var sec = el('section', 'cy-finder__group'); sec.id = 'cy-finder-' + g.id; var head = el('div', 'cy-finder__group-head'); head.appendChild(el('h2', 'cy-finder__group-title', g.label)); head.appendChild(el('span', 'cy-finder__group-count', g.items.length + (g.items.length === 1 ? ' Artikel' : ' Artikel'))); sec.appendChild(head); var ul = el('ul', 'cy-finder__grid'); g.items.forEach(function (it, i) { var c = card(it); if (i >= SHOW) c.classList.add('is-extra'); ul.appendChild(c); }); sec.appendChild(ul); if (g.items.length > SHOW) { var btn = el('button', 'btn btn-outline-primary btn-sm cy-finder__more', 'Alle ' + g.items.length + ' anzeigen'); btn.type = 'button'; btn.addEventListener('click', function () { sec.classList.add('is-open'); btn.remove(); }); sec.appendChild(btn); } wrap.appendChild(sec); }); q('[data-cy-finder-status]', root).textContent = total ? total + ' passende Artikel für ' + dev.label + '.' : 'Keine Artikel gefunden.'; var mail = q('[data-cy-finder-mail]', root); mail.href = 'mailto:sale@ceylan-online.de?subject=' + encodeURIComponent('Ersatzteil gesucht: ' + dev.label) + '&body=' + encodeURIComponent('Gerät: ' + dev.label + '\nSeriennummer (Typenschild):\nGesuchtes Teil:\n\nBitte Fotos von Typenschild und Teil anhängen.\n'); } function loading() { var root = q('#cy-finder'), wrap = q('[data-cy-finder-groups]', root); q('[data-cy-finder-jump]', root).textContent = ''; q('[data-cy-finder-status]', root).textContent = 'Teile werden geladen …'; wrap.textContent = ''; var sec = el('div', 'cy-finder__group'); var ul = el('ul', 'cy-finder__grid'); for (var i = 0; i < 8; i++) { var li = el('li', 'cy-finder__card cy-finder__card--loading'); li.appendChild(el('span', 'cy-finder__ph cy-finder__ph--img')); li.appendChild(el('span', 'cy-finder__ph')); li.appendChild(el('span', 'cy-finder__ph cy-finder__ph--short')); ul.appendChild(li); } sec.appendChild(ul); wrap.appendChild(sec); } function select(key, push) { var dev = DEVICES[key]; if (!dev) return; current = key; var root = q('#cy-finder'); qa('[data-cy-device]', root).forEach(function (b) { var on = b.getAttribute('data-cy-device') === key; b.classList.toggle('is-active', on); b.setAttribute('aria-selected', on ? 'true' : 'false'); }); root.classList.add('has-selection'); q('[data-cy-finder-result]', root).hidden = false; q('[data-cy-finder-filter]', root).value = ''; if (push && history.replaceState) history.replaceState(null, '', '#' + key); loading(); var queries = [dev.query, 'Kreismesser ' + dev.dia, 'Netzgerät'].concat(dev.ng.map(function (n) { return 'NG' + n; })); Promise.all(queries.map(search)).then(function (lists) { if (current !== key) return; render(dev, build(dev, merge(lists))); }); } function images() { Object.keys(DEVICES).forEach(function (key) { var dev = DEVICES[key]; search(dev.query).then(function (list) { var hit = list.filter(function (x) { return (inCat(x, CAT_DEVICE) || /elektrisches dönermesser/i.test(x.name)) && low(x.name).indexOf(low(dev.query)) > -1 && x.image; })[0]; var slot = q('[data-cy-device="' + key + '"] [data-cy-device-img]'); if (!slot || slot.firstChild) return; if (hit) { var img = el('img'); img.src = hit.image; img.alt = ''; slot.appendChild(img); } else { slot.classList.add('is-noimg'); slot.textContent = 'Ø ' + dev.dia; } }); }); } document.addEventListener('click', function (e) { var b = e.target.closest && e.target.closest('#cy-finder [data-cy-device]'); if (b) select(b.getAttribute('data-cy-device'), true); }); document.addEventListener('input', function (e) { if (!e.target.matches || !e.target.matches('[data-cy-finder-filter]')) return; var v = low(e.target.value).trim(); var root = q('#cy-finder'); root.classList.toggle('is-filtering', !!v); qa('.cy-finder__card', root).forEach(function (c) { c.hidden = v && (c.getAttribute('data-cy-text') || '').indexOf(v) < 0; }); qa('.cy-finder__group', root).forEach(function (s) { s.hidden = v && !qa('.cy-finder__card:not([hidden])', s).length; }); }); function init() { var root = q('#cy-finder'); if (!root || root.getAttribute('data-ready')) return; root.setAttribute('data-ready', '1'); images(); var h = (location.hash || '').replace('#', '').toLowerCase(); if (DEVICES[h]) select(h, false); } window.addEventListener('hashchange', function () { var h = (location.hash || '').replace('#', '').toLowerCase(); if (DEVICES[h] && h !== current) select(h, false); }); if (document.readyState === 'complete') init(); else window.addEventListener('load', init); setTimeout(init, 1500); })();