Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show first form in multi step modal

I copied this code from the internet, from here

It is used to show multiple forms in a single modal by sliding off the old fieldset and sliding in the new fieldset.

      <div class="modal-content">

         <!-- MultiStep Form -->
         <div class="row">
            <div class="col-md-12 ">
               <form id="msform" name="flatform" ng-submit="addflatinfo(flat, flatform)" novalidate>
                  <div class="modal-header">
                   <h4 class="modal-title" id="exampleModalLabel">Add flat</h4>
                  </div>

                  <!-- First fieldset -->
              <fieldset class="firstFieldSet">
                     <h4>
                        adf
                     </h4>
                     <div class="row">
                     ....
                  <input type="button" name="nextOcc"
                     class="nextO action-button 
                     adFlatSecondFieldsetCl" 
                     value="Next" />
              </fieldset>
           <!--Second fieldset -->
              <fieldset class="secondFieldSet">
                     <h4>
                        adf
                     </h4>
                     <div class="row">
                     ....

             </fieldset>

It works ok but when I close the modal when I'm in the 2nd or 3rd or 4th fieldset, it shows where the fieldset where I stopped. So I tried to do what the pervious button would do(slide out the current fieldset and show the previous) whenever I click the button to open the modal.

I have 5 fieldsets in my application. I keep track of current fieldset and when opening the modal again, I slide out the fieldset that was there before closing the modal and show the first fieldset.

But this is not ok.. I see a smaller fieldset over a bigger fieldset and sometimes I don't see anything but the modal header and sometimes just a small fieldset like the image below it's all messed up.

How do I show the first fieldset always when I open the modal?

The code to show next fieldset when a button with class .nextO is clicked.

current_fs = $(".nextO").parent();
        next_fs = $(".nextO").parent().next();

        //activate next step on progressbar using the index of next_fs
        $("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");

        //show the next fieldset
        next_fs.show(); 
        //hide the current fieldset with style
        current_fs.animate({opacity: 0}, {
            step: function(now, mx) {
                //as the opacity of current_fs reduces to 0 - stored in "now"
                //1. scale current_fs down to 80%
                scale = 1 - (1 - now) * 0.2;
                //2. bring next_fs from the right(50%)
                left = (now * 50)+"%";
                //3. increase opacity of next_fs to 1 as it moves in
                opacity = 1 - now;
                current_fs.css({
                    'transform': 'scale('+scale+')',
                    'position': 'absolute'
                });
                next_fs.css({'left': left, 'opacity': opacity});
            }, 
            duration: 800, 
            complete: function(){
                current_fs.hide();
                animating = false;
            }, 
            //this comes from the custom easing plugin
            easing: 'easeInOutBack'
        });

The code to go to previous fieldset(which is what I use when the modal is first opened so that it always shows the first).

if(animating) return false;
    animating = true;
    //fade remove the fieldset which was open before closing the modal -- $scope.currentAdFieldset 
    current_fs = $($scope.currentAdFieldset).parent();
    previous_fs = $('.adFlatSecondFieldsetCl').parent().prev();
    $("#progressbar li").eq($("fieldset").index(current_fs)).removeClass("active");
    console.log(previous_fs, "prevfs");
    previous_fs.show(); 
    current_fs.animate({opacity: 0}, {
        step: function(now, mx) {
            scale = 0.8 + (1 - now) * 0.2;
            left = ((1-now) * 50)+"%";
            opacity = 1 - now;
            current_fs.css({'left': left,  });
            previous_fs.css({'transform': 'scale('+scale+')', 'opacity': opacity});

        }, 
        duration: 800, 
        complete: function(){
            current_fs.hide();
            animating = false;
        }, 
        //this comes from the custom easing plugin
        easing: 'easeInOutBack'
    });

Is there a proper way to show the first fieldset when I open the modal. This is what it looks like. The fieldset does not fill the modal img

Edit: I tried this on ng-click of the button that opens the modal

$('.modal-content fieldset').css('opacity', '0');
    $('.modal-content fieldset').first().css('opacity', '1');
    $('.modal-content fieldset').first().show();
    $("#progressbar li:not(:eq(0))").removeClass('active');
    $('#apartmentsmodel').modal({ backdrop: 'static', keyboard: false, show: true });

Edit 2:

I tried this along with what the answer said and it worked:

$('.modal-content fieldset').css({'opacity': '0','display':'none', 'transform' : 'scale(1)'});
    $('.modal-content fieldset').first().css({'opacity': '1', 'transform' : 'scale(1)', 'display':'block'});
like image 581
Dwigh Avatar asked Aug 28 '18 10:08

Dwigh


1 Answers

Try this snippet. It uses the show.bs.modal event (more info) to check if a modal is being opened.

<script type="text/javascript">
    $(document).ready(function () {

        $('body').on('show.bs.modal', function () {

            //hide all the fieldsets
            $('.modal-content fieldset').css('opacity', '0');

            //show the first fieldset
            $('.modal-content fieldset').first().css('opacity', '1');
            $('.modal-content fieldset').first().show();

            //make sure the progress bar also show the first only
            $("#progressbar li:not(:eq(0))").removeClass('active');

        });

    });
</script>

This was tested with the example codes from the plugin you specified. Used the html, css and jquery from the Download on that site in a Bootrap 4 modal and it worked.

UPDATE

<!doctype html>
<html lang="nl">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link rel="stylesheet" href="bootstrap.css" />

</head>
<body>

    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
        Launch demo modal
    </button>

    <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">

                    <!-- progressbar -->
                    <ul id="progressbar">
                        <li class="active">Account Setup</li>
                        <li>Social Profiles</li>
                        <li>Personal Details</li>
                    </ul>

                    <!-- fieldsets -->
                    <fieldset>
                        <h2 class="fs-title">Create your account</h2>
                        <h3 class="fs-subtitle">This is step 1</h3>
                        <input type="text" name="email" placeholder="Email" />
                        <input type="password" name="pass" placeholder="Password" />
                        <input type="password" name="cpass" placeholder="Confirm Password" />
                        <input type="button" name="next" class="next action-button" value="Next" />
                    </fieldset>
                    <fieldset>
                        <h2 class="fs-title">Social Profiles</h2>
                        <h3 class="fs-subtitle">Your presence on the social network</h3>
                        <input type="text" name="twitter" placeholder="Twitter" />
                        <input type="text" name="facebook" placeholder="Facebook" />
                        <input type="text" name="gplus" placeholder="Google Plus" />
                        <input type="button" name="previous" class="previous action-button" value="Previous" />
                        <input type="button" name="next" class="next action-button" value="Next" />
                    </fieldset>
                    <fieldset>
                        <h2 class="fs-title">Personal Details</h2>
                        <h3 class="fs-subtitle">We will never sell it</h3>
                        <input type="text" name="fname" placeholder="First Name" />
                        <input type="text" name="lname" placeholder="Last Name" />
                        <input type="text" name="phone" placeholder="Phone" />
                        <textarea name="address" placeholder="Address"></textarea>
                        <input type="button" name="previous" class="previous action-button" value="Previous" />
                        <input type="submit" name="submit" class="submit action-button" value="Submit" />
                    </fieldset>

                </div>
            </div>
        </div>
    </div>

    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="bootstrap.js"></script>
    <script type="text/javascript" src="jquery.easing.min.js"></script>

    <script type="text/javascript">
        $(document).ready(function () {

            $("#openmodal").click(function () {
                $('bootstrap-modal').modal('show');
                return false;
            });

            $('body').on('show.bs.modal', function () {

                //hide all the fieldsets
                $('.modal-content fieldset').css('opacity', '0');

                //show the first fieldset
                $('.modal-content fieldset').first().css('opacity', '1');
                $('.modal-content fieldset').first().show();

                //make sure the progress bar also show the first only
                $("#progressbar li:not(:eq(0))").removeClass('active');

            });

        });
    </script>

    <style>
        /*custom font*/

        @import url(http://fonts.googleapis.com/css?family=Montserrat);
        /*basic reset*/
        * {
            margin: 0;
            padding: 0;
        }

        html {
            height: 100%;
            /*Image only BG fallback*/
            background: url('http://thecodeplayer.com/uploads/media/gs.png');
            /*background = gradient + image pattern combo*/
            background: linear-gradient(rgba(196, 102, 0, 0.2), rgba(155, 89, 182, 0.2)), url('http://thecodeplayer.com/uploads/media/gs.png');
        }

        body {
            font-family: montserrat, arial, verdana;
        }
        /*form styles*/
        #msform {
            width: 400px;
            margin: 50px auto;
            text-align: center;
            position: relative;
        }

            #msform fieldset {
                background: white;
                border: 0 none;
                border-radius: 3px;
                box-shadow: 0 0 15px 1px rgba(0, 0, 0, 0.4);
                padding: 20px 30px;
                box-sizing: border-box;
                width: 80%;
                margin: 0 10%;
                /*stacking fieldsets above each other*/
                position: absolute;
            }
                /*Hide all except first fieldset*/
                #msform fieldset:not(:first-of-type) {
                    display: none;
                }
            /*inputs*/
            #msform input, #msform textarea {
                padding: 15px;
                border: 1px solid #ccc;
                border-radius: 3px;
                margin-bottom: 10px;
                width: 100%;
                box-sizing: border-box;
                font-family: montserrat;
                color: #2C3E50;
                font-size: 13px;
            }
            /*buttons*/
            #msform .action-button {
                width: 100px;
                background: #27AE60;
                font-weight: bold;
                color: white;
                border: 0 none;
                border-radius: 1px;
                cursor: pointer;
                padding: 10px 5px;
                margin: 10px 5px;
            }

                #msform .action-button:hover, #msform .action-button:focus {
                    box-shadow: 0 0 0 2px white, 0 0 0 3px #27AE60;
                }
        /*headings*/
        .fs-title {
            font-size: 15px;
            text-transform: uppercase;
            color: #2C3E50;
            margin-bottom: 10px;
        }

        .fs-subtitle {
            font-weight: normal;
            font-size: 13px;
            color: #666;
            margin-bottom: 20px;
        }
        /*progressbar*/
        #progressbar {
            margin-bottom: 30px;
            overflow: hidden;
            /*CSS counters to number the steps*/
            counter-reset: step;
        }

            #progressbar li {
                list-style-type: none;
                color: white;
                text-transform: uppercase;
                font-size: 9px;
                width: 33.33%;
                float: left;
                position: relative;
            }

                #progressbar li:before {
                    content: counter(step);
                    counter-increment: step;
                    width: 20px;
                    line-height: 20px;
                    display: block;
                    font-size: 10px;
                    color: #333;
                    background: white;
                    border-radius: 3px;
                    margin: 0 auto 5px auto;
                }
                /*progressbar connectors*/
                #progressbar li:after {
                    content: '';
                    width: 100%;
                    height: 2px;
                    background: white;
                    position: absolute;
                    left: -50%;
                    top: 9px;
                    z-index: -1; /*put it behind the numbers*/
                }

                #progressbar li:first-child:after {
                    /*connector not needed before the first step*/
                    content: none;
                }
                /*marking active/completed steps green*/
                /*The number of the step and the connector before it = green*/
                #progressbar li.active:before, #progressbar li.active:after {
                    background: #27AE60;
                    color: white;
                }
    </style>

    <script>
        $(function () {

            //jQuery time
            var current_fs, next_fs, previous_fs; //fieldsets
            var left, opacity, scale; //fieldset properties which we will animate
            var animating; //flag to prevent quick multi-click glitches

            $(".next").click(function () {
                if (animating) return false;
                animating = true;

                current_fs = $(this).parent();
                next_fs = $(this).parent().next();

                //activate next step on progressbar using the index of next_fs
                $("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");

                //show the next fieldset
                next_fs.show();
                //hide the current fieldset with style
                current_fs.animate({ opacity: 0 }, {
                    step: function (now, mx) {
                        //as the opacity of current_fs reduces to 0 - stored in "now"
                        //1. scale current_fs down to 80%
                        scale = 1 - (1 - now) * 0.2;
                        //2. bring next_fs from the right(50%)
                        left = (now * 50) + "%";
                        //3. increase opacity of next_fs to 1 as it moves in
                        opacity = 1 - now;
                        current_fs.css({ 'transform': 'scale(' + scale + ')' });
                        next_fs.css({ 'left': left, 'opacity': opacity });
                    },
                    duration: 800,
                    complete: function () {
                        current_fs.hide();
                        animating = false;
                    },
                    //this comes from the custom easing plugin
                    easing: 'easeInOutBack'
                });
            });

            $(".previous").click(function () {
                if (animating) return false;
                animating = true;

                current_fs = $(this).parent();
                previous_fs = $(this).parent().prev();

                //de-activate current step on progressbar
                $("#progressbar li").eq($("fieldset").index(current_fs)).removeClass("active");

                //show the previous fieldset
                previous_fs.show();
                //hide the current fieldset with style
                current_fs.animate({ opacity: 0 }, {
                    step: function (now, mx) {
                        //as the opacity of current_fs reduces to 0 - stored in "now"
                        //1. scale previous_fs from 80% to 100%
                        scale = 0.8 + (1 - now) * 0.2;
                        //2. take current_fs to the right(50%) - from 0%
                        left = ((1 - now) * 50) + "%";
                        //3. increase opacity of previous_fs to 1 as it moves in
                        opacity = 1 - now;
                        current_fs.css({ 'left': left });
                        previous_fs.css({ 'transform': 'scale(' + scale + ')', 'opacity': opacity });
                    },
                    duration: 800,
                    complete: function () {
                        current_fs.hide();
                        animating = false;
                    },
                    //this comes from the custom easing plugin
                    easing: 'easeInOutBack'
                });
            });

            $(".submit").click(function () {
                return false;
            })

        });
    </script>

</body>
</html>
like image 61
VDWWD Avatar answered Nov 07 '22 16:11

VDWWD