319 lines
13 KiB
JavaScript
319 lines
13 KiB
JavaScript
// ==UserScript==
|
||
// @name IDEAERP - Dodaj sekcję EMMA z TIM EDI
|
||
// @namespace http://tampermonkey.net/
|
||
// @version 1.0
|
||
// @description Dodaje sekcję "EMMA" do menu głównego z funkcjonalnością generowania plików EDI dla TIM. Po kliknięciu otwiera się modal z polem do wprowadzenia numeru zamówienia i wysyłania danych do serwera TIM EDI. Automatyczna konwersja liter na wielkie.
|
||
// @match https://emma.ideaerp.pl/web*
|
||
// @icon https://emma.ideaerp.pl/web/image/res.company/1/favicon/
|
||
// @downloadURL https://n8n.emma.net.pl/webhook/edi-tim
|
||
// @updateURL https://n8n.emma.net.pl/webhook/edi-tim
|
||
// @grant none
|
||
// ==/UserScript==
|
||
|
||
/* ========================OPIS==============================
|
||
WERSJA 1.0 - Integracja z TIM EDI + Automatyczne aktualizacje
|
||
|
||
CEL SKRYPTU:
|
||
- Dodanie sekcji "EMMA" do menu głównego IDEAERP
|
||
- Integracja z systemem TIM EDI do generowania plików
|
||
- Umożliwienie wysyłania numerów zamówień do serwera TIM
|
||
|
||
DZIAŁANIE SKRYPTU:
|
||
1. Lokalizuje sekcję menu o ID "209" w systemie IDEAERP
|
||
2. Tworzy nową sekcję "EMMA" z elementem "Tim Edi"
|
||
3. Po kliknięciu otwiera modal z formularzem
|
||
4. Umożliwia wprowadzenie numeru zamówienia
|
||
5. Wysyła dane do serwera TIM EDI (https://192.168.0.97:5011/tim/edi)
|
||
6. Czyści formularz po udanym wysłaniu
|
||
|
||
WYMAGANIA TECHNICZNE:
|
||
- Dostęp do serwera TIM EDI (192.168.0.97:5011)
|
||
- Sekcja menu o data-menu-section="209" w IDEAERP
|
||
- Obsługa fetch API w przeglądarce
|
||
- Dostęp do serwera aktualizacji (n8n.emma.net.pl/webhook/edi-tim)
|
||
- Tampermonkey z obsługą automatycznych aktualizacji
|
||
|
||
FUNKCJONALNOŚCI:
|
||
+ Dodawanie sekcji EMMA do menu głównego
|
||
+ Modal z formularzem do wprowadzania numeru zamówienia
|
||
+ Automatyczna konwersja liter na wielkie (w czasie rzeczywistym)
|
||
+ Zabezpieczenie przed wklejaniem małych liter
|
||
+ Walidacja wprowadzonych danych
|
||
+ Wysyłanie POST request do serwera TIM EDI
|
||
+ Obsługa błędów sieciowych
|
||
+ Czyszczenie formularza po wysłaniu
|
||
+ Przycisk zamknięcia modala (X)
|
||
+ Overlay z efektem przyciemnienia tła
|
||
|
||
STRUKTURA MODALA:
|
||
- Tytuł: "Generuj plik EDI"
|
||
- Pole tekstowe z placeholder: "Podaj numer zamówienia"
|
||
- Przycisk "Wyślij" (niebieski)
|
||
- Przycisk zamknięcia (X w prawym górnym rogu)
|
||
- Overlay z półprzezroczystym tłem
|
||
|
||
ENDPOINT API:
|
||
- URL: https://192.168.0.97:5011/tim/edi
|
||
- Method: POST
|
||
- Content-Type: application/json
|
||
- Body: { "Zamówienie": "numer_zamówienia" }
|
||
|
||
OBSŁUGA BŁĘDÓW:
|
||
- Walidacja pustego pola (alert: "Dodaj zamówienia")
|
||
- Obsługa błędów sieciowych (alert: "Wystąpił błąd podczas wysyłania danych")
|
||
- Logowanie błędów do konsoli
|
||
|
||
INTEGRACJA Z IDEAERP:
|
||
- Wstrzykiwanie sekcji do istniejącego menu
|
||
- Umieszczenie sekcji EMMA jako pierwszy element w kontenerze
|
||
- Zachowanie stylów i struktury menu IDEAERP
|
||
- Obsługa dynamicznego ładowania strony
|
||
|
||
AUTOMATYCZNE AKTUALIZACJE:
|
||
- Serwer aktualizacji: https://n8n.emma.net.pl/webhook/edi-tim
|
||
- Tampermonkey automatycznie sprawdza dostępność nowych wersji
|
||
- Jednoklikowa aktualizacja bez konieczności ręcznego pobierania
|
||
- Zachowanie ustawień użytkownika podczas aktualizacji
|
||
- Kompatybilność z systemem n8n do zarządzania wersjami
|
||
|
||
CHANGELOG:
|
||
v1.0 (2024) - AUTOMATYCZNE AKTUALIZACJE
|
||
- Dodano @downloadURL i @updateURL wskazujące na n8n.emma.net.pl/webhook/edi-tim
|
||
- Integracja z systemem n8n do zarządzania wersjami skryptu
|
||
- Automatyczne sprawdzanie i pobieranie aktualizacji przez Tampermonkey
|
||
- Dokumentacja procesu aktualizacji w sekcji OPIS
|
||
- Podwyższenie numeru wersji do 1.0 (stabilna wersja)
|
||
|
||
v0.9 (2024) - AUTOMATYCZNA KONWERSJA LITER
|
||
- Dodano automatyczną konwersję liter na wielkie w czasie rzeczywistym
|
||
- Zabezpieczenie przed wklejaniem małych liter
|
||
- Zachowanie pozycji kursora podczas konwersji
|
||
- Dodano CSS text-transform: uppercase dla wizualnej spójności
|
||
|
||
v0.8 (2024) - PIERWSZA WERSJA
|
||
- Dodanie sekcji EMMA do menu głównego
|
||
- Implementacja modala z formularzem
|
||
- Integracja z serwerem TIM EDI
|
||
- Obsługa wysyłania numerów zamówień
|
||
- Walidacja danych wejściowych
|
||
- Obsługa błędów sieciowych
|
||
- Czyszczenie formularza po wysłaniu
|
||
- Responsywny design modala
|
||
- Przycisk zamknięcia modala
|
||
============================================================ */
|
||
|
||
(function() {
|
||
'use strict';
|
||
|
||
// ——— Funkcja główna: dodawanie sekcji EMMA do menu ———
|
||
function addEmmaSection() {
|
||
var targetSection = document.querySelector('div.i_secondary_menu__section[data-menu-section="209"]');
|
||
if (!targetSection) {
|
||
setTimeout(addEmmaSection, 500);
|
||
return;
|
||
}
|
||
if (document.querySelector('div.i_secondary_menu__section[data-menu-section="1248"]')) {
|
||
attachPopupListener();
|
||
return;
|
||
}
|
||
|
||
var newSectionHtml = `
|
||
<div class="i_secondary_menu__section folded" data-menu-section="1248">
|
||
<a href="#" class="i_secondary_menu__toggle o_menu_header_lvl_1" data-menu-xmlid="ideaerp_base.i7_base_sale_order_folders_main_menu" data-display="static" role="button" aria-expanded="false">
|
||
EMMA
|
||
</a>
|
||
<ul class="i_secondary_menu__content" role="menu">
|
||
<li>
|
||
<a role="menuitem" href="#" class="dropdown-item o_menu_entry_lvl_2" id="timEdiLink">
|
||
<span>Tim Edi</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`;
|
||
var tempDiv = document.createElement('div');
|
||
tempDiv.innerHTML = newSectionHtml.trim();
|
||
var newSection = tempDiv.firstElementChild;
|
||
// Wstawiamy sekcję jako pierwszy element w kontenerze
|
||
var parent = targetSection.parentNode;
|
||
parent.insertBefore(newSection, parent.firstChild);
|
||
console.log("Dodano sekcję EMMA z TIM EDI do menu jako pierwszy element.");
|
||
attachPopupListener();
|
||
}
|
||
|
||
// ——— Obsługa kliknięć: podpięcie event listenera do linku TIM EDI ———
|
||
function attachPopupListener() {
|
||
var timEdiLink = document.getElementById('timEdiLink');
|
||
if (timEdiLink) {
|
||
timEdiLink.addEventListener('click', function(e) {
|
||
e.preventDefault();
|
||
showPopup();
|
||
});
|
||
}
|
||
}
|
||
|
||
// ——— Tworzenie i wyświetlanie modala z formularzem TIM EDI ———
|
||
function showPopup() {
|
||
var overlay = document.getElementById('edi-popup-overlay');
|
||
if (!overlay) {
|
||
overlay = document.createElement('div');
|
||
overlay.id = 'edi-popup-overlay';
|
||
Object.assign(overlay.style, {
|
||
position: 'fixed',
|
||
top: '0',
|
||
left: '0',
|
||
right: '0',
|
||
bottom: '0',
|
||
background: 'rgba(0, 0, 0, 0.6)',
|
||
zIndex: '10000',
|
||
display: 'flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center'
|
||
});
|
||
|
||
var modal = document.createElement('div');
|
||
modal.id = 'edi-popup';
|
||
Object.assign(modal.style, {
|
||
background: '#fff',
|
||
borderRadius: '8px',
|
||
padding: '20px',
|
||
width: '320px',
|
||
boxSizing: 'border-box',
|
||
boxShadow: '0 2px 10px rgba(0,0,0,0.2)',
|
||
position: 'relative',
|
||
fontFamily: 'Arial, sans-serif'
|
||
});
|
||
|
||
// ——— Przycisk zamknięcia modala (X w prawym górnym rogu) ———
|
||
var closeButton = document.createElement('button');
|
||
closeButton.id = 'edi-close';
|
||
closeButton.textContent = '×';
|
||
Object.assign(closeButton.style, {
|
||
position: 'absolute',
|
||
top: '1px',
|
||
right: '5px',
|
||
background: 'transparent',
|
||
border: 'none',
|
||
fontSize: '22px',
|
||
cursor: 'pointer',
|
||
color: '#888'
|
||
});
|
||
closeButton.addEventListener('click', function() {
|
||
overlay.style.display = 'none';
|
||
});
|
||
modal.appendChild(closeButton);
|
||
|
||
// ——— Tytuł modala ———
|
||
var title = document.createElement('h4');
|
||
title.textContent = 'Generuj plik EDI';
|
||
Object.assign(title.style, {
|
||
margin: '20px 0 15px 0',
|
||
fontSize: '16px',
|
||
color: '#888'
|
||
});
|
||
modal.appendChild(title);
|
||
|
||
// ——— Pole tekstowe do wprowadzania numeru zamówienia ———
|
||
var input = document.createElement('input');
|
||
input.type = 'text';
|
||
input.id = 'order-number';
|
||
input.placeholder = 'Podaj numer zamówienia';
|
||
Object.assign(input.style, {
|
||
width: '100%',
|
||
padding: '8px',
|
||
marginBottom: '15px',
|
||
border: '1px solid #ccc',
|
||
borderRadius: '4px',
|
||
fontSize: '14px',
|
||
textTransform: 'uppercase' // Automatyczna konwersja na wielkie litery
|
||
});
|
||
|
||
// ——— Zabezpieczenie: automatyczna konwersja na wielkie litery ———
|
||
input.addEventListener('input', function(e) {
|
||
var cursorPosition = e.target.selectionStart;
|
||
var originalValue = e.target.value;
|
||
var upperValue = originalValue.toUpperCase();
|
||
|
||
// Aktualizujemy wartość tylko jeśli nastąpiła zmiana
|
||
if (originalValue !== upperValue) {
|
||
e.target.value = upperValue;
|
||
// Przywracamy pozycję kursora
|
||
e.target.setSelectionRange(cursorPosition, cursorPosition);
|
||
}
|
||
});
|
||
|
||
// ——— Dodatkowe zabezpieczenie dla wklejania tekstu ———
|
||
input.addEventListener('paste', function(e) {
|
||
setTimeout(function() {
|
||
var cursorPosition = input.selectionStart;
|
||
var originalValue = input.value;
|
||
var upperValue = originalValue.toUpperCase();
|
||
|
||
if (originalValue !== upperValue) {
|
||
input.value = upperValue;
|
||
input.setSelectionRange(cursorPosition, cursorPosition);
|
||
}
|
||
}, 0);
|
||
});
|
||
|
||
modal.appendChild(input);
|
||
|
||
// ——— Przycisk wysyłania danych do serwera TIM EDI ———
|
||
var button = document.createElement('button');
|
||
button.id = 'edi-submit';
|
||
button.textContent = 'Wyślij';
|
||
Object.assign(button.style, {
|
||
padding: '10px 20px',
|
||
fontSize: '14px',
|
||
background: '#007bff',
|
||
color: '#fff',
|
||
border: 'none',
|
||
borderRadius: '4px',
|
||
cursor: 'pointer'
|
||
});
|
||
button.addEventListener('click', function() {
|
||
// ——— Walidacja danych wejściowych ———
|
||
var orderNumber = input.value.trim();
|
||
if (!orderNumber) {
|
||
alert("Dodaj zamówienia");
|
||
return;
|
||
}
|
||
// ——— Wysyłanie danych do serwera TIM EDI ———
|
||
fetch('https://192.168.0.97:5011/tim/edi', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify({ "Zamówienie": orderNumber })
|
||
})
|
||
.then(response => {
|
||
if (!response.ok) {
|
||
throw new Error('Network response was not ok');
|
||
}
|
||
return response.json();
|
||
})
|
||
.then(data => {
|
||
// ——— Obsługa sukcesu: czyszczenie formularza i zamknięcie modala ———
|
||
console.log('Sukces:', data);
|
||
input.value = "";
|
||
overlay.style.display = 'none';
|
||
})
|
||
.catch((error) => {
|
||
// ——— Obsługa błędów sieciowych ———
|
||
console.error('Error:', error);
|
||
alert("Wystąpił błąd podczas wysyłania danych.");
|
||
});
|
||
});
|
||
modal.appendChild(button);
|
||
|
||
overlay.appendChild(modal);
|
||
document.body.appendChild(overlay);
|
||
} else {
|
||
overlay.style.display = 'flex';
|
||
}
|
||
}
|
||
|
||
// ——— Inicjalizacja: uruchomienie po załadowaniu strony ———
|
||
window.addEventListener('load', addEmmaSection);
|
||
})();
|