Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
89
rated 0 times [  96] [ 7]  / answers: 1 / hits: 40191  / 10 Years ago, sat, march 8, 2014, 12:00:00

I have a form where there is a need for me to have 2 or more date fields for different things. I tried the Angular UI Bootstrap which works fine when I have only 1 date field in the form. But it stops working if I have multiple date fields and I dont know the easier method to get this to work.



This is my HTML sample:



 <label>First Date</label>  
<div class=input-group>
<input type=text class=form-control datepicker-popup={{format}} name=dt ng-model=formData.dt is-open=opened datepicker-options=dateOptions ng-required=true close-text=Close />
<span class=input-group-btn>
<button class=btn btn-default ng-click=open($event)><i class=glyphicon glyphicon-calendar></i></button>
</span>
</div>

<label>Second Date</label>
<div class=input-group>
<input type=text class=form-control datepicker-popup={{format}} name=dtSecond ng-model=formData.dtSecond is-open=opened datepicker-options=dateOptions ng-required=true close-text=Close />
<span class=input-group-btn>
<button class=btn btn-default ng-click=open($event)><i class=glyphicon glyphicon-calendar></i></button>
</span>
</div>


My JS is:



myApp.controller('DatePickrCntrl', function ($scope) {

$scope.today = function() {
$scope.formData.dt = new Date();
};
$scope.today();

$scope.showWeeks = true;
$scope.toggleWeeks = function () {
$scope.showWeeks = ! $scope.showWeeks;
};

$scope.clear = function () {
$scope.dt = null;
};

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

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

$scope.open = function($event) {
$event.preventDefault();
$event.stopPropagation();

$scope.opened = true;
};

$scope.dateOptions = {
'year-format': 'yy',
'starting-day': 1
};

$scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'shortDate'];
$scope.format = $scope.formats[0];

});


I implemented based on the sample here. The problem I have here is:



1) When one of the date field is clicked, the pop-up datepicker is messed up and seems to show 2 datepicker in 1.



2) When I remove is-open=opened attribute, the pop-up window seems to work fine. But without is-open=opened, the ng-click=open($event) for the button doesnt work.



3) Since each of the date fields have different ng-models, I am unable to set default dates for any date fields except for the first one with ng-model=formData.dt



The only long way to resolve this that I can think of is to separate the controller for each date field.



I would like to know how others implement multiple date fields in 1 form itself when using Angular UI Bootstrap.


More From » angularjs

 Answers
5

I have 30 in one form one controller no problem. use the same concept if you need it on ng-repeat.



 <label>First Date</label>  
<div class=input-group>
<input type=text class=form-control datepicker-popup={{format}}
name=dt ng-model=formData.dt is-open=datepickers.dt
datepicker-options=dateOptions ng-required=true
close-text=Close />
<span class=input-group-btn>
<button class=btn btn-default ng-click=open($event,'dt')>
<i class=glyphicon glyphicon-calendar></i></button>
</span>
</div>

<label>Second Date</label>
<div class=input-group>
<input type=text class=form-control datepicker-popup={{format}}
name=dtSecond ng-model=formData.dtSecond
is-open=datepickers.dtSecond datepicker-options=dateOptions
ng-required=true close-text=Close />
<span class=input-group-btn>
<button class=btn btn-default ng-click=open($event,'dtSecond')>
<i class=glyphicon glyphicon-calendar></i></button>
</span>
</div>

myApp.controller('DatePickrCntrl', function ($scope) {
$scope.datepickers = {
dt: false,
dtSecond: false
}
$scope.today = function() {
$scope.formData.dt = new Date();

// ***** Q1 *****
$scope.formData.dtSecond = new Date();
};
$scope.today();

$scope.showWeeks = true;
$scope.toggleWeeks = function () {
$scope.showWeeks = ! $scope.showWeeks;
};

$scope.clear = function () {
$scope.dt = null;
};

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

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

$scope.open = function($event, which) {
$event.preventDefault();
$event.stopPropagation();

$scope.datepickers[which]= true;
};

$scope.dateOptions = {
'year-format': 'yy',
'starting-day': 1
};

$scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'shortDate'];
$scope.format = $scope.formats[0];

});


// ***** Q2 ***** somemodel can be just an array [1,2,3,4,5]
<div ng-repeat=o in somemodel>
<label>Date Label</label>
<div class=input-group>
<input type=text class=form-control datepicker-popup={{format}}
name=dt{{o}} ng-model=datepickers.data[o]
is-open=datepickers.isopen[o] datepicker-options=datepickers.option
ng-required=true close-text=Close />
<span class=input-group-btn>
<button class=btn btn-default ng-click=open($event,o)>
<i class=glyphicon glyphicon-calendar></i></button>
</span>
</div>
</div>


myApp.controller('DatePickrCntrl', function ($scope) {

$scope.datepickers = {
data: {},
options: {
'year-format': 'yy',
'starting-day': 1
},
isopen: {}
}
$http.get(get/data/for/some/model, function(result) {
$scope.somemodel = result;
for (var i = 0; i < result.length; i++) {
$scope.datepickers.isopen[result] = false;
$scope.datepickers.data[result] = new Date(); //set default date.
}
});

// fill in rest of the function
});

[#72092] Thursday, March 6, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
eanskylerg

Total Points: 524
Total Questions: 107
Total Answers: 100

Location: Colombia
Member since Mon, May 2, 2022
2 Years ago
;