From 9bb837d5fcbd10fe8ecabe9b9d5f65eb2a0fa38e Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Tue, 11 Mar 2025 17:54:39 +0100 Subject: [PATCH] Brak zmian w kodzie. --- apilo-bck | 405 +++++++++++++++++++++++++++--------- apilo.js | 611 +++++++++++++++++++++++++++--------------------------- 2 files changed, 614 insertions(+), 402 deletions(-) diff --git a/apilo-bck b/apilo-bck index 384e57d..d31c03f 100644 --- a/apilo-bck +++ b/apilo-bck @@ -1,130 +1,339 @@ - static public function apilo_product_search() - { - global $mdb, $settings, $config; - $sku = $mdb -> get( 'pp_shop_products', 'sku', [ 'id' => \S::get( 'product_id' ) ] ); - $ean = $mdb -> get( 'pp_shop_products', 'ean', [ 'id' => \S::get( 'product_id' ) ] ); - if ( !$sku and !$ean ) - { - echo json_encode( [ 'status' => 'error', 'msg' => 'Podany produkt nie posiada kodu SKU ani EAN.' ] ); - exit; - } - $url = "https://projectpro.apilo.com/rest/api/warehouse/product/"; -$params = []; -if ($sku) { - $params['sku'] = $sku; + + + + + + + + +const currentUrl = window.location.href; +console.log(currentUrl); +const patterns = [ + /^https:\/\/projectpro\.apilo\.com\/order\/order\/news\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/in-progress\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/to-send\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/completed\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/all\/?$/ +]; +if (patterns.some(pattern => pattern.test(currentUrl))) { + waitForTableAndSetImage(); + attachTableReloadListener(); } -// if ($ean) { -// $params['ean'] = $ean; -// } -$url .= '?' . http_build_query($params); +function waitForTableAndSetImage() { + const intervalId = setInterval(() => { + let dataTables_scrollBody = document.getElementsByClassName('dataTables_scrollBody'); + if (dataTables_scrollBody.length > 0) { + let dataTables_tbody = dataTables_scrollBody[0].getElementsByTagName('tbody')[0]; + let rows = dataTables_tbody.getElementsByTagName('tr'); -$ch = curl_init($url); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); -curl_setopt($ch, CURLOPT_HTTPHEADER, [ - "Authorization: Bearer " . $config['apilo']['access-token'], - "Accept: application/json" -]); + if (rows.length > 0) { + clearInterval(intervalId); + setImageToProduct(); + } + } + }, 100); +} -$response = curl_exec($ch); -$responseData = json_decode($response, true); - -if (curl_errno($ch)) { - echo 'Błąd cURL: ' . curl_error($ch); -} else { - if ($responseData && isset($responseData['products'])) { - foreach ($responseData['products'] as $product) { - echo "Nazwa produktu: " . $product['name'] . "
"; - echo "SKU: " . $product['sku'] . "
"; - echo "EAN: " . $product['ean'] . "

"; +function attachTableReloadListener() { + const table = document.querySelector('.dataTables_scrollBody table'); + if (table) { + const observer = new MutationObserver((mutationsList, observer) => { + for (const mutation of mutationsList) { + if (mutation.type === 'childList') { + waitForTableAndSetImage(); + break; } - } else { - echo "Brak wyników dla podanego SKU lub EAN."; - } + } + }); + + observer.observe(table.querySelector('tbody'), { childList: true }); + } } -curl_close($ch); -exit; +function setImageToProduct(img = '') { + let dataTables_scrollBody = document.getElementsByClassName('dataTables_scrollBody'); + if (dataTables_scrollBody.length > 0) { + let dataTables_tbody = dataTables_scrollBody[0].getElementsByTagName('tbody')[0]; + let rows = dataTables_tbody.getElementsByTagName('tr'); - // $refreshUrl = "https://projectpro.apilo.com/rest/auth/token/?grant_type=refresh_token&refresh_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9qZWN0cHJvLmFwaWxvLmNvbSIsImV4cCI6MTcwNDA2NDE3MywianRpIjoiZTJjZDI4MWItZmU3NS01YTIyLWI4MGYtM2MyNTI3MmViZjVjIiwidHlwZSI6InJlZnJlc2hfdG9rZW4iLCJjbGllbnRfaWQiOjIsInBsYXRmb3JtX2lkIjoyLCJpYXQiOjE2OTg3OTM3NzN9.QUXHq9_9ERSrTqtbx50ZE_h_uN32ai112k-JqmSD9TZg4RsJxyzA13PeIulAWVa2ZeEJolvB-X2XyU7Ok__dhRYtNEUs-2HQgoa9sX1LAUlnUyABkY5hXOMpRNztrZ_BJMl_Ttj4GkwEOGlP8Ze0JNXaqmio0d1Bbbc6DtYfzHtkqgzl_mImIBtIXmBpypP3nVgz9GtKq9eOxfczQsWsUv5OBmCBDSF3O6yJA9r7jLOgSo1_MOH1MYai6xd_23FFlTcOvQUUwmnI6EMe3ytIpfuegEPuhXMPY8FCa0tWGhuBx2jtPBzQRQdJW7dzk3rEQX495lhE3cwK_T0PPjDBJ6HaYUoA5sTiF-9S1JfysS5D-Jd7z-m2KNVW8FPz1Zz200U2k2wfAs64NT9NeDPVkEcBJ5GFmOFvCGw4ywosWuQVQx0YxfzF65becLKxddPRS1MC9_-NxxL4ergClbPA2_e2Qwkg2EXWhil6cAwGy2G7C80t2NGN5aP1UL_uH2FQZ8VBdW_R5KvAXZDJsWSJqvn7pinLqTollMoMipbyQA02jaUvIk7senIF-h3f4DHbj90I97dekyzUUcbppKVhBfF6ZsfeFUojbT-GUapjakOwz3uL2dNEXOENUQMn3bsnQmkQABsGQrhQZjnPc-mdEm0PJJz0rK8QdZ2cQHYgo4g"; + for (let i = 0; i < rows.length; i++) { + let cells = rows[i].getElementsByTagName('td'); - // $ch = curl_init($refreshUrl); - // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - // curl_setopt($ch, CURLOPT_HTTPHEADER, [ - // "Authorization: Basic " . base64_encode($config['apilo']['client-id'] . ":" . $config['apilo']['client-secret']), - // "Accept: application/json" - // ]); + if (cells.length > 1) { + let secondCellText = cells[1].textContent.trim(); + let domain; - // $refreshResponse = curl_exec($ch); + if (secondCellText.includes('marianek.pl')) { + domain = 'marianek.pl'; + } else if (secondCellText.includes('pomysloweprezenty.pl')) { + domain = 'pomysloweprezenty.pl'; + } else { + continue; + } - // if (curl_errno($ch)) { - // echo 'Błąd cURL: ' . curl_error($ch); - // } else { - // $newTokens = json_decode($refreshResponse, true); - // echo "Nowy access token: " . $newTokens['accessToken']; + if (cells.length >= 5) { + let fifthCell = cells[4]; + let divsInFifthCell = fifthCell.children; - // // Zapisz nowy access token i refresh token w sesji lub bazie danych - // // $_SESSION['accessToken'] = $newTokens['accessToken']; - // // $_SESSION['refreshToken'] = $newTokens['refreshToken']; - // } + for (let i = 0; i < divsInFifthCell.length; i++) { + let currentDiv = divsInFifthCell[i]; + let imgDiv = currentDiv.getElementsByTagName('div')[0]; + let dataDiv = currentDiv.getElementsByTagName('div')[1]; - // curl_close($ch); - // exit; + if (dataDiv) { + let skuText = dataDiv.innerHTML.match(/SKU:\s*([A-Za-z0-9-]+)/); - // $url = "https://projectpro.apilo.com/rest/auth/token/?grant_type=authorization_code&code=" . $config['apilo']['authorization-code']; + if (skuText && skuText[1]) { + getProductData(skuText[1], domain).then(data => { + if (!data) { + console.log('Product not found:', skuText[1]); + return; + } - // $ch = curl_init( $url ); - // curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); - // curl_setopt( $ch, CURLOPT_HTTPHEADER, [ - // "Authorization: Basic " . base64_encode( $config['apilo']['client-id'] . ":" . $config['apilo']['client-secret'] ), - // "Accept: application/json" - // ] ); + console.log('Product found:', skuText[1]); + imgDiv.innerHTML = ''; + const imgElement = makeImg(data); + imgDiv.appendChild(imgElement); - // $response = curl_exec($ch); + imgElement.addEventListener('mouseover', function() { + showLargeImage(data, imgElement); + }); - // if( curl_errno( $ch ) ) { - // echo 'Błąd cURL: ' . curl_error( $ch ); - // } else { - // echo $response; - // } + imgElement.addEventListener('mouseout', function() { + hideLargeImage(); + }); + }); + } + } + } + } + } + } + } +} - // curl_close( $ch ); +function makeImg(src = 'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png') { + const img = document.createElement('img'); + img.src = src; + img.alt = 'image'; + img.className = 'img-fluid center-block'; + img.style.maxWidth = '48px'; + img.style.maxHeight = '48px'; - // $data = json_decode($response, true); + return img; +} - // $currentDateTime = new DateTime(); - // $tokenExpiryDateTime = DateTime::createFromFormat( DateTime::ATOM, $data['accessTokenExpireAt']); +function showLargeImage(src, imgElement) { + const largeImg = document.createElement('img'); + largeImg.src = src; + largeImg.style.position = 'absolute'; + largeImg.style.maxWidth = '400px'; + largeImg.style.maxHeight = '400px'; + largeImg.style.border = '1px solid #ccc'; + largeImg.style.background = '#fff'; + largeImg.style.zIndex = '1000'; + largeImg.style.top = imgElement.getBoundingClientRect().top + window.scrollY + 'px'; + largeImg.style.left = imgElement.getBoundingClientRect().left + imgElement.offsetWidth + 10 + 'px'; + largeImg.id = 'largeImagePreview'; - // // Sprawdzamy czy accessToken wygasł - // if ( $tokenExpiryDateTime <= $currentDateTime) { - // // Token wygasł, odświeżamy go używając refreshToken - // // $refreshUrl = "https://projectpro.apilo.com/rest/auth/token/?grant_type=refresh_token&refresh_token=" . $data['refreshToken']; + document.body.appendChild(largeImg); +} - // // curl_setopt( $ch, CURLOPT_URL, $refreshUrl ); - // // curl_setopt( $ch, CURLOPT_HTTPHEADER, [ - // // "Authorization: Basic " . base64_encode( $config['apilo']['client-id'] . ":" . $config['apilo']['client-secret'] ), - // // "Accept: application/json" - // // ] ); +function hideLargeImage() { + const largeImg = document.getElementById('largeImagePreview'); + if (largeImg) { + largeImg.remove(); + } +} - // // $refreshResponse = curl_exec($ch); +async function getProductData(sku, domain) { + let url; + if (domain === 'marianek.pl') { + url = `https://marianek.pl/api/v1/product.php?sku=${sku}`; + } else if (domain === 'pomysloweprezenty.pl') { + url = `https://pomysloweprezenty.pl/api/v1/product.php?sku=${sku}`; + } else { + console.error('Unsupported domain:', domain); + return null; + } - // // if (curl_errno($ch)) { - // // echo 'Błąd cURL podczas odświeżania: ' . curl_error($ch); - // // exit; - // // } + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } - // // $refreshedData = json_decode($refreshResponse, true); - // echo "Odświeżony token: " . $refreshedData['accessToken']; - // } else { - // echo "Token jest ważny."; - // } + const data = await response.json(); console.log(data); + return data.img; + } catch (error) { + console.error('Error fetching product data: ' + url, error); + return null; + } +} - // curl_close($ch); -exit; - } \ No newline at end of file +const currentUrl2 = window.location.href; +const pattern = /^https:\/\/projectpro\.apilo\.com\/warehouse\/shipment\/new-for-order\/.+/; + +if (pattern.test(currentUrl2)) { + const portletBody = document.querySelector('.kt-portlet__body'); + if (portletBody) { + const buttonContainer = document.createElement('div'); + buttonContainer.className = 'custom-button-container'; + buttonContainer.style.display = 'flex'; + buttonContainer.style.gap = '10px'; + buttonContainer.style.marginBottom = '15px'; + portletBody.parentNode.insertBefore(buttonContainer, portletBody); + + const buttonP2D = createButton('Inpost P2D', '#007bff', 'P2D.inpost', 'RZE14N||RZE14N'); + const buttonD2D = createButton('Inpost D2D', '#ff7800', 'D2D.inpostkurier'); + const buttonD2P = createButton('Inpost D2P', '#28a745', 'D2P.inpost'); + const buttonP2P = createButton('Inpost P2P', '#ffc107', 'P2P.inpost', 'RZE14N||RZE14N'); + + buttonContainer.appendChild(buttonP2D); + buttonContainer.appendChild(buttonD2D); + buttonContainer.appendChild(buttonD2P); + buttonContainer.appendChild(buttonP2P); + } +} + +function createButton(text, backgroundColor, method, dropoffPoint = null) { + const button = document.createElement('button'); + button.textContent = text; + button.style.background = backgroundColor; + button.style.display = 'inline-flex'; + button.style.width = '200px'; + button.style.height = '40px'; + button.style.alignItems = 'center'; + button.style.justifyContent = 'center'; + button.style.color = '#FFF'; + button.style.border = 'none'; + button.style.cursor = 'pointer'; + + button.addEventListener('click', () => handleShipment(method, dropoffPoint)); + + return button; +} + +async function handleShipment(method, dropoffPoint = null) { + try { + await selectPackageType(); + await setShipmentMethod(method); + if (dropoffPoint) { + await setDropoffPoint(dropoffPoint); + } + await setParcelWeight('1'); + await submitShipment(); + } catch (error) { + console.error('Wystąpił błąd: ', error); + } +} + +function retryUntilSuccess(fn, interval = 500, retries = 10) { + return new Promise((resolve, reject) => { + const attempt = async () => { + try { + const result = await fn(); + resolve(result); + } catch (err) { + if (retries === 0) { + reject(err); + } else { + setTimeout(() => { + retries--; + attempt(); + }, interval); + } + } + }; + attempt(); + }); +} + +function selectPackageType() { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const selectElement = document.getElementById('warehousebundle_shipment_packageType'); + if (selectElement) { + selectElement.value = 'package'; + const event = document.createEvent('HTMLEvents'); + event.initEvent('change', true, false); + selectElement.dispatchEvent(event); + resolve(); + } else { + reject('Nie znaleziono elementu packageType'); + } + }); + }); +} + +function setShipmentMethod(method) { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const methodElement = document.getElementById('warehousebundle_shipment_method'); + if (methodElement) { + methodElement.value = method; + const methodEvent = document.createEvent('HTMLEvents'); + methodEvent.initEvent('change', true, false); + methodElement.dispatchEvent(methodEvent); + resolve(); + } else { + reject('Nie znaleziono elementu shipment_method'); + } + }); + }); +} + +function setDropoffPoint(dropoffPoint) { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const dropoffPointElement = document.getElementById('warehousebundle_shipment_preferences_dropoffPoint'); + if (dropoffPointElement) { + dropoffPointElement.value = dropoffPoint; + const dropoffPointEvent = document.createEvent('HTMLEvents'); + dropoffPointEvent.initEvent('change', true, false); + dropoffPointElement.dispatchEvent(dropoffPointEvent); + resolve(); + } else { + reject('Nie znaleziono elementu dropoffPoint'); + } + }); + }); +} + +function setParcelWeight(weight) { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const weightElement = document.getElementById('warehousebundle_shipment_shipmentParcels_0_weight'); + if (weightElement) { + weightElement.value = weight; + const weightEvent = document.createEvent('HTMLEvents'); + weightEvent.initEvent('change', true, false); + weightElement.dispatchEvent(weightEvent); + resolve(); + } else { + reject('Nie znaleziono elementu shipmentParcels_0_weight'); + } + }); + }); +} + +function submitShipment() { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const submitButton = document.getElementById('warehousebundle_shipment_buttons_submit'); + if (submitButton) { + submitButton.click(); + resolve(); + } else { + reject('Nie znaleziono przycisku submit'); + } + }); + }); +} \ No newline at end of file diff --git a/apilo.js b/apilo.js index ab274e2..d31c03f 100644 --- a/apilo.js +++ b/apilo.js @@ -1,336 +1,339 @@ -// ==UserScript== -// @name A -// @version 1 -// @grant none -// ==/UserScript== - const currentUrl = window.location.href; - const patterns = [ - /^https:\/\/projectpro\.apilo\.com\/order\/order\/news\/?$/, - /^https:\/\/projectpro\.apilo\.com\/order\/order\/in-progress\/?$/, - /^https:\/\/projectpro\.apilo\.com\/order\/order\/to-send\/?$/, - /^https:\/\/projectpro\.apilo\.com\/order\/order\/completed\/?$/, - /^https:\/\/projectpro\.apilo\.com\/order\/order\/all\/?$/ - ]; - if (patterns.some(pattern => pattern.test(currentUrl))) { - waitForTableAndSetImage(); - attachTableReloadListener(); + + + + + + + + + + + + +const currentUrl = window.location.href; +console.log(currentUrl); +const patterns = [ + /^https:\/\/projectpro\.apilo\.com\/order\/order\/news\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/in-progress\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/to-send\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/completed\/?$/, + /^https:\/\/projectpro\.apilo\.com\/order\/order\/all\/?$/ +]; +if (patterns.some(pattern => pattern.test(currentUrl))) { + waitForTableAndSetImage(); + attachTableReloadListener(); +} + +function waitForTableAndSetImage() { + const intervalId = setInterval(() => { + let dataTables_scrollBody = document.getElementsByClassName('dataTables_scrollBody'); + if (dataTables_scrollBody.length > 0) { + let dataTables_tbody = dataTables_scrollBody[0].getElementsByTagName('tbody')[0]; + let rows = dataTables_tbody.getElementsByTagName('tr'); + + if (rows.length > 0) { + clearInterval(intervalId); + setImageToProduct(); + } + } + }, 100); +} + +function attachTableReloadListener() { + const table = document.querySelector('.dataTables_scrollBody table'); + if (table) { + const observer = new MutationObserver((mutationsList, observer) => { + for (const mutation of mutationsList) { + if (mutation.type === 'childList') { + waitForTableAndSetImage(); + break; + } + } + }); + + observer.observe(table.querySelector('tbody'), { childList: true }); } +} - function waitForTableAndSetImage() { - const intervalId = setInterval(() => { - let dataTables_scrollBody = document.getElementsByClassName('dataTables_scrollBody'); - if (dataTables_scrollBody.length > 0) { - let dataTables_tbody = dataTables_scrollBody[0].getElementsByTagName('tbody')[0]; - let rows = dataTables_tbody.getElementsByTagName('tr'); +function setImageToProduct(img = '') { + let dataTables_scrollBody = document.getElementsByClassName('dataTables_scrollBody'); + if (dataTables_scrollBody.length > 0) { + let dataTables_tbody = dataTables_scrollBody[0].getElementsByTagName('tbody')[0]; + let rows = dataTables_tbody.getElementsByTagName('tr'); - if (rows.length > 0) { - clearInterval(intervalId); // Zatrzymanie dalszego wykonywania setInterval - setImageToProduct(); + for (let i = 0; i < rows.length; i++) { + let cells = rows[i].getElementsByTagName('td'); + + if (cells.length > 1) { + let secondCellText = cells[1].textContent.trim(); + let domain; + + if (secondCellText.includes('marianek.pl')) { + domain = 'marianek.pl'; + } else if (secondCellText.includes('pomysloweprezenty.pl')) { + domain = 'pomysloweprezenty.pl'; + } else { + continue; + } + + if (cells.length >= 5) { + let fifthCell = cells[4]; + let divsInFifthCell = fifthCell.children; + + for (let i = 0; i < divsInFifthCell.length; i++) { + let currentDiv = divsInFifthCell[i]; + let imgDiv = currentDiv.getElementsByTagName('div')[0]; + let dataDiv = currentDiv.getElementsByTagName('div')[1]; + + if (dataDiv) { + let skuText = dataDiv.innerHTML.match(/SKU:\s*([A-Za-z0-9-]+)/); + + if (skuText && skuText[1]) { + getProductData(skuText[1], domain).then(data => { + if (!data) { + console.log('Product not found:', skuText[1]); + return; + } + + console.log('Product found:', skuText[1]); + imgDiv.innerHTML = ''; + const imgElement = makeImg(data); + imgDiv.appendChild(imgElement); + + imgElement.addEventListener('mouseover', function() { + showLargeImage(data, imgElement); + }); + + imgElement.addEventListener('mouseout', function() { + hideLargeImage(); + }); + }); } - } - }, 100); // Sprawdza co 100ms, można dostosować czas - } - - function attachTableReloadListener() { - const table = document.querySelector('.dataTables_scrollBody table'); - if (table) { - // Tworzymy obserwatora zmian w DOM - const observer = new MutationObserver((mutationsList, observer) => { - for (const mutation of mutationsList) { - if (mutation.type === 'childList') { - // Wykonaj kod po zmianie w tabeli (dodanie/usunięcie wierszy) - console.log('Table content changed'); - waitForTableAndSetImage(); - break; // Zatrzymujemy iterację po pierwszej znalezionej zmianie + } } } - }); - - // Konfiguracja obserwatora do nasłuchiwania zmian w zawartości tabeli - observer.observe(table.querySelector('tbody'), { childList: true }); + } } } +} - function setImageToProduct(img = '') { - let dataTables_scrollBody = document.getElementsByClassName('dataTables_scrollBody'); - if (dataTables_scrollBody.length > 0) { - let dataTables_tbody = dataTables_scrollBody[0].getElementsByTagName('tbody')[0]; - let rows = dataTables_tbody.getElementsByTagName('tr'); +function makeImg(src = 'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png') { + const img = document.createElement('img'); + img.src = src; + img.alt = 'image'; + img.className = 'img-fluid center-block'; + img.style.maxWidth = '48px'; + img.style.maxHeight = '48px'; - for (let i = 0; i < rows.length; i++) { - let cells = rows[i].getElementsByTagName('td'); + return img; +} - if (cells.length > 1) { - let secondCellText = cells[1].textContent.trim(); - let domain; +function showLargeImage(src, imgElement) { + const largeImg = document.createElement('img'); + largeImg.src = src; + largeImg.style.position = 'absolute'; + largeImg.style.maxWidth = '400px'; + largeImg.style.maxHeight = '400px'; + largeImg.style.border = '1px solid #ccc'; + largeImg.style.background = '#fff'; + largeImg.style.zIndex = '1000'; + largeImg.style.top = imgElement.getBoundingClientRect().top + window.scrollY + 'px'; + largeImg.style.left = imgElement.getBoundingClientRect().left + imgElement.offsetWidth + 10 + 'px'; + largeImg.id = 'largeImagePreview'; - if (secondCellText.includes('marianek.pl')) { - domain = 'marianek.pl'; - } else if (secondCellText.includes('pomysloweprezenty.pl')) { - domain = 'pomysloweprezenty.pl'; - } else { - continue; - } + document.body.appendChild(largeImg); +} - if (cells.length >= 5) { - let fifthCell = cells[4]; - let divsInFifthCell = fifthCell.children; +function hideLargeImage() { + const largeImg = document.getElementById('largeImagePreview'); + if (largeImg) { + largeImg.remove(); + } +} - for (let i = 0; i < divsInFifthCell.length; i++) { - let currentDiv = divsInFifthCell[i]; - let imgDiv = currentDiv.getElementsByTagName('div')[0]; - let dataDiv = currentDiv.getElementsByTagName('div')[1]; +async function getProductData(sku, domain) { + let url; + if (domain === 'marianek.pl') { + url = `https://marianek.pl/api/v1/product.php?sku=${sku}`; + } else if (domain === 'pomysloweprezenty.pl') { + url = `https://pomysloweprezenty.pl/api/v1/product.php?sku=${sku}`; + } else { + console.error('Unsupported domain:', domain); + return null; + } - if (dataDiv) { - let skuText = dataDiv.innerHTML.match(/SKU:\s*([A-Za-z0-9-]+)/); + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } - if (skuText && skuText[1]) { - getProductData(skuText[1], domain).then(data => { - if (!data) { - console.log('Product not found:', skuText[1]); - return; - } + const data = await response.json(); console.log(data); + return data.img; + } catch (error) { + console.error('Error fetching product data: ' + url, error); + return null; + } +} - console.log('Product found:', skuText[1]); - imgDiv.innerHTML = ''; - const imgElement = makeImg(data); - imgDiv.appendChild(imgElement); +const currentUrl2 = window.location.href; +const pattern = /^https:\/\/projectpro\.apilo\.com\/warehouse\/shipment\/new-for-order\/.+/; - // Dodanie eventu na hover - imgElement.addEventListener('mouseover', function() { - showLargeImage(data, imgElement); - }); +if (pattern.test(currentUrl2)) { + const portletBody = document.querySelector('.kt-portlet__body'); + if (portletBody) { + const buttonContainer = document.createElement('div'); + buttonContainer.className = 'custom-button-container'; + buttonContainer.style.display = 'flex'; + buttonContainer.style.gap = '10px'; + buttonContainer.style.marginBottom = '15px'; + portletBody.parentNode.insertBefore(buttonContainer, portletBody); - imgElement.addEventListener('mouseout', function() { - hideLargeImage(); - }); - }); - } - } - } - } - } - } + const buttonP2D = createButton('Inpost P2D', '#007bff', 'P2D.inpost', 'RZE14N||RZE14N'); + const buttonD2D = createButton('Inpost D2D', '#ff7800', 'D2D.inpostkurier'); + const buttonD2P = createButton('Inpost D2P', '#28a745', 'D2P.inpost'); + const buttonP2P = createButton('Inpost P2P', '#ffc107', 'P2P.inpost', 'RZE14N||RZE14N'); + + buttonContainer.appendChild(buttonP2D); + buttonContainer.appendChild(buttonD2D); + buttonContainer.appendChild(buttonD2P); + buttonContainer.appendChild(buttonP2P); + } +} + +function createButton(text, backgroundColor, method, dropoffPoint = null) { + const button = document.createElement('button'); + button.textContent = text; + button.style.background = backgroundColor; + button.style.display = 'inline-flex'; + button.style.width = '200px'; + button.style.height = '40px'; + button.style.alignItems = 'center'; + button.style.justifyContent = 'center'; + button.style.color = '#FFF'; + button.style.border = 'none'; + button.style.cursor = 'pointer'; + + button.addEventListener('click', () => handleShipment(method, dropoffPoint)); + + return button; +} + +async function handleShipment(method, dropoffPoint = null) { + try { + await selectPackageType(); + await setShipmentMethod(method); + if (dropoffPoint) { + await setDropoffPoint(dropoffPoint); + } + await setParcelWeight('1'); + await submitShipment(); + } catch (error) { + console.error('Wystąpił błąd: ', error); + } +} + +function retryUntilSuccess(fn, interval = 500, retries = 10) { + return new Promise((resolve, reject) => { + const attempt = async () => { + try { + const result = await fn(); + resolve(result); + } catch (err) { + if (retries === 0) { + reject(err); + } else { + setTimeout(() => { + retries--; + attempt(); + }, interval); + } } - } + }; + attempt(); + }); +} - function makeImg(src = 'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png') { - const img = document.createElement('img'); - img.src = src; - img.alt = 'image'; - img.className = 'img-fluid center-block'; - img.style.maxWidth = '48px'; - img.style.maxHeight = '48px'; - - return img; - } - - function showLargeImage(src, imgElement) { - const largeImg = document.createElement('img'); - largeImg.src = src; - largeImg.style.position = 'absolute'; - largeImg.style.maxWidth = '400px'; - largeImg.style.maxHeight = '400px'; - largeImg.style.border = '1px solid #ccc'; - largeImg.style.background = '#fff'; - largeImg.style.zIndex = '1000'; - largeImg.style.top = imgElement.getBoundingClientRect().top + window.scrollY + 'px'; - largeImg.style.left = imgElement.getBoundingClientRect().left + imgElement.offsetWidth + 10 + 'px'; - largeImg.id = 'largeImagePreview'; - - document.body.appendChild(largeImg); - } - - function hideLargeImage() { - const largeImg = document.getElementById('largeImagePreview'); - if (largeImg) { - largeImg.remove(); - } - } - - async function getProductData(sku, domain) { - let url; - if (domain === 'marianek.pl') { - url = `https://marianek.pl/api/v1/product.php?sku=${sku}`; - } else if (domain === 'pomysloweprezenty.pl') { - url = `https://pomysloweprezenty.pl/api/v1/product.php?sku=${sku}`; +function selectPackageType() { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const selectElement = document.getElementById('warehousebundle_shipment_packageType'); + if (selectElement) { + selectElement.value = 'package'; + const event = document.createEvent('HTMLEvents'); + event.initEvent('change', true, false); + selectElement.dispatchEvent(event); + resolve(); } else { - console.error('Unsupported domain:', domain); - return null; + reject('Nie znaleziono elementu packageType'); } + }); + }); +} - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); console.log(data); - return data.img; - } catch (error) { - console.error('Error fetching product data: ' + url, error); - return null; +function setShipmentMethod(method) { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const methodElement = document.getElementById('warehousebundle_shipment_method'); + if (methodElement) { + methodElement.value = method; + const methodEvent = document.createEvent('HTMLEvents'); + methodEvent.initEvent('change', true, false); + methodElement.dispatchEvent(methodEvent); + resolve(); + } else { + reject('Nie znaleziono elementu shipment_method'); } - } + }); + }); +} - const currentUrl2 = window.location.href; - const pattern = /^https:\/\/projectpro\.apilo\.com\/warehouse\/shipment\/new-for-order\/.+/; - - if (pattern.test(currentUrl2)) { - const portletBody = document.querySelector('.kt-portlet__body'); - if (portletBody) { - const buttonContainer = document.createElement('div'); - buttonContainer.className = 'custom-button-container'; - buttonContainer.style.display = 'flex'; - buttonContainer.style.gap = '10px'; - buttonContainer.style.marginBottom = '15px'; - portletBody.parentNode.insertBefore(buttonContainer, portletBody); - - const buttonP2D = createButton('Inpost P2D', '#007bff', 'P2D.inpost', 'RZE14N||RZE14N'); - const buttonD2D = createButton('Inpost D2D', '#ff7800', 'D2D.inpostkurier'); - const buttonD2P = createButton('Inpost D2P', '#28a745', 'D2P.inpost'); - const buttonP2P = createButton('Inpost P2P', '#ffc107', 'P2P.inpost', 'RZE14N||RZE14N'); - - buttonContainer.appendChild(buttonP2D); - buttonContainer.appendChild(buttonD2D); - buttonContainer.appendChild(buttonD2P); - buttonContainer.appendChild(buttonP2P); +function setDropoffPoint(dropoffPoint) { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const dropoffPointElement = document.getElementById('warehousebundle_shipment_preferences_dropoffPoint'); + if (dropoffPointElement) { + dropoffPointElement.value = dropoffPoint; + const dropoffPointEvent = document.createEvent('HTMLEvents'); + dropoffPointEvent.initEvent('change', true, false); + dropoffPointElement.dispatchEvent(dropoffPointEvent); + resolve(); + } else { + reject('Nie znaleziono elementu dropoffPoint'); } - } + }); + }); +} - function createButton(text, backgroundColor, method, dropoffPoint = null) { - const button = document.createElement('button'); - button.textContent = text; - button.style.background = backgroundColor; - button.style.display = 'inline-flex'; - button.style.width = '200px'; - button.style.height = '40px'; - button.style.alignItems = 'center'; - button.style.justifyContent = 'center'; - button.style.color = '#FFF'; - button.style.border = 'none'; - button.style.cursor = 'pointer'; - - button.addEventListener('click', () => handleShipment(method, dropoffPoint)); - - return button; - } - - async function handleShipment(method, dropoffPoint = null) { - try { - await selectPackageType(); - await setShipmentMethod(method); - if (dropoffPoint) { - await setDropoffPoint(dropoffPoint); - } - await setParcelWeight('1'); - await submitShipment(); - } catch (error) { - console.error('Wystąpił błąd: ', error); +function setParcelWeight(weight) { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const weightElement = document.getElementById('warehousebundle_shipment_shipmentParcels_0_weight'); + if (weightElement) { + weightElement.value = weight; + const weightEvent = document.createEvent('HTMLEvents'); + weightEvent.initEvent('change', true, false); + weightElement.dispatchEvent(weightEvent); + resolve(); + } else { + reject('Nie znaleziono elementu shipmentParcels_0_weight'); } - } + }); + }); +} - function retryUntilSuccess(fn, interval = 500, retries = 10) { - return new Promise((resolve, reject) => { - const attempt = async () => { - try { - const result = await fn(); - resolve(result); - } catch (err) { - if (retries === 0) { - reject(err); - } else { - setTimeout(() => { - retries--; - attempt(); - }, interval); - } - } - }; - attempt(); - }); - } - - function selectPackageType() { - return retryUntilSuccess(() => { - return new Promise((resolve, reject) => { - const selectElement = document.getElementById('warehousebundle_shipment_packageType'); - if (selectElement) { - selectElement.value = 'package'; - const event = document.createEvent('HTMLEvents'); - event.initEvent('change', true, false); - selectElement.dispatchEvent(event); - resolve(); - } else { - reject('Nie znaleziono elementu packageType'); - } - }); - }); - } - - function setShipmentMethod(method) { - return retryUntilSuccess(() => { - return new Promise((resolve, reject) => { - const methodElement = document.getElementById('warehousebundle_shipment_method'); - if (methodElement) { - methodElement.value = method; - const methodEvent = document.createEvent('HTMLEvents'); - methodEvent.initEvent('change', true, false); - methodElement.dispatchEvent(methodEvent); - resolve(); - } else { - reject('Nie znaleziono elementu shipment_method'); - } - }); - }); - } - - function setDropoffPoint(dropoffPoint) { - return retryUntilSuccess(() => { - return new Promise((resolve, reject) => { - const dropoffPointElement = document.getElementById('warehousebundle_shipment_preferences_dropoffPoint'); - if (dropoffPointElement) { - dropoffPointElement.value = dropoffPoint; - const dropoffPointEvent = document.createEvent('HTMLEvents'); - dropoffPointEvent.initEvent('change', true, false); - dropoffPointElement.dispatchEvent(dropoffPointEvent); - resolve(); - } else { - reject('Nie znaleziono elementu dropoffPoint'); - } - }); - }); - } - - function setParcelWeight(weight) { - return retryUntilSuccess(() => { - return new Promise((resolve, reject) => { - const weightElement = document.getElementById('warehousebundle_shipment_shipmentParcels_0_weight'); - if (weightElement) { - weightElement.value = weight; - const weightEvent = document.createEvent('HTMLEvents'); - weightEvent.initEvent('change', true, false); - weightElement.dispatchEvent(weightEvent); - resolve(); - } else { - reject('Nie znaleziono elementu shipmentParcels_0_weight'); - } - }); - }); - } - - function submitShipment() { - return retryUntilSuccess(() => { - return new Promise((resolve, reject) => { - const submitButton = document.getElementById('warehousebundle_shipment_buttons_submit'); - if (submitButton) { - submitButton.click(); - resolve(); - } else { - reject('Nie znaleziono przycisku submit'); - } - }); - }); - } \ No newline at end of file +function submitShipment() { + return retryUntilSuccess(() => { + return new Promise((resolve, reject) => { + const submitButton = document.getElementById('warehousebundle_shipment_buttons_submit'); + if (submitButton) { + submitButton.click(); + resolve(); + } else { + reject('Nie znaleziono przycisku submit'); + } + }); + }); +} \ No newline at end of file