Files
sase.tr/scripts/pl24auth/captured/v3-02-vehicle-menu.html
Semih 2358b38b4d feat: PL24 integration + EMEX on-demand parts loading
## Major Changes

### PL24 Integration (PartsLink24 API)
- Add PL24 auth service with JWT token management
- Add PL24 service for VIN decode and parts catalog
- Support for VAG, Mercedes, BMW, Ford, Renault and more
- Schema image download with base64 decoding
- Image deduplication via SchemaPic table

### EMEX On-Demand Loading
- Remove automatic parts scraping during VIN decode
- Add fetchCategoryParts() for on-demand loading
- Store category URLs in rawResponse for later fetching
- Fix Chrome executable path for Puppeteer

### VIN Decode Flow
- PL24 first, fallback to EMEX if not available
- Both sources now use on-demand parts loading
- Faster VIN lookup (no parts scraped upfront)

### Database Schema
- Add SchemaPic model for image deduplication
- Add schemaPicId to VehicleCategory
- Add EMEX models for parallel scraping

### Frontend Improvements
- Dark theme with Tailwind CSS
- Improved UI components (card, button, input)
- Better category and parts display
- Schema image viewer

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 11:15:06 +01:00

39 lines
10 KiB
HTML

<!DOCTYPE html><html><head>
<meta charset="utf-8">
<!-- viewport-fit=cover -> for IOS notch matching -->
<!-- maximum-scale=1.0,user-scalable=0 -> no zooming on ios -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0, viewport-fit=cover">
<title>partslink24</title>
<!-- favicons -->
<link rel="icon" href="/pl24-app/favicons/favicon.ico" sizes="32x32">
<link rel="icon" href="/pl24-app/favicons/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/pl24-app/favicons/apple-touch-icon.png">
<link rel="mask-icon" href="/pl24-app/favicons/safari-pinned-tab.svg" color="#000000">
<meta name="msapplication-TileColor" content="#f7c400">
<meta name="msapplication-config" content="/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<script type="text/javascript" data-metrics-id="653XEPU6" id="metrics" src="/pl24-app/metrics-loader.js"></script>
<script type="module" crossorigin="" src="/pl24-app/assets/index-e59f85ff.js"></script>
<link rel="modulepreload" crossorigin="" href="/pl24-app/assets/__federation_shared_react-a187c2a1.js">
<link rel="modulepreload" crossorigin="" href="/pl24-app/assets/__federation_shared_react-dom-435d0037.js">
<link rel="stylesheet" href="/pl24-app/assets/index-d2bb7e3e.css">
<link rel="manifest" href="/pl24-app/manifest.webmanifest"><style data-emotion="css" data-s=""></style><script id="usercentrics-cmp" src="https://app.usercentrics.eu/browser-ui/latest/bundle.js" data-lang="en" data-settings-id="1dDyIAPUm" async=""></script><script async="" src="https://metrics.partslink24.com/js/container_653XEPU6.js"></script></head>
<body class="">
<noscript>You need to enable JavaScript to run this testapp.</noscript>
<div id="root"><div class="_container_93u48_9" lang="en" style="height: 1080px;"><div aria-hidden="true" class="MuiBackdrop-root css-ps8t2m" style="opacity: 0; transition: opacity 195ms cubic-bezier(0.4, 0, 0.2, 1); visibility: hidden;"><div class="spinner-wrapper"><div class="spinner"></div></div></div><div class="_container_s5kdw_9" style="visibility: hidden; transform: translateY(55px);"><span class="icon icon--full-screen _icon_skck4_9" data-test-id="fullscreenToggle"></span></div><div class="_headerContainer_1gzni_9"><header class="_header_1gzni_9" data-test-id="header"><div class="_container_1gzni_41"><div class="_content_1gzni_56"><div class="_container_1wqol_9"><div class="_containerLeft_1wqol_16"><img src="/pl24-app/assets/logo-272a932c.png" class="_active_1i0o2_1" style="height: 32px;"></div><div class="_menuContainer_1wqol_28"><div class="_hidden_1wqol_34"><button class="_btn_aow59_9 _autoWidth_aow59_24 _desktop_aow59_45 _btn-primary_aow59_30" type="button" data-test-id="navigateBackToPurchaseOrderManagementButton"><div class="_container_aow59_81">Back to the order</div></button></div><div class="_hidden_1wqol_34"><span class="icon icon-btn icon--order _icon_skck4_9" data-test-id="navigateBackToPurchaseOrderManagementIcon"></span></div><span class="icon icon-btn icon--more _icon_skck4_9" tabindex="1" data-test-id="openMenu"></span></div></div></div></div></header></div><div class="_mainContainer_xhd5e_9" data-test-id="mainContainer"><div class="_container_3ww10_9" data-test-id="breadcrumbs"><div class="_breadcrumbContainer_3ww10_23"><div class="_container_k7wab_9" data-test-id="breadcrumbStart" style="flex-shrink: 5; min-width: min-content;"><div class="_item_k7wab_19" tabindex="1">Start</div></div><div class="_container_k7wab_9" data-test-id="breadcrumbCatalogName" style="flex-shrink: 15; min-width: min-content;"><span class="icon icon--arrow-right _icon_skck4_9"></span><div class="_item_k7wab_19 _inactive_k7wab_32" tabindex="1">Brand selection</div></div></div></div><div class="_contentContainer_xhd5e_24"><div class="_viewContainer_xhd5e_39" data-test-id="content"><div class="_content_xhd5e_24"><div class="_scrollContainer_7ci7g_9"><div class="_container_7ci7g_16"><div class="_listContainer_7ci7g_34"><div class="_caption_7ci7g_43">Choose brand:</div><div class="_container_ifyja_9" data-testid="brandSelection"><div class="_list_ifyja_14"><div class="_container_i43hx_9" title="Alpine"><img class="_image_i43hx_26" src="/carbrands/alpine/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Audi"><img class="_image_i43hx_26" src="/carbrands/audi/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="BMW Classic"><img class="_image_i43hx_26" src="/carbrands/bmw_classic/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="BMW"><img class="_image_i43hx_26" src="/carbrands/bmw/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="BMW Motorrad Classic"><img class="_image_i43hx_26" src="/carbrands/bmw_motorrad_classic/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="BMW Motorrad"><img class="_image_i43hx_26" src="/carbrands/bmw_motorrad/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Bentley"><img class="_image_i43hx_26" src="/carbrands/bentley/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Dacia"><img class="_image_i43hx_26" src="/carbrands/dacia/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Jaguar"><img class="_image_i43hx_26" src="/carbrands/jaguar/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Land Rover"><img class="_image_i43hx_26" src="/carbrands/landrover/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Lexus"><img class="_image_i43hx_26" src="/carbrands/lexus/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="MAN"><img class="_image_i43hx_26" src="/carbrands/man/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Mercedes-Benz Classic"><img class="_image_i43hx_26" src="/carbrands/mercedes_benz_classic/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Mercedes-Benz"><img class="_image_i43hx_26" src="/carbrands/mercedes/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Mercedes-Benz Trucks"><img class="_image_i43hx_26" src="/carbrands/mercedes_trucks/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Mercedes-Benz Unimog"><img class="_image_i43hx_26" src="/carbrands/mercedes_unimog/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Mercedes-Benz Vans"><img class="_image_i43hx_26" src="/carbrands/mercedes_vans/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="MINI Classic"><img class="_image_i43hx_26" src="/carbrands/mini_classic/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="MINI"><img class="_image_i43hx_26" src="/carbrands/mini/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Mitsubishi"><img class="_image_i43hx_26" src="/carbrands/mitsubishi/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Porsche"><img class="_image_i43hx_26" src="/carbrands/porsche/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Porsche Classic"><img class="_image_i43hx_26" src="/carbrands/porsche_classic/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Renault"><img class="_image_i43hx_26" src="/carbrands/renault/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Cupra"><img class="_image_i43hx_26" src="/carbrands/cupra/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="SEAT"><img class="_image_i43hx_26" src="/carbrands/seat/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Škoda"><img class="_image_i43hx_26" src="/carbrands/skoda/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="smart"><img class="_image_i43hx_26" src="/carbrands/smart/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Suzuki"><img class="_image_i43hx_26" src="/carbrands/suzuki/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Toyota"><img class="_image_i43hx_26" src="/carbrands/toyota/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Volkswagen Commercial Vehicles"><img class="_image_i43hx_26" src="/carbrands/vw_nutzfahrzeuge/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Volkswagen Classic"><img class="_image_i43hx_26" src="/carbrands/vw_classic/pl24_cat_logo_app.png"></div><div class="_container_i43hx_9" title="Volkswagen"><img class="_image_i43hx_26" src="/carbrands/vw/pl24_cat_logo_app.png"></div></div></div></div></div></div></div></div><div class="_container_1c4xf_9" data-test-id="companionBar"><div class="_itemContainer_lybg3_9 _itemDesktop_lybg3_62" data-test-id="vehicleCompanionBarItem"><div class="_item_lybg3_9 _itemInactive_lybg3_53" data-testid="menu-item-vehicle" aria-label="Vehicle identification"><div class=""><span class="icon icon-btn icon--car _icon_skck4_9 _disabled_skck4_19"></span></div></div></div><div class="_itemContainer_lybg3_9 _itemDesktop_lybg3_62" data-test-id="searchCompanionBarItem"><div class="_item_lybg3_9 _itemInactive_lybg3_53" data-testid="menu-item-search" aria-label="Search"><div class=""><span class="icon icon-btn icon--search-list _icon_skck4_9 _disabled_skck4_19"></span></div></div></div><div class="_itemContainer_lybg3_9 _itemDesktop_lybg3_62" data-test-id="promotionsCompanionBarItem"><div class="_item_lybg3_9 _itemInactive_lybg3_53" data-testid="menu-item-promotions" aria-label="Deals"><div class=""><span class="icon icon-btn icon--percent-outlined _icon_skck4_9 _disabled_skck4_19"></span></div></div></div><div class="_itemContainer_lybg3_9 _itemDesktop_lybg3_62" data-test-id="ordersCompanionBarItem"><div class="_item_lybg3_9 _itemInactive_lybg3_53" data-testid="menu-item-orders" aria-label="Order administration"><div class=""><span class="icon icon-btn icon--orderbridge _icon_skck4_9 _disabled_skck4_19"></span></div></div></div></div></div></div></div>,</div>
<div id="usercentrics-root" data-created-at="1769006680762" style=""></div><iframe id="uc-cross-domain-bridge" src="https://app.usercentrics.eu/browser-sdk/4.59.0/cross-domain-bridge.html" style="display: none;"></iframe><style id="uc-overflow-style">.overflowHidden {overflow: hidden !important;}</style></body></html>