When we want to develop a web-based application using AngularJs, it often requires a datepicker control with some extra features like max date, min date and so on. But like classic ASP.NET, a ready-made control is not always available in the AngularJs framework. But actually, if we want to create a custom datepicker control, we can create it easily. Using this article, we will learn how to create a custom datepicker control.
For that, we will first open Visual Studio and create a blank ASP.NET web application. We then need to install some Nuget packages such as AngularJs, Bootstrap and Angular UI.
First we create a datepicker directory with the attributes. For this, we first create a HTML file named Date.html and the following code in that file:
- <div>
- <input type="text" class="form-control" style="width:{{DateParam.width}};" placeholder="{{DateParam.placeHolder}}"
- ng-model="DateParam.selectedDate" id="{{TextControlID}}" ng-disabled="DateParam.Disabled" ng-click="open($event)"
- ng-model-options="{debounce:1000}" ng-change="fnChangeDate();">
- <input type="text" class="form-control" datepicker-popup="{{DateParam.dateFormat}}" is-open="opened" min-date="DateParam.minDate" max-date="DateParam.maxDate"
- datepicker-options="dateOptions" date-disabled="disabled(date, mode)" ng-required="true" close-text="Close"
- style="width:{{DateParam.width}}; visibility:hidden; height:0; padding:0;" ng-model="CalDate" show-weeks="DateParam.showWeeks"
- show-button-bar="DateParam.showButtonBar" year-range="DateParam.yearRange" datepicker-mode="DateParam.datepickerMode"
- starting-day="1" />
- <span class="input-group-btn" style="visibility:{{hidden}}; ">
- <button type="button" id="{{ButtonControlID}}" class="btn btn-default" ng-click="open($event)" ng-disabled="DateParam.Disabled">
- <i class="glyphicon glyphicon-calendar"></i>
- </button>
- </span>
- </div>
Now first, we need to define the Angular app as in the following:
- var CustomCtrlApp = angular.module('CustomCtrlApp', ['ui.bootstrap']);
Now, in the script folder, add a JavaScript file named Date.js that is basically the controller file of the datepicker directory. In the JavaScript file, add the following code:
- CustomCtrlApp.directive("ngDate", ['$filter', function () {
- this;
- return {
- restrict: "EA",
- scope: {
- DateSetup: '=dateSetup'
- },
- templateUrl: '../HTMLTemplate/Date.html',
- controller: function ($scope, $element, $attrs, $filter) {
- $scope.initializeAttribute = function () {
- $scope.DateChange = false;
- $scope.DateParam = $scope.DateSetup;
- $scope.TextControlID = ($scope.DateParam.Id == undefined ? 'dtp1' : $scope.DateParam.Id);
- $scope.ButtonControlID = ($scope.DateParam.Id == undefined ? 'btn1' : $scope.DateParam.Id);
-
- if ($scope.DateParam.dateFormat == undefined) {
- $scope.DateParam.dateFormat = 'shortDate';
- }
-
- if ($scope.DateParam.showWeeks == undefined) {
- $scope.DateParam.showWeeks = false;
- }
-
- if ($scope.DateParam.showButtonBar == undefined) {
- $scope.DateParam.showButtonBar = false;
- }
-
- if ($scope.DateParam.showCalendarIcon == undefined) {
- $scope.DateParam.showCalendarIcon = false;
- }
-
- $scope.hidden = $scope.DateParam.showCalendarIcon == true ? 'visible' : 'hidden';
-
- if ($scope.DateParam.selectedDate == undefined) {
- $scope.CalDate = $scope.FormatDate(new Date());
- $scope.DateParam.selectedDate = '';
- }
- else {
- $scope.CalDate = $scope.FormatDate($scope.DateParam.selectedDate);
- $scope.DateParam.selectedDate = $scope.FormatDate($scope.DateParam.selectedDate);
- }
-
- if ($scope.DateParam.width == undefined) {
- $scope.DateParam.width = '80%';
- }
-
- if ($scope.DateParam.minDate == undefined) {
- $scope.DateParam.minDate = null;
- }
-
- if ($scope.DateParam.maxDate == undefined) {
- $scope.DateParam.maxDate = null;
- }
-
- if ($scope.DateParam.yearRange == undefined) {
- $scope.DateParam.yearRange = 20;
- }
-
- if ($scope.DateParam.datepickerMode == undefined) {
- $scope.DateParam.datepickerMode = 'day';
- }
-
- }
-
- $scope.initializeMethod = function () {
- $scope.DateParam.method = {
- setEnabled: function (args) {
- $scope.DateParam.Disabled = !args;
- },
- setMinDate: function (minDate) {
- $scope.DateParam.minDate = minDate;
- },
- setMaxDate: function (maxDate) {
- $scope.DateParam.maxDate = maxDate;
- },
- getMinDate: function () {
- return $scope.DateParam.minDate;
- },
- getMaxDate: function () {
- return $scope.DateParam.maxDate;
- },
- setSelectedDate: function (selDate) {
- $scope.CalDate = $scope.FormatDate(selDate);
- $scope.DateParam.selectedDate = $scope.FormatDate(selDate);
- },
- getSelectedDate: function () {
- return $scope.CalDate;
- },
- clearSelection: function () {
- $scope.clear();
- }
- };
- }
-
- $scope.clear = function () {
- $scope.CalDate = null;
- $scope.DateParam.selectedDate = null;
- };
-
- $scope.open = function ($event) {
- $event.preventDefault();
- $event.stopPropagation();
- $scope.opened = true;
- };
-
- $scope.$watch('CalDate', function () {
- if ($scope.opened) {
- $scope.opened = false;
- $scope.DateParam.selectedDate = $scope.FormatDate($scope.CalDate);
- $scope.DateParam.events.onDateChanged(new Date($scope.CalDate));
- }
- });
-
- $scope.$watch('DateParam.selectedDate', function () {
- if ($scope.DateChange) {
- $scope.opened = true;
- $scope.CalDate = $scope.DateParam.selectedDate;
- }
- });
-
- $scope.fnChangeDate = function () {
- $scope.DateChange = true;
- }
-
- $scope.dateOptions = {
- formatYear: 'yy',
- startingDay: 1
- };
-
- $scope.FormatDate = function (args) {
- return $filter('date')(args, $scope.DateParam.dateFormat);
- }
-
- $scope.initializeAttribute();
- $scope.initializeMethod();
- }
- }
- }]);
In the preceding code, we specify some attribute of the Datepicker control like:
- Width
- selectedDate
- Date Format
- Min Date
- Max Date
- Enabled
- Place Holder
- Show weeks
- Show Button Bar
Also, we defined the onDateChanged Event that is fired on the target page after date selection.
Also, we defined some methods of the datepicker control like:
- SetEnabled
- setMinDate
- SetMaxDate
- getMinDate
- getMaxDate
- getSelectedDate
- clearSelection
Now, we add a HTML page in the HTML folder named DateDemo.html and add the following code there:
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Date Demo</title>
- <script src="../RefScript/angular.min.js"></script>
- <script src="../RefScript/ui-bootstrap.min.js"></script>
- <script src="../RefScript/ui-bootstrap-tpls.min.js"></script>
- <script src="../PageScript/CustomCtrlApp.js"></script>
- <script src="../DirectiveScript/Date.js"></script>
- <script src="../PageScript/DateDemo.js"></script>
-
- <link href="../RefStyle/bootstrap.min.css" rel="stylesheet" />
-
- </head>
- <body ng-app="CustomCtrlApp">
- <div ng-controller="DateDemo">
- <table width="100%" cellpadding="0" cellspacing="0">
- <tr>
- <td style="width:20%;">Select Date </td>
- <td style="width:20%;">
- <ng-date date-setup="DateArgs"></ng-date>
- </td>
- <td style="width:50%;">
- <input type="button" value="On/Off" ng-click="fnToggle()" />
- <input type="button" value="Clear" ng-click="fnClear()" />
-
- <input type="button" value="Set Min Date" ng-click="fnSetMinDate()" />
- <input type="button" value="Set Max Date" ng-click="fnSetMaxDate()" />
- <input type="button" value="Set Sel Date" ng-click="fnSetSelDate()" />
-
- <input type="button" value="Get Min Date" ng-click="fnGetMinDate()" />
- <input type="button" value="Get Max Date" ng-click="fnGetMaxDate()" />
- <input type="button" value="Get Sel Date" ng-click="fnGetSelDate()" />
- </td>
- </tr>
- <tr>
- <td>{{SelectedDate}}</td>
- </tr>
- </table>
- </div>
- </body>
- </html>
Now to define the datedemo controller. For this, we add another JavaScript file in the script folder named datedemo.js and add the following code:
- CustomCtrlApp.controller("DateDemo", ['$scope', '$http', '$filter',
- function ($scope, $http, $filter) {
- $scope.Heading1 = "Date Control";
-
- $scope.DateArgs = {
- width: '70%',
-
- dateFormat: 'dd/MM/yyyy',
-
-
- enabled: true,
- placeHolder: 'Enter DOB',
- Id: 'dtpDOB',
- showWeeks: false,
- showButtonBar: false,
- showCalendarIcon: false
- };
-
- $scope.Enable = true;
-
- if ($scope.DateArgs.events == undefined) {
- $scope.DateArgs.events = {};
- }
-
- $scope.DateArgs.events.onDateChanged = function (args) {
- $scope.SelectedDate = $filter('date')(args, $scope.DateArgs.dateFormat);
- }
-
- $scope.fnToggle = function () {
- $scope.Enable = !$scope.Enable;
- $scope.DateArgs.method.setEnabled($scope.Enable);
- }
-
- $scope.fnClear = function () {
- $scope.DateArgs.method.clearSelection();
- }
-
- $scope.fnGetMinDate = function () {
- alert($scope.DateArgs.method.getMinDate());
- }
-
- $scope.fnGetMaxDate = function () {
- alert($scope.DateArgs.method.getMaxDate());
- }
-
- $scope.fnGetSelDate = function () {
- alert($scope.DateArgs.method.getSelectedDate());
- }
-
- $scope.fnSetMinDate = function () {
- $scope.DateArgs.method.setMinDate(new Date('2015-01-01'));
- }
-
- $scope.fnSetMaxDate = function () {
- $scope.DateArgs.method.setMaxDate(new Date('2015-07-31'));
- }
-
- $scope.fnSetSelDate = function () {
- $scope.DateArgs.method.setSelectedDate(new Date('2015-07-20'));
- }
- }]);
Now, run the project and the output will be as in the following: