<!DOCTYPE html>
<html ng-app="DemoApp">
<head>
<link rel="stylesheet" href="//rawgit.com/twbs/bootstrap/v3.3.0/dist/css/bootstrap.css">
<link rel="stylesheet" href="style.css">
</head>
<body ng-controller="DefaultController">
<h1>Angular Input Modified Demo</h1>
<p class="subtitle">AngularUI Bootstrap TimePicker Example</p>
<form name="taskForm" novalidate>
<pre>
Form modified: {{ taskForm.modified ? 'Yes' : 'No' }}
Modified count: {{ taskForm.modifiedCount }}
Modified models: {{ taskForm.modifiedModels }}
Value: {{ task.dateStart }}
</pre>
<!-- Start date -->
<div class="form-group">
<label for="date-start" class="control-label">Start date:</label>
<input type="hidden" name="dateStart" ng-model="task.dateStart" bs-modifiable>
<timepicker
class="timepicker"
ng-model="task.dateStart"
></timepicker>
<p class="reset">
<button ng-click="taskForm.dateStart.$setPristine()">Save This Field</button>
<button ng-click="taskForm.dateStart.reset()">Reset This Field</button>
</p>
<p class="master">Master: "{{ taskForm.dateStart.masterValue }}"</p>
<p class="modified">Modified: {{ taskForm.dateStart.modified ? 'Yes' : 'No' }}</p>
</div>
<!-- Buttons -->
<div class="form-group footer">
<p>Button is disabled when form is not modified <i>(nothing to save)</i>
</p>
<div class="control buttons">
<button
type="submit"
class="btn btn-primary"
ng-click="taskForm.$setPristine()"
ng-disabled="!taskForm.modified"
>
Save Form
</button>
<button
type="button"
class="btn btn-default"
ng-disabled="!taskForm.modified"
ng-click="taskForm.reset()"
>Reset Form</button>
</div>
</div>
</form>
<!-- Scripts -->
<script src="//rawgit.com/angular/bower-angular/v1.3.2/angular.js"></script>
<script src="//rawgit.com/angular-ui/bootstrap-bower/0.11.2/ui-bootstrap.js"></script>
<script src="//rawgit.com/angular-ui/bootstrap-bower/0.11.2/ui-bootstrap-tpls.js"></script>
<script src="//rawgit.com/betsol/angular-input-modified/master/dist/angular-input-modified.js"></script>
<script src="script.js"></script>
</body>
</html>
(function(document, angular) {
'use strict';
angular.module('DemoApp', ['ui.bootstrap', 'DatepickerWorkaround', 'ngInputModified'])
.config(function(inputModifiedConfigProvider) {
inputModifiedConfigProvider.disableGlobally();
})
.controller('DefaultController', function($scope, TaskService, $timeout) {
$scope.task = {
dateStart: new Date(2014, 0, 1, 0, 0, 0, 0)
};
TaskService.loadTask().then(function(task) {
$scope.task = task;
// We need to call setPristine() after the digest cycle.
$timeout(function() {
$scope.taskForm.$setPristine();
});
});
})
.factory('TaskService', function($timeout) {
return {
loadTask: function() {
return $timeout(function() {
return {
dateStart: new Date(2014, 0, 1, 17, 45, 0, 0)
};
}, 3000);
}
};
})
;
/**
* This is a workaround for Angular UI DatePicker bug #2659:
* See: https://github.com/angular-ui/bootstrap/issues/2659
*/
angular
.module('DatepickerWorkaround', [])
.directive('datepickerPopup', function () {
return {
restrict: 'EAC',
require: 'ngModel',
link: function (scope, element, attr, controller) {
// Remove the default formatter from the input directive to prevent conflict.
controller.$formatters.shift();
}
}
})
;
})(document, angular);
body {
padding: 40px;
}
p.subtitle {
font-weight: bold;
font-size: 18px;
}
/** Decorating elements as valid only if they are modified */
.control input.ng-valid.ng-modified {
background-color: #EFE;
border-color: #6A6;
}
/** Decorating entire form-group */
.form-group.valid.modified {
border-style: solid;
background-color: #EFE;
border-color: #6A6;
}
div.footer {
margin-top: 10px;
}
div.footer button {
margin-left: 5px;
padding: 5px 20px;
}
div.footer button:first-child {
margin-left: 0;
}
.control input.ng-invalid {
background-color: #FEE;
border-color: #F66;
}
.form-group {
margin: 10px;
padding: 10px;
border: 1px dashed #AAA;
}
.form-group label {
color: 000;
font-size: 13px;
font-weight: bold;
}
p.master, p.modified {
margin: 0;
padding: 0;
color: #888;
font-family: monospace;
white-space: pre;
}
p.reset button {
padding: 0 5px;
font-size: 10px;
color: #333;
}
div.radio-inline {
display: inline-block;
margin-left: 10px;
}
div.radio-inline:first-child {
margin-left: 0;
}
div.radio-inline label {
font-weight: normal;
}
.timepicker input {
width: 50px;
}
.timepicker .form-group {
border: none;
}