diff --git a/e2e/core/pages/content-services.page.ts b/e2e/core/pages/content-services.page.ts index 10e51e912b..79aabd9240 100644 --- a/e2e/core/pages/content-services.page.ts +++ b/e2e/core/pages/content-services.page.ts @@ -15,23 +15,13 @@ * limitations under the License. */ -import { - DropActions, - BrowserActions, - BrowserVisibility, - DateUtil, - DocumentListPage, - DropdownPage, - Logger -} from '@alfresco/adf-testing'; +import { DropActions, BrowserActions, BrowserVisibility, DocumentListPage, DropdownPage, Logger } from '@alfresco/adf-testing'; import { $$, browser, by, element, protractor, $ } from 'protractor'; import { FolderDialogPage } from './dialog/folder-dialog.page'; import { NavigationBarPage } from './navigation-bar.page'; - import * as path from 'path'; export class ContentServicesPage { - columns = { name: 'Display name', size: 'Size', @@ -94,28 +84,28 @@ export class ContentServicesPage { await BrowserVisibility.waitUntilElementIsVisible(disabledDelete); } - async deleteContent(content): Promise { + async deleteContent(content: string): Promise { await this.contentList.clickOnActionMenu(content); await BrowserActions.click(this.deleteContentElement); await this.checkContentIsNotDisplayed(content); } - async metadataContent(content): Promise { + async metadataContent(content: string): Promise { await this.contentList.clickOnActionMenu(content); await BrowserActions.click(this.metadataAction); } - async versionManagerContent(content): Promise { + async versionManagerContent(content: string): Promise { await this.contentList.clickOnActionMenu(content); await BrowserActions.click(this.versionManagerAction); } - async clickFileHyperlink(fileName): Promise { + async clickFileHyperlink(fileName: string): Promise { const hyperlink = this.contentList.dataTablePage().getFileHyperlink(fileName); await BrowserActions.click(hyperlink); } - async checkFileHyperlinkIsEnabled(fileName): Promise { + async checkFileHyperlinkIsEnabled(fileName: string): Promise { const hyperlink = this.contentList.dataTablePage().getFileHyperlink(fileName); await BrowserVisibility.waitUntilElementIsVisible(hyperlink); } @@ -129,38 +119,6 @@ export class ContentServicesPage { return this.contentList.dataTablePage().getAllRowsColumnValues(this.columns.nodeId); } - checkElementsDateSortedAsc(elements) { - let sorted = true; - let i = 0; - - while (elements.length > 1 && sorted === true && i < (elements.length - 1)) { - const left = DateUtil.parse(elements[i], 'DD-MM-YY'); - const right = DateUtil.parse(elements[i + 1], 'DD-MM-YY'); - if (left > right) { - sorted = false; - } - i++; - } - - return sorted; - } - - checkElementsDateSortedDesc(elements) { - let sorted = true; - let i = 0; - - while (elements.length > 1 && sorted === true && i < (elements.length - 1)) { - const left = DateUtil.parse(elements[i], 'DD-MM-YY'); - const right = DateUtil.parse(elements[i + 1], 'DD-MM-YY'); - if (left < right) { - sorted = false; - } - i++; - } - - return sorted; - } - // @deprecated prefer waitTillContentLoaded async checkDocumentListElementsAreDisplayed(): Promise { await this.checkAcsContainer(); @@ -368,16 +326,16 @@ export class ContentServicesPage { await DropActions.dropFile(this.dragAndDrop, file); } - async checkLockIsDisplayedForElement(name): Promise { + async checkLockIsDisplayedForElement(name: string): Promise { const lockButton = $(`div.adf-datatable-cell[data-automation-id="${name}"] button`); await BrowserVisibility.waitUntilElementIsVisible(lockButton); } - async getColumnValueForRow(file, columnName): Promise { + async getColumnValueForRow(file: string, columnName: string): Promise { return this.contentList.dataTablePage().getColumnValueForRow(this.columns.name, file, columnName); } - async checkEmptyFolderTextToBe(text): Promise { + async checkEmptyFolderTextToBe(text: string): Promise { await BrowserVisibility.waitUntilElementIsVisible(this.emptyFolder); await expect(await this.emptyFolder.getText()).toContain(text); } @@ -386,7 +344,7 @@ export class ContentServicesPage { await expect(await BrowserActions.getAttribute(this.emptyFolderImage, 'src')).toContain(url); } - async getRowIconImageUrl(fileName): Promise { + async getRowIconImageUrl(fileName: string): Promise { const iconRow = $(`.app-document-list-container div.adf-datatable-cell[data-automation-id="${fileName}"] img`); return BrowserActions.getAttribute(iconRow, 'src'); } @@ -415,12 +373,16 @@ export class ContentServicesPage { } async checkDocumentCardPropertyIsShowed(elementName: string, propertyName: string): Promise { - const elementProperty = $(`.app-document-list-container div.adf-datatable-cell[data-automation-id="${elementName}"][title="${propertyName}"]`); + const elementProperty = $( + `.app-document-list-container div.adf-datatable-cell[data-automation-id="${elementName}"][title="${propertyName}"]` + ); await BrowserVisibility.waitUntilElementIsVisible(elementProperty); } async getAttributeValueForElement(elementName: string, propertyName: string): Promise { - const elementSize = $(`.app-document-list-container div.adf-datatable-cell[data-automation-id="${elementName}"][title="${propertyName}"] span`); + const elementSize = $( + `.app-document-list-container div.adf-datatable-cell[data-automation-id="${elementName}"][title="${propertyName}"] span` + ); return BrowserActions.getText(elementSize); } @@ -429,24 +391,10 @@ export class ContentServicesPage { await BrowserVisibility.waitUntilElementIsVisible(elementMenu); } - async navigateToCardFolder(folderName: string): Promise { - await BrowserActions.closeMenuAndDialogs(); - const folderCard = $(`.app-document-list-container div.adf-image-table-cell.adf-datatable-cell[data-automation-id="${folderName}"]`); - await BrowserActions.click(folderCard); - const folderSelected = $(`.adf-datatable-row.adf-is-selected div[data-automation-id="${folderName}"].adf-datatable-cell--image`); - await BrowserVisibility.waitUntilElementIsVisible(folderSelected); - await browser.actions().sendKeys(protractor.Key.ENTER).perform(); - } - async selectGridSortingFromDropdown(sortingOption: string): Promise { await this.sortingDropdown.selectDropdownOption(sortingOption); } - async checkRowIsDisplayed(rowName: string): Promise { - const row = this.contentList.dataTablePage().getCellElementByValue(this.columns.name, rowName); - await BrowserVisibility.waitUntilElementIsVisible(row); - } - async checkSelectedSiteIsDisplayed(siteName: string): Promise { await this.siteListDropdown.checkOptionIsSelected(siteName); } diff --git a/e2e/core/pages/dialog/folder-dialog.page.ts b/e2e/core/pages/dialog/folder-dialog.page.ts index 4a14195e12..0997f6249d 100644 --- a/e2e/core/pages/dialog/folder-dialog.page.ts +++ b/e2e/core/pages/dialog/folder-dialog.page.ts @@ -19,7 +19,6 @@ import { $$ } from 'protractor'; import { BrowserActions } from '@alfresco/adf-testing'; export class FolderDialogPage { - folderDialog = $$('adf-folder-dialog').first(); folderNameField = this.folderDialog.$('#adf-folder-name-input'); createUpdateButton = this.folderDialog.$('#adf-folder-create-button'); @@ -29,7 +28,7 @@ export class FolderDialogPage { await BrowserActions.click(this.createUpdateButton); } - async addFolderName(folderName): Promise { + async addFolderName(folderName: string): Promise { await BrowserActions.clearSendKeys(this.folderNameField, folderName); } } diff --git a/e2e/core/pages/dialog/upload-toggles.page.ts b/e2e/core/pages/dialog/upload-toggles.page.ts index da6e82302f..7a7e52ffcd 100644 --- a/e2e/core/pages/dialog/upload-toggles.page.ts +++ b/e2e/core/pages/dialog/upload-toggles.page.ts @@ -19,7 +19,6 @@ import { $, browser } from 'protractor'; import { BrowserActions, BrowserVisibility, TogglePage } from '@alfresco/adf-testing'; export class UploadTogglesPage { - togglePage = new TogglePage(); multipleFileUploadToggle = $('#adf-multiple-upload-switch'); uploadFolderToggle = $('#adf-folder-upload-switch'); @@ -44,11 +43,6 @@ export class UploadTogglesPage { await this.togglePage.enableToggle(this.uploadFolderToggle); } - async checkMultipleFileUploadToggleIsEnabled(): Promise { - const enabledToggle = $('mat-slide-toggle[id="adf-multiple-upload-switch"][class*="mat-checked"]'); - await BrowserVisibility.waitUntilElementIsVisible(enabledToggle); - } - async checkMaxSizeToggleIsEnabled(): Promise { const enabledToggle = $('mat-slide-toggle[id="adf-max-size-filter-upload-switch"][class*="mat-checked"]'); await BrowserVisibility.waitUntilElementIsVisible(enabledToggle); diff --git a/e2e/core/pages/metadata-view.page.ts b/e2e/core/pages/metadata-view.page.ts index c6b4bc9158..058d7ed65b 100644 --- a/e2e/core/pages/metadata-view.page.ts +++ b/e2e/core/pages/metadata-view.page.ts @@ -31,7 +31,6 @@ export class MetadataViewPage { size = $(`[data-automation-id='card-textitem-value-content.sizeInBytes']`); description = $(`span[data-automation-id='card-textitem-value-properties.cm:description']`); author = $(`[data-automation-id='card-textitem-value-properties.cm:author']`); - titleProperty = $(`span[data-automation-id='card-textitem-value-properties.cm:title'] span`); editIcon = $(`button[data-automation-id='meta-data-card-toggle-edit']`); informationButton = $(`button[data-automation-id='meta-data-card-toggle-expand']`); informationSpan = $(`span[data-automation-id='meta-data-card-toggle-expand-label']`); @@ -96,10 +95,6 @@ export class MetadataViewPage { return BrowserActions.getInputValue(this.author); } - async getTitleProperty(): Promise { - return BrowserActions.getText(this.titleProperty); - } - async editIconIsDisplayed(): Promise { await BrowserVisibility.waitUntilElementIsVisible(this.editIcon); } diff --git a/e2e/core/pages/trashcan.page.ts b/e2e/core/pages/trashcan.page.ts deleted file mode 100644 index 428ccaf861..0000000000 --- a/e2e/core/pages/trashcan.page.ts +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { BrowserActions, BrowserVisibility, DocumentListPage } from '@alfresco/adf-testing'; -import { browser, $$, $ } from 'protractor'; - -export class TrashcanPage { - private contentList = new DocumentListPage($('adf-document-list')); - private restoreButton = $(`button[title='Restore']`); - - async numberOfResultsDisplayed(): Promise { - const rows = $$('adf-document-list div[class*="adf-datatable-body"] adf-datatable-row[class*="adf-datatable-row"]'); - return rows.count(); - } - - async waitForTableBody(): Promise { - const tableBody = $$('adf-document-list .adf-datatable-body').first(); - await BrowserVisibility.waitUntilElementIsVisible(tableBody); - } - - async checkTrashcanIsEmpty(): Promise { - await BrowserVisibility.waitUntilElementIsVisible($('adf-empty-content')); - } - - getDocumentList(): DocumentListPage { - return this.contentList; - } - - async clickRestore(): Promise { - await BrowserActions.click(this.restoreButton); - await browser.sleep(2000); - } - - async checkRestoreButtonIsNotDisplayed(): Promise { - await BrowserVisibility.waitUntilElementIsNotVisible(this.restoreButton); - } -} diff --git a/e2e/models/ACS/file.model.ts b/e2e/models/ACS/file.model.ts index 5009bc12b3..fe5572ea7b 100644 --- a/e2e/models/ACS/file.model.ts +++ b/e2e/models/ACS/file.model.ts @@ -33,7 +33,7 @@ export class FileModel { lastPageText = browser.params.resources.Files.ADF_DOCUMENTS.PDF.last_page_text; secondPageText = browser.params.resources.Files.ADF_DOCUMENTS.PDF.second_page_text; lastPageNumber = browser.params.resources.Files.ADF_DOCUMENTS.PDF.last_page_number; - createdAt = ''; + createdAt: Date = null; password = ''; createdByUser = new CreatedByModel(); modifiedByUser = new CreatedByModel(); diff --git a/e2e/process-services/pages/task-details.page.ts b/e2e/process-services/pages/task-details.page.ts index 7cff096543..38b8abf71e 100644 --- a/e2e/process-services/pages/task-details.page.ts +++ b/e2e/process-services/pages/task-details.page.ts @@ -81,7 +81,7 @@ export class TaskDetailsPage { return BrowserActions.getText(this.taskDetailsTitle); } - async checkSelectedForm(formName): Promise { + async checkSelectedForm(formName: string): Promise { await this.attachFormDropdown.checkOptionIsSelected(formName); } @@ -263,7 +263,7 @@ export class TaskDetailsPage { await BrowserActions.clearSendKeys(this.addPeopleField, user); } - async selectUserToInvolve(user): Promise { + async selectUserToInvolve(user: string): Promise { const row = this.getRowsUser(user); await BrowserActions.click(row); } @@ -282,15 +282,14 @@ export class TaskDetailsPage { return $(`div[data-automation-id="adf-people-full-name-${user.replace(' ', '-')}"]`); } - async removeInvolvedUser(user): Promise { + async removeInvolvedUser(user: string): Promise { const row = this.getRowsUser(user).element(by.xpath('ancestor::adf-datatable-row[contains(@class, "adf-datatable-row")]')); await BrowserActions.click(row.$('button[data-automation-id="action_menu_0"]')); await BrowserVisibility.waitUntilElementIsVisible(this.removeInvolvedPeople); await BrowserActions.click(this.removeInvolvedPeople); - } - async getInvolvedUserEmail(user): Promise { + async getInvolvedUserEmail(user: string): Promise { return BrowserActions.getText($(`div[data-automation-id="adf-people-email-${user.replace(' ', '-')}"]`)); } @@ -401,5 +400,4 @@ export class TaskDetailsPage { await BrowserVisibility.waitUntilElementIsVisible(this.saveFormButton); await BrowserActions.click(this.saveFormButton); } - } diff --git a/e2e/process-services/pages/tasks.page.ts b/e2e/process-services/pages/tasks.page.ts index a9625802d1..4c292097aa 100644 --- a/e2e/process-services/pages/tasks.page.ts +++ b/e2e/process-services/pages/tasks.page.ts @@ -21,12 +21,11 @@ import { TaskDetailsPage } from './task-details.page'; import { FiltersPage } from './filters.page'; import { ChecklistDialog } from './dialog/create-checklist-dialog.page'; import { TasksListPage } from './tasks-list.page'; -import { element, by, $ } from 'protractor'; -import { BrowserVisibility, BrowserActions, FormFields } from '@alfresco/adf-testing'; +import { $, by, element } from 'protractor'; +import { BrowserActions, BrowserVisibility, FormFields } from '@alfresco/adf-testing'; export class TasksPage { createButton = $('button[data-automation-id="create-button"'); - newTaskButton = $('button[data-automation-id="btn-start-task"]'); addChecklistButton = $('button[class*="adf-add-to-checklist-button"]'); rowByRowName = by.xpath('ancestor::mat-chip'); checklistContainer = $('div[class*="checklist-menu"]'); @@ -42,10 +41,10 @@ export class TasksPage { return new StartTaskDialogPage(); } - async createTask({ name, description = '', dueDate = '', formName = 'None'}): Promise { + async createTask({ name, description = '', dueDate = '', formName = 'None' }): Promise { await this.clickOnCreateButton(); await BrowserActions.clickExecuteScript('button[data-automation-id="btn-start-task"]'); - const dialog = new StartTaskDialogPage(); + const dialog = new StartTaskDialogPage(); await dialog.addName(name); await dialog.addDescription(description); await dialog.addDueDate(dueDate); @@ -88,8 +87,7 @@ export class TasksPage { getChecklistByName(name: string) { const elem = this.getRowsName(name); - const row = elem.element(this.rowByRowName); - return row; + return elem.element(this.rowByRowName); } async checkChecklistIsDisplayed(name: string): Promise { @@ -150,5 +148,4 @@ export class TasksPage { async clickSortByNameDesc(): Promise { return this.tasksListPage().getDataTable().sortByColumn('DESC', 'name'); } - } diff --git a/e2e/process-services/tasks/custom-tasks-filters.e2e.ts b/e2e/process-services/tasks/custom-tasks-filters.e2e.ts index ee8b371c46..47cf9a90a3 100644 --- a/e2e/process-services/tasks/custom-tasks-filters.e2e.ts +++ b/e2e/process-services/tasks/custom-tasks-filters.e2e.ts @@ -15,23 +15,24 @@ * limitations under the License. */ -import { createApiService, +import { + createApiService, ApplicationsUtil, ArrayUtil, - DateUtil, LoginPage, PaginationPage, - ProcessUtil, TaskUtil, - UsersActions + ProcessUtil, + TaskUtil, + UsersActions, + UserModel } from '@alfresco/adf-testing'; import { browser } from 'protractor'; import { TaskListDemoPage } from './../pages/task-list-demo.page'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; -import { TaskActionsApi, TaskRepresentation, TasksApi } from '@alfresco/js-api'; +import { AppDefinitionRepresentation, ProcessInstanceRepresentation, TaskActionsApi, TaskRepresentation, TasksApi } from '@alfresco/js-api'; import { addDays, format, subDays } from 'date-fns'; describe('Start Task - Custom App', () => { - const app = browser.params.resources.Files.SIMPLE_APP_WITH_USER_FORM; const secondApp = browser.params.resources.Files.WIDGETS_SMOKE_TEST; @@ -49,25 +50,66 @@ describe('Start Task - Custom App', () => { const taskActionsApi = new TaskActionsApi(apiService.getInstance()); const tasksApi = new TasksApi(apiService.getInstance()); - let processUserModel; - let appRuntime; let secondAppRuntime; - let appModel; - const completedTasks = []; - const paginationTasksName = ['t01', 't02', 't03', 't04', 't05', 't06', 't07', 't08', 't09', 't10', 't11', 't12', 't13', 'taskOne', 'taskTwo', 'taskOne']; + let processUserModel: UserModel; + let appRuntime: AppDefinitionRepresentation; + let secondAppRuntime: AppDefinitionRepresentation; + let appModel: AppDefinitionRepresentation; + const completedTasks: TaskRepresentation[] = []; + const paginationTasksName = [ + 't01', + 't02', + 't03', + 't04', + 't05', + 't06', + 't07', + 't08', + 't09', + 't10', + 't11', + 't12', + 't13', + 'taskOne', + 'taskTwo', + 'taskOne' + ]; const completedTasksName = ['completed01', 'completed02', 'completed03']; - const allTasksName = ['t01', 'taskOne', 'taskTwo', 'taskOne', 't13', 't12', 't11', 't10', 't09', 't08', 't07', 't06', 't05', 't04', 't03', 't02', - 'User Task', 'User Task', 'User Task', 'User Task']; - const invalidAppId = '1234567890'; const invalidName = 'invalidName'; const invalidTaskId = '0000'; + const allTasksName = [ + 't01', + 'taskOne', + 'taskTwo', + 'taskOne', + 't13', + 't12', + 't11', + 't10', + 't09', + 't08', + 't07', + 't06', + 't05', + 't04', + 't03', + 't02', + 'User Task', + 'User Task', + 'User Task', + 'User Task' + ]; + const invalidAppId = '1234567890'; + const invalidName = 'invalidName'; + const invalidTaskId = '0000'; const noTasksFoundMessage = 'No Tasks Found'; const nrOfTasks = 20; let currentPage = 1; const totalNrOfPages = 'of 4'; - const currentDateStandardFormat = DateUtil.formatDate('YYYY-MM-DDTHH:mm:ss.SSSZ'); + const DATE_FORMAT = `yyyy-MM-dd'T'HH:mm:ss.SSSXXX`; + const currentDateStandardFormat = format(new Date(), DATE_FORMAT); const beforeDate = format(subDays(new Date(), 1), 'MM/dd/yyyy'); - const currentDate = DateUtil.formatDate('MM/DD/YYYY'); + const currentDate = format(new Date(), 'MM/dd/yyyy'); const afterDate = format(addDays(new Date(), 1), 'MM/dd/yyyy'); - let taskWithDueDate; - let processDefinitionId; + let taskWithDueDate: TaskRepresentation; + let processDefinitionId: ProcessInstanceRepresentation; const itemsPerPage = { five: '5', @@ -106,17 +148,21 @@ describe('Start Task - Custom App', () => { } for (let i = 0; i < 3; i++) { - completedTasks[i] = await tasksApi.createNewTask(new TaskRepresentation({ - name: completedTasksName[i], - dueDate: new Date(DateUtil.formatDate('YYYY-MM-DDTHH:mm:ss.SSSZ', new Date(), i + 2)) - })); + completedTasks[i] = await tasksApi.createNewTask( + new TaskRepresentation({ + name: completedTasksName[i], + dueDate: addDays(new Date(), i + 2) + }) + ); await taskActionsApi.completeTask(completedTasks[i].id); } - taskWithDueDate = await tasksApi.createNewTask(new TaskRepresentation({ - name: paginationTasksName[0], - dueDate: new Date(currentDateStandardFormat) - })); + taskWithDueDate = await tasksApi.createNewTask( + new TaskRepresentation({ + name: paginationTasksName[0], + dueDate: new Date(currentDateStandardFormat) + }) + ); await loginPage.login(processUserModel.username, processUserModel.password); }); @@ -132,9 +178,12 @@ describe('Start Task - Custom App', () => { await expect(await paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(nrOfTasks); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName)).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName)).toEqual(true); + }); await expect(await paginationPage.getCurrentPage()).toEqual('Page 1'); await expect(await paginationPage.getTotalPages()).toEqual('of 1'); @@ -150,9 +199,12 @@ describe('Start Task - Custom App', () => { await expect(await paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(nrOfTasks); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName)).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName)).toEqual(true); + }); await paginationPage.checkNextPageButtonIsDisabled(); await paginationPage.checkPreviousPageButtonIsDisabled(); }); @@ -164,9 +216,12 @@ describe('Start Task - Custom App', () => { await expect(await paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); + }); await paginationPage.clickOnNextPage(); @@ -176,30 +231,43 @@ describe('Start Task - Custom App', () => { await expect(await paginationPage.getPaginationRange()).toEqual('Showing 6-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); + }); await paginationPage.clickOnNextPage(); currentPage++; await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); await expect(await paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); - await expect(await paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); + await expect(await paginationPage.getPaginationRange()).toEqual( + 'Showing 11-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks + ); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); + }); await paginationPage.clickOnNextPage(); currentPage++; await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); await expect(await paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); - await expect(await paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); + await expect(await paginationPage.getPaginationRange()).toEqual( + 'Showing 16-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks + ); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); + }); }); it('[C286364] 10 Items per page', async () => { @@ -209,18 +277,24 @@ describe('Start Task - Custom App', () => { await expect(await paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); await expect(await paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 10))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 10))).toEqual(true); + }); await paginationPage.clickOnNextPage(); currentPage++; await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); await expect(await paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); await expect(await paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 20))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 20))).toEqual(true); + }); }); it('[C286363] 15 Items per page', async () => { @@ -228,24 +302,32 @@ describe('Start Task - Custom App', () => { await taskListSinglePage.typeItemsPerPage(itemsPerPage.fifteenValue); await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); await expect(await paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); - await expect(await paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue * currentPage + ' of ' + nrOfTasks); + await expect(await paginationPage.getPaginationRange()).toEqual( + 'Showing 1-' + itemsPerPage.fifteenValue * currentPage + ' of ' + nrOfTasks + ); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fifteenValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 15))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 15))).toEqual(true); + }); currentPage++; await paginationPage.clickOnNextPage(); await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); await expect(await paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); await expect(await paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfTasks + ' of ' + nrOfTasks); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(nrOfTasks - itemsPerPage.fifteenValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); + }); }); it('[C286366] Pagination is not displayed when no task is displayed', async () => { - await taskListSinglePage.typeAppId(secondAppRuntime.id); + await taskListSinglePage.typeAppId(secondAppRuntime.id.toString()); await expect(await taskListSinglePage.getAppId()).toEqual(secondAppRuntime.id.toString()); await taskListSinglePage.paginationPage().checkPaginationIsNotDisplayed(); @@ -272,9 +354,12 @@ describe('Start Task - Custom App', () => { await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); + }); currentPage++; @@ -288,9 +373,12 @@ describe('Start Task - Custom App', () => { await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); + }); currentPage++; await taskListSinglePage.typePage(currentPage); @@ -302,9 +390,12 @@ describe('Start Task - Custom App', () => { await paginationPage.checkPageSelectorIsDisplayed(); await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); + }); currentPage++; await taskListSinglePage.typePage(currentPage); @@ -317,9 +408,12 @@ describe('Start Task - Custom App', () => { await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); - await taskListSinglePage.taskList().getAllRowsNameColumn('Name').then(async (list) => { - await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); - }); + await taskListSinglePage + .taskList() + .getAllRowsNameColumn('Name') + .then(async (list) => { + await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); + }); }); it('[C286405] Type invalid values to page field', async () => { @@ -385,7 +479,7 @@ describe('Start Task - Custom App', () => { }); it('[C280515] Should be able to see only the tasks of a specific app when typing the apps id in the appId field', async () => { - await taskListSinglePage.typeAppId(appRuntime.id); + await taskListSinglePage.typeAppId(appRuntime.id.toString()); await expect(await taskListSinglePage.getAppId()).toEqual(appRuntime.id.toString()); await taskListSinglePage.taskList().checkContentIsDisplayed(app.taskName, 'Name'); @@ -472,8 +566,12 @@ describe('Start Task - Custom App', () => { }); it('[C286622] Should be able to see only tasks that are part of a specific process when processDefinitionId is set', async () => { - const processDefinitionIds = [processDefinitionId.processDefinitionId, processDefinitionId.processDefinitionId, - processDefinitionId.processDefinitionId, processDefinitionId.processDefinitionId]; + const processDefinitionIds = [ + processDefinitionId.processDefinitionId, + processDefinitionId.processDefinitionId, + processDefinitionId.processDefinitionId, + processDefinitionId.processDefinitionId + ]; await navigationBarPage.clickTaskListButton(); await taskListSinglePage.clickResetButton(); diff --git a/e2e/search/components/search-date-range.e2e.ts b/e2e/search/components/search-date-range.e2e.ts index a4b156ac0a..0acac3afab 100644 --- a/e2e/search/components/search-date-range.e2e.ts +++ b/e2e/search/components/search-date-range.e2e.ts @@ -15,11 +15,12 @@ * limitations under the License. */ -import { BrowserActions, DataTableComponentPage, DateUtil, LoginPage } from '@alfresco/adf-testing'; +import { BrowserActions, DataTableComponentPage, LoginPage } from '@alfresco/adf-testing'; import { browser, ElementFinder } from 'protractor'; import { SearchBarPage } from '../pages/search-bar.page'; import { SearchFiltersPage } from '../pages/search-filters.page'; import { SearchResultsPage } from '../pages/search-results.page'; +import { format, parse, addDays } from 'date-fns'; describe('Search Date Range Filter', () => { const loginPage = new LoginPage(); @@ -77,7 +78,7 @@ describe('Search Date Range Filter', () => { await datePickerToday.selectTodayDate(); await datePickerToday.checkDatePickerIsNotDisplayed(); let fromDate = await dateRangeFilter.getFromDate(); - fromDate = DateUtil.formatDate('DD-MM-YY', DateUtil.parse(fromDate, 'DD-MMM-YY')); + fromDate = format(parse(fromDate, 'd-MMM-yy', new Date()), 'dd-MM-yy'); await dateRangeFilter.checkApplyButtonIsDisabled(); @@ -87,7 +88,7 @@ describe('Search Date Range Filter', () => { await toDatePicker.selectTodayDate(); await toDatePicker.checkDatePickerIsNotDisplayed(); let toDate = await dateRangeFilter.getToDate(); - toDate = DateUtil.formatDate('DD-MM-YY', DateUtil.parse(toDate, 'DD-MMM-YY'), 1); + toDate = format(addDays(parse(toDate, 'dd-MMM-yy', new Date()), 1), 'dd-MM-yy'); await dateRangeFilter.checkApplyButtonIsEnabled(); await dateRangeFilter.clickApplyButton(); @@ -97,10 +98,10 @@ describe('Search Date Range Filter', () => { const results = (await dataTable.geCellElementDetail('Created')) as ElementFinder[]; for (const currentResult of results) { const currentDate = await BrowserActions.getAttribute(currentResult, 'title'); - const currentDateFormatted = DateUtil.parse(currentDate, 'MMM DD, YYYY, h:mm:ss a'); + const currentDateFormatted = parse(currentDate, 'MMM dd, yyyy, h:mm:ss a', new Date()); - await expect(currentDateFormatted <= DateUtil.parse(toDate, 'DD-MM-YY')).toBe(true); - await expect(currentDateFormatted >= DateUtil.parse(fromDate, 'DD-MM-YY')).toBe(true); + await expect(currentDateFormatted <= parse(toDate, 'dd-MM-yy', new Date())).toBe(true); + await expect(currentDateFormatted >= parse(fromDate, 'dd-MM-yy', new Date())).toBe(true); } }); }); diff --git a/e2e/search/components/search-number-range.e2e.ts b/e2e/search/components/search-number-range.e2e.ts index 4f4d609b7c..5223f73045 100644 --- a/e2e/search/components/search-number-range.e2e.ts +++ b/e2e/search/components/search-number-range.e2e.ts @@ -15,9 +15,10 @@ * limitations under the License. */ -import { createApiService, BrowserActions, +import { + createApiService, + BrowserActions, DataTableComponentPage, - DateUtil, LocalStorageUtil, LoginPage, UploadActions, @@ -31,9 +32,10 @@ import { SearchFiltersPage } from '../pages/search-filters.page'; import { FileModel } from '../../models/ACS/file.model'; import { browser, ElementFinder } from 'protractor'; import { SearchConfiguration } from '../search.config'; +import { parse } from 'date-fns'; +import { NodeEntry } from '@alfresco/js-api'; describe('Search Number Range Filter', () => { - const loginPage = new LoginPage(); const searchBarPage = new SearchBarPage(); const searchFilters = new SearchFiltersPage(); @@ -54,7 +56,8 @@ describe('Search Number Range Filter', () => { location: browser.params.resources.Files.ADF_DOCUMENTS.TXT_0B.file_path }); - let file2Bytes; let file0Bytes; + let file2Bytes: NodeEntry; + let file0Bytes: NodeEntry; const apiService = createApiService(); const usersActions = new UsersActions(apiService); @@ -85,7 +88,7 @@ describe('Search Number Range Filter', () => { await uploadActions.deleteFileOrFolder(file0Bytes.entry.id); await navigationBarPage.clickLogoutButton(); - }); + }); beforeEach(async () => { await searchFilters.checkSizeRangeFilterIsDisplayed(); @@ -95,7 +98,7 @@ describe('Search Number Range Filter', () => { afterEach(async () => { await browser.refresh(); - }); + }); it('[C276921] Should display default values for Number Range widget', async () => { await sizeRangeFilter.checkFromFieldIsDisplayed(); @@ -173,7 +176,7 @@ describe('Search Number Range Filter', () => { await searchResults.dataTable.waitTillContentLoaded(); await searchResults.sortBySize('DESC'); - const results = await dataTable.geCellElementDetail('Size') as ElementFinder[]; + const results = (await dataTable.geCellElementDetail('Size')) as ElementFinder[]; for (const currentResult of results) { const currentSize = await BrowserActions.getAttribute(currentResult, 'title'); @@ -203,7 +206,7 @@ describe('Search Number Range Filter', () => { await searchResults.sortBySize('DESC'); - const results = await dataTable.geCellElementDetail('Size') as ElementFinder[]; + const results = (await dataTable.geCellElementDetail('Size')) as ElementFinder[]; for (const currentResult of results) { const currentSize = await BrowserActions.getAttribute(currentResult, 'title'); if (currentSize && currentSize.trim() !== '') { @@ -217,7 +220,7 @@ describe('Search Number Range Filter', () => { await searchResults.dataTable.waitTillContentLoaded(); await searchResults.sortBySize('DESC'); - const resultsSize = await dataTable.geCellElementDetail('Size') as ElementFinder[]; + const resultsSize = (await dataTable.geCellElementDetail('Size')) as ElementFinder[]; for (const currentResult of resultsSize) { const currentSize = await BrowserActions.getAttribute(currentResult, 'title'); if (currentSize && currentSize.trim() !== '') { @@ -225,7 +228,7 @@ describe('Search Number Range Filter', () => { } } - const resultsDisplay = await dataTable.geCellElementDetail('Display name') as ElementFinder[]; + const resultsDisplay = (await dataTable.geCellElementDetail('Display name')) as ElementFinder[]; for (const currentResult of resultsDisplay) { const name = await BrowserActions.getAttribute(currentResult, 'title'); if (name && name.trim() !== '') { @@ -263,7 +266,7 @@ describe('Search Number Range Filter', () => { await searchResults.sortBySize('DESC'); - const results = await dataTable.geCellElementDetail('Size') as ElementFinder[]; + const results = (await dataTable.geCellElementDetail('Size')) as ElementFinder[]; for (const currentResult of results) { const currentSize = await BrowserActions.getAttribute(currentResult, 'title'); if (currentSize && currentSize.trim() !== '') { @@ -302,7 +305,7 @@ describe('Search Number Range Filter', () => { await sizeRangeFilter.clickApplyButton(); await searchResults.sortBySize('DESC'); - const results = await dataTable.geCellElementDetail('Size') as ElementFinder[]; + const results = (await dataTable.geCellElementDetail('Size')) as ElementFinder[]; for (const currentResult of results) { const currentSize = await BrowserActions.getAttribute(currentResult, 'title'); if (currentSize && currentSize.trim() !== '') { @@ -315,7 +318,7 @@ describe('Search Number Range Filter', () => { await expect(await sizeRangeFilter.getFromNumber()).toEqual(''); await expect(await sizeRangeFilter.getToNumber()).toEqual(''); - const resultsSize = await dataTable.geCellElementDetail('Size') as ElementFinder[]; + const resultsSize = (await dataTable.geCellElementDetail('Size')) as ElementFinder[]; for (const currentResult of resultsSize) { const currentSize = await BrowserActions.getAttribute(currentResult, 'title'); if (currentSize && currentSize.trim() !== '') { @@ -393,7 +396,7 @@ describe('Search Number Range Filter', () => { await searchFilters.clickSizeRangeFilterHeader(); await searchFilters.checkSizeRangeFilterIsExpanded(); - const fromYear = (new Date()).getFullYear(); + const fromYear = new Date().getFullYear(); const toYear = fromYear + 1; await sizeRangeFilter.checkToFieldIsDisplayed(); @@ -406,15 +409,15 @@ describe('Search Number Range Filter', () => { await searchResults.sortByCreated('DESC'); - const results = await dataTable.geCellElementDetail('Created') as ElementFinder[]; + const results = (await dataTable.geCellElementDetail('Created')) as ElementFinder[]; for (const currentResult of results) { const currentDate = await BrowserActions.getAttribute(currentResult, 'title'); - const currentDateFormatted = DateUtil.parse(currentDate, 'MMM DD, YYYY, h:mm:ss a'); + const currentDateFormatted = parse(currentDate, 'MMM dd, yyyy, h:mm:ss a', new Date()); await expect(currentDateFormatted.getFullYear() <= toYear).toBe(true); await expect(currentDateFormatted.getFullYear() >= fromYear).toBe(true); } - }); + }); it('[C277139] Should be able to set To field to be exclusive', async () => { await navigationBarPage.navigateToContentServices(); diff --git a/e2e/search/pages/search-results.page.ts b/e2e/search/pages/search-results.page.ts index 6b7fa7c1b0..b0f2d089ea 100644 --- a/e2e/search/pages/search-results.page.ts +++ b/e2e/search/pages/search-results.page.ts @@ -17,14 +17,11 @@ import { BrowserVisibility, DataTableComponentPage, SearchSortingPickerPage } from '@alfresco/adf-testing'; import { $ } from 'protractor'; -import { ContentServicesPage } from '../../core/pages/content-services.page'; export class SearchResultsPage { - noResultsMessage = $('.app-no-result-message'); dataTable = new DataTableComponentPage(); searchSortingPicker = new SearchSortingPickerPage(); - contentServices = new ContentServicesPage(); getNodeHighlight(content: string) { return this.dataTable.getCellByRowContentAndColumn('Display name', content, 'Search'); @@ -50,28 +47,6 @@ export class SearchResultsPage { await BrowserVisibility.waitUntilElementIsVisible(this.noResultsMessage); } - async checkNoResultMessageIsNotDisplayed(): Promise { - await BrowserVisibility.waitUntilElementIsNotVisible(this.noResultsMessage); - } - - async navigateToFolder(content: string): Promise { - await this.contentServices.openFolder(content); - } - - async deleteContent(content: string): Promise { - await this.contentServices.deleteContent(content); - } - - async sortByName(sortOrder: string): Promise { - await this.searchSortingPicker.sortBy(sortOrder, 'Name'); - await this.dataTable.waitTillContentLoaded(); - } - - async sortByAuthor(sortOrder: string): Promise { - await this.searchSortingPicker.sortBy(sortOrder, 'Author'); - await this.dataTable.waitTillContentLoaded(); - } - async sortByCreated(sortOrder: string): Promise { await this.searchSortingPicker.sortBy(sortOrder, 'Created'); await this.dataTable.waitTillContentLoaded(); @@ -81,13 +56,4 @@ export class SearchResultsPage { await this.searchSortingPicker.sortBy(sortOrder, 'Size'); await this.dataTable.waitTillContentLoaded(); } - - async checkListIsOrderedByNameAsc(): Promise { - return this.contentServices.contentList.dataTablePage().checkListIsSorted('ASC', 'Display name'); - } - - async checkListIsOrderedByNameDesc(): Promise { - return this.contentServices.contentList.dataTablePage().checkListIsSorted('DESC', 'Display name'); - } - } diff --git a/e2e/search/search-component.e2e.ts b/e2e/search/search-component.e2e.ts index da6c7ee669..88cdaabd8d 100644 --- a/e2e/search/search-component.e2e.ts +++ b/e2e/search/search-component.e2e.ts @@ -17,7 +17,8 @@ import { browser } from 'protractor'; -import { createApiService, +import { + createApiService, BrowserActions, LocalStorageUtil, LoginPage, @@ -34,10 +35,9 @@ import { FileModel } from '../models/ACS/file.model'; import { FolderModel } from '../models/ACS/folder.model'; import { NavigationBarPage } from '../core/pages/navigation-bar.page'; import { SearchConfiguration } from './search.config'; -import { NodesApi } from '@alfresco/js-api'; +import { NodeEntry, NodesApi } from '@alfresco/js-api'; describe('Search component - Search Bar', () => { - const search = { inactive: { firstChar: 'x', @@ -65,25 +65,29 @@ describe('Search component - Search Bar', () => { const firstFolderName = StringUtil.generateRandomString(16); const secondFolderName = StringUtil.generateRandomString(16); const thirdFolderName = StringUtil.generateRandomString(16); - const filesToDelete = []; + const filesToDelete: NodeEntry[] = []; const firstFileModel = new FileModel({ - name: filename, shortName: filename.substring(0, 8) + name: filename, + shortName: filename.substring(0, 8) }); const firstFolderModel = new FolderModel({ - name: firstFolderName, shortName: firstFolderName.substring(0, 8) + name: firstFolderName, + shortName: firstFolderName.substring(0, 8) }); const secondFolder = new FolderModel({ - name: secondFolderName, shortName: secondFolderName.substring(0, 8) + name: secondFolderName, + shortName: secondFolderName.substring(0, 8) }); const thirdFolder = new FolderModel({ - name: thirdFolderName, shortName: thirdFolderName.substring(0, 8) + name: thirdFolderName, + shortName: thirdFolderName.substring(0, 8) }); const term = 'Zoizo'; - let fileHighlightUploaded; + let fileHighlightUploaded: NodeEntry; beforeAll(async () => { await apiService.loginWithProfile('admin'); @@ -116,7 +120,6 @@ describe('Search component - Search Bar', () => { afterAll(async () => { for (const currentNode of filesToDelete) { await uploadActions.deleteFileOrFolder(currentNode.entry.id); - } await navigationBarPage.clickLogoutButton(); }); @@ -249,7 +252,7 @@ describe('Search component - Search Bar', () => { await searchResultPage.checkContentIsDisplayed(firstFileModel.name); }); - it('[C290137] Should be able to search by \'%\'', async () => { + it("[C290137] Should be able to search by '%'", async () => { await openSearchBar(); await searchBarPage.enterTextAndPressEnter('%'); @@ -268,7 +271,6 @@ describe('Search component - Search Bar', () => { await searchBarPage.enterTextAndPressEnter(term); await searchResultPage.dataTable.waitTillContentLoaded(); - }); it('[C299212] Should be able to configure the highlight option for search results', async () => { diff --git a/e2e/search/search-filters.e2e.ts b/e2e/search/search-filters.e2e.ts index 4d3ab953de..2e7fd77098 100644 --- a/e2e/search/search-filters.e2e.ts +++ b/e2e/search/search-filters.e2e.ts @@ -35,9 +35,9 @@ import { import { browser } from 'protractor'; import { SearchConfiguration } from './search.config'; import { getYear } from 'date-fns'; +import { NodeEntry } from '@alfresco/js-api'; describe('Search Filters', () => { - const loginPage = new LoginPage(); const searchBarPage = new SearchBarPage(); const searchFiltersPage = new SearchFiltersPage(); @@ -59,7 +59,8 @@ describe('Search Filters', () => { const uniqueFileName3 = fileNamePrefix + StringUtil.generateRandomString(5); const fileModel = new FileModel({ - name: filename, shortName: filename.substring(0, 8) + name: filename, + shortName: filename.substring(0, 8) }); const pngFileModel = new FileModel({ @@ -82,7 +83,11 @@ describe('Search Filters', () => { name: `${uniqueFileName3}.txt` }); - let fileUploaded; let fileTypePng; let fileTypeTxt1; let fileTypeJpg; let fileTypeTxt2; + let fileUploaded: NodeEntry; + let fileTypePng: NodeEntry; + let fileTypeTxt1: NodeEntry; + let fileTypeJpg: NodeEntry; + let fileTypeTxt2: NodeEntry; const filter = { type: 'TYPE-PNG Image' }; @@ -90,9 +95,7 @@ describe('Search Filters', () => { beforeAll(async () => { await apiService.loginWithProfile('admin'); - await usersActions.createUser(acsUser); - await apiService.login(acsUser.username, acsUser.password); fileUploaded = await uploadActions.uploadFile(fileModel.location, fileModel.name, '-my-'); @@ -104,7 +107,6 @@ describe('Search Filters', () => { await loginPage.login(acsUser.username, acsUser.password); await browser.sleep(browser.params.testConfig.timeouts.index_search); // wait search index previous file/folder uploaded - }); beforeEach(async () => { @@ -140,7 +142,6 @@ describe('Search Filters', () => { group: 'Size facet queries' }; - await LocalStorageUtil.setConfigField('search', JSON.stringify(jsonFile)); await searchBarPage.clickOnSearchIcon(); @@ -257,7 +258,6 @@ describe('Search Filters', () => { }); describe('Change config', () => { - it('[C291802] Should be able to filter facet fields with "Contains"', async () => { await navigationBarPage.navigateToContentServices(); diff --git a/e2e/search/search-multiselect.e2e.ts b/e2e/search/search-multiselect.e2e.ts index 516e04c5b0..6a070f399a 100644 --- a/e2e/search/search-multiselect.e2e.ts +++ b/e2e/search/search-multiselect.e2e.ts @@ -23,7 +23,7 @@ import { SearchFiltersPage } from './pages/search-filters.page'; import { FileModel } from '../models/ACS/file.model'; import { NavigationBarPage } from '../core/pages/navigation-bar.page'; import CONSTANTS = require('../util/constants'); -import { SitesApi } from '@alfresco/js-api'; +import { NodeEntry, SiteEntry, SitesApi } from '@alfresco/js-api'; describe('Search Component - Multi-Select Facet', () => { const loginPage = new LoginPage(); @@ -52,10 +52,14 @@ describe('Search Component - Multi-Select Facet', () => { name: `${randomName}.txt` }); - let site; let userOption; + let site: SiteEntry; + let userOption: string; describe('', () => { - let jpgFile; let jpgFileSite; let txtFile; let txtFileSite; + let jpgFile: NodeEntry; + let jpgFileSite: NodeEntry; + let txtFile: NodeEntry; + let txtFileSite: NodeEntry; const acsUser = new UserModel(); const jpgFileInfo = new FileModel({ @@ -67,11 +71,8 @@ describe('Search Component - Multi-Select Facet', () => { await createSite(acsUser); jpgFile = await uploadActions.uploadFile(jpgFileInfo.location, jpgFileInfo.name, '-my-'); - jpgFileSite = await uploadActions.uploadFile(jpgFileInfo.location, jpgFileInfo.name, site.entry.guid); - txtFile = await uploadActions.uploadFile(txtFileInfo.location, txtFileInfo.name, '-my-'); - txtFileSite = await uploadActions.uploadFile(txtFileInfo.location, txtFileInfo.name, site.entry.guid); await browser.sleep(browser.params.testConfig.timeouts.index_search); @@ -132,7 +133,8 @@ describe('Search Component - Multi-Select Facet', () => { }); describe('', () => { - let jpgFile; let txtFile; + let jpgFile: NodeEntry; + let txtFile: NodeEntry; const userUploadingTxt = new UserModel(); const userUploadingImg = new UserModel(); @@ -195,7 +197,7 @@ describe('Search Component - Multi-Select Facet', () => { }); describe('', () => { - let txtFile; + let txtFile: NodeEntry; const acsUser = new UserModel(); beforeAll(async () => { diff --git a/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.spec.ts b/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.spec.ts index 554e36de6e..62a7b89e06 100644 --- a/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.spec.ts +++ b/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.spec.ts @@ -15,20 +15,22 @@ * limitations under the License. */ -import { SearchDatetimeRangeComponent } from './search-datetime-range.component'; +import { DEFAULT_DATETIME_FORMAT, SearchDatetimeRangeComponent } from './search-datetime-range.component'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ContentTestingModule } from '../../../testing/content.testing.module'; import { TranslateModule } from '@ngx-translate/core'; +import { MatDatetimepickerInputEvent } from '@mat-datetimepicker/core'; +import { DateFnsUtils } from '@alfresco/adf-core'; +import { isValid } from 'date-fns'; -declare let moment: any; describe('SearchDatetimeRangeComponent', () => { let fixture: ComponentFixture; let component: SearchDatetimeRangeComponent; - const fromDatetime = '2016-10-16 12:30'; - const toDatetime = '2017-10-16 20:00'; - const maxDatetime = '10-Mar-20 20:00'; - const datetimeFormatFixture = 'DD-MMM-YY HH:mm'; + const fromDatetime = new Date('2016-10-16 12:30'); + const toDatetime = new Date('2017-10-16 20:00'); + const datetimeFormatFixture = 'DD-MMM-YY HH:mm'; // dd-MMM-yy HH:mm + const maxDatetime = DateFnsUtils.parseDate('10-Mar-20 20:00', datetimeFormatFixture); beforeEach(() => { TestBed.configureTestingModule({ @@ -59,13 +61,13 @@ describe('SearchDatetimeRangeComponent', () => { await fixture.whenStable(); const inputString = '20-feb-18 20:00'; - const momentFromInput = moment(inputString, datetimeFormatFixture); + const fromDate = DateFnsUtils.parseDate(inputString, datetimeFormatFixture); - expect(momentFromInput.isValid()).toBeTruthy(); + expect(isValid(fromDate)).toBeTrue(); - component.onChangedHandler({ value: inputString }, component.from); + component.onChangedHandler({ value: fromDate } as MatDatetimepickerInputEvent, component.from); - expect(component.from.value.toString()).toEqual(momentFromInput.toString()); + expect(component.from.value.toString()).toEqual(fromDate.toString()); }); it('should NOT setup form control with invalid datetime on change', async () => { @@ -74,30 +76,28 @@ describe('SearchDatetimeRangeComponent', () => { fixture.detectChanges(); await fixture.whenStable(); - const inputString = '2017-10-16 20:f:00'; - const momentFromInput = moment(inputString, datetimeFormatFixture); + component.onChangedHandler({ value: new Date('2017-10-16 20:f:00') } as MatDatetimepickerInputEvent, component.from); - expect(momentFromInput.isValid()).toBeFalsy(); - - component.onChangedHandler({ value: inputString }, component.from); - - expect(component.from.value.toString()).not.toEqual(momentFromInput.toString()); + expect(component.from.value).toBeNull(); }); it('should reset form', async () => { fixture.detectChanges(); await fixture.whenStable(); - component.form.setValue({ from: fromDatetime, to: toDatetime }); + component.form.setValue({ + from: fromDatetime, + to: toDatetime + }); expect(component.from.value).toEqual(fromDatetime); expect(component.to.value).toEqual(toDatetime); component.reset(); - expect(component.from.value).toEqual(''); - expect(component.to.value).toEqual(''); - expect(component.form.value).toEqual({ from: '', to: '' }); + expect(component.from.value).toBeNull(); + expect(component.to.value).toBeNull(); + expect(component.form.value).toEqual({ from: null, to: null }); }); it('should reset fromMaxDatetime on reset', async () => { @@ -152,7 +152,7 @@ describe('SearchDatetimeRangeComponent', () => { to: toDatetime }, true); - const expectedQuery = `cm:created:['2016-10-16T12:30:00Z' TO '2017-10-16T20:00:59Z']`; + const expectedQuery = `cm:created:['2016-10-16T12:30:00.000Z' TO '2017-10-16T20:00:59.000Z']`; expect(context.queryFragments[component.id]).toEqual(expectedQuery); expect(context.update).toHaveBeenCalled(); @@ -163,8 +163,8 @@ describe('SearchDatetimeRangeComponent', () => { queryFragments: {}, update: () => {} }; - const fromInGmt = '2021-02-24T17:00:00+02:00'; - const toInGmt = '2021-02-28T15:00:00+02:00'; + const fromInGmt = new Date('2021-02-24T17:00:00+02:00'); + const toInGmt = new Date('2021-02-28T15:00:00+02:00'); component.id = 'createdDateRange'; component.context = context; @@ -180,7 +180,7 @@ describe('SearchDatetimeRangeComponent', () => { to: toInGmt }, true); - const expectedQuery = `cm:created:['2021-02-24T15:00:00Z' TO '2021-02-28T13:00:59Z']`; + const expectedQuery = `cm:created:['2021-02-24T15:00:00.000Z' TO '2021-02-28T13:00:59.000Z']`; expect(context.queryFragments[component.id]).toEqual(expectedQuery); expect(context.update).toHaveBeenCalled(); @@ -190,7 +190,7 @@ describe('SearchDatetimeRangeComponent', () => { fixture.detectChanges(); await fixture.whenStable(); - component.onChangedHandler({ value: '10/14/2020 10:00:00 PM' }, component.from); + component.onChangedHandler({ value: new Date('invalid') } as MatDatetimepickerInputEvent, component.from); fixture.detectChanges(); await fixture.whenStable(); @@ -198,18 +198,17 @@ describe('SearchDatetimeRangeComponent', () => { expect(component.getFromValidationMessage()).toEqual('SEARCH.FILTER.VALIDATION.INVALID-DATETIME'); }); - it('should not show datetime-format error when valid found', async () => { + it('should display date with default format in the input', async () => { + component.settings = { field: 'cm:created' }; + fixture.detectChanges(); await fixture.whenStable(); + component.onChangedHandler({ value: new Date() } as MatDatetimepickerInputEvent, component.from); + const input = fixture.debugElement.nativeElement.querySelector('[data-automation-id="datetime-range-from-input"]'); - input.value = '10/16/2017 9:00 PM'; - input.dispatchEvent(new Event('input')); - - fixture.detectChanges(); - await fixture.whenStable(); - - expect(component.getFromValidationMessage()).toEqual(''); + const expected = DateFnsUtils.formatDate(new Date(), DEFAULT_DATETIME_FORMAT); + expect(input.value).toBe(expected); }); it('should have no maximum datetime by default', async () => { diff --git a/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.ts b/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.ts index e6e47fa9d1..840f80538b 100644 --- a/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.ts +++ b/lib/content-services/src/lib/search/components/search-datetime-range/search-datetime-range.component.ts @@ -15,42 +15,48 @@ * limitations under the License. */ -import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; -import { UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core'; - +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { ADF_DATE_FORMATS, ADF_DATETIME_FORMATS, AdfDateFnsAdapter, AdfDateTimeFnsAdapter, DateFnsUtils } from '@alfresco/adf-core'; import { SearchWidget } from '../../models/search-widget.interface'; import { SearchWidgetSettings } from '../../models/search-widget-settings.interface'; import { SearchQueryBuilderService } from '../../services/search-query-builder.service'; import { LiveErrorStateMatcher } from '../../forms/live-error-state-matcher'; -import { Moment } from 'moment'; import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; -import { DatetimeAdapter, MAT_DATETIME_FORMATS } from '@mat-datetimepicker/core'; -import { MAT_MOMENT_DATETIME_FORMATS } from '@mat-datetimepicker/moment'; +import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepickerInputEvent } from '@mat-datetimepicker/core'; +import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core'; +import { isValid, isBefore, startOfMinute, endOfMinute } from 'date-fns'; export interface DatetimeRangeValue { from: string; to: string; } -declare let moment: any; +interface FormProps { + from: FormControl; + to: FormControl; +} -const DEFAULT_DATETIME_FORMAT: string = 'DD/MM/YYYY HH:mm'; +export const DEFAULT_DATETIME_FORMAT: string = 'dd/MM/yyyy HH:mm'; @Component({ selector: 'adf-search-datetime-range', templateUrl: './search-datetime-range.component.html', styleUrls: ['./search-datetime-range.component.scss'], - providers: [{ provide: MAT_DATETIME_FORMATS, useValue: MAT_MOMENT_DATETIME_FORMATS }], + providers: [ + { provide: MAT_DATE_FORMATS, useValue: ADF_DATE_FORMATS }, + { provide: MAT_DATETIME_FORMATS, useValue: ADF_DATETIME_FORMATS }, + { provide: DateAdapter, useClass: AdfDateFnsAdapter }, + { provide: DatetimeAdapter, useClass: AdfDateTimeFnsAdapter } + ], encapsulation: ViewEncapsulation.None, host: { class: 'adf-search-date-range' } }) -export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDestroy { - from: UntypedFormControl; - to: UntypedFormControl; +export class SearchDatetimeRangeComponent implements SearchWidget, OnInit { + from: FormControl; + to: FormControl; - form: UntypedFormGroup; + form: FormGroup; matcher = new LiveErrorStateMatcher(); id: string; @@ -64,9 +70,8 @@ export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDes enableChangeUpdate: boolean; displayValue$: Subject = new Subject(); - private onDestroy$ = new Subject(); - - constructor(private dateAdapter: DatetimeAdapter, private userPreferencesService: UserPreferencesService) {} + constructor(private dateAdapter: DateAdapter, + private dateTimeAdapter: DatetimeAdapter) {} getFromValidationMessage(): string { return this.from.hasError('invalidOnChange') || this.hasParseError(this.from) @@ -93,29 +98,30 @@ export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDes ngOnInit() { this.datetimePickerFormat = this.settings?.datetimeFormat ? this.settings.datetimeFormat : DEFAULT_DATETIME_FORMAT; - this.userPreferencesService - .select(UserPreferenceValues.Locale) - .pipe(takeUntil(this.onDestroy$)) - .subscribe((locale) => this.setLocale(locale)); + const dateAdapter = this.dateAdapter as AdfDateFnsAdapter; + dateAdapter.displayFormat = this.datetimePickerFormat; + + const dateTimeAdapter = this.dateTimeAdapter as AdfDateTimeFnsAdapter; + dateTimeAdapter.displayFormat = this.datetimePickerFormat; const validators = Validators.compose([Validators.required]); if (this.settings?.maxDatetime) { - this.maxDatetime = moment(this.settings.maxDatetime); + this.maxDatetime = new Date(this.settings.maxDatetime); } if (this.startValue) { const splitValue = this.startValue.split('||'); const fromValue = this.dateAdapter.parse(splitValue[0], this.datetimePickerFormat); const toValue = this.dateAdapter.parse(splitValue[1], this.datetimePickerFormat); - this.from = new UntypedFormControl(fromValue, validators); - this.to = new UntypedFormControl(toValue, validators); + this.from = new FormControl(fromValue, validators); + this.to = new FormControl(toValue, validators); } else { - this.from = new UntypedFormControl('', validators); - this.to = new UntypedFormControl('', validators); + this.from = new FormControl(null, validators); + this.to = new FormControl(null, validators); } - this.form = new UntypedFormGroup({ + this.form = new FormGroup({ from: this.from, to: this.to }); @@ -124,17 +130,12 @@ export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDes this.enableChangeUpdate = this.settings?.allowUpdateOnChange ?? true; } - ngOnDestroy() { - this.onDestroy$.next(true); - this.onDestroy$.complete(); - } - - apply(model: { from: string; to: string }, isValid: boolean) { - if (isValid && this.id && this.context && this.settings && this.settings.field) { + apply(model: Partial<{ from: Date; to: Date }>, isValidValue: boolean) { + if (isValidValue && this.id && this.context && this.settings && this.settings.field) { this.isActive = true; - const start = moment.utc(model.from).startOf('minute').format(); - const end = moment.utc(model.to).endOf('minute').format(); + const start = DateFnsUtils.utcToLocal(startOfMinute(model.from)).toISOString(); + const end = DateFnsUtils.utcToLocal(endOfMinute(model.to)).toISOString(); this.context.queryFragments[this.id] = `${this.settings.field}:['${start}' TO '${end}']`; this.updateDisplayValue(); @@ -186,8 +187,8 @@ export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDes clear() { this.isActive = false; this.form.reset({ - from: '', - to: '' + from: null, + to: null }); if (this.id && this.context) { this.context.queryFragments[this.id] = ''; @@ -211,10 +212,10 @@ export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDes } } - onChangedHandler(event: any, formControl: UntypedFormControl) { - const inputValue = event.value; - const formatDate = this.dateAdapter.parse(inputValue, this.datetimePickerFormat); - if (formatDate?.isValid()) { + onChangedHandler(event: MatDatetimepickerInputEvent, formControl: FormControl) { + const formatDate = event.value; + + if (isValid(formatDate)) { formControl.setValue(formatDate); } else if (formatDate) { formControl.setErrors({ @@ -225,21 +226,16 @@ export class SearchDatetimeRangeComponent implements SearchWidget, OnInit, OnDes this.setFromMaxDatetime(); } - setLocale(locale) { - this.dateAdapter.setLocale(locale); - moment.locale(locale); - } - - hasParseError(formControl): boolean { + hasParseError(formControl: FormControl): boolean { return formControl.hasError('matDatepickerParse') && formControl.getError('matDatepickerParse').text; } forcePlaceholder(event: any) { - event.srcElement.click(); + event.target.click(); } setFromMaxDatetime() { this.fromMaxDatetime = - !this.to.value || (this.maxDatetime && moment(this.maxDatetime).isBefore(this.to.value)) ? this.maxDatetime : moment(this.to.value); + !this.to.value || (this.maxDatetime && isBefore(this.maxDatetime, this.to.value)) ? this.maxDatetime : this.to.value; } } diff --git a/lib/core/src/lib/pipes/moment-date.pipe.ts b/lib/core/src/lib/pipes/moment-date.pipe.ts index c88bd7f229..9a9522b55d 100644 --- a/lib/core/src/lib/pipes/moment-date.pipe.ts +++ b/lib/core/src/lib/pipes/moment-date.pipe.ts @@ -18,6 +18,9 @@ import { Pipe, PipeTransform } from '@angular/core'; import moment, { Moment } from 'moment'; +/** + * @deprecated this pipe is deprecated and should no longer be used + */ @Pipe({ name: 'adfMomentDate' }) export class MomentDatePipe implements PipeTransform { transform(value: moment.MomentInput, dateFormat: string): Moment { diff --git a/lib/core/src/lib/pipes/moment-datetime.pipe.ts b/lib/core/src/lib/pipes/moment-datetime.pipe.ts index 3a9d644972..230775a670 100644 --- a/lib/core/src/lib/pipes/moment-datetime.pipe.ts +++ b/lib/core/src/lib/pipes/moment-datetime.pipe.ts @@ -18,6 +18,9 @@ import { Pipe, PipeTransform } from '@angular/core'; import moment, { Moment } from 'moment'; +/** + * @deprecated this pipe is deprecated and should no longer be used + */ @Pipe({ name: 'adfMomentDateTime' }) export class MomentDateTimePipe implements PipeTransform { transform(value: moment.MomentInput, dateFormat: string): Moment { 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 52462cc5f9..0340f3e3b7 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 @@ -16,13 +16,12 @@ */ import { element, by, $ } from 'protractor'; -import { DateUtil } from '../../utils/date-util'; import { BrowserVisibility } from '../../utils/browser-visibility'; import { BrowserActions } from '../../utils/browser-actions'; import { TestElement } from '../../test-element'; +import { addDays, format, subDays } from 'date-fns'; export class DatePickerCalendarPage { - datePicker = $('mat-calendar[id*="mat-datepicker"]'); nextMonthButton = $('button[class*="mat-calendar-next-button"]'); previousMonthButton = $('button[class*="mat-calendar-previous-button"]'); @@ -33,8 +32,8 @@ export class DatePickerCalendarPage { return BrowserActions.getAttribute($('button[class*="mat-calendar-body-active"]'), 'aria-label'); } - async checkDatesAfterDateAreDisabled(date): Promise { - const afterDate = DateUtil.formatDate('DD-MM-YY', date, 1); + async checkDatesAfterDateAreDisabled(date: Date): Promise { + const afterDate = format(addDays(date, 1), 'dd-MM-yy'); const afterCalendar = $(`td[class*="mat-calendar-body-cell"][aria-label="${afterDate}"]`); if (await afterCalendar.isPresent()) { const aria = await BrowserActions.getAttribute(afterCalendar, 'aria-disabled'); @@ -44,8 +43,8 @@ export class DatePickerCalendarPage { await expect(isEnabled).toBe(false); } - async checkDatesBeforeDateAreDisabled(date): Promise { - const beforeDate = DateUtil.formatDate('DD-MM-YY', date, -1); + async checkDatesBeforeDateAreDisabled(date: Date): Promise { + const beforeDate = format(subDays(date, 1), 'dd-MM-yy'); const beforeCalendar = $(`td[class*="mat-calendar-body-cell"][aria-label="${beforeDate}"]`); if (await beforeCalendar.isPresent()) { const aria = await BrowserActions.getAttribute(beforeCalendar, 'aria-disabled'); diff --git a/lib/testing/src/lib/protractor/core/utils/date-util.ts b/lib/testing/src/lib/protractor/core/utils/date-util.ts deleted file mode 100644 index 4cb97e8319..0000000000 --- a/lib/testing/src/lib/protractor/core/utils/date-util.ts +++ /dev/null @@ -1,29 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as moment from 'moment'; - -export class DateUtil { - - static formatDate(dateFormat: string, date: Date = new Date(), days: number | string = 0): string { - return moment(date).add(days, 'days').format(dateFormat); - } - - static parse(date: string, dateFormat: string = 'DD-MM-YY'): Date { - return moment(date, dateFormat).toDate(); - } -} diff --git a/lib/testing/src/lib/protractor/core/utils/public-api.ts b/lib/testing/src/lib/protractor/core/utils/public-api.ts index 375b972636..6b4868fe3c 100644 --- a/lib/testing/src/lib/protractor/core/utils/public-api.ts +++ b/lib/testing/src/lib/protractor/core/utils/public-api.ts @@ -22,6 +22,5 @@ export * from './protractor.util'; export * from './local-storage.util'; export * from './file-browser.util'; export * from './form.util'; -export * from './date-util'; export * from './wait-actions'; export * from './logger';