Как запустить проверку в мастере при нажатии кнопки «Далее»?

0

В приложении Laravel 8, которое использует vuejs и jquery, я обнаружил мастер, созданный с помощью html, например:

<div class="content__inner">
    <div class="ccontainer overflow-hiddenn">
        <!--multisteps-form-->
        <div class="multisteps-form">
            <div class="multisteps-form__progress">
                <button
                    class="multisteps-form__progress-btn js-active"
                    type="button"
                    title="Add Project Info"
                >
                    Project Info
                </button>
                <button
                    class="multisteps-form__progress-btn"
                    type="button"
                    title="Add Product"
                >
                    Product Details 22222
                </button>
                <button
                    class="multisteps-form__progress-btn"
                    type="button"
                    title="Project Budget & Diagram"
                >
                    Project Budget & Diagram
                </button>
                <button
                    class="multisteps-form__progress-btn"
                    type="button"
                    title="Video & Website Link"
                >
                    Video & Website Link
                </button>
            </div>

            <form class="multisteps-form__form">
                <!--single form panel-->
                <div
                    class="multisteps-form__panel shadow p-4 rounded bg-white js-active"
                    data-animation="scaleIn"
                >
                    <!-- <h3 class="multisteps-form__title">Your User Info</h3> -->
                    <div class="multisteps-form__content">
                        <div class="row">
                            <div class="col-xl-4">
                                <div class="submit-field">
                                    <h5>
                                        Project Name
                                        <span>*</span>
                                    </h5>
                                    <input
                                        type="text"
                                        class="with-border"
                                        id="name_project"
                                        v-model="project.name"
                                    />
                                </div>
                            </div>

                            <div class="col-xl-4">
                                <div class="submit-field">
                                    <h5>
                                        Choose Categories
                                        <span>*</span>
                                    </h5>
                                    <b-form-select
                                        class="tzselectpicker"
                                        v-model="project.category"
                                    :options="project_category"
                                ></b-form-select>
                            </div>
                        </div>

и инициализированная функция js

setStepForm() {
    //DOM elements
    const DOMstrings = {
        stepsBtnClass: "multisteps-form__progress-btn",
        stepsBtns: document.querySelectorAll(
            `.multisteps-form__progress-btn`
        ),
        stepsBar: document.querySelector(".multisteps-form__progress"),
        stepsForm: document.querySelector(".multisteps-form__form"),
        stepsFormTextareas: document.querySelectorAll(
            ".multisteps-form__textarea"
        ),
        stepFormPanelClass: "multisteps-form__panel",
        stepFormPanels: document.querySelectorAll(
            ".multisteps-form__panel"
        ),
        stepPrevBtnClass: "js-btn-prev",
        stepNextBtnClass: "js-btn-next"
    };
    console.log(" setStepForm DOMstrings::");
    console.log(DOMstrings);

    //remove class from a set of items
    const removeClasses = (elemSet, className) => {
        elemSet.forEach(elem => {
            elem.classList.remove(className);
        });
    };

    //return exect parent node of the element
    const findParent = (elem, parentClass) => {
        let currentNode = elem;
        while (!currentNode.classList.contains(parentClass)) {
            currentNode = currentNode.parentNode;
        }
        return currentNode;
    };

    //get active button step number
    const getActiveStep = elem => {
        return Array.from(DOMstrings.stepsBtns).indexOf(elem);
    };

    //set all steps before clicked (and clicked too) to active
    const setActiveStep = activeStepNum => {
        //remove active state from all the state
        removeClasses(DOMstrings.stepsBtns, "js-active");
        //set picked items to active
        DOMstrings.stepsBtns.forEach((elem, index) => {
            if (index <= activeStepNum) {
                elem.classList.add("js-active");
            }
        });
    };

    //get active panel
    const getActivePanel = () => {
        let activePanel;
        DOMstrings.stepFormPanels.forEach(elem => {
            if (elem.classList.contains("js-active")) {
                activePanel = elem;
            }
        });
        return activePanel;
    };

    //open active panel (and close unactive panels)
    const setActivePanel = activePanelNum => {
        //remove active class from all the panels
        removeClasses(DOMstrings.stepFormPanels, "js-active");
        //show active panel
        DOMstrings.stepFormPanels.forEach((elem, index) => {
            if (index === activePanelNum) {
                elem.classList.add("js-active");
                setFormHeight(elem);
            }
        });
    };

    //set form height equal to current panel height
    const formHeight = activePanel => {
        const activePanelHeight = activePanel.offsetHeight;
        DOMstrings.stepsForm.style.height = `${activePanelHeight}px`;
    };

    const setFormHeight = () => {
        const activePanel = getActivePanel();
        formHeight(activePanel);
    };

    //STEPS BAR CLICK FUNCTION
    DOMstrings.stepsBar.addEventListener("click", e => {
        //check if click target is a step button
        const eventTarget = e.target;
        if (
            !eventTarget.classList.contains(
                `${DOMstrings.stepsBtnClass}`
            )
        ) {
            return;
        }
        //get active button step number
        const activeStep = getActiveStep(eventTarget);
        //set all steps before clicked (and clicked too) to active
        setActiveStep(activeStep);
        //open active panel
        setActivePanel(activeStep);
    });

    //PREV/NEXT BTNS CLICK
    DOMstrings.stepsForm.addEventListener("click", e => {
        const eventTarget = e.target;
        //check if we clicked on `PREV` or NEXT` buttons
        if (
            !(
                eventTarget.classList.contains(
                    `${DOMstrings.stepPrevBtnClass}`
                ) ||
                eventTarget.classList.contains(
                    `${DOMstrings.stepNextBtnClass}`
                )
            )
        ) {
            return;
        }

        //find active panel
        const activePanel = findParent(
            eventTarget,
            `${DOMstrings.stepFormPanelClass}`
        );
        let activePanelNum = Array.from(
            DOMstrings.stepFormPanels
        ).indexOf(activePanel);
        //set active step and active panel onclick
        if (
            eventTarget.classList.contains(
                `${DOMstrings.stepPrevBtnClass}`
            )
        ) {
            activePanelNum--;
        } else {
            activePanelNum++;
        }
        setActiveStep(activePanelNum);
        setActivePanel(activePanelNum);

        setTimeout(() => {
            var body = $(".dashboard-content-container");
            body.stop().animate(
                { scrollTop: 0 },
                500,
                "swing",
                function() {}
            );
        }, 100);
    });

    setTimeout(() => {
        setFormHeight();
    }, 500);
    //SETTING PROPER FORM HEIGHT ONLOAD
    window.addEventListener("load", setFormHeight, false);

    //SETTING PROPER FORM HEIGHT ONRESIZE
    window.addEventListener("resize", setFormHeight, false);

    //changing animation via animation select !!!YOU DON'T NEED THIS CODE (if you want to change animation type, just change form panels data-attr)

    const setAnimationType = newType => {
        DOMstrings.stepFormPanels.forEach(elem => {
            elem.dataset.animation = newType;
        });
    };

    //selector onchange - changing animation
    const animationSelect = document.querySelector(
        ".pick-animation__select"
    );
    if (animationSelect != null) {
        animationSelect.addEventListener("change", () => {
            const newAnimationType = animationSelect.value;

            setAnimationType(newAnimationType);
        });
    }
},

При нажатии кнопки «Далее» открывается следующий шаг, но мне нужно проверить введенные данные, прежде чем перейти к следующему шагу. Подскажите, пожалуйста, как я могу сделать здесь проверку? Также это какая-то библиотека? Искал в сети, но утонул ...

Спасибо!

CodeFix

1 ответ

0

Каждое представление мастера отправляет позицию мастера в ajax. В бэкэнде на основе положения мастера проверяйте поля. Так как вы знаете, какие и все поля существуют в каждом представлении мастера.

Например, у вас есть 3 шага мастера.

Step 1 имеет 3 поля ввода

Step 2 имеет 2 поля ввода

Step 3 имеет 1 поле ввода

Предположим, что если вы отправляете текущий шаг 1, вы можете проверить только эти поля.

$validations=[
'step1'=>[
  //field validation array
],
'step3'=>[
  //field validation array
],
'step3'=>[
  //field validation array
],
]

затем на основе шага мастера запроса вы можете легко получить правила проверки

Validation::make($validations[$request->step]);

Или вы можете сделать все поля валидными, только если они есть в запросе

Поделиться
Источник
  • 0
    Вы имеете в виду эту библиотеку jqueryvalidation.org? Или проверка laravel на сервере? На самом деле я не вижу, как, нажав кнопку «Далее», выполнить проверку и перейти к следующему только в случае успешной проверки? Пожалуйста, укажите на это ...
  • 0
    нет проверки на стороне сервера, или вы также можете использовать проверку jquery. проверка на стороне сервера не может манипулировать пользователем, но проверка jquery только для снижения производительности пользователя
  • 0
    Пожалуйста, укажите: как нажать кнопку «Далее», чтобы выполнить проверку и перейти к следующему только в случае успешной проверки? Это действительно проблема для меня
  • 0
    Можете ли вы указать, какую библиотеку мастеров вы используете? или еще набор кода кода, который запускается онлайн, чтобы мы могли помочь
  • 0
    Я не знаю, это какая-то библиотека для волшебников. Я искал в коде simar и не нашел. Похоже на код js / jquery

Другие вопросы

  • Состояние редактирования внутри модального окна1 ответ

    Я делаю небольшое приложение для заметок. Когда пользователь пишет свой заголовок и заметку и нажимает «Отправить», заметка помещается на страницу ... Я хочу иметь возможность редактировать заметку. При нажатии кнопки редактирования появляется модальное окно, и я хочу, чтобы заголовок и примечание п...

  • ajax дважды загружает данные из базы данных с помощью laravel php1 ответ

    привет, я пытаюсь загрузить данные из базы данных с помощью ajax. но данные загружаются дважды на страницу html.<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $('button').click(function(){ $.ajax({ ...

  • Калькулятор JS форм1 ответ

    Я сделал этот простой калькулятор своим первым проектом на JS. Я был на одном курсе, где мне сказали, что программисты «ленивы», поэтому они стараются писать как можно меньше кода. И вот мой вопрос. Я думаю, что мой калькулятор действительно долго работает над кодом. Я хотел бы знать, есть ли способ...

  • отображать другие входы на основе значения другого входа с помощью laravel, ajax1 ответ

    Я новичок в laravel, и я пытаюсь создать форму и отправить ее в базу данных. Мне удалось сохранить данные в базе данных, используя следующий код. Мой клинок: <form id="castingform" method="post" action="castingss" enctype="multipart/form-data"> ...

  • onload функция Javascript return undefined2 ответ

    Я вызываю функцию JavaScript, в которой хочу проверить высоту и ширину изображения перед загрузкой. я возвращаюсьfalse значение, но в исходной функции, когда это консольный журнал, он даетundefined . Для лучшего понимания проверьте код. Код работает нормально, но я хочу получитьtrue а такжеfalse из ...

  • Создание даты из строки в Javascript показывает неправильную дату2 ответ

    У меня есть эта строка, из которой я хочу создать дату:Wed Jun 16 2021 00:00:00 GMT+0300 (Israel Daylight Time) Теперь, когда я пытаюсь сделать из него новое свидание:const date = new Date('Wed Jun 16 2021 00:00:00 GMT+0300 (Israel Daylight Time)'); И попробуйте вывести, он показывает:2021-06-15T21...

  • Остановить воспроизведение видео YouTube при закрытии CUSTOM модального окна1 ответ

    Привет, классные Overflowers. Мне удалось реализовать красивый, простой модальный файл, который отображает видео на YouTube при нажатии на эскиз img. Моя проблема в том, что я не могу заставить видео останавливаться после закрытия модального окна. Я пробовал здесь много идей и скриптов, но многие из...

  • Оператор if в jQuery и HTML?2 ответ

    Я успешно запускаю следующий скрипт: он обновляет текст каждые 3 секунды.<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> <script> $(function() { window.setInterval(function() { loadNewText() }, 3000) function loadNewText...

  • Добавление ссылки на dll в Javascript1 ответ

    Может ли кто-нибудь предложить вариант добавления ссылки на DLL в Javascript. Я работаю над приложением javascript, в котором мы пытаемся получать события с сервера напрямую, без .Net / Java. Я пробовал использовать ActiveXObject, но он не поддерживается в текущих браузерах...

  • анимация скольжения с анимацией fadeIn для перехода к следующей форме1 ответ

    Я пытаюсь создать анимацию для события нажатия кнопки, чтобы сдвинуть форму, затем вызвать следующую форму, она также сдвинется вверх и вызовет следующую форму, но моя форма исчезает после одной анимации слайда и не показывает никаких форм. script.js файл есть.jQuery(document).ready(function(){ //M...

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум