272 lines
14 KiB
JavaScript
272 lines
14 KiB
JavaScript
// ==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 = `
|
||
<div class="a-Property-fieldContainer" id="P4500_LEMODALPAGEREVERS_CONT">
|
||
<select size="1" class="a-Property-field a-Property-field--select" id="P4500_LEMODALPAGEREVERS_SELECT" data-property-id="11">
|
||
</select>
|
||
</div>
|
||
`;
|
||
|
||
// Вставить новый элемент после "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 = `<a href="#" target="_blank">${page}</a>`;
|
||
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 = `
|
||
<div class="a-Property-fieldContainer" id="P4500_LEMODALPAGEREVERS_CONT">
|
||
<input class="a-Property-field a-Property-field--readOnly" readonly="true" value="Выполните поиск для запуска функционала" type="text">
|
||
</div>
|
||
`;
|
||
|
||
// Вставить новый элемент после "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);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
})();
|