// ==UserScript== // @name OracleApex5:Get-External-Internal-Url-From-Page-Use-Search // @namespace http://tampermonkey.net/ // @version 2024-02-13 // @description Скрипт, который отслеживает изменения в элементе страницы с помощью MutationObserver, извлекает данные с сервера, добавляет их в выпадающий список и обновляет информацию в зависимости от полученных результатов поиска. // @author You // @match https://lseo.jv.mt-s.kz:4443/service/f?p=4000:4500* // @match https://lseo.jv.mt-s.kz:4443/service/f?p=4000:8000* // @match https://online.lse.kz/service/f?p=4000:4500* // @match https://online.lse.kz/service/f?p=4000:8000* // @match https://asut-clone.erg.kz/apex/f?p=4000:4500* // @match https://asut-clone.erg.kz/apex/f?p=4000:8000* // @icon https://docs.oracle.com/favicon.ico // @grant none // ==/UserScript== (function() { 'use strict'; // Функция, которая будет вызвана при исчезновении "is-processing" function handleMutation(mutationsList, observer) { mutationsList.forEach(mutation => { if (!mutation.target.classList.contains('is-processing')) { // "is-processing" убрался, выполнить функцию startSearch() startSearch(); // После выполнения, прекратить наблюдение observer.disconnect(); // Снова начать наблюдение после выполнения startSearch() startObservingWithRetry(targetNode, observer, config); } }); } // Создать новый экземпляр MutationObserver с функцией обратного вызова var observer = new MutationObserver(handleMutation); // Наблюдать за изменениями в элементе с id "a_PageDesigner" var targetNode = null; try { targetNode = document.getElementById('a_PageDesigner'); } catch {} // Настройка на наблюдение за изменениями в классах элемента var config = { attributes: true, attributeFilter: ['class'] }; // Начать наблюдение // startObservingWithRetry(); function startSearch(){ // Найти элемент с классом "a-ControlBar-col" var vLength = $v('pPageItemsProtected').length; // var mainUrl = window.location.origin + window.location.pathname.slice(0, -1) var mainUrl = window.location.origin.replace("http:", "https:") + window.location.pathname.slice(0, -1); var nameLE_pProtected = "LE_pProtected_"+mainUrl; var nameLE_pSession = "LE_pSession_"+mainUrl; var nameLE_pSalt = "LE_pSalt_"+mainUrl; if (localStorage.getItem(nameLE_pProtected) === null) { localStorage.setItem(nameLE_pProtected, $v('pPageItemsProtected')) } if ( (localStorage.getItem(nameLE_pProtected).length === 22 && localStorage.getItem(nameLE_pSession) === apex.item('pInstance').getValue()) | (vLength === 22) ) { //console.log('Inject') if (vLength === 22) { localStorage.setItem(nameLE_pProtected, $v('pPageItemsProtected')) localStorage.setItem(nameLE_pSession, apex.item('pInstance').getValue()) localStorage.setItem(nameLE_pSalt, $v('pSalt')) } var vCurrentPage = $v(document.querySelector("#go_to_page")) var vSearchString= ":"+vCurrentPage+":&SESSION" var bodyParams = { "salt": localStorage.getItem(nameLE_pSalt), "pageItems": { "itemsToSubmit": [ { "n": "P8000_START_SEARCH", "v": "0" }, { "n": "P8000_SEARCH", "v": vSearchString }, { "n": "P8000_CASE_SENSITIVE", "v": [] }, { "n": "P8000_CURRENT_PAGE_ONLY", "v": []}, { "n": "P0_FLOWPAGE", "v": "101;1|1" } ], "protected": localStorage.getItem(nameLE_pProtected), "rowVersion": "" } }; var body = "p_json=" + encodeURIComponent(JSON.stringify(bodyParams)) + "&p_flow_id=4000&p_flow_step_id=8000&p_instance="+$v('pInstance')+"&p_page_submission_id="+localStorage.getItem(nameLE_pSalt)+"&p_request=&p_reload_on_submit=A"; fetch("https://" + window.location.host + "/service/wwv_flow.accept", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, body: body, credentials: "include" }) .then(response => response.text()) .then(data => { var tempElement = document.createElement('div'); tempElement.innerHTML = data; var searchResultsElement = tempElement.querySelector('#search_results'); if (searchResultsElement) { var tables = searchResultsElement.querySelectorAll('table'); var foundPages = []; try { tables.forEach(function (table) { var tableText = table.textContent || table.innerText; if (tableText.includes(vSearchString)) { var tdElements = table.querySelectorAll('td'); var pagePath = tdElements[0].textContent.trim(); var pagePathParts = pagePath.split(' > '); var combinedElements = pagePathParts.slice(2).join(' > '); foundPages.push(combinedElements); } }) } catch {}; if (foundPages.length > 0) { // Создать пустой объект для отслеживания добавленных значений var addedValues = {}; var controlBarCol = document.querySelector('.a-ControlBar-col'); // Проверка наличия элемента if (controlBarCol) { // Найти элемент с id "utilitiesMenu" внутри "a-ControlBar-col" var utilitiesMenu = controlBarCol.querySelector('#utilitiesMenu'); try { document.querySelector("#P4500_LEMODALPAGEREVERS_MAIN").remove(); } catch {} // // Проверка наличия элемента if (utilitiesMenu) { // Создать новый элемент select var newElement = document.createElement('div'); newElement.id = 'P4500_LEMODALPAGEREVERS_MAIN'; newElement.className = 'a-PageSelect'; newElement.style.margin = '-1px;margin-right: 5px;border-width:1px'; newElement.innerHTML = `
`; // Вставить новый элемент после "utilitiesMenu" utilitiesMenu.insertAdjacentElement('afterend', newElement); document.querySelector("#P4500_LEMODALPAGEREVERS_MAIN").setAttribute("style","margin-right: 5px;border-width:1px") document.querySelector("#P4500_LEMODALPAGEREVERS_CONT").setAttribute("style","padding:3px") } } // Получить элемент select var selectElement = document.getElementById('P4500_LEMODALPAGEREVERS_SELECT'); // Проверка наличия элемента if (selectElement) { // Очистить содержимое элемента select selectElement.innerHTML = ''; // Заполнить элементами от pagePathParts foundPages.forEach(function (page, index) { // Проверить, было ли уже добавлено значение if (!addedValues[page]) { var option = document.createElement('option'); option.value = index + 1; option.innerHTML = `${page}`; selectElement.appendChild(option); // Добавить значение в объект, чтобы избежать дублирования addedValues[page] = true; } }); } } else { console.log('No pages found with id ' + vSearchString); } } else { try { var selectElementTry = document.getElementById('P4500_LEMODALPAGEREVERS_SELECT'); selectElementTry.innerHTML = ''; var option = document.createElement('option'); option.value = 1; option.innerHTML = `Сессия изменена, попробуйте выполнить поиск, и после обновить страницу`; selectElementTry.appendChild(option); } catch {} console.log('Element with id "search_results" not found'); } }) .catch(error => console.error("Error:", error)); } else { console.log('Ошибка'+'\n'+'vLength ||| ' +vLength +'\n'+'localStorage.getItem(nameLE_pProtected).length ||| ' + localStorage.getItem(nameLE_pProtected).length +'\n'+'localStorage.getItem(nameLE_pSession) ||| ' + localStorage.getItem(nameLE_pSession) +'\n'+"apex.item('pInstance').getValue() ||| " + apex.item('pInstance').getValue() ) var controlBarCol = document.querySelector('.a-ControlBar-col'); // Проверка наличия элемента if (controlBarCol) { // Найти элемент с id "utilitiesMenu" внутри "a-ControlBar-col" var utilitiesMenu = controlBarCol.querySelector('#utilitiesMenu'); try { document.querySelector("#P4500_LEMODALPAGEREVERS_MAIN").remove(); } catch {} // // Проверка наличия элемента if (utilitiesMenu) { // Создать новый элемент select var newElement = document.createElement('div'); newElement.id = 'P4500_LEMODALPAGEREVERS_MAIN'; newElement.className = 'a-PageSelect'; newElement.style.margin = '-1px;margin-right: 5px;border-width:1px'; newElement.innerHTML = `
`; // Вставить новый элемент после "utilitiesMenu" utilitiesMenu.insertAdjacentElement('afterend', newElement); document.querySelector("#P4500_LEMODALPAGEREVERS_MAIN").setAttribute("style","margin-right: 5px;border-width:1px") document.querySelector("#P4500_LEMODALPAGEREVERS_CONT").setAttribute("style","padding:3px; width:260px") } } }}; // Начать наблюдение с возможностью повтора через 5 секунд // startObservingWithRetry(); startObservingWithRetry(targetNode, observer, config); // Функция для начала наблюдения с возможностью повтора через 5 секунд function startObservingWithRetry(targetNode, observer, config) { try { if (targetNode === null) { console.log ('NULL|'+observer) startSearch() } else { targetNode = document.getElementById('a_PageDesigner'); observer.observe(targetNode, config); } } catch (error) { console.error('Error starting observing:', error); // Повторная попытка через 5 секунд setTimeout(() => startObservingWithRetry(targetNode, observer, config), 5000); } } })();