Skip to content

Commit a0d5531

Browse files
committed
1 parent f2ec7c2 commit a0d5531

30 files changed

+1061
-2121
lines changed

app/images/date-picker-1.png

3.18 KB
Loading

app/index.html

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ <h2 class="menu-heading" ng-if="section.type === 'heading'" id="heading_{{ secti
5050

5151
</md-sidenav>
5252
<md-content layout="column" layout-fill class="right-container">
53-
<md-toolbar layout="row" class="md-whiteframe-z2 animated fadeInDown md-accent" >
53+
<md-toolbar layout="row" class="md-whiteframe-z2 animated fadeInDown" >
5454
<div class="md-toolbar-tools" >
5555
<span class="md-headline">Date Time Picker</span>
5656
<md-button aria-label="Open Sidebar" hide-gt-md class="md-icon-button" ng-click="vm.toggleLeft()">
@@ -88,13 +88,18 @@ <h2 class="menu-heading" ng-if="section.type === 'heading'" id="heading_{{ secti
8888
<script src="menu/menu.controller.js"></script>
8989
<script src="menu/menu.link.directive.js"></script>
9090
<script src="menu/menu.service.js"></script>
91-
<script src="menu/menu.toggle.directive.js"></script>
92-
<script src="picker/range-picker.js"></script>
93-
<script src="picker/calender-date.js"></script>
94-
<script src="picker/calender-hour.js"></script>
95-
<script src="picker/calender-picker.js"></script>
96-
<script src="picker/time-picker.js"></script>
97-
<script src="picker/date-picker-service.js"></script>
91+
<script src="menu/menu.toggle.directive.js"></script>
92+
93+
<script src="picker/js/calender-date.js"></script>
94+
<script src="picker/js/calender-hour.js"></script>
95+
<script src="picker/js/calender-picker.js"></script>
96+
<script src="picker/js/date-picker-service.js"></script>
97+
<script src="picker/js/date-time-picker.js"></script>
98+
<script src="picker/js/range-picker.js"></script>
99+
<script src="picker/js/sm-time-picker.js"></script>
100+
<script src="picker/js/time-picker.js"></script>
101+
102+
98103
<!-- endbuild -->
99104
</body>
100105
</html>

app/picker/calender-date.html

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
<div class="date-picker">
1+
<div class="date-picker">
22
<div ng-show="vm.view==='YEAR_MONTH'" ng-class="{'year-container' : vm.view==='YEAR_MONTH'}">
33
<md-virtual-repeat-container id="year-container" class="year-md-repeat" md-top-index="vm.yearTopIndex">
44
<div md-virtual-repeat="yr in vm.yearItems" md-on-demand class="repeated-item" flex>
5-
<md-button class="md-button"
6-
aria-label="year"
7-
ng-click="vm.changeYear(yr)"
8-
ng-class="{'md-primary': yr === vm.currentDate.year(),
9-
'md-primary md-raised' :yr ===vvm.currentDate.year(),
5+
<md-button class="md-button" aria-label="year" ng-click="vm.changeYear(yr)" ng-class="{'md-accent': yr === vm.currentDate.year(),
106
'selected-year md-primary':vm.initialDate.year()===yr}">
117
{{yr}}
128
</md-button>
@@ -15,25 +11,17 @@
1511
</div>
1612
<div ng-show="vm.view==='DATE'" ng-class="{'date-container' : vm.view==='DATE'}">
1713
<div layout="row" class="navigation" layout-align="space-between center">
18-
<md-button
19-
ng-disabled="vm.stopScrollPrevious"
20-
class="md-icon-button scroll-button"
21-
aria-label="privious"
22-
ng-click="vm.changePeriod('p')">
23-
<md-icon md-font-icon="material-icons">keyboard_arrow_left</md-icon>
24-
</md-button>
25-
<md-button class="md-button" ng-class="vm.moveCalenderAnimation" ng-click="vm.changeView('YEAR_MONTH')">
26-
{{vm.monthList[vm.initialDate.month()]}}{{' '}}{{vm.initialDate.year()}}
27-
</md-button>
28-
<md-button
29-
ng-disabled="vm.stopScrollNext"
30-
class="md-icon-button scroll-button"
31-
aria-label="next"
32-
ng-click="vm.changePeriod('n')">
33-
<md-icon md-font-icon="material-icons">keyboard_arrow_right</md-icon>
34-
</md-button>
14+
<md-button ng-disabled="vm.stopScrollPrevious" class="md-icon-button scroll-button" aria-label="privious" ng-click="vm.changePeriod('p')">
15+
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18"><path d="M15 8.25H5.87l4.19-4.19L9 3 3 9l6 6 1.06-1.06-4.19-4.19H15v-1.5z"/></svg>
16+
</md-button>
17+
<md-button class="md-button" ng-class="vm.moveCalenderAnimation" ng-click="vm.changeView('YEAR_MONTH')">
18+
{{vm.monthList[vm.initialDate.month()]}}{{' '}}{{vm.initialDate.year()}}
19+
</md-button>
20+
<md-button ng-disabled="vm.stopScrollNext" class="md-icon-button scroll-button" aria-label="next" ng-click="vm.changePeriod('n')">
21+
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18"><path d="M9 3L7.94 4.06l4.19 4.19H3v1.5h9.13l-4.19 4.19L9 15l6-6z"/></svg>
22+
</md-button>
3523
</div>
36-
<div layout="row" class="date-cell-header">
24+
<div class="date-cell-header">
3725
<md-button class="md-icon-button" md-autofocus ng-disabled="true" ng-repeat="dHead in vm.dateCellHeader">
3826
{{dHead[vm.dayHeader]}}
3927
</md-button>
@@ -59,4 +47,4 @@
5947
</div>
6048
</div>
6149
</div>
62-
</div>
50+
</div>

app/picker/calender-date.js renamed to app/picker/js/calender-date.js

Lines changed: 3 additions & 255 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ function Calender($timeout,picker){
1515
format:"@",
1616
mode:"@",
1717
startView:"@",
18-
weekStartDay:"@"
18+
weekStartDay:"@",
19+
dateSelectCall : '&'
1920
},
2021
controller:["$scope","$timeout","picker","$mdMedia",CalenderCtrl],
2122
controllerAs : 'vm',
@@ -224,6 +225,7 @@ CalenderCtrl.prototype.selectDate = function(d,isDisabled){
224225
var self = this;
225226
if (isDisabled) return;
226227
self.currentDate = d;
228+
self.$scope.dateSelectCall({date:d});
227229
self.setNgModelValue(d);
228230

229231
self.$scope.$emit('calender:date-selected');
@@ -302,261 +304,10 @@ CalenderCtrl.prototype.closeDateTime = function(){
302304
else
303305
self.view='DATE';
304306
self.$scope.$emit('calender:close');
305-
306307
}
307308

308309

309310

310-
function DateTimePicker($mdUtil,$mdMedia,$document,picker){
311-
return {
312-
restrict : 'E',
313-
replace:true,
314-
scope :{
315-
value: '=',
316-
startDate : '@',
317-
weekStartDay : '@',
318-
startView:"@",
319-
mode : '@',
320-
format : '@',
321-
minDate : '@',
322-
maxDate : '@',
323-
fname : "@",
324-
lable : "@",
325-
isRequired : '@',
326-
disable : '=',
327-
form : '=',
328-
closeOnSelect:"@"
329-
},
330-
template: ' <md-input-container md-no-float>'
331-
+' <label for="{{fname}}" >{{lable }}</label>'
332-
+' <input name="{{fname}}" ng-model="value" '
333-
+' type="text" placeholde="{{lable}}"'
334-
+' aria-label="{{fname}}" ng-focus="show()" data-ng-required="isRequired" ng-disabled="disable"'
335-
+' server-error class="sm-input-container">'
336-
+' <div ng-messages="form[fname].$error" ng-if="form[fname].$touched">'
337-
+' <div ng-messages-include="{{ngMassagedTempaltePath}}"></div>'
338-
+' </div>'
339-
+' <div id="picker" class="sm-calender-pane md-whiteframe-15dp">'
340-
+' <sm-date-picker '
341-
+' id="{{fname}}Picker" '
342-
+' ng-model="value" '
343-
+' initial-date="{{value}}"'
344-
+' mode="{{mode}}" '
345-
+' close-on-select="{{closeOnSelect}}"'
346-
+' start-view="{{startView}}" '
347-
+' data-min-date="minDate" '
348-
+' data-max-date="maxDate" '
349-
+' data-format="{{format}}" '
350-
+' data-week-start-day="{{weekStartDay}}" > '
351-
+' </sm-date-picker>'
352-
+' </div>'
353-
+' </md-input-container>',
354-
link : function(scope,$element,attr){
355-
356-
var inputPane = $element[0].querySelector('.sm-input-container');
357-
var calenderPane = $element[0].querySelector('.sm-calender-pane');
358-
var cElement = angular.element(calenderPane);
359-
360-
scope.noFloat = 'noFloat' in attr;
361-
362-
scope.ngMassagedTempaltePath =picker.massagePath;
363-
// check if Pre defined format is supplied
364-
scope.format = angular.isUndefined(scope.format) ? 'MM-DD-YYYY': scope.format;
365-
366-
// Hide calender pane on initialization
367-
cElement.addClass('hide hide-animate');
368-
369-
// set start date
370-
scope.startDate = angular.isUndefined(scope.value)? scope.startDate : scope.value;
371-
372-
// Hide Calender on click out side
373-
$document.on('click', function (e) {
374-
if ((calenderPane !== e.target && inputPane !==e.target) && (!calenderPane.contains(e.target) && !inputPane.contains(e.target))) {
375-
hideElement();
376-
}
377-
});
378-
379-
// if tab out hide key board
380-
angular.element(inputPane).on('keydown', function (e) {
381-
if(e.which===9){
382-
hideElement();
383-
}
384-
});
385-
386-
// show calender
387-
scope.show= function(){
388-
var elementRect = inputPane.getBoundingClientRect();
389-
var bodyRect = document.body.getBoundingClientRect();
390-
391-
cElement.removeClass('hide');
392-
if($mdMedia('sm') || $mdMedia('xs')){
393-
console.log(bodyRect.width);
394-
calenderPane.style.left = (bodyRect.width-320)/2+'px';
395-
calenderPane.style.top = (bodyRect.height-450)/2+ 'px';
396-
}else{
397-
var rect = getVisibleViewPort(elementRect,bodyRect);
398-
calenderPane.style.left = (rect.left) + 'px';
399-
calenderPane.style.top = (rect.top) + 'px';
400-
}
401-
document.body.appendChild(calenderPane);
402-
$mdUtil.disableScrollAround(calenderPane);
403-
cElement.addClass('show');
404-
405-
}
406-
407-
// calculate visible port to display calender
408-
function getVisibleViewPort(elementRect,bodyRect){
409-
var calenderHeight = 320;
410-
var calenderWidth = 450;
411-
412-
var top =elementRect.top;
413-
if(elementRect.top +calenderHeight > bodyRect.bottom){
414-
top = elementRect.top - ((elementRect.top +calenderHeight) - (bodyRect.bottom -20));
415-
}
416-
var left = elementRect.left;
417-
if(elementRect.left +calenderWidth > bodyRect.right){
418-
left = elementRect.left - ((elementRect.left +calenderWidth) - (bodyRect.right -10));
419-
}
420-
return {top : top, left : left };
421-
}
422-
423-
function hideElement(){
424-
cElement.addClass('hide-animate');
425-
cElement.removeClass('show');
426-
$mdUtil.enableScrolling();
427-
428-
}
429-
//listen to emit for closing calender
430-
scope.$on('calender:close',function(){
431-
hideElement();
432-
});
433-
}
434-
}
435-
}
436-
437-
function smTimePickerNew($mdUtil,$mdMedia,$document,$timeout,picker){
438-
return {
439-
restrict : 'E',
440-
replace:true,
441-
scope :{
442-
value: '=',
443-
startDate : '@',
444-
weekStartDay : '@',
445-
startView:"@",
446-
mode : '@',
447-
format : '@',
448-
minDate : '@',
449-
maxDate : '@',
450-
fname : "@",
451-
lable : "@",
452-
isRequired : '@',
453-
disable : '=',
454-
form : '=',
455-
closeOnSelect:"@"
456-
},
457-
template: ' <md-input-container >'
458-
+' <label for="{{fname}}">{{lable }}</label>'
459-
+' <input name="{{fname}}" ng-model="value" ng-readonly="true"'
460-
+' type="text" placeholde="{{lable}}"'
461-
+' aria-label="{{fname}}" data-ng-required="isRequired"'
462-
+' ng-focus="show()" server-error class="sm-input-container">'
463-
+' <div ng-messages="form.fname.$error" ng-if="form[fname].$touched">'
464-
+' <div ng-messages-include="{{ngMassagedTempaltePath}}"></div>'
465-
+' </div>'
466-
+' <div id="picker" class="sm-calender-pane md-whiteframe-15dp">'
467-
+' <sm-time-pickern '
468-
+' id="{{fname}}Picker" '
469-
+' ng-model="value" '
470-
+' initial-date="{{value}}"'
471-
+' mode="{{mode}}" '
472-
+' close-on-select="{{closeOnSelect}}"'
473-
+' start-view="{{startView}}" '
474-
+' data-min-date="minDate" '
475-
+' data-max-date="maxDate" '
476-
+' format="{{format}}" '
477-
+' start-day="{{weekStartDay}}" > '
478-
+' </sm-time-pickern>'
479-
+' </div>'
480-
+' </md-input-container>',
481-
link : function(scope,$element,attr){
482-
var inputPane = $element[0].querySelector('.sm-input-container');
483-
var calenderPane = $element[0].querySelector('.sm-calender-pane');
484-
var cElement = angular.element(calenderPane);
485-
scope.ngMassagedTempaltePath =picker.massagePath;
486-
// check if Pre defined format is supplied
487-
scope.format = angular.isUndefined(scope.format) ? 'MM-DD-YYYY': scope.format;
488-
489-
490-
// Hide calender pane on initialization
491-
cElement.addClass('hide hide-animate');
492-
493-
// set start date
494-
scope.startDate = angular.isUndefined(scope.value)? scope.startDate : scope.value;
495-
496-
// Hide Calender on click out side
497-
$document.on('click', function (e) {
498-
if ((calenderPane !== e.target && inputPane !==e.target) && (!calenderPane.contains(e.target) && !inputPane.contains(e.target))) {
499-
hideElement();
500-
}
501-
});
502-
503-
// if tab out hide key board
504-
angular.element(inputPane).on('keydown', function (e) {
505-
if(e.which===9){
506-
hideElement();
507-
}
508-
});
509-
510-
// show calender
511-
scope.show= function(){
512-
var elementRect = inputPane.getBoundingClientRect();
513-
var bodyRect = document.body.getBoundingClientRect();
514-
515-
cElement.removeClass('hide');
516-
if($mdMedia('sm') || $mdMedia('xs')){
517-
calenderPane.style.left = (bodyRect.width-300)/2+'px';
518-
calenderPane.style.top = (bodyRect.height-450)/2+ 'px';
519-
}else{
520-
var rect = getVisibleViewPort(elementRect,bodyRect);
521-
calenderPane.style.left = (rect.left) + 'px';
522-
calenderPane.style.top = (rect.top) + 'px';
523-
}
524-
document.body.appendChild(calenderPane);
525-
$mdUtil.disableScrollAround(calenderPane);
526-
cElement.addClass('show');
527-
}
528-
529-
// calculate visible port to display calender
530-
function getVisibleViewPort(elementRect,bodyRect){
531-
var calenderHeight = 460;
532-
var calenderWidth = 296;
533-
534-
var top =elementRect.top;
535-
if(elementRect.top +calenderHeight > bodyRect.bottom){
536-
top = elementRect.top - ((elementRect.top +calenderHeight) - (bodyRect.bottom -20));
537-
}
538-
var left = elementRect.left;
539-
if(elementRect.left +calenderWidth > bodyRect.right){
540-
left = elementRect.left - ((elementRect.left +calenderWidth) - (bodyRect.right -10));
541-
}
542-
return {top : top, left : left };
543-
}
544-
545-
function hideElement(){
546-
cElement.addClass('hide-animate');
547-
cElement.removeClass('show');
548-
//this is only for animation
549-
//calenderPane.parentNode.removeChild(calenderPane);
550-
$mdUtil.enableScrolling();
551-
}
552-
//listen to emit for closing calender
553-
scope.$on('calender:close',function(){
554-
hideElement();
555-
});
556-
}
557-
}
558-
}
559-
560311

561312
function picker(){
562313
var massagePath = "X";
@@ -659,9 +410,6 @@ function picker(){
659410
var app = angular.module('smDateTimeRangePicker',[]);
660411

661412
app.directive('smCalender',['$timeout','picker',Calender]);
662-
app.directive('smDateTimePicker',['$mdUtil','$mdMedia','$document','picker',DateTimePicker]);
663-
app.directive('smTimePickerNew',['$mdUtil','$mdMedia','$document','$timeout','picker',smTimePickerNew]);
664-
665413
app.provider('picker',[picker]);
666414

667415
})();

0 commit comments

Comments
 (0)