<!DOCTYPE html>
<html ng-app="ui.bootstrap.demo">

  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular-animate.js"></script>
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-1.3.3.js"></script>
    <script src="example.js"></script>
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<style>
  input.ng-invalid, textarea.ng-invalid, select.ng-invalid, div.ng-invalid-div {
    background-color: #ffff1a;
    border: 1px solid #ffe6e6;
    color: #e60000;
}
  </head>


</style>
  <body ng-controller="DatepickerPopupDemoCtrl">
    <style>
  .full button span {
    background-color: limegreen;
    border-radius: 32px;
    color: black;
  }
  .partially button span {
    background-color: orange;
    border-radius: 32px;
    color: black;
  }
    </style>
    <fieldset check-if-required>
      <div >
        <pre>Selected date is:           <em>{{dt | date:'fullDate' }}</em>
        </pre>
        <h4>Popup</h4>
        <div class="row">
          <div class="col-md-6">
            <p class="input-group">
              <input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt" is-open="popup1.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" alt-input-formats="altInputFormats" />
              <span class="input-group-btn">
                <button type="button" class="btn btn-default" ng-click="open1()">
                  <i class="glyphicon glyphicon-calendar"></i>
                </button>
              </span>
            </p>
          </div>
          <div class="col-md-6">
            <h4>Using $compile with Datepicker Popup</h4>
            <p class="input-group">
              <input id="test_me" type="text" class="form-control" uib-datepicker-popup="" ng-model="dt2" is-open="popup2.opened" datepicker-options="dateOptions" close-text="Close" />
              <span class="input-group-btn">
                <button type="button" class="btn btn-default" ng-click="open2()">
                  <i class="glyphicon glyphicon-calendar"></i>
                </button>
              </span>
            </p>
          </div>
        </div>
        <div class="row">
          <div class="col-md-6">
            <label>Format:               <span class="muted-text">(manual alternate                 <em>{{altInputFormats[0]}}</em>
)</span>
            </label>
            <select class="form-control" ng-model="format" ng-options="f for f in formats">
              <option></option>
            </select>
          </div>
        </div>
        <hr />
        <button type="button" class="btn btn-sm btn-info" ng-click="today()">Today</button>
        <button type="button" class="btn btn-sm btn-default" ng-click="setDate(2009, 7, 24)">2009-08-24</button>
        <button type="button" class="btn btn-sm btn-danger" ng-click="clear()">Clear</button>
        <button type="button" class="btn btn-sm btn-default" ng-click="toggleMin()" uib-tooltip="After today restriction">Min date</button>
      </div>
    </fieldset>
  </body>

</html>
(function(angular) {
  'use strict';
var app=angular.module('ui.bootstrap.demo', ['ngAnimate', 'ui.bootstrap']);
app.controller('DatepickerPopupDemoCtrl', ['$scope', function ($scope) {
  $scope.today = function() {
    $scope.dt = new Date();
    $scope.dt2 = new Date();
  };
  $scope.today();
  $scope.clear = function() {
    $scope.dt = null;
    $scope.dt2 = null;
  };

  $scope.inlineOptions = {
    customClass: getDayClass,
    minDate: new Date(),
    showWeeks: true
  };

  $scope.dateOptions = {
    dateDisabled: disabled,
    formatYear: 'yy',
    maxDate: new Date(2020, 5, 22),
    minDate: new Date(),
    startingDay: 1
  };

  // Disable weekend selection
  function disabled(data) {
    var date = data.date,
      mode = data.mode;
    return mode === 'day' && (date.getDay() === 0 || date.getDay() === 6);
  }

  $scope.toggleMin = function() {
    $scope.inlineOptions.minDate = $scope.inlineOptions.minDate ? null : new Date();
    $scope.dateOptions.minDate = $scope.inlineOptions.minDate;
  };

  $scope.toggleMin();

  $scope.open1 = function() {
    $scope.popup1.opened = true;
  };

  $scope.open2 = function() {
    $scope.popup2.opened = true;
  };

  $scope.setDate = function(year, month, day) {
    $scope.dt = new Date(year, month, day);
    $scope.dt2 = new Date(year, month, day);
  };

  $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
  $scope.format = $scope.formats[0];
  $scope.altInputFormats = ['M!/d!/yyyy', "'n/a'"];

  $scope.popup1 = {
    opened: false
  };

  $scope.popup2 = {
    opened: false
  };

  var tomorrow = new Date();
  tomorrow.setDate(tomorrow.getDate() + 1);
  var afterTomorrow = new Date();
  afterTomorrow.setDate(tomorrow.getDate() + 1);
  $scope.events = [
    {
      date: tomorrow,
      status: 'full'
    },
    {
      date: afterTomorrow,
      status: 'partially'
    }
  ];

  function getDayClass(data) {
    var date = data.date,
      mode = data.mode;
    if (mode === 'day') {
      var dayToCheck = new Date(date).setHours(0,0,0,0);

      for (var i = 0; i < $scope.events.length; i++) {
        var currentDay = new Date($scope.events[i].date).setHours(0,0,0,0);

        if (dayToCheck === currentDay) {
          return $scope.events[i].status;
        }
      }
    }

    return '';
  }
}])
.directive('checkIfRequired', ['$compile', '$timeout', function ($compile, $timeout) {
    return {
      priority: 100,
    	//terminal: true,
    	//require: '?^form',
      link: function (scope, el, attrs) {
          var children;
          el.removeAttr('check-if-required');
          //JIRA: NE-2500 - use $timeout to ensure the inner directive, if any, has finished rendering its HTML 
          $timeout(function() {
            angular.element(document).ready(function(){
              children = $(":input", el);
    					angular.forEach(children, function(child, key) {
    						var elmScope;
    						var elmModel;
  							if(child && child.id) {
  				                //JIRA: NE-2500 - execute $complie within the scope of the element "child"
  								//	    default is `scope`
  								elmScope = angular.element(child).scope() || scope;
  								elmModel = angular.element(child).controller('ngModel');
  								if (child.id == "test_me") {
  		                angular.element(child).attr('ng-required', "true");
    									//Change how '$compile()' is used - This is needed to avoid problem of double compilation.
    									$compile(child)(elmScope);
    									//$compile(child, null, 110)(elmScope);
  		                //$compile(child)(scope, function (clone) {
    									//	angular.element(child).after(clone);     
    									//	angular.element(child).remove();
    									//});					                
  								}
  							}
    				  });
            });
          });
        }
    };
}]);
})(window.angular);