{"id":2073,"date":"2025-06-21T21:26:19","date_gmt":"2025-06-21T20:26:19","guid":{"rendered":"https:\/\/wissensbasiert.de\/?page_id=2073"},"modified":"2026-01-30T08:13:48","modified_gmt":"2026-01-30T07:13:48","slug":"portal","status":"publish","type":"page","link":"https:\/\/wissensbasiert.de\/en\/wbp-solutions\/portal\/","title":{"rendered":"Portal"},"content":{"rendered":"<p><div id=\"Projekte\" class=\"fusion-container-anchor\"><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:15px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last\" style=\"--awb-bg-blend:overlay;--awb-bg-size:cover;\"><div class=\"fusion-column-wrapper fusion-flex-column-wrapper-legacy\"><div class=\"fusion-image-element fusion-image-align-center in-legacy-container\" style=\"text-align:center;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><div class=\"imageframe-align-center\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"200\" height=\"200\" alt=\"Dashboard\" title=\"Dashboard\" src=\"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro.png\" data-orig-src=\"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-200x200.png\" class=\"lazyload img-responsive wp-image-1863\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%272000%27%20height%3D%272000%27%20viewBox%3D%270%200%202000%202000%27%3E%3Crect%20width%3D%272000%27%20height%3D%272000%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-200x200.png 200w, https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-400x400.png 400w, https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-600x600.png 600w, https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-800x800.png 800w, https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-1200x1200.png 1200w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 980px) 100vw, 200px\" \/><\/span><\/div><\/div><div class=\"fusion-clearfix\"><\/div><\/div><\/div><\/div><\/div><\/div>\n<div id=\"\u00dcberblick\" class=\"fusion-container-anchor\"><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:15px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:104%;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-blend:overlay;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-title-center fusion-title-text fusion-title-size-one\" style=\"--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;--awb-sep-color:#727272;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-double sep-solid\" style=\"border-color:#727272;\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h1 class=\"fusion-title-heading title-heading-center fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:30;line-height:1.4;\">WBP Solutions Portal<\/h1><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-double sep-solid\" style=\"border-color:#727272;\"><\/div><\/div><\/div><div class=\"fusion-modal modal fade modal-1 Kontakt\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"modal-heading-1\" aria-hidden=\"true\" style=\"--awb-border-color:var(--awb-custom_color_1);--awb-background:#ffffff;\"><div class=\"modal-dialog modal-sm\" role=\"document\"><div class=\"modal-content fusion-modal-content\"><div class=\"modal-header\"><button class=\"close\" type=\"button\" data-dismiss=\"modal\" aria-hidden=\"true\" aria-label=\"Close\">&times;<\/button><h3 class=\"modal-title\" id=\"modal-heading-1\" data-dismiss=\"modal\" aria-hidden=\"true\">Dr. Paul Hebes<\/h3><\/div><div class=\"modal-body fusion-clearfix\">\n<p style=\"text-align: center;\"><div class=\"fusion-fa-align-center\"><i class=\"fb-icon-element-1 fb-icon-element fontawesome-icon fa fa-phone circle-no\" style=\"--awb-iconcolor:#63b472;--awb-iconcolor-hover:#63b472;--awb-font-size:20px;\"><\/i><\/div>\n<p style=\"text-align: center;\">+49 (0)30 91902603<\/p>\n<p style=\"text-align: center;\"><div class=\"fusion-fa-align-center\"><i class=\"fb-icon-element-2 fb-icon-element fontawesome-icon fa fa-mobile circle-no\" style=\"--awb-iconcolor:#63b472;--awb-iconcolor-hover:#63b472;--awb-font-size:20px;\"><\/i><\/div>\n<p style=\"text-align: center;\">+49 (0)1522 9742947<\/p>\n<p style=\"text-align: center;\"><div class=\"fusion-fa-align-center\"><i class=\"fb-icon-element-3 fb-icon-element fontawesome-icon fa fa-envelope-o circle-no\" style=\"--awb-iconcolor:#63b472;--awb-iconcolor-hover:#63b472;--awb-circlecolor:#727272;--awb-font-size:20px;\"><\/i><\/div>\n<p style=\"text-align: center;\"><a href=\"mailto: paul.hebes@wissensbasiert.de\">paul.hebes@wissensbasiert.de<\/a><\/p>\n<\/div><\/div><\/div><\/div><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:var(--awb-color6);--awb-margin-top:40px;--awb-margin-bottom:40px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;\"><h2 class=\"fusion-title-heading title-heading-center fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:18;--minFontSize:18;line-height:1.5;\"><p>Diese Seite wird nur noch \u00fcbergangsweise unterst\u00fctzt. Bitte nutzen Sie ab sofort das Portal unter<\/p>\n<p><a href=\"https:\/\/portal.wissensbasiert.de\">https:\/\/portal.wissensbasiert.de<\/a><\/p><\/h2><\/div><\/div><\/div><\/div><\/div><\/div>\n<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-right:2%;--awb-padding-left:2%;--awb-padding-right-small:0px;--awb-padding-left-small:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:104%;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-right-small:0px;--awb-padding-left-small:0px;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\" data-scroll-devices=\"small-visibility,medium-visibility,large-visibility\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><!-- ==========================\n     HTML-Struktur\n========================== -->\n<div id=\"auth0-description\" class=\"auth0-description\">\n  <strong>Bitte loggen Sie sich ein, um Zugriff auf Ihre Tools zu erhalten.<\/strong><br>\n  Sie haben noch keine Lizenz? Dann nehmen Sie bitte Kontakt auf:\n  <a href=\"mailto:wbp-solutions@wissensbasiert.de\">wbp-solutions@wissensbasiert.de<\/a>\n<\/div>\n\n<div id=\"auth0-login\" class=\"auth0-login\"><\/div>\n\n<div id=\"loading-spinner\" class=\"loading-spinner\">\n  <div class=\"spinner\"><\/div>\n<\/div>\n\n<div id=\"dashboard-gallery\" class=\"dashboard-gallery\"><\/div>\n\n<!-- ==========================\n     SCRIPTS\n========================== -->\n<script src=\"https:\/\/cdn.auth0.com\/js\/lock\/11.34.1\/lock.min.js\"><\/script>\n<script type=\"module\" src=\"https:\/\/dub01.online.tableau.com\/javascripts\/api\/tableau.embedding.3.latest.min.js\"><\/script>\n<script>\n  \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Globals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const CLIENT_ID    = \"z9qBLXKUn4XWcwrAJaT3jWbZ2VcieW81\";\n  const DOMAIN       = \"login.wissensbasiert.de\";\n  const FALLBACK_URL = \"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2023\/01\/Visual-data-bro-200x200.png\";\n\n  \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Helper zum Fetchen mit Timeout\/Retry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function fetchWithTimeout(url, timeout = 15000) {\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), timeout);\n    return fetch(url, { signal: controller.signal })\n      .then(res => { clearTimeout(timer); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.blob(); })\n      .then(blob => { clearTimeout(timer); return URL.createObjectURL(blob); })\n      .catch(err => { clearTimeout(timer); throw err; });\n  }\n  function fetchWithRetry(url, timeout = 15000, retries = 2, backoff = 2000) {\n    return new Promise((resolve, reject) => {\n      function attempt(remaining) {\n        fetchWithTimeout(url, timeout)\n          .then(resolve)\n          .catch(err => remaining > 0\n            ? setTimeout(() => attempt(remaining - 1), backoff)\n            : reject(err)\n          );\n      }\n      attempt(retries);\n    });\n  }\n\n  \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  document.addEventListener(\"DOMContentLoaded\", () => {\n    const description = document.getElementById(\"auth0-description\");\n    const gallery     = document.getElementById(\"dashboard-gallery\");\n\n    \/\/ 0. Koppeln der Sichtbarkeit\n    function updateDescriptionByGallery() {\n      \/\/ wenn Galerie sichtbar ist: Hinweis ausblenden, sonst einblenden\n      const isGalleryVisible = window.getComputedStyle(gallery).display !== \"none\";\n      description.style.display = isGalleryVisible ? \"none\" : \"block\";\n    }\n\n    \/\/ initial: Galerie verstecken und Hinweis anzeigen\n    gallery.style.display = \"none\";\n    updateDescriptionByGallery();\n\n    \/\/ 1. Auth0Lock initialisieren\n    const lock = new Auth0Lock(CLIENT_ID, DOMAIN, {\n      container: \"auth0-login\",\n      auth: {\n        redirect: false,\n        responseType: \"token id_token\",\n        sso: true,\n        params: { scope: \"openid email email_verified\" }\n      },\n      theme: {\n        logo: \"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2022\/12\/LOGO_RGB_WEB.png\",\n        primaryColor: \"#63b472\"\n      },\n      language: \"de\",\n      languageDictionary: {\n        title: \"Willkommen\",\n        emailInputPlaceholder: \"E-Mail-Adresse\",\n        passwordInputPlaceholder: \"Passwort\",\n        signUpTerms: \"Mit der Registrierung akzeptiere ich die Nutzungsbedingungen.\"\n      },\n      allowSignUp: true,\n      initialScreen: \"login\",\n      closable: false\n    });\n\n    \/\/ 2. Login-Maske zeigen\n    lock.show();\n\n    \/\/ 3. Nach erfolgreicher Authentifizierung Dashboard rendern\n    lock.on(\"authenticated\", authResult => {\n      lock.hide();\n      lock.getUserInfo(authResult.accessToken, (err, profile) => {\n        if (err) return console.error(err);\n        renderDashboard(profile, authResult.accessToken);\n      });\n    });\n\n    \/\/ 4. Error-Handler\n    lock.on(\"authorization_error\", err => {\n      console.error(err);\n      alert(\"Anmeldefehler: \" + err.error_description);\n    });\n  });\n\n  \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Dashboard rendern \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function renderDashboard(profile, token) {\n    const spinner = document.getElementById(\"loading-spinner\");\n    const gallery = document.getElementById(\"dashboard-gallery\");\n    const description = document.getElementById(\"auth0-description\");\n\n    \/\/ 1. Ladezustand\n    spinner.style.display = \"block\";\n    gallery.style.display = \"none\";\n\n    try {\n      \/\/ 2. Header + Buttons\n      gallery.innerHTML = `\n        <div class=\"dashboard-header\">\n          <button id=\"password-btn\" class=\"btn\">Passwort \u00e4ndern<\/button>\n          <button id=\"logout-btn\" class=\"btn\">Abmelden<\/button>\n        <\/div>\n        <h2>Ihre Tools<\/h2>\n      `;\n\n      \/\/ Logout: einfach neu laden, dann zeigt Lock-Maske + Hinweis wieder\n      document.getElementById(\"logout-btn\").onclick = () => {\n        window.location.reload();\n      };\n\n      \/\/ Passwort \u00e4ndern\n      document.getElementById(\"password-btn\").onclick = async () => {\n        try {\n          const res = await fetch(\n            \"https:\/\/wbpsolutions.eu.pythonanywhere.com\/change-password-ticket\",\n            {\n              method: \"POST\",\n              headers: { \"Content-Type\": \"application\/json\" },\n              body: JSON.stringify({ email: profile.email })\n            }\n          );\n          const data = await res.json();\n          if (data.ticket) window.open(data.ticket, \"_blank\", \"noopener\");\n          else alert(\"Konnte keinen Passwort-Link generieren.\");\n        } catch {\n          alert(\"Fehler beim Anfordern des Passwort-Links.\");\n        }\n      };\n\n      \/\/ 3. Dashboards abrufen\n      const email = encodeURIComponent(profile.email);\n      const res   = await fetch(\n        `https:\/\/wbpsolutions.eu.pythonanywhere.com\/dashboards?user=${email}`,\n        { headers: { Authorization: `Bearer ${token}` } }\n      );\n      const list = await res.json();\n\n      const vizSizes = {\n        \"Stadtradeln Berlin 2020\": { width:1200, height:800 },\n        \"Passenger Transport\":     { width:1200, height:1000 },\n        \"Cargo Transport\":         { width:1200, height:1000 },\n        \"Zwilling finden\":         { width:1000, height:1200 },\n        \"Nachbarn\":                { width:1200, height:800 }\n      };\n\n      \/\/ 4. Thumbnails bauen\n      await Promise.all(list.map(d => new Promise(resolve => {\n        const card = document.createElement(\"div\"); card.className = \"card\";\n        const img  = new Image(); img.crossOrigin=\"anonymous\"; img.referrerPolicy=\"no-referrer\"; img.className=\"thumb\";\n        img.onload = place; img.onerror = () => { img.src = FALLBACK_URL; img.onload = place; img.onerror = place; };\n        function place() {\n          const label = document.createElement(\"p\"); label.innerText = d.name; label.className=\"label\";\n          card.append(img, label); gallery.append(card); resolve();\n        }\n        card.onclick = () => openViz(d, email, vizSizes, gallery);\n        fetchWithRetry(d.thumbnail).then(url => img.src = url).catch(() => img.onerror());\n      })));\n\n      \/\/ 5. Galerie anzeigen + Hinweis-Text ausblenden\n      spinner.style.display = \"none\";\n      gallery.style.display = \"block\";\n      updateDescriptionByGallery();\n    } catch (e) {\n      console.error(e);\n      spinner.style.display = \"none\";\n      gallery.innerHTML += `<p class=\"error\">Konnte Dashboards nicht laden. Eventuell haben Sie noch keine Lizenz erworben.<\/p>`;\n      gallery.style.display = \"block\";\n      updateDescriptionByGallery();\n    }\n  }\n\n  \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Tableau-Viz einbetten \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function openViz(d, email, vizSizes, gallery) {\n    const existing = document.getElementById(\"viz-container\");\n    if (existing) existing.remove();\n    try {\n      const tokenRes = await fetch(`https:\/\/wbpsolutions.eu.pythonanywhere.com\/get-token?user=${email}`);\n      const tokenData = await tokenRes.json();\n      if (!tokenData.token) throw new Error(\"Kein Embed Token erhalten\");\n\n      const size = vizSizes[d.name] || { width:1200, height:800 };\n      const container = document.createElement(\"div\");\n      container.id = \"viz-container\";\n      Object.assign(container.style, {\n        width: \"100%\",\n        maxWidth: `${size.width}px`,\n        margin: \"0 auto\",\n        paddingBottom: \"40px\"\n      });\n      gallery.append(container);\n\n      const viz = document.createElement(\"tableau-viz\");\n      viz.setAttribute(\"src\", d.url);\n      viz.setAttribute(\"token\", tokenData.token);\n      viz.setAttribute(\"toolbar\", \"bottom\");\n      viz.setAttribute(\"hide-tabs\", \"true\");\n      Object.assign(viz.style, {\n        width: \"100%\",\n        height: `${size.height}px`\n      });\n     \n      const noShare = document.createElement(\"custom-parameter\");\n      noShare.setAttribute(\"name\", \":showShareOptions\");\n      noShare.setAttribute(\"value\", \"false\");\n      viz.append(noShare);\n      \n      container.append(viz);\n      container.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    } catch (e) {\n      console.error(e);\n      alert(\"Dashboard konnte nicht geladen werden.\");\n    }\n  }\n\n  \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Sichtbarkeits-Helfer wieder nach au\u00dfen \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ damit renderDashboard() ihn aufrufen kann\n  function updateDescriptionByGallery() {\n    const description = document.getElementById(\"auth0-description\");\n    const gallery     = document.getElementById(\"dashboard-gallery\");\n    const isVisible   = window.getComputedStyle(gallery).display !== \"none\";\n    description.style.display = isVisible ? \"none\" : \"block\";\n  }\n<\/script>\n\n<style>\n  \/* Grund-Reset *\/\n  html, body {\n    margin: 0;\n    padding: 0;\n    overflow-x: hidden;\n    width: 100%;\n  }\n\n  \/* Hinweis-Box *\/\n  .auth0-description {\n    text-align: center;\n    margin-bottom: 1em;\n    padding: 0 16px;\n  }\n\n  \/* Auth0 Lock Container *\/\n  .auth0-login {\n    max-width: 400px;\n    margin: 0 auto;\n  }\n\n  \/* Spinner-Overlay *\/\n  .loading-spinner {\n    display: none;\n    position: fixed;\n    top: 50%; left: 50%;\n    transform: translate(-50%, -50%);\n    background: rgba(255,255,255,0.8);\n    padding: 20px;\n    border-radius: 8px;\n    box-shadow: 0 2px 6px rgba(0,0,0,0.2);\n    z-index: 1000;\n  }\n  .spinner {\n    width: 48px; height: 48px;\n    border: 6px solid rgba(0,0,0,0.1);\n    border-top-color: #63b472;\n    border-radius: 50%;\n    animation: spin 1s infinite linear;\n  }\n  @keyframes spin { to { transform: rotate(360deg); } }\n\n  \/* Galerie + Buttons *\/\n  .dashboard-gallery {\n    text-align: center;\n    overflow-x: hidden;\n  }\n  .dashboard-header {\n    text-align: right;\n    padding-right: 10vw;\n    margin-bottom: 40px;\n  }\n  .btn {\n    padding: 6px 12px;\n    border: none;\n    background: #63b472;\n    color: white;\n    border-radius: 4px;\n    cursor: pointer;\n    margin-left: 10px;\n  }\n  .btn:first-child { margin-left: 0; }\n\n  \/* Karten *\/\n  .card {\n    display: inline-block;\n    margin: 10px;\n    cursor: pointer;\n    max-width: 220px;\n  }\n  .thumb {\n    width: 200px;\n    height: 120px;\n    object-fit: cover;\n    border-radius: 6px;\n    box-shadow: 0 2px 6px rgba(0,0,0,0.2);\n  }\n  .label {\n    margin: 6px 0;\n    text-align: center;\n  }\n\n  \/* Fehlermeldung *\/\n  .error {\n    color: red;\n    font-weight: bold;\n  }\n\n  \/* Tableau-Viz *\/\n  tableau-viz {\n    width: 100%;\n    margin: 40px auto;\n    display: block;\n    box-sizing: border-box;\n    padding: 0;\n  }\n  @media (max-width: 768px) {\n    tableau-viz {\n      max-width: 100vw;\n      height: 70vh !important;\n    }\n  }\n\n  \/* Lock mobil *\/\n  @media (max-width: 768px) {\n    #auth0-login .auth0-lock-content-wrapper {\n      max-height: 300px !important;\n      overflow: hidden !important;\n    }\n  }\n\n\t\/* Thumbnails oben ausrichten *\/\n  .card {\n    display: inline-block;\n    vertical-align: top; \/* <- NEU: richtet alle Karten am oberen Rand aus *\/\n    margin: 10px;\n    cursor: pointer;\n    max-width: 220px;\n  }\n\n\n\n<\/style>\n<\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":2160,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2073","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Portal - Wissensbasierte Planung<\/title>\n<meta name=\"description\" content=\"WBP Solutions Portal. Hier erhalten Sie Zugriff auf die Tools und Dashboards, die Ihnen bei der Planung helfen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wissensbasiert.de\/en\/wbp-solutions\/portal\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Portal - Wissensbasierte Planung\" \/>\n<meta property=\"og:description\" content=\"WBP Solutions Portal. Hier erhalten Sie Zugriff auf die Tools und Dashboards, die Ihnen bei der Planung helfen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wissensbasiert.de\/en\/wbp-solutions\/portal\/\" \/>\n<meta property=\"og:site_name\" content=\"Wissensbasierte Planung\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-30T07:13:48+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@wissensbasiert\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/wbp-solutions\\\/portal\\\/\",\"url\":\"https:\\\/\\\/wissensbasiert.de\\\/wbp-solutions\\\/portal\\\/\",\"name\":\"Portal - Wissensbasierte Planung\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/#website\"},\"datePublished\":\"2025-06-21T20:26:19+00:00\",\"dateModified\":\"2026-01-30T07:13:48+00:00\",\"description\":\"WBP Solutions Portal. Hier erhalten Sie Zugriff auf die Tools und Dashboards, die Ihnen bei der Planung helfen.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/wbp-solutions\\\/portal\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wissensbasiert.de\\\/wbp-solutions\\\/portal\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/wbp-solutions\\\/portal\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/wissensbasiert.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WBP-Solutions\",\"item\":\"https:\\\/\\\/wissensbasiert.de\\\/wbp-solutions\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Portal\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/#website\",\"url\":\"https:\\\/\\\/wissensbasiert.de\\\/\",\"name\":\"Wissensbasierte Planung\",\"description\":\"Mit Wissen Planen\",\"publisher\":{\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wissensbasiert.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/#organization\",\"name\":\"Dr. PAUL HEBES - Wissensbasierte Planung\",\"url\":\"https:\\\/\\\/wissensbasiert.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wissensbasiert.de\\\/wp-content\\\/uploads\\\/2017\\\/10\\\/Wortmarke_Homepage.png\",\"contentUrl\":\"https:\\\/\\\/wissensbasiert.de\\\/wp-content\\\/uploads\\\/2017\\\/10\\\/Wortmarke_Homepage.png\",\"width\":786,\"height\":241,\"caption\":\"Dr. PAUL HEBES - Wissensbasierte Planung\"},\"image\":{\"@id\":\"https:\\\/\\\/wissensbasiert.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/wissensbasiert\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Portal - Knowledge-based planning","description":"WBP Solutions Portal. Here you can access the tools and dashboards that will help you with your planning.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wissensbasiert.de\/en\/wbp-solutions\/portal\/","og_locale":"en_GB","og_type":"article","og_title":"Portal - Wissensbasierte Planung","og_description":"WBP Solutions Portal. Hier erhalten Sie Zugriff auf die Tools und Dashboards, die Ihnen bei der Planung helfen.","og_url":"https:\/\/wissensbasiert.de\/en\/wbp-solutions\/portal\/","og_site_name":"Wissensbasierte Planung","article_modified_time":"2026-01-30T07:13:48+00:00","twitter_card":"summary_large_image","twitter_site":"@wissensbasiert","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wissensbasiert.de\/wbp-solutions\/portal\/","url":"https:\/\/wissensbasiert.de\/wbp-solutions\/portal\/","name":"Portal - Knowledge-based planning","isPartOf":{"@id":"https:\/\/wissensbasiert.de\/#website"},"datePublished":"2025-06-21T20:26:19+00:00","dateModified":"2026-01-30T07:13:48+00:00","description":"WBP Solutions Portal. Here you can access the tools and dashboards that will help you with your planning.","breadcrumb":{"@id":"https:\/\/wissensbasiert.de\/wbp-solutions\/portal\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wissensbasiert.de\/wbp-solutions\/portal\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wissensbasiert.de\/wbp-solutions\/portal\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/wissensbasiert.de\/"},{"@type":"ListItem","position":2,"name":"WBP-Solutions","item":"https:\/\/wissensbasiert.de\/wbp-solutions\/"},{"@type":"ListItem","position":3,"name":"Portal"}]},{"@type":"WebSite","@id":"https:\/\/wissensbasiert.de\/#website","url":"https:\/\/wissensbasiert.de\/","name":"Knowledge-based planning","description":"Planning with knowledge","publisher":{"@id":"https:\/\/wissensbasiert.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wissensbasiert.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/wissensbasiert.de\/#organization","name":"Dr. PAUL HEBES - Knowledge-based planning","url":"https:\/\/wissensbasiert.de\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wissensbasiert.de\/#\/schema\/logo\/image\/","url":"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2017\/10\/Wortmarke_Homepage.png","contentUrl":"https:\/\/wissensbasiert.de\/wp-content\/uploads\/2017\/10\/Wortmarke_Homepage.png","width":786,"height":241,"caption":"Dr. PAUL HEBES - Wissensbasierte Planung"},"image":{"@id":"https:\/\/wissensbasiert.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/wissensbasiert"]}]}},"_links":{"self":[{"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/pages\/2073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/comments?post=2073"}],"version-history":[{"count":2,"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/pages\/2073\/revisions"}],"predecessor-version":[{"id":2847,"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/pages\/2073\/revisions\/2847"}],"up":[{"embeddable":true,"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/pages\/2160"}],"wp:attachment":[{"href":"https:\/\/wissensbasiert.de\/en\/wp-json\/wp\/v2\/media?parent=2073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}