Search code examples
grails

How to popup calendar when click on button and store value in text field in grails 3.3.9


I am beginner and currently using grails version 3.3.9. I want to make a registration form. In my form i want to add a button with a text field, whenever i click on button it show a calendar and than take a input on text field like this:

Here is the code of form.gsp

    <label class="my-reg-right"><g:message code="birth.date"/></label>
    <div class="input-group" >
        <input type="text" name="birthdate" value="${member?.birthdate}" class="col-md-8" />
        <i class="fas fa-calendar col-md-2"></i>

    </div>

how can i do it ? When i write the code like this it works fine and take a date into database

<g:datePicker name="birthdate" value="${member?.birthdate}" class="col-md-8" />

Solution

  • <g:datePicker> Creates a date picker which renders as HTML select tags for the day, month, year, hour and second of the day.

    So, You can simply achieve this using bootstrap date picker.

     $(function () {
       var bindDatePicker = function() {
    		$(".date").datetimepicker({
            format:'YYYY-MM-DD',
    			icons: {
    				time: "fa fa-clock-o",
    				date: "fa fa-calendar",
    				up: "fa fa-arrow-up",
    				down: "fa fa-arrow-down"
    			}
    		}).find('input:first').on("blur",function () {
    			// check if the date is correct. We can accept dd-mm-yyyy and yyyy-mm-dd.
    			// update the format if it's yyyy-mm-dd
    			var date = parseDate($(this).val());
    
    			if (! isValidDate(date)) {
    				//create date based on momentjs (we have that)
    				date = moment().format('YYYY-MM-DD');
    			}
    
    			$(this).val(date);
    		});
    	}
       
       var isValidDate = function(value, format) {
    		format = format || false;
    		// lets parse the date to the best of our knowledge
    		if (format) {
    			value = parseDate(value);
    		}
    
    		var timestamp = Date.parse(value);
    
    		return isNaN(timestamp) == false;
       }
       
       var parseDate = function(value) {
    		var m = value.match(/^(\d{1,2})(\/|-)?(\d{1,2})(\/|-)?(\d{4})$/);
    		if (m)
    			value = m[5] + '-' + ("00" + m[3]).slice(-2) + '-' + ("00" + m[1]).slice(-2);
    
    		return value;
       }
       
       bindDatePicker();
     });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment-with-locales.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/3.1.3/js/bootstrap-datetimepicker.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"/>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/3.1.3/css/bootstrap-datetimepicker.min.css" rel="stylesheet"/>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
    <div class="container">
      <div class="row">
        Date formats: yyyy-mm-dd, yyyymmdd, dd-mm-yyyy, dd/mm/yyyy, ddmmyyyyy
      </div>
      <br />
        <div class="row">
            <div class='col-sm-3'>
                <div class="form-group">
                    <div class='input-group date' id='datetimepicker1'>
                        <input type='text' class="form-control" />
                        <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span>
                        </span>
                    </div>
                </div>
            </div>
        </div>
    </div>

    Hope this will helps you.