Platonus - Autocomplete Graduate

Автозаполнение полей выпускника

当前为 2024-12-13 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Platonus - Autocomplete Graduate
// @namespace    scriptomatika
// @author       mouse-karaganda
// @description  Автозаполнение полей выпускника
// @license      MIT
// @match        https://platonus.buketov.edu.kz/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=platonus.buketov.edu.kz
// @version      1.0
// @grant        none
// ==/UserScript==

(function() {
    console.log('Userscript run at == ', location.href);
    let $ = window.jQuery;

    let studentList = [
        '1;Абилова;Далила;Руслановна;Abilova;Dalila;970570;87087747738;980429450553;01-02-1995'
    ];

    let item = {
        number: 0,
        surname: 1,
        name: 2,
        fatherName: 3,
        surnameEng: 4,
        nameEng: 5,
        phone: 6,
        phoneMobile: 7,
        numIin: 8,
        birthday: 9
    };

    let tabs = {
        personalData: 'Личные данные',
        education: 'Образование',
        employment: 'Трудоустройство',
        graduateData: 'Данные о выпускнике',
        benefits: 'Льготы'
    };

    let completer = {
        maxLoadTime: 120000,
        oneStepTime: 400,
        globalIndex: 0,

        insertStyle: function() {
            let styleText = [
                '.completer_button { margin-right: 20px; }',
                '.completer_button.btn-success, .completer_button.btn-success:hover { background-color: #0033cc !important; border-color: #0033cc !important; }'
            ];
            $('<style type="text/css">').appendTo(document.head)
                .text(styleText.join('\n'));
        },

        createButton: function(allButtons) {
            let saveButton = allButtons[0];
            $('<button>').addClass('btn btn-success completer_button').insertBefore(saveButton)
                .text('Заполнить из Лотус')
                .on('click', completer.clickToButton);

            $(saveButton).on('click', completer.clickToSave)
                .attr({ title: 'Сохранить [' + (++completer.globalIndex) + ']' });
            //console.log('completer :: create saveButton [%o] = ', ++completer.globalIndex, saveButton);
        },

        setValueToInput: function(oneInput, value) {
            oneInput.value = value;
            oneInput.dispatchEvent(new Event('input'));
            oneInput.dispatchEvent(new Event('blur'));
        },

        clickToButton: async function() {
            let pik = $('#dativeFIOru').get(0);
            //completer.setValueToTextbox(pik, "Бокижанова");

            let stud = completer.findStudent();
            completer.currentStudent = stud;

            // Переходим на вкладку
            if (completer.activateTab(tabs.personalData)) {
                setTimeout(completer.setTabPersonalData, completer.oneStepTime);
            }
        },

        setTabPersonalData: function() {
            let findTab = completer.findTab(tabs.personalData);
            if (findTab.length == 0) {
                return;
            }
            let stud = completer.currentStudent;

            let getInput = completer.findInput('Фамилия транслитом');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.surnameEng]);
            }
            getInput = completer.findInput('Имя транслитом');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.nameEng]);
            }
            getInput = completer.findInput('Домашний телефон');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.phone]);
            }
            getInput = completer.findInput('Мобильный телефон');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], completer.getPhoneMobile(stud[item.phoneMobile]));
            }
            getInput = completer.findInput('ИИН');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], completer.getIin(stud[item.numIin]));
            }
            getInput = completer.findDatepicker('Дата рождения');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.birthday]);
            }
        },

        findStudent: function() {
            let findItem = studentList[0];
            let result = findItem.split(';');
            return result;
        },

        activateTab: function(tabText) {
            let findTab = completer.findTab(tabText);
            if (findTab.length > 0) {
                findTab.eq(0).trigger('click');
                return true;
            }
            return false;
        },

        findTab: function(tabText) {
            let tabList = $('ul.nav-tabs button.nav-link');
            //console.log('completer :: tabList = ', tabList);
            let oneTab = tabList.filter((index, tab) => $(tab).text().trim() == tabText);
            console.log('completer :: findTab [%o] = ', tabText, oneTab);
            return oneTab;
        },

        findLabel: function(labelText) {
            let labelList = $('.tab-content label.form-label');
            //console.log('completer :: labelList = ', labelList);
            let oneLabel = labelList.filter((index, label) => $(label).text().trim() == labelText);
            console.log('completer :: findLabel [%o] = ', labelText, oneLabel);
            return oneLabel;
        },

        findInput: function(labelText) {
            // Ищем метку и следующий после неё элемент
            let oneLabel = completer.findLabel(labelText);
            let oneInput = oneLabel.next('input[type="text"]');
            console.log('completer :: findInput [%o] = ', labelText, oneInput);
            return oneInput;
        },

        findDatepicker: function(labelText) {
            let oneLabel = completer.findLabel(labelText);
            let oneDatepicker = oneLabel.next('.input-group').find('input[datepicker]');
            console.log('completer :: findDatepicker [%o] = ', labelText, oneDatepicker);
            return oneDatepicker;
        },

        getPhoneMobile: function(value) {
            return value;
        },

        getIin: function(value) {
            return value;
        },

        clickToSave: function(event) {
            completer.saveStart = new Date();
            completer.saveTimer = setInterval(completer.saveHandler, completer.oneStepTime);
        },

        saveHandler: function() {
            console.log('completer :: step saveTimer');
            // Ждем появления алерта
            let saveAlert = $('plt-notification div.alert');
            if (saveAlert.length == 0) {
                let pause = new Date() - completer.saveStart;
                if (pause > completer.maxLoadTime) {
                    clearInterval(completer.saveTimer);
                    return;
                }
            } else {
                clearInterval(completer.saveTimer);
                // Возвращаем кнопку Лотуса после сохранения
                completer.runPopstate();
            }
        },

        popstateHandler: function() {
            // Ждем кнопку сохранения
            let allButtons = $('.tab-content button.btn.btn-success');
            console.log('completer :: popstateHandler [%o] = ', allButtons.length, allButtons);

            if (allButtons.length == 0) {
                let pause = new Date() - completer.popstateStart;
                if (pause > completer.maxLoadTime) {
                    clearInterval(completer.popstateTimer);
                    return;
                }
            } else {
                clearInterval(completer.popstateTimer);
                // Создаем новую кнопку
                completer.createButton(allButtons);
            }
        },

        runPopstate: function(event) {
            let isGraduate = /graduate\/\d+/.test(location.href);
            console.log('completer :: runPopstate [%o] = ', isGraduate, location.href);
            if (!isGraduate) {
                return;
            }
            completer.popstateStart = new Date();
            completer.popstateTimer = setInterval(completer.popstateHandler, completer.oneStepTime);
        },

        start: function() {
            completer.insertStyle();
            completer.runPopstate();
            //window.addEventListener("popstate", completer.runPopstate);
            $(window).on("popstate", completer.runPopstate);
        }
    };

    completer.start();

    console.log('Platonus - Autocomplete Graduate 💬 1.0');
})();