Android Radio Konfigurator: Unterschied zwischen den Versionen

Aus Wiki rund um Android-Navis für BMW E38/E39/E46/E53
Wechseln zu: Navigation, Suche
Zeile 32: Zeile 32:
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}
#nvk .nvk-card.hl{border:2px solid #36c;border-left-width:8px;background:rgba(51,102,204,.12);padding:12px 14px}
#nvk .nvk-card.hl b{font-size:1.1em}
#nvk .nvk-card.hl b{font-size:1.1em}
#nvk .nvk-row{display:flex;flex-wrap:wrap;gap:4px 12px;align-items:baseline;padding:2px 0;border-bottom:1px solid rgba(128,128,128,.3)}
#nvk .nvk-row label{flex:1;margin:0;min-width:240px}
#nvk .nvk-row a{white-space:nowrap;font-weight:600}
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}
#nvk .nvk-img.wide{max-width:min(100%,460px);max-height:none}
#nvk #nvk-form{margin-top:22px}
#nvk #nvk-form{margin-top:22px}
Zeile 99: Zeile 102:
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */
/* Shop-Anbindung: API = radios.php (liefert Radio-Liste und Artikelnummern). Warenkorb = Shopware-Link pro Artikelnummer. */
var API = "https://xtrons.ibus-app.de/radios.php";
var API = "https://xtrons.ibus-app.de/radios.php";
var CART_ADD = "https://shop.ibus-app.de/checkout/addArticle/sAdd/";
/* CART_TRANSFER = true: Warenkorb-Button öffnet den Shop mit ?nvk=ARTIKELNUMMERN. Das funktioniert nur, wenn im Shop das Skript shop-warenkorb-uebergabe.js eingebunden ist. */
var CART_TRANSFER = true;
var CART = "https://shop.ibus-app.de/checkout/cart";
var CART = "https://shop.ibus-app.de/checkout/cart";
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */
/* Rechtliche Seiten (Links unter dem Konfigurator und beim Datenschutz-Haken). Leer = Link wird nicht angezeigt. */
Zeile 294: Zeile 298:
   ===================================================================== */
   ===================================================================== */
var $ = function (id) { return document.getElementById(id); };
var $ = function (id) { return document.getElementById(id); };
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0, radioCache = {}, chosenRadio = null;
var sel = {}, picked = {}, summary = "", capA = 0, capB = 0, radioCache = {}, chosenRadio = null, cartFill = null;
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
var fieldsEl = $("nvk-fields"), optsEl = $("nvk-opts"), outEl = $("nvk-out");
function full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); }
function full(u) { return u.indexOf("/thumb/") === -1 ? u : u.replace("/thumb/", "/").replace(/\/[^\/]+$/, ""); }
Zeile 452: Zeile 456:
   sm.textContent = "Verfügbare Radios für Deinen BMW " + veh.t + " (" + list.length + ")"; det.appendChild(sm);
   sm.textContent = "Verfügbare Radios für Deinen BMW " + veh.t + " (" + list.length + ")"; det.appendChild(sm);
   list.forEach(function (it) {
   list.forEach(function (it) {
     var d = document.createElement("div"); d.className = "nvk-card rad";
     var row = document.createElement("div"); row.className = "nvk-row";
     var lab = document.createElement("label"); lab.className = "nvk-o";
     var lab = document.createElement("label"); lab.className = "nvk-o";
     var rb = document.createElement("input"); rb.type = "radio"; rb.name = "nvk-radio";
     var rb = document.createElement("input"); rb.type = "radio"; rb.name = "nvk-radio";
     rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;
     rb.checked = chosenRadio ? chosenRadio.sku === it.sku : false;
     rb.addEventListener("change", function () { chosenRadio = it; });
     rb.addEventListener("change", function () { chosenRadio = it; if (cartFill) cartFill(); });
    var sp = document.createElement("span"); sp.style.fontWeight = "700";
     lab.appendChild(rb);
    sp.textContent = " " + it.type + (fits(it) ? "  (passt zu Deiner Auswahl)" : "");
    lab.appendChild(document.createTextNode(" " + it.name + (it.price ? "  -  " + it.price : "") + (fits(it) ? "  (passt zu Deiner Auswahl)" : "")));
     lab.appendChild(rb); lab.appendChild(sp); d.appendChild(lab);
     row.appendChild(lab); row.appendChild(link(it.url, "Shop →"));
    var t = document.createElement("div"); t.textContent = it.name + (it.price ? "  -  " + it.price : ""); d.appendChild(t);
     det.appendChild(row);
     var l = document.createElement("div"); l.className = "nvk-links"; l.appendChild(link(it.url, "Im Shop ansehen →")); d.appendChild(l);
     det.appendChild(d);
   });
   });
   outEl.appendChild(det);
   outEl.appendChild(det);
Zeile 474: Zeile 476:
   p.textContent = "Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:";
   p.textContent = "Das oben gewählte Radio (falls ausgewählt) und diese Artikel werden direkt im Shop in den Warenkorb gelegt:";
   box.appendChild(p);
   box.appendChild(p);
   items.forEach(function (x) { var r = document.createElement("div"); r.textContent = "- " + x.t; box.appendChild(r); });
   var listEl = document.createElement("div"); box.appendChild(listEl);
  cartFill = function () {
    listEl.innerHTML = "";
    var lines = (chosenRadio ? ["Radio: " + chosenRadio.type] : []).concat(items.map(function (x) { return x.t; }));
    lines.forEach(function (t) { var r = document.createElement("div"); r.textContent = "- " + t; listEl.appendChild(r); });
  };
  cartFill();
   var n = document.createElement("div"); n.className = "nvk-help";
   var n = document.createElement("div"); n.className = "nvk-help";
   n.textContent = "Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.";
   n.textContent = "Kameras, TPMS, Werkzeug und Artikel ohne Direktlink wählst Du bitte über die Links oben im Shop aus.";
Zeile 507: Zeile 515:
     vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);
     vb.appendChild(vlab); vb.appendChild(vin); vb.appendChild(cb); vb.appendChild(ta); vb.appendChild(ls); box.appendChild(vb);
   }
   }
  if (!CART_TRANSFER) { outEl.appendChild(box); return; }
   var btn = document.createElement("button"); btn.type = "button"; btn.className = "nvk-btn"; btn.style.marginTop = "8px";
   var btn = document.createElement("button"); btn.type = "button"; btn.className = "nvk-btn"; btn.style.marginTop = "8px";
   btn.textContent = "Auswahl in den Warenkorb legen";
   btn.textContent = "Auswahl in den Warenkorb legen";
Zeile 517: Zeile 526:
   if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });
   if (chosenRadio) list.unshift({ t: chosenRadio.type, sku: chosenRadio.sku });
   if (!list.length) { st.textContent = "Es ist noch nichts zum Bestellen ausgewählt."; return; }
   if (!list.length) { st.textContent = "Es ist noch nichts zum Bestellen ausgewählt."; return; }
   st.textContent = "Artikel werden an den Shop übergeben …";
  var w = window.open("", "_blank");
   st.textContent = "Artikelnummern werden ermittelt …";
   var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });
   var ids = list.filter(function (x) { return x.aid; }).map(function (x) { return x.aid; });
   var get = ids.length ? fetch(API + "?aid=" + ids.join(",")).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});
   var get = ids.length ? fetch(API + "?aid=" + ids.join(",")).then(function (r) { return r.json(); }).then(function (j) { return j.skus || {}; }) : Promise.resolve({});
   get.then(function (map) {
   get.then(function (map) {
     var skus = [];
     var skus = [];
     list.forEach(function (x) { var s = x.sku || map[x.aid]; if (s) skus.push(s); });
     list.forEach(function (x) { var k = x.sku || map[x.aid]; if (k) skus.push(k); });
     if (!skus.length) throw new Error("none");
     if (!skus.length) throw new Error("none");
     return skus.reduce(function (p, s) {
     var url = CART + "?nvk=" + encodeURIComponent(skus.join(","));
      return p.then(function () { return fetch(CART_ADD + encodeURIComponent(s) + "/sQuantity/1", { mode: "no-cors", credentials: "include" }); });
     if (w) {
     }, Promise.resolve()).then(function () { return skus.length; });
      w.location.href = url;
  }).then(function (n) {
      st.textContent = "Der Shop wurde in einem neuen Tab geöffnet (" + skus.length + " von " + list.length + " Artikeln übergeben). Bitte dort den Warenkorb kontrollieren.";
    st.textContent = n + " von " + list.length + " Artikeln wurden an den Warenkorb übergeben. Bitte dort kontrollieren: ";
    } else {
    st.appendChild(link(CART, "Zum Warenkorb →"));
      st.textContent = "Der neue Tab wurde blockiert. Bitte Pop-ups erlauben oder diesen Link nutzen: ";
   }).catch(function () { st.textContent = "Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben."; });
      st.appendChild(link(url, "Warenkorb im Shop öffnen →"));
    }
   }).catch(function () { if (w) w.close(); st.textContent = "Das hat leider nicht geklappt. Bitte nutze die Shop-Links oben."; });
}
}
function renderResult() {
function renderResult() {
Zeile 639: Zeile 651:
</script>
</script>
</div>
</div>
</html>
</html>
<small>Stand: 21.10.2026</small><br>
<small>Stand: 21.10.2026</small><br>

Version vom 22. Oktober 2026, 06:37 Uhr

Mit diesem Tool kann auf Basis von Fahrzeug und vorhandenen Komponenten eine Liste nötiger Komponenten erstellt werden.
Zu den gewählten Komponenten werden Links in den I-BUS Shop gezeigt und abschließend kann mit der Auswahl eine Anfrage-Mail an das I-BUS App Team gesendet werden.

Zusatzoptionen

Stand: 21.10.2026