diff --git a/lib/process-services-cloud/src/lib/common/date-range-filter/date-range-filter.component.html b/lib/process-services-cloud/src/lib/common/date-range-filter/date-range-filter.component.html index 6cee240d107..a0baa65b264 100644 --- a/lib/process-services-cloud/src/lib/common/date-range-filter/date-range-filter.component.html +++ b/lib/process-services-cloud/src/lib/common/date-range-filter/date-range-filter.component.html @@ -18,7 +18,10 @@ - + diff --git a/lib/testing/src/lib/protractor/core/pages/material/date-picker-calendar.page.ts b/lib/testing/src/lib/protractor/core/pages/material/date-picker-calendar.page.ts index 09f0656eabb..e439835b388 100644 --- a/lib/testing/src/lib/protractor/core/pages/material/date-picker-calendar.page.ts +++ b/lib/testing/src/lib/protractor/core/pages/material/date-picker-calendar.page.ts @@ -26,6 +26,7 @@ export class DatePickerCalendarPage { nextMonthButton = element(by.css('button[class*="mat-calendar-next-button"]')); previousMonthButton = element(by.css('button[class*="mat-calendar-previous-button"]')); todayDate = element(by.css('.mat-calendar-body-today')); + periodButton = element(by.css('button[class*=mat-calendar-period-button]')); async getSelectedDate(): Promise { return BrowserActions.getAttribute(element(by.css('td[class*="mat-calendar-body-active"]')), 'aria-label'); @@ -80,4 +81,32 @@ export class DatePickerCalendarPage { await BrowserActions.click(endDayElement); await this.checkDatePickerIsNotDisplayed(); } + + private async setDateUsingPeriodButton(date: Date) { + const months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']; + const year = date.getFullYear(); + const month = months[date.getMonth()]; + const day = date.getDate(); + const yearElement = element(by.cssContainingText(`div.mat-calendar-body-cell-content.mat-focus-indicator`, `${year}`)); + const monthElement = element(by.cssContainingText(`div.mat-calendar-body-cell-content.mat-focus-indicator`, `${month}`)); + const dayElement = element(by.cssContainingText(`div.mat-calendar-body-cell-content.mat-focus-indicator`, `${day}`)); + + await BrowserActions.click(this.periodButton); + await BrowserActions.click(yearElement); + await BrowserActions.click(monthElement); + await BrowserActions.click(dayElement); + } + + async selectExactDate(date: Date): Promise { + await this.checkDatePickerIsDisplayed(); + await this.setDateUsingPeriodButton(date); + await this.checkDatePickerIsNotDisplayed(); + } + + async selectExactDateRange(start: Date, end: Date): Promise { + await this.checkDatePickerIsDisplayed(); + await this.setDateUsingPeriodButton(start); + await this.setDateUsingPeriodButton(end); + await this.checkDatePickerIsNotDisplayed(); + } } diff --git a/lib/testing/src/lib/protractor/core/pages/material/date-picker.page.ts b/lib/testing/src/lib/protractor/core/pages/material/date-picker.page.ts index 233cc291c15..772bcf903f7 100644 --- a/lib/testing/src/lib/protractor/core/pages/material/date-picker.page.ts +++ b/lib/testing/src/lib/protractor/core/pages/material/date-picker.page.ts @@ -15,17 +15,31 @@ * limitations under the License. */ -import { element, by } from 'protractor'; +import { element, by, ElementFinder } from 'protractor'; import { BrowserActions } from '../../utils/browser-actions'; import { DatePickerCalendarPage } from './date-picker-calendar.page'; export class DatePickerPage { - datePicker = element.all(by.css('.mat-datepicker-toggle')).first(); + datePicker: ElementFinder; dateTime = new DatePickerCalendarPage(); - async setTodayDateValue(): Promise { + constructor(datePickerElement?: ElementFinder) { + const locator = by.css('.mat-datepicker-toggle'); + this.datePicker = datePickerElement ? datePickerElement : element(locator); + } + + async clickDatePicker() { await BrowserActions.click(this.datePicker); + } + + async setTodayDateValue(): Promise { + await this.clickDatePicker(); await this.dateTime.selectTodayDate(); } + + async setDateRange(start: Date, end: Date): Promise { + await this.clickDatePicker(); + await this.dateTime.selectExactDateRange(start, end); + } } diff --git a/lib/testing/src/lib/protractor/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts b/lib/testing/src/lib/protractor/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts index d87aacbf816..b00d25a2df5 100644 --- a/lib/testing/src/lib/protractor/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts +++ b/lib/testing/src/lib/protractor/process-services-cloud/pages/edit-process-filter-cloud-component.page.ts @@ -20,6 +20,7 @@ import { BrowserVisibility } from '../../core/utils/browser-visibility'; import { BrowserActions } from '../../core/utils/browser-actions'; import { DropdownPage } from '../../core/pages/material/dropdown.page'; import { PeopleCloudComponentPage } from './people-cloud-component.page'; +import { DatePickerPage } from '../../core/pages/material/date-picker.page'; export interface FilterProps { name?: string; @@ -28,6 +29,7 @@ export interface FilterProps { order?: string; initiator?: string; processName?: string; + suspendedDateRange?: string; } export class EditProcessFilterCloudComponentPage { @@ -44,6 +46,12 @@ export class EditProcessFilterCloudComponentPage { private locatorSortDropdown = element(by.css(`mat-select[data-automation-id='adf-cloud-edit-process-property-sort']`)); private locatorOrderDropdown = element(by.css(`mat-select[data-automation-id='adf-cloud-edit-process-property-order']`)); private locatorProcessDefinitionNameDropdown = element(by.css(`mat-select[data-automation-id='adf-cloud-edit-process-property-processDefinitionName']`)); + private locatorSuspendedDateRangeDropdown = element(by.css(`mat-select[data-automation-id='adf-cloud-edit-process-property-suspendedDateRange']`)); + private locatorStartedDateRangeDropdown = element(by.css(`mat-select[data-automation-id='adf-cloud-edit-process-property-startedDateRange']`)); + private locatorCompletedDateRangeDropdown = element(by.css(`mat-select[data-automation-id='adf-cloud-edit-process-property-completedDateRange']`)); + + private locatorSuspendedDateRangeWithin = element(by.css(`mat-datepicker-toggle[data-automation-id='adf-cloud-edit-process-property-date-range-suspendedDateRange']`)); + private expansionPanelExtended = this.rootElement.element(by.css('mat-expansion-panel-header.mat-expanded')); private content = this.rootElement.element(by.css('div.mat-expansion-panel-content[style*="visible"]')); @@ -52,6 +60,12 @@ export class EditProcessFilterCloudComponentPage { sortDropdown = new DropdownPage(this.locatorSortDropdown); orderDropdown = new DropdownPage(this.locatorOrderDropdown); processDefinitionNameDropdown = new DropdownPage(this.locatorProcessDefinitionNameDropdown); + suspendedDateRangeDropdown = new DropdownPage(this.locatorSuspendedDateRangeDropdown); + startedDateRangeDropdown = new DropdownPage(this.locatorStartedDateRangeDropdown); + completedDateRangeDropdown = new DropdownPage(this.locatorCompletedDateRangeDropdown); + + suspendedDateRangeWithin = new DatePickerPage(this.locatorSuspendedDateRangeWithin); + peopleCloudComponent = new PeopleCloudComponentPage(); editProcessFilterDialogPage = new EditProcessFilterDialogPage(); @@ -64,36 +78,36 @@ export class EditProcessFilterCloudComponentPage { return BrowserVisibility.waitUntilElementIsVisible(this.filter); } - async openFilter(): Promise { + async openFilter() { await this.isFilterDisplayed(); await BrowserActions.click(this.customiseFilter); await this.checkHeaderIsExpanded(); } - async checkHeaderIsExpanded(): Promise { + async checkHeaderIsExpanded() { await BrowserVisibility.waitUntilElementIsVisible(this.expansionPanelExtended); await BrowserVisibility.waitUntilElementIsVisible(this.content); } - async closeFilter(): Promise { + async closeFilter() { await BrowserActions.click(this.customiseFilter); await this.checkHeaderIsCollapsed(); } - async checkHeaderIsCollapsed(): Promise { + async checkHeaderIsCollapsed() { await BrowserVisibility.waitUntilElementIsNotVisible(this.expansionPanelExtended, 1000); await BrowserVisibility.waitUntilElementIsNotVisible(this.content, 1000); } - setStatusFilterDropDown(option: string): Promise { - return this.statusDropdown.selectDropdownOption(option); + async setStatusFilterDropDown(option: string) { + await this.statusDropdown.selectDropdownOption(option); } getStateFilterDropDownValue(): Promise { return BrowserActions.getText(element(by.css("mat-form-field[data-automation-id='status'] span"))); } - async setSortFilterDropDown(option): Promise { + async setSortFilterDropDown(option) { await this.sortDropdown.selectDropdownOption(option); } @@ -102,7 +116,7 @@ export class EditProcessFilterCloudComponentPage { return BrowserActions.getText(sortLocator); } - async setOrderFilterDropDown(option): Promise { + async setOrderFilterDropDown(option) { await this.orderDropdown.selectDropdownOption(option); await browser.sleep(1500); } @@ -111,12 +125,29 @@ export class EditProcessFilterCloudComponentPage { return BrowserActions.getText(element(by.css("mat-form-field[data-automation-id='order'] span"))); } - setAppNameDropDown(option: string): Promise { - return this.appNameDropdown.selectDropdownOption(option); + async setAppNameDropDown(option: string) { + await this.appNameDropdown.selectDropdownOption(option); + } + + async setProcessDefinitionNameDropDown(option: string) { + await this.processDefinitionNameDropdown.selectDropdownOption(option); + } + + async setSuspendedDateRangeDropDown(option: string) { + await this.suspendedDateRangeDropdown.selectDropdownOption(option); } - setProcessDefinitionNameDropDown(option: string): Promise { - return this.processDefinitionNameDropdown.selectDropdownOption(option); + async setStartedDateRangeDropDown(option: string) { + await this.startedDateRangeDropdown.selectDropdownOption(option); + } + + async setCompletedDateRangeDropDown(option: string) { + await this.completedDateRangeDropdown.selectDropdownOption(option); + } + + async setSuspendedDateRangeWithin(start: Date, end: Date) { + await this.setSuspendedDateRangeDropDown('Date within'); + await this.suspendedDateRangeWithin.setDateRange(start, end); } async getApplicationSelected(): Promise { @@ -144,20 +175,20 @@ export class EditProcessFilterCloudComponentPage { return BrowserVisibility.waitUntilElementIsNotVisible(emptyList); } - setProcessInstanceId(option: string): Promise { - return this.setProperty('processInstanceId', option); + async setProcessInstanceId(option: string) { + await this.setProperty('processInstanceId', option); } - setProcessDefinitionKey(option: string): Promise { - return this.setProperty('processDefinitionKey', option); + async setProcessDefinitionKey(option: string) { + await this.setProperty('processDefinitionKey', option); } - setProcessName(option: string): Promise { - return this.setProperty('processName', option); + async setProcessName(option: string) { + await this.setProperty('processName', option); } - setInitiator(value: string): Promise { - return this.peopleCloudComponent.searchAssigneeAndSelect(value); + async setInitiator(value: string) { + await this.peopleCloudComponent.searchAssigneeAndSelect(value); } getProcessInstanceId(): Promise { @@ -169,26 +200,26 @@ export class EditProcessFilterCloudComponentPage { return BrowserActions.getInputValue(locator); } - async setProperty(property: string, option: string): Promise { + async setProperty(property: string, option: string) { const locator = element.all(by.css('input[data-automation-id="adf-cloud-edit-process-property-' + property + '"]')).first(); await BrowserVisibility.waitUntilElementIsVisible(locator); await BrowserActions.clearSendKeys(locator, option); } - checkSaveButtonIsDisplayed(): Promise { - return BrowserVisibility.waitUntilElementIsVisible(this.saveButton); + async checkSaveButtonIsDisplayed() { + await BrowserVisibility.waitUntilElementIsVisible(this.saveButton); } - checkSaveAsButtonIsDisplayed(): Promise { - return BrowserVisibility.waitUntilElementIsVisible(this.saveAsButton); + async checkSaveAsButtonIsDisplayed() { + await BrowserVisibility.waitUntilElementIsVisible(this.saveAsButton); } - checkDeleteButtonIsDisplayed(): Promise { - return BrowserVisibility.waitUntilElementIsVisible(this.deleteButton); + async checkDeleteButtonIsDisplayed() { + await BrowserVisibility.waitUntilElementIsVisible(this.deleteButton); } - checkDeleteButtonIsNotDisplayed(): Promise { - return BrowserVisibility.waitUntilElementIsNotVisible(this.deleteButton); + async checkDeleteButtonIsNotDisplayed() { + await BrowserVisibility.waitUntilElementIsNotVisible(this.deleteButton); } async checkSaveButtonIsEnabled(): Promise { @@ -206,7 +237,7 @@ export class EditProcessFilterCloudComponentPage { return this.deleteButton.isEnabled(); } - async saveAs(name: string): Promise { + async saveAs(name: string) { await this.clickSaveAsButton(); await this.editProcessFilterDialog().setFilterName(name); await this.editProcessFilterDialog().clickOnSaveButton(); @@ -214,20 +245,20 @@ export class EditProcessFilterCloudComponentPage { await browser.driver.sleep(1000); } - async clickSaveAsButton(): Promise { + async clickSaveAsButton() { await BrowserActions.click(this.saveAsButton); await browser.driver.sleep(1000); } - clickDeleteButton(): Promise { - return BrowserActions.click(this.deleteButton); + async clickDeleteButton() { + await BrowserActions.click(this.deleteButton); } - clickSaveButton(): Promise { - return BrowserActions.click(this.saveButton); + async clickSaveButton() { + await BrowserActions.click(this.saveButton); } - async setFilter(props: FilterProps): Promise { + async setFilter(props: FilterProps) { await this.openFilter(); if (props.name) { await this.setProcessName(props.name); } if (props.status) { await this.setStatusFilterDropDown(props.status); } @@ -235,6 +266,7 @@ export class EditProcessFilterCloudComponentPage { if (props.order) { await this.setOrderFilterDropDown(props.order); } if (props.initiator) { await this.setInitiator(props.initiator); } if (props.processName) { await this.setProcessName(props.processName); } + if (props.suspendedDateRange) { await this.setSuspendedDateRangeDropDown(props.suspendedDateRange); } await this.closeFilter(); } }