// ==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(); } 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); // Zatrzymanie dalszego wykonywania setInterval setImageToProduct(); } } }, 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'); 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); // Dodanie eventu na hover imgElement.addEventListener('mouseover', function() { showLargeImage(data, imgElement); }); imgElement.addEventListener('mouseout', function() { hideLargeImage(); }); }); } } } } } } } } 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}`; } else { console.error('Unsupported domain:', domain); return null; } 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; } } 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'); } }); }); }