How to detect date selection in ng-bootstrap Datepicker on input field? - html

We use the ng-bootstrap Datepicker as Directive in our project:
<input class="form-control"
name="dp" ngbDatepicker #d="ngbDatepicker" (blur)="d.close()" [(ngModel)]="model"
(ngModelChange)="onDateSelected()">
The current behaviour is that onDateSelected() is called when a date in the datepicker is selected, as well as every time a change is made to the input field.
The desired behaviour is that onDateSelected() is called whenever the user clicks on a date in the datepicker or moves the cursor out of the <input> (i.e. blur).
My approach was to change (ngModelChange) to (blur):
<input class="form-control"
name="dp" ngbDatepicker #d="ngbDatepicker" (blur)="d.close(); onDateSelected()"
[(ngModel)]="model">
but this leads to onDateSelected() not being called, when a date is selected from the datepicker - which kinda makes sense, because the cursor is not inside the <input>. However, I could not find some sort of dateSelected-Event when searching the ng-bootstrap docs on which I could call onDateSelected():
<input class="form-control"
name="dp" ngbDatepicker #d="ngbDatepicker" (blur)="d.close(); onDateSelected()"
/* missing -> */ (dateSelected)="onDateSelected()" /* <- */ [(ngModel)]="model">
Is there something I miss? Or maybe another way to implement this behaviour? I can't think of being the only one with this requirement...

Meanwhile, the issue has been closed and there will be a (dateSelect) event in 1.1.0: https://github.com/ng-bootstrap/ng-bootstrap/pull/2254

<input class="form-control"
name="dp" ngbDatepicker #d="ngbDatepicker" (blur)="d.close()"
[(ngModel)]="model"
(select)="onDateSelected()">
This will work and onDateSelected() is called whenever you select a date in datepicker

Here is the solution:
<input
class="form-control"
name="startDate"
[(ngModel)]="startDate"
(dateSelect)="doSomething()"
(blur)="doSomething()"
ngbDatepicker
#startDate="ngbDatepicker"
>
Here (dateSelect) handles choosing from the calendar picker and (blur) handles manually input when the input loses focus.

Guess select output method is what you are looking for.
Select: An event fired when user selects a date using keyboard or mouse. The payload of the event is currently selected NgbDateStruct.
Refer the output section

Using dateSelect worked for me:
<input class="form-control"
name="dp" ngbDatepicker #d="ngbDatepicker" (blur)="d.close(); ()onDateSelected()"
[(ngModel)]="model">

Related

Text change won't trigger an event

I have: <input type="text" id="help-text" [(ngModel)]="fileName" disabled>, and I'm curious to find how can I trigger an event if 'fileName' changed in Angular. (change)="onChange()" does not seem to be working and a couple of pre-defined jquery scripts.
Remove disabled attribute and use ngModelChange
<input type="text" id="help-text" [(ngModel)]="fileName" (ngModelChange)="modelChanged($event)">

How to handle html date picker having type="date" using selenium , on date selection no change in html dom

I am trying to handle the html based date picker, I am able to click on it so that the date picker calendar pop up, but there is no inspect option for calendar.
Even when i manually select the date there is no such change in the HTML DOM, that can be used.
i tried adding date inside it using following workaround, none of them worked(no , thing happening in DOM).
jse.executeScript("document.getElementById('date-input').value='10101990'");
driver.switchTo().activeElement().sendKeys(Keys.TAB);
driver.findElement(By.id("date-input")).sendKeys(Keys.TAB);
In web it appears as editable along with select from calendar option(run the code snippet below)
while in mobile (web) its appearance is different as shown in screenshot.
is there any solution with JAVA-Selenium : Inspect HTML5 date picker shadow DOM
<label for="start">Start date:</label>
<input type="date" id="start" name="trip-start"
min="2020-01-01" max="2020-12-31" value>
<input class="Input-module_input__nj1kl" type="date" id="date-input" data-testid="date-input" placeholder="Date of Birth" required="" aria-invalid="false" aria-describedby="birth-date-input-error" aria-required="true" min="1920-01-01" max="2020-08-18" value>
<label for="date-input" class="Input-module_label__npqrt1">Date of Birth*</label><label for="date-input" class="Input-module_label__30ytr">Date of Birth*</label>
<span role="alert" id="date-input-error" class="Input-module_errorMessage__lMKY" style="display: none;">Please enter a valid date of birth</span>
Below Code sample have worked for me.Update your required date in format yyyy-MM-dd for the variable date
driver.get("http://127.0.0.1:8887/");
JavascriptExecutor js = (JavascriptExecutor) driver;
String date="2009-02-09";
js.executeScript("document.getElementById('date-input').value ='"+date.toString()+"'",2000);
Change your required Id in getElementById('date-input') inside the js executor
Well... I can simply tell you the simple logic
By default when the calendar opens then-current date is selected
You need to check if current date is less or greater than date to be selected. Date.compareTo function will help here
Then you need to navigate to the corresponding month and year combination.
Once you are in the right month and year then you can select the date as well.

HTML/Angular2 date picker disable to select a future date

I have an issue related to html/angular 2 date picker.
So i have such input tag:
<input #createdAt ngModel type="datetime-local" id="createdAt" name="date" class="form-control" required>
but i don't want allow to a user select future date, so only today and past date is allowed.
How can i achieve such behaviour with angular 2?
Below is the syntax for max/min attributes for the angular material date picker.
<input matInput [max]="maxDate" [min]="minDate" [matDatepicker]="picker">
One of the option is to leverage the max attribute of <input type="datetime-local such as: <input type="date" name="bday" max="1979-12-31">
An alternative is to use an existing Angular2 component, such as the date picker from Bootstrap Angular 2. The component is highly customizable and your goal can be achieved by setting the maxDate input.

How can user make input type date empty?

I wish to use the new input attribute from HTML5 DATE, only one problem, in the logic of the project, the user must be have the choice to delete the value, but i don't see, how to set empty value on this inputs
Assuming you want to make the value shown to dd/mm/yyyy, then click on Clear button.
In HTML5 on Chrome the date picker popup has a "clear" button at the bottom (next to "today")
<input type="date" value="">
<input type="date" name="NameItAnythingYouWant" value="">

Playbook input type date change event

I'm trying to make use of the input type date on playbook, and it seems that no events are sent when a date is selected in the date picker.
Hence I cannot do any validation on that date.
Does anybody know if any event is sent when the input value is changed with the datepicker?
Edit:
I'm developing a tablet webapp in html, the datepicker is the native one that appear in the browser.
<input type="date" />
I want to show the native datepicker when possible (iOs 5+, Playbook, ..) and a home brewed datepicker for other touch devices
The events that should be fired are input and change. I don't have access to a Playbook or an iOS 5 device, but this example works in Opera (which has also implemented native date pickers).
<form oninput="date_diff()">
<label for="date1">First date:</label>
<input id="date1" type="date" value="2011-08-24">
<label for="date2">Second date:</label>
<input id="date2" type="date" value="2011-08-25">
</form>
The date_diff function gets executed whenever one of the date values is changed.