Platonus - Autocomplete Graduate

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

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

您需要先安装一个扩展,例如 篡改猴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.1
// @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;038229264;19-03-2015;5B090400'
    ];

    let item = {};
    let itemArray = [
        'number',
        'surname',
        'name',
        'fatherName',
        'surnameEng',
        'nameEng',
        'phone',
        'phoneMobile',
        'numIin',
        'birthday',
        'docNum',
        'dateDoc',
        'professionCode'
    ];

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

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

        globalQueue: {},

        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(mapButton) {
            let outer = $('<li>').attr('id', completer.lotusBtnId)
                .insertBefore(mapButton.parent('li'));

            $('<button>').addClass('btn btn-success completer_button').appendTo(outer)
                .text('Заполнить из Лотус')
                .on('click', completer.clickToButton);
        },

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

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

            // Переходим на вкладку
            completer.gotoNextTab(tabs.personalData);
        },

        gotoNextTab: function(tabName) {
            if (completer.activateTab(tabName)) {
                setTimeout(tabs[tabName], 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]);
            }
            getInput = completer.findInput('Номер документа, удостоверяющего личность');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.docNum]);
            }
            getInput = completer.findDatepicker('Дата выдачи документа, удостоверяющего личность');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.dateDoc]);
            }
            getInput = completer.findDatepicker('Срок действия документа, удостоверяющего личность');
            if (getInput.length > 0) {
                completer.setValueToInput(getInput[0], stud[item.dateDoc]);
            }

            completer.gotoNextTab(tabs.education);
        },

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

            let getInput = completer.findCombobox('Академическая степень');
            if (getInput.length > 0) {
                completer.setValueToCombobox(getInput[0], 'Бакалавр');
            }
            let stepInTab = () => {
                getInput = completer.findCombobox('Специальность/Группа образовательных программ');
                if (getInput.length > 0) {
                    completer.setValueToCombobox(getInput[0], stud[item.professionCode]);
                }
            };
            setTimeout(stepInTab, completer.oneStepTime * 3);

            //completer.gotoNextTab(tabs.employment);
        },

        setTabEmployment: function() {
            completer.gotoNextTab(tabs.graduateData);
        },

        setTabGraduateData: function() {
            completer.gotoNextTab(tabs.benefits);
        },

        setTabBenefits: function() {
            completer.activateTab(tabs.personalData);
        },

        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"], input:not([type])');
            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;
        },

        findCombobox: function(labelText) {
            let oneLabel = completer.findLabel(labelText);
            let oneCombobox = oneLabel.nextAll('select + .select2-container').find('span[role="combobox"]');
            console.log('completer :: findCombobox [%o] = ', labelText, oneCombobox);
            return oneCombobox;
        },

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

        setValueToCombobox: function(oneInput, value) {
            console.log('completer :: setValueToCombobox [%o] = ', value, oneInput);
            oneInput.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));

            let filterHandler = function() {
                // Ищем поле для фильтра
                let optionsContainer = $(oneInput).parents('.select2-container').nextAll('.has-error + .select2-container');
                let filterInput = optionsContainer.find('[type="search"]');
                console.log('completer :: filterInput = ', filterInput);
                if (filterInput.length > 0) {
                    completer.setValueToInput(filterInput[0], value.toLowerCase());

                    let listHandler = function() {
                        // Выделяем оставшийся пункт
                        let filterList = optionsContainer.find('ul[role="listbox"] li');
                        console.log('completer :: filterList = ', filterList);
                        if (filterList.length > 0) {
                            filterList[0].dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
                        }
                    };
                    setTimeout(listHandler, completer.oneStepTime);
                }
            }
            setTimeout(filterHandler, completer.oneStepTime);
        },

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

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

        popstateHandler: function() {
            // Ждем кнопку карты
            let mapButton = $('a.btn.btn-primary[href$="/map"]');
            console.log('completer :: popstateHandler [%o] = ', mapButton.length, mapButton);

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

        runPopstate: function(event) {
            // Убираем старую кнопку
            $('#' + completer.lotusBtnId).remove();

            // Проверяем, какая страница открыта
            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);
        },

        startItem: function(event) {
            item = {};
            itemArray.forEach((name, index) => {
                item[name] = index;
            });
            //console.log('completer :: startItem = ', item);

            tabs[tabs.personalData] = completer.setTabPersonalData;
            tabs[tabs.education] = completer.setTabEducation;
            tabs[tabs.employment] = completer.setTabEmployment;
            tabs[tabs.graduateData] = completer.setTabGraduateData;
            tabs[tabs.benefits] = completer.setTabBenefits;
        },

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

    completer.start();

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