From 415d2185b1aed65b60558c8a2bf6212695e2f634 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Tue, 16 Oct 2018 16:51:49 +0100 Subject: [PATCH] [ADF-3381][ADF-3492] search results improvements (#3727) * search results improvements * fix search term formatting * rollback the query change * fix search test * lint fix * lint fix * search page component to ts --- demo-shell/src/app.config.json | 15 +- .../search/search-result.component.html | 13 +- .../search/search-result.component.ts | 55 +++-- .../search/search_component.e2e.ts | 4 +- .../search/search_filters.e2e.ts | 2 +- .../search/search_multiselect.e2e.ts | 45 ++-- .../search/search_page_component.e2e.ts | 38 +++- e2e/pages/adf/searchFiltersPage.js | 168 -------------- e2e/pages/adf/searchFiltersPage.ts | 155 +++++++++++++ e2e/pages/adf/searchResultsPage.js | 210 ------------------ e2e/pages/adf/searchResultsPage.ts | 153 +++++++++++++ protractor.conf.js | 6 +- 12 files changed, 411 insertions(+), 453 deletions(-) delete mode 100644 e2e/pages/adf/searchFiltersPage.js create mode 100644 e2e/pages/adf/searchFiltersPage.ts delete mode 100644 e2e/pages/adf/searchResultsPage.js create mode 100644 e2e/pages/adf/searchResultsPage.ts diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index 4f8059f60e..53074acf1c 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -73,12 +73,17 @@ "options": [ { "key": "name", "label": "Name", "type": "FIELD", "field": "cm:name", "ascending": true }, { "key": "content.sizeInBytes", "label": "Size", "type": "FIELD", "field": "content.size", "ascending": true }, - { "key": "description", "label": "Description", "type": "FIELD", "field": "cm:description", "ascending": true }, { "key": "createdByUser", "label": "Author", "type": "FIELD", "field": "cm:creator", "ascending": true }, - { "key": "createdAt", "label": "Created", "type": "FIELD", "field": "cm:created", "ascending": true } + { "key": "createdAt", "label": "Created", "type": "FIELD", "field": "cm:created", "ascending": true }, + { "key": "score", "label": "Relevance", "type": "FIELD", "field": "score", "ascending": false} ], "defaults": [ - { "key": "name", "type": "FIELD", "field": "cm:name", "ascending": true } + { + "key": "score", + "type": "FIELD", + "field": "score", + "ascending": false + } ] }, "filterQueries": [ @@ -101,11 +106,11 @@ "queries": [ { "query": "created:2018", "label": "1.Created This Year" }, { "query": "content.mimetype", "label": "2.Type" }, - { "query": "content.size:[0 TO 10240]", "label": "3.Size: xtra small"}, + { "query": "content.size:[0 TO 10240]", "label": "3.Size: Extra small"}, { "query": "content.size:[10240 TO 102400]", "label": "4.Size: small"}, { "query": "content.size:[102400 TO 1048576]", "label": "5.Size: medium" }, { "query": "content.size:[1048576 TO 16777216]", "label": "6.Size: large" }, - { "query": "content.size:[16777216 TO 134217728]", "label": "7.Size: xtra large" }, + { "query": "content.size:[16777216 TO 134217728]", "label": "7.Size: Extra large" }, { "query": "content.size:[134217728 TO MAX]", "label": "8.Size: XX large" } ] }, diff --git a/demo-shell/src/app/components/search/search-result.component.html b/demo-shell/src/app/components/search/search-result.component.html index 118c3785de..a115dc9262 100644 --- a/demo-shell/src/app/components/search/search-result.component.html +++ b/demo-shell/src/app/components/search/search-result.component.html @@ -1,11 +1,3 @@ - - - -
@@ -14,6 +6,7 @@
+
@@ -25,7 +18,7 @@ [showSitePicker]="false" [showSettingsPanel]="false" [currentFolderId]="null" - [nodeResult]="resultNodePageList" + [nodeResult]="data" [disableDragArea]="true" [pagination]="pagination" (changedPageSize)="onRefreshPagination($event)" @@ -33,7 +26,7 @@ (turnedNextPage)="onRefreshPagination($event)" (loadNext)="onRefreshPagination($event)" (turnedPreviousPage)="onRefreshPagination($event)" - (deleteElementSuccess)="onDeleteElementSuccess($event)"> + (deleteElementSuccess)="onDeleteElementSuccess()">
diff --git a/demo-shell/src/app/components/search/search-result.component.ts b/demo-shell/src/app/components/search/search-result.component.ts index 9d965b15ce..ecd8de04b1 100644 --- a/demo-shell/src/app/components/search/search-result.component.ts +++ b/demo-shell/src/app/components/search/search-result.component.ts @@ -15,11 +15,11 @@ * limitations under the License. */ -import { Component, OnInit, Optional, ViewChild, OnDestroy } from '@angular/core'; +import { Component, OnInit, Optional, OnDestroy } from '@angular/core'; import { Router, ActivatedRoute, Params } from '@angular/router'; import { NodePaging, Pagination } from 'alfresco-js-api'; -import { SearchComponent, SearchQueryBuilderService } from '@alfresco/adf-content-services'; -import { UserPreferencesService, SearchService, SearchConfigurationService } from '@alfresco/adf-core'; +import { SearchQueryBuilderService } from '@alfresco/adf-content-services'; +import { UserPreferencesService, SearchService } from '@alfresco/adf-core'; import { Subscription } from 'rxjs'; @Component({ @@ -30,15 +30,11 @@ import { Subscription } from 'rxjs'; }) export class SearchResultComponent implements OnInit, OnDestroy { - @ViewChild('searchResult') - searchResult: SearchComponent; - queryParamName = 'q'; searchedWord = ''; - resultNodePageList: NodePaging; + data: NodePaging; pagination: Pagination; - maxItems: number; - skipCount = 0; + isLoading = true; sorting = ['name', 'asc']; @@ -47,9 +43,7 @@ export class SearchResultComponent implements OnInit, OnDestroy { constructor(public router: Router, private preferences: UserPreferencesService, private queryBuilder: SearchQueryBuilderService, - private searchConfiguration: SearchConfigurationService, @Optional() private route: ActivatedRoute) { - this.maxItems = this.preferences.paginationSize; queryBuilder.paging = { maxItems: this.preferences.paginationSize, skipCount: 0 @@ -63,36 +57,55 @@ export class SearchResultComponent implements OnInit, OnDestroy { this.subscriptions.push( this.queryBuilder.updated.subscribe(() => { this.sorting = this.getSorting(); + this.isLoading = true; + }), + + this.queryBuilder.executed.subscribe(data => { + this.onSearchResultLoaded(data); + this.isLoading = false; }) ); if (this.route) { this.route.params.forEach((params: Params) => { this.searchedWord = params.hasOwnProperty(this.queryParamName) ? params[this.queryParamName] : null; - if (this.searchedWord) { - const queryBody = this.searchConfiguration.generateQueryBody(this.searchedWord, 0, 100); + const query = this.formatSearchQuery(this.searchedWord); - this.queryBuilder.userQuery = queryBody.query.query; + if (query) { + this.queryBuilder.userQuery = query; this.queryBuilder.update(); + } else { + this.queryBuilder.userQuery = null; + this.queryBuilder.executed.next({ list: { pagination: { totalItems: 0 }, entries: [] } }); } }); } } + private formatSearchQuery(userInput: string) { + if (!userInput) { + return null; + } + + const suffix = userInput.lastIndexOf('*') >= 0 ? '' : '*'; + const query = `cm:name:${userInput}${suffix} OR cm:title:${userInput}${suffix} OR cm:description:${userInput}${suffix} + OR ia:whatEvent:${userInput}${suffix} OR ia:descriptionEvent:${userInput}${suffix} OR lnk:title:${userInput}${suffix} + OR lnk:description:${userInput}${suffix} OR TEXT:${userInput}${suffix} OR TAG:${userInput}${suffix}`; + + return query; + } + ngOnDestroy() { this.subscriptions.forEach(subscription => subscription.unsubscribe()); this.subscriptions = []; } onSearchResultLoaded(nodePaging: NodePaging) { - this.resultNodePageList = nodePaging; - this.pagination = {...nodePaging.list.pagination }; + this.data = nodePaging; + this.pagination = { ...nodePaging.list.pagination }; } onRefreshPagination(pagination: Pagination) { - this.maxItems = pagination.maxItems; - this.skipCount = pagination.skipCount; - this.queryBuilder.paging = { maxItems: pagination.maxItems, skipCount: pagination.skipCount @@ -100,8 +113,8 @@ export class SearchResultComponent implements OnInit, OnDestroy { this.queryBuilder.update(); } - onDeleteElementSuccess(element: any) { - this.searchResult.reload(); + onDeleteElementSuccess() { + this.queryBuilder.execute(); } private getSorting(): string[] { diff --git a/e2e/content-services/search/search_component.e2e.ts b/e2e/content-services/search/search_component.e2e.ts index 702578c232..416a482ddd 100644 --- a/e2e/content-services/search/search_component.e2e.ts +++ b/e2e/content-services/search/search_component.e2e.ts @@ -21,7 +21,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import SearchDialog = require('../../pages/adf/dialog/searchDialog'); import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import filePreviewPage = require('../../pages/adf/filePreviewPage'); -import SearchResultPage = require('../../pages/adf/searchResultsPage'); +import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import AcsUserModel = require('../../models/ACS/acsUserModel'); import FileModel = require('../../models/ACS/fileModel'); @@ -47,7 +47,7 @@ describe('Search component - Search Bar', () => { let loginPage = new LoginPage(); let contentServicesPage = new ContentServicesPage(); let searchDialog = new SearchDialog(); - let searchResultPage = new SearchResultPage(); + let searchResultPage = new SearchResultsPage(); let acsUser = new AcsUserModel(); diff --git a/e2e/content-services/search/search_filters.e2e.ts b/e2e/content-services/search/search_filters.e2e.ts index 4ff5d37d3a..fa8b6600eb 100644 --- a/e2e/content-services/search/search_filters.e2e.ts +++ b/e2e/content-services/search/search_filters.e2e.ts @@ -17,7 +17,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import SearchDialog = require('../../pages/adf/dialog/searchDialog'); -import SearchFiltersPage = require('../../pages/adf/searchFiltersPage'); +import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; import AcsUserModel = require('../../models/ACS/acsUserModel'); import FileModel = require('../../models/ACS/fileModel'); diff --git a/e2e/content-services/search/search_multiselect.e2e.ts b/e2e/content-services/search/search_multiselect.e2e.ts index 06d44d4bce..06bc06bda5 100644 --- a/e2e/content-services/search/search_multiselect.e2e.ts +++ b/e2e/content-services/search/search_multiselect.e2e.ts @@ -26,8 +26,8 @@ import { browser } from 'protractor'; import { LoginPage } from '../../pages/adf/loginPage'; import SearchDialog = require('../../pages/adf/dialog/searchDialog'); -import SearchResultPage = require('../../pages/adf/searchResultsPage'); -import SearchFiltersPage = require('../../pages/adf/searchFiltersPage'); +import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; +import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; import AcsUserModel = require('../../models/ACS/acsUserModel'); import FileModel = require('../../models/ACS/fileModel'); @@ -35,7 +35,7 @@ import FileModel = require('../../models/ACS/fileModel'); describe('Search Component - Multi-Select Facet', () => { let loginPage = new LoginPage(); let searchDialog = new SearchDialog(); - let searchResultsPage = new SearchResultPage(); + let searchResultsPage = new SearchResultsPage(); let uploadActions = new UploadActions(); let searchFiltersPage = new SearchFiltersPage(); let site; @@ -51,13 +51,14 @@ describe('Search Component - Multi-Select Facet', () => { let jpgFile, jpgFileSite, txtFile, txtFileSite; let acsUser = new AcsUserModel(); + let randomName = Util.generateRandomString(); let jpgFileInfo = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, - 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + 'name': `${randomName}.jpg` }); let txtFileInfo = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location, - 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name + 'name': `${randomName}.txt` }); beforeAll(async (done) => { @@ -80,13 +81,13 @@ describe('Search Component - Multi-Select Facet', () => { txtFileSite = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileInfo.location, txtFileInfo.name, site.entry.guid); - await browser.driver.sleep(30000); + await browser.driver.sleep(10000); loginPage.loginToContentServicesUsingUserModel(acsUser); searchDialog.checkSearchIconIsVisible(); searchDialog.clickOnSearchIcon(); - searchDialog.enterTextAndPressEnter('file'); + searchDialog.enterTextAndPressEnter(`${randomName}`); searchFiltersPage.checkSearchFiltersIsDisplayed(); searchFiltersPage.filterByCreator(acsUser.firstName, acsUser.lastName); @@ -129,13 +130,14 @@ describe('Search Component - Multi-Select Facet', () => { let userUploadingTxt = new AcsUserModel(); let userUploadingImg = new AcsUserModel(); + let randomName = Util.generateRandomString(); let jpgFileInfo = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, - 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + 'name': `${randomName}.jpg` }); let txtFileInfo = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location, - 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name + 'name': `${randomName}.txt` }); beforeAll(async (done) => { @@ -162,26 +164,13 @@ describe('Search Component - Multi-Select Facet', () => { jpgFile = await uploadActions.uploadFile(this.alfrescoJsApi, jpgFileInfo.location, jpgFileInfo.name, site.entry.guid); - await browser.driver.sleep(30000); + await browser.driver.sleep(10000); loginPage.loginToContentServicesUsingUserModel(userUploadingImg); searchDialog.checkSearchIconIsVisible(); searchDialog.clickOnSearchIcon(); - searchDialog.enterTextAndPressEnter('file'); - - done(); - }); - - afterAll(async (done) => { - await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - - Promise.all([ - uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, jpgFile.entry.id), - uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, txtFile.entry.id) - ]); - - await this.alfrescoJsApi.core.sitesApi.deleteSite(site.entry.id); + searchDialog.enterTextAndPressEnter(`*${randomName}*`); done(); }); @@ -190,6 +179,7 @@ describe('Search Component - Multi-Select Facet', () => { searchFiltersPage.checkSearchFiltersIsDisplayed(); searchFiltersPage.filterByCreator(userUploadingTxt.firstName, userUploadingTxt.lastName); + searchFiltersPage.filterByCreator(userUploadingImg.firstName, userUploadingImg.lastName); searchResultsPage.checkContentIsDisplayed(txtFile.entry.name); @@ -208,9 +198,10 @@ describe('Search Component - Multi-Select Facet', () => { let txtFile; let acsUser = new AcsUserModel(); + let randomName = Util.generateRandomString(); let txtFileInfo = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location, - 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name + 'name': `${randomName}.txt` }); beforeAll(async (done) => { @@ -226,13 +217,13 @@ describe('Search Component - Multi-Select Facet', () => { }); txtFile = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileInfo.location, txtFileInfo.name, '-my-'); - await browser.driver.sleep(30000); + await browser.driver.sleep(10000); loginPage.loginToContentServicesUsingUserModel(acsUser); searchDialog.checkSearchIconIsVisible(); searchDialog.clickOnSearchIcon(); - searchDialog.enterTextAndPressEnter('file'); + searchDialog.enterTextAndPressEnter(`*${randomName}*`); searchFiltersPage.checkSearchFiltersIsDisplayed(); diff --git a/e2e/content-services/search/search_page_component.e2e.ts b/e2e/content-services/search/search_page_component.e2e.ts index 9d3138d1b4..82a24c6eb9 100644 --- a/e2e/content-services/search/search_page_component.e2e.ts +++ b/e2e/content-services/search/search_page_component.e2e.ts @@ -21,7 +21,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import SearchDialog = require('../../pages/adf/dialog/searchDialog'); import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import SearchResultPage = require('../../pages/adf/searchResultsPage'); +import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import filePreviewPage = require('../../pages/adf/filePreviewPage'); import AcsUserModel = require('../../models/ACS/acsUserModel'); @@ -40,7 +40,7 @@ describe('Search component - Search Page', () => { active: { firstFile: null, secondFile: null, - base: Util.generateRandomString(3), + base: Util.generateRandomString(7), extension: '.txt' }, no_permission: { @@ -52,7 +52,7 @@ describe('Search component - Search Page', () => { let loginPage = new LoginPage(); let contentServicesPage = new ContentServicesPage(); let searchDialog = new SearchDialog(); - let searchResultPage = new SearchResultPage(); + let searchResultPage = new SearchResultsPage(); let acsUser = new AcsUserModel(); let emptyFolderModel = new FolderModel({ 'name': Util.generateRandomString() }); @@ -206,6 +206,7 @@ describe('Search component - Search Page', () => { .checkSearchIconIsVisible() .clickOnSearchIcon() .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); searchResultPage.sortAndCheckListIsOrderedByName(true).then((result) => { expect(result).toEqual(true); @@ -215,7 +216,8 @@ describe('Search component - Search Page', () => { it('[C272804] Should be able to sort results by name (Descending)', () => { contentServicesPage.goToDocumentList(); - searchDialog.checkSearchBarIsNotVisible() + searchDialog + .checkSearchBarIsNotVisible() .checkSearchIconIsVisible() .clickOnSearchIcon() .enterTextAndPressEnter(search.active.base); @@ -228,8 +230,13 @@ describe('Search component - Search Page', () => { it('[C272805] Should be able to sort results by author (Ascending)', () => { contentServicesPage.goToDocumentList(); - searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); searchResultPage.sortAndCheckListIsOrderedByAuthor(true).then((result) => { expect(result).toEqual(true); @@ -238,8 +245,13 @@ describe('Search component - Search Page', () => { it('[C272806] Should be able to sort results by author (Descending)', () => { contentServicesPage.goToDocumentList(); - searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); searchResultPage.sortAndCheckListIsOrderedByAuthor(false).then((result) => { expect(result).toEqual(true); @@ -248,8 +260,13 @@ describe('Search component - Search Page', () => { it('[C272807] Should be able to sort results by date (Ascending)', () => { contentServicesPage.goToDocumentList(); - searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); searchResultPage.sortAndCheckListIsOrderedByCreated(true).then((result) => { expect(result).toEqual(true); @@ -258,8 +275,13 @@ describe('Search component - Search Page', () => { it('[C260260] Should be able to sort results by date (Descending)', () => { contentServicesPage.goToDocumentList(); - searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); searchResultPage.sortAndCheckListIsOrderedByCreated(false).then((result) => { expect(result).toEqual(true); diff --git a/e2e/pages/adf/searchFiltersPage.js b/e2e/pages/adf/searchFiltersPage.js deleted file mode 100644 index f1ed2e5d20..0000000000 --- a/e2e/pages/adf/searchFiltersPage.js +++ /dev/null @@ -1,168 +0,0 @@ -/*! - * @license - * Copyright 2016 Alfresco Software, Ltd. - * - * 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. - */ - -var Util = require('../../util/util'); - -var SearchFiltersPage = function () { - - var searchFilters = element(by.css("adf-search-filter")); - var fileTypeFilter = element(by.css("mat-expansion-panel[data-automation-id='expansion-panel-1:Type'")); - var searchFileTypeFilter = element(by.css("input[data-automation-id='facet-result-filter-1:Type'")); - var creatorFilter = element(by.css("mat-expansion-panel[data-automation-id='expansion-panel-3:Creator'")); - var searchCreatorFilter = element(by.css("input[data-automation-id='facet-result-filter-3:Creator'")); - var fileSizeFilter = element(by.css("mat-expansion-panel[data-automation-id='expansion-panel-2:Size'")); - var showMoreButtonForSize = fileSizeFilter.element(by.css('button[title="Show more"]')); - var showLessButtonForSize = fileSizeFilter.element(by.css('button[title="Show less"]')); - var numberOfCheckboxesforSize = element.all(by.css('mat-checkbox[data-automation-id*="checkbox-2:Size"]')); - - this.checkSearchFiltersIsDisplayed = function () { - Util.waitUntilElementIsVisible(searchFilters); - }; - - this.checkFileTypeFilterIsDisplayed = function () { - Util.waitUntilElementIsVisible(fileTypeFilter); - }; - - this.checkSearchFileTypeFilterIsDisplayed = function () { - Util.waitUntilElementIsVisible(fileTypeFilter); - }; - - this.checkCreatorFilterIsDisplayed = function () { - Util.waitUntilElementIsVisible(creatorFilter); - }; - - this.checkSearchCreatorFilterIsDisplayed = function () { - Util.waitUntilElementIsVisible(searchCreatorFilter); - }; - - this.clickFileTypeFilter = function () { - Util.waitUntilElementIsClickable(fileTypeFilter); - return fileTypeFilter.click(); - }; - - this.clickCreatorFilter = function () { - Util.waitUntilElementIsClickable(creatorFilter); - return creatorFilter.click(); - }; - - this.searchInFileTypeFilter = function (fileType) { - Util.waitUntilElementIsClickable(searchFileTypeFilter); - searchFileTypeFilter.clear(); - searchFileTypeFilter.sendKeys(fileType); - }; - - this.searchInCreatorFilter = function (creatorName) { - Util.waitUntilElementIsClickable(searchCreatorFilter); - searchCreatorFilter.clear(); - searchCreatorFilter.sendKeys(creatorName); - }; - - this.selectFileType = function (fileType) { - let result = element(by.css(`mat-checkbox[data-automation-id='checkbox-1:Type-${fileType}'] .mat-checkbox-inner-container`)); - Util.waitUntilElementIsClickable(result); - result.click(); - }; - - this.selectCreator = function (creatorName) { - let result = element(by.css(`mat-checkbox[data-automation-id='checkbox-3:Creator-${creatorName}'] .mat-checkbox-inner-container`)); - Util.waitUntilElementIsClickable(result); - result.click(); - }; - - this.filterByFileType = function (fileType) { - this.checkFileTypeFilterIsDisplayed(); - - this.checkSearchFileTypeFilterIsDisplayed(); - this.searchInFileTypeFilter(fileType); - this.selectFileType(fileType); - }; - - this.filterByCreator = function (creatorFirstName, creatorLastName) { - this.checkCreatorFilterIsDisplayed(); - - this.checkSearchCreatorFilterIsDisplayed(); - this.searchInCreatorFilter(`${creatorFirstName} ${creatorLastName}`); - this.selectCreator(`${creatorFirstName} ${creatorLastName}`); - }; - - this.removeCreatorFilter = function (creatorFirstName, creatorLastName) { - let cancelChipButton = element(by.cssContainingText('mat-chip',` ${creatorFirstName} ${creatorLastName} `)).element(by.css('mat-icon')); - Util.waitUntilElementIsClickable(cancelChipButton); - return cancelChipButton.click(); - }; - - this.checkCreatorChipIsDisplayed = function (creatorFirstName, creatorLastName) { - return Util.waitUntilElementIsVisible(element(by.cssContainingText('mat-chip',` ${creatorFirstName} ${creatorLastName} `)).element(by.css('mat-icon'))); - }; - - this.checkCreatorChipIsNotDisplayed = function (creatorFirstName, creatorLastName) { - return Util.waitUntilElementIsNotOnPage(element(by.cssContainingText('mat-chip',` ${creatorFirstName} ${creatorLastName} `)).element(by.css('mat-icon'))); - }; - - this.clickSizeShowMoreButtonUntilIsNotDisplayed = function () { - Util.waitUntilElementIsVisible(fileSizeFilter); - - showMoreButtonForSize.isDisplayed().then(async (visible) => { - if (visible) { - for (var checkboxes = 5; checkboxes <= totalNumberOfCheckboxes; checkboxes + 5) { - var totalNumberOfCheckboxes = await numberOfCheckboxesforSize.count(); - - expect(totalNumberOfCheckboxes).toEqual(checkboxes); - } - showMoreButtonForSize.click(); - - this.clickSizeShowMoreButtonUntilIsNotDisplayed(); - } - }, err => {}) - }; - - this.checkSizeShowMoreButtonIsNotDisplayed = function () { - Util.waitUntilElementIsNotVisible(showMoreButtonForSize); - }; - - this.checkSizeShowMoreButtonIsDisplayed = function () { - Util.waitUntilElementIsVisible(showMoreButtonForSize); - }; - - this.clickSizeShowLessButtonUntilIsNotDisplayed = function () { - Util.waitUntilElementIsVisible(fileSizeFilter); - - showLessButtonForSize.isDisplayed().then(async (visible) => { - if (visible) { - var totalNumberOfCheckboxes = await numberOfCheckboxesforSize.count(); - - for (var checkboxes = totalNumberOfCheckboxes; checkboxes > 10; checkboxes = totalNumberOfCheckboxes - checkboxes){ - expect(totalNumberOfCheckboxes).toEqual(checkboxes); - } - - showLessButtonForSize.click(); - - this.clickSizeShowLessButtonUntilIsNotDisplayed(); - } - }, err => {}) - }; - - this.checkShowLessButtonIsNotDisplayed = function () { - Util.waitUntilElementIsNotVisible(showLessButtonForSize); - }; - - this.checkShowLessButtonIsDisplayed = function () { - Util.waitUntilElementIsVisible(showLessButtonForSize); - } - -}; -module.exports = SearchFiltersPage; diff --git a/e2e/pages/adf/searchFiltersPage.ts b/e2e/pages/adf/searchFiltersPage.ts new file mode 100644 index 0000000000..9a1bd2f75e --- /dev/null +++ b/e2e/pages/adf/searchFiltersPage.ts @@ -0,0 +1,155 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * 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 Util = require('../../util/util'); + +export class SearchFiltersPage { + + searchFilters = element(by.css('adf-search-filter')); + fileTypeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-1:Type"')); + searchFileTypeFilter = element(by.css('input[data-automation-id="facet-result-filter-1:Type"')); + creatorFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-3:Creator"')); + searchCreatorFilter = element(by.css('input[data-automation-id="facet-result-filter-3:Creator"')); + fileSizeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-2:Size"')); + showMoreButtonForSize = this.fileSizeFilter.element(by.css('button[title="Show more"]')); + showLessButtonForSize = this.fileSizeFilter.element(by.css('button[title="Show less"]')); + numberOfCheckboxesforSize = element.all(by.css('mat-checkbox[data-automation-id*="checkbox-2:Size"]')); + + checkSearchFiltersIsDisplayed() { + Util.waitUntilElementIsVisible(this.searchFilters); + } + + checkFileTypeFilterIsDisplayed() { + Util.waitUntilElementIsVisible(this.fileTypeFilter); + } + + checkSearchFileTypeFilterIsDisplayed() { + Util.waitUntilElementIsVisible(this.fileTypeFilter); + } + + checkCreatorFilterIsDisplayed() { + Util.waitUntilElementIsVisible(this.creatorFilter); + } + + checkSearchCreatorFilterIsDisplayed() { + Util.waitUntilElementIsVisible(this.searchCreatorFilter); + } + + searchInFileTypeFilter(fileType) { + Util.waitUntilElementIsClickable(this.searchFileTypeFilter); + this.searchFileTypeFilter.clear(); + this.searchFileTypeFilter.sendKeys(fileType); + } + + searchInCreatorFilter(creatorName) { + Util.waitUntilElementIsClickable(this.searchCreatorFilter); + this.searchCreatorFilter.clear(); + this.searchCreatorFilter.sendKeys(creatorName); + } + + selectFileType(fileType) { + let result = element(by.css(`mat-checkbox[data-automation-id='checkbox-1:Type-${fileType}'] .mat-checkbox-inner-container`)); + Util.waitUntilElementIsClickable(result); + result.click(); + } + + selectCreator(creatorName) { + let result = element(by.css(`mat-checkbox[data-automation-id='checkbox-3:Creator-${creatorName}'] .mat-checkbox-inner-container`)); + Util.waitUntilElementIsClickable(result); + result.click(); + } + + filterByFileType(fileType) { + this.checkFileTypeFilterIsDisplayed(); + + this.checkSearchFileTypeFilterIsDisplayed(); + this.searchInFileTypeFilter(fileType); + this.selectFileType(fileType); + } + + filterByCreator(creatorFirstName, creatorLastName) { + this.checkCreatorFilterIsDisplayed(); + + this.checkSearchCreatorFilterIsDisplayed(); + this.searchInCreatorFilter(`${creatorFirstName} ${creatorLastName}`); + this.selectCreator(`${creatorFirstName} ${creatorLastName}`); + } + + removeCreatorFilter(creatorFirstName, creatorLastName) { + let cancelChipButton = element(by.cssContainingText('mat-chip', ` ${creatorFirstName} ${creatorLastName} `)).element(by.css('mat-icon')); + Util.waitUntilElementIsClickable(cancelChipButton); + return cancelChipButton.click(); + } + + checkCreatorChipIsDisplayed(creatorFirstName, creatorLastName) { + return Util.waitUntilElementIsVisible(element(by.cssContainingText('mat-chip', ` ${creatorFirstName} ${creatorLastName} `)).element(by.css('mat-icon'))); + } + + checkCreatorChipIsNotDisplayed(creatorFirstName, creatorLastName) { + return Util.waitUntilElementIsNotOnPage(element(by.cssContainingText('mat-chip', ` ${creatorFirstName} ${creatorLastName} `)).element(by.css('mat-icon'))); + } + + clickSizeShowMoreButtonUntilIsNotDisplayed() { + Util.waitUntilElementIsVisible(this.fileSizeFilter); + + this.showMoreButtonForSize.isDisplayed().then(async (visible) => { + if (visible) { + for (let checkboxes = 5; checkboxes <= totalNumberOfCheckboxes; checkboxes + 5) { + let totalNumberOfCheckboxes = await numberOfCheckboxesforSize.count(); + + expect(totalNumberOfCheckboxes).toEqual(checkboxes); + } + this.showMoreButtonForSize.click(); + + this.clickSizeShowMoreButtonUntilIsNotDisplayed(); + } + }, err => { + }); + } + + checkSizeShowMoreButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.showMoreButtonForSize); + } + + clickSizeShowLessButtonUntilIsNotDisplayed() { + Util.waitUntilElementIsVisible(this.fileSizeFilter); + + this.showLessButtonForSize.isDisplayed().then(async (visible) => { + if (visible) { + let totalNumberOfCheckboxes = await this.numberOfCheckboxesforSize.count(); + + for (let checkboxes = totalNumberOfCheckboxes; checkboxes > 10; checkboxes = totalNumberOfCheckboxes - checkboxes) { + expect(totalNumberOfCheckboxes).toEqual(checkboxes); + } + + this.showLessButtonForSize.click(); + + this.clickSizeShowLessButtonUntilIsNotDisplayed(); + } + }, err => { + }); + } + + checkShowLessButtonIsNotDisplayed() { + Util.waitUntilElementIsNotVisible(this.showLessButtonForSize); + } + + checkShowLessButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.showLessButtonForSize); + } + +} diff --git a/e2e/pages/adf/searchResultsPage.js b/e2e/pages/adf/searchResultsPage.js deleted file mode 100644 index 19daaeec69..0000000000 --- a/e2e/pages/adf/searchResultsPage.js +++ /dev/null @@ -1,210 +0,0 @@ -/*! - * @license - * Copyright 2016 Alfresco Software, Ltd. - * - * 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. - */ - -var Util = require('../../util/util'); -var ContentList = require('./dialog/contentList'); -var DatatablePage = require('./dataTablePage'); - -var SearchResultsPage = function () { - - var noResultsMessage = element(by.css("div[class='adf-no-result-message']")); - var noResultsMessageBy = by.css("div[class='adf-no-result-message']"); - var contentList = new ContentList(); - var dataTable = new DatatablePage(); - var sortArrowLocator = by.css("adf-sorting-picker button mat-icon"); - var sortDropdownLocator = by.css("mat-option span"); - var sortingArrow = element(by.css("adf-sorting-picker div[class='mat-select-arrow']")); - - this.closeActionButton = function () { - let container = element(by.css('div.cdk-overlay-backdrop.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing')); - Util.waitUntilElementIsVisible(container); - container.click(); - Util.waitUntilElementIsNotVisible(container); - return this; - } - - this.checkContentIsDisplayed = function (content) { - contentList.checkContentIsDisplayed(content); - return this; - }; - - this.numberOfResultsDisplayed = function () { - return contentList.getAllDisplayedRows(); - }; - - this.checkContentIsNotDisplayed = function (content) { - Util.waitUntilElementIsNotOnPage(element(by.css("span[title='" + content +"']"))); - }; - - this.checkNoResultMessageIsDisplayed = function() { - Util.waitUntilElementIsPresent(element(noResultsMessageBy)); - Util.waitUntilElementIsVisible(element(noResultsMessageBy)); - return this; - }; - - this.checkNoResultMessageIsNotDisplayed = function () { - Util.waitUntilElementIsNotOnPage(noResultsMessage); - return this; - }; - - this.navigateToFolder = function(content) { - dataTable.navigateToContent(content); - return this; - }; - - this.deleteContent = function(content) {
 - contentList.deleteContent(content); - 
}; - - this.checkDeleteIsDisabled = function(content) { - contentList.checkDeleteIsDisabled(content); - this.closeActionButton(); - }; - - this.copyContent = function(content) {
 - contentList.copyContent(content); - 
}; - - this.moveContent = function(content) {
 - contentList.moveContent(content);
 - }; - - /** - * Sort the list by name column. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - */ - this.sortByName = function (sortOrder) { - this.sortBy(sortOrder, "Name"); - }; - - /** - * Sort the list by any option. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - * @param option - */ - this.sortBy = function (sortOrder, option) { - - let selectedSortingOption = element(by.css("adf-sorting-picker div[class='mat-select-value'] span span")); - - Util.waitUntilElementIsVisible(selectedSortingOption); - - selectedSortingOption.getText().then((selectedOption) => { - - if(selectedOption !== option) - { - Util.waitUntilElementIsVisible(sortingArrow); - sortingArrow.click(); - - element.all(sortDropdownLocator).each(function(element) { - element.getText().then(function(text) { - if (text === option) { - element.click(); - } - }); - }); - } - }); - - this.sortByOrder(sortOrder); - }; - - this.sortByOrder = function(sortOrder) { - Util.waitUntilElementIsVisible(element(sortArrowLocator)); - return element(sortArrowLocator).getText().then(function (result) { - if(sortOrder===true) { - if(result !== 'arrow_upward') { - element(sortArrowLocator).click(); - } - } - else { - if(result === 'arrow_upward') { - element(sortArrowLocator).click(); - } - } - - return Promise.resolve(); - }); - }; - - /** - * Sort the list by author column. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - */ - this.sortByAuthor = function (sortOrder) { - this.sortBy(sortOrder, "Author"); - }; - - /** - * Sort the list by created column. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - */ - this.sortByCreated = function (sortOrder) { - this.sortBy(sortOrder, "Created"); - }; - - /** - * Sort by name and check the list is sorted. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @return result : 'true' if the list is sorted as expected and 'false' if it isn't - */ - this.sortAndCheckListIsOrderedByName = function (sortOrder) { - this.sortByName(sortOrder); - dataTable.waitForTableBody(); - var deferred = protractor.promise.defer(); - contentList.checkListIsOrderedByNameColumn(sortOrder).then(function(result) { - deferred.fulfill(result); - }); - return deferred.promise; - }; - - /** - * Sort by author and check the list is sorted. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @return result : 'true' if the list is sorted as expected and 'false' if it isn't - */ - this.sortAndCheckListIsOrderedByAuthor = function (sortOrder) { - this.sortByAuthor(sortOrder); - var deferred = protractor.promise.defer(); - contentList.checkListIsOrderedByAuthorColumn(sortOrder).then(function(result) { - deferred.fulfill(result); - }); - return deferred.promise; - }; - - /** - * Sort by created and check the list is sorted. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @return result : 'true' if the list is sorted as expected and 'false' if it isn't - */ - this.sortAndCheckListIsOrderedByCreated = function (sortOrder) { - this.sortByCreated(sortOrder); - var deferred = protractor.promise.defer(); - contentList.checkListIsOrderedByCreatedColumn(sortOrder).then(function(result) { - deferred.fulfill(result); - }); - return deferred.promise; - }; - -}; -module.exports = SearchResultsPage; diff --git a/e2e/pages/adf/searchResultsPage.ts b/e2e/pages/adf/searchResultsPage.ts new file mode 100644 index 0000000000..bd1b8660eb --- /dev/null +++ b/e2e/pages/adf/searchResultsPage.ts @@ -0,0 +1,153 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * 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 Util = require('../../util/util'); +import ContentList = require('./dialog/contentList'); +import DatatablePage = require('./dataTablePage'); + +export class SearchResultsPage { + + noResultsMessage = element(by.css('div[class="adf-no-result-message"]')); + noResultsMessageBy = by.css('div[class="adf-no-result-message"]'); + contentList = new ContentList(); + dataTable = new DatatablePage(); + sortArrowLocator = by.css('adf-sorting-picker button mat-icon'); + sortingArrow = element(by.css('adf-sorting-picker div[class="mat-select-arrow"]')); + + closeActionButton() { + let container = element(by.css('div.cdk-overlay-backdrop.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing')); + Util.waitUntilElementIsVisible(container); + container.click(); + Util.waitUntilElementIsNotVisible(container); + return this; + } + + checkContentIsDisplayed(content) { + this.contentList.checkContentIsDisplayed(content); + return this; + } + + numberOfResultsDisplayed() { + return this.contentList.getAllDisplayedRows(); + } + + checkContentIsNotDisplayed(content) { + Util.waitUntilElementIsNotOnPage(element(by.css("span[title='" + content + "']"))); + } + + checkNoResultMessageIsDisplayed() { + Util.waitUntilElementIsPresent(element(this.noResultsMessageBy)); + Util.waitUntilElementIsVisible(element(this.noResultsMessageBy)); + return this; + } + + checkNoResultMessageIsNotDisplayed() { + Util.waitUntilElementIsNotOnPage(this.noResultsMessage); + return this; + } + + navigateToFolder(content) { + this.dataTable.navigateToContent(content); + return this; + } + + deleteContent(content) { + this.contentList.deleteContent(content); + } + + checkDeleteIsDisabled(content) { + this.contentList.checkDeleteIsDisabled(content); + this.closeActionButton(); + } + + copyContent(content) { + this.contentList.copyContent(content); + } + + moveContent(content) { + this.contentList.moveContent(content); + } + + sortByName(sortOrder) { + this.sortBy(sortOrder, 'Name'); + } + + sortBy(sortOrder) { + + this.sortingArrow.click(); + + let selectedSortingOption = element(by.xpath('//span [contains(text(), \"Name\")]')); + + selectedSortingOption.click(); + + this.sortByOrder(sortOrder); + } + + sortByOrder(sortOrder) { + Util.waitUntilElementIsVisible(element(this.sortArrowLocator)); + return element(this.sortArrowLocator).getText().then((result) => { + if (sortOrder === true) { + if (result !== 'arrow_upward') { + element(this.sortArrowLocator).click(); + } + } else { + if (result === 'arrow_upward') { + element(this.sortArrowLocator).click(); + } + } + + return Promise.resolve(); + }); + } + + sortByAuthor(sortOrder) { + this.sortBy(sortOrder, 'Author'); + } + + sortByCreated(sortOrder) { + this.sortBy(sortOrder, 'Created'); + } + + sortAndCheckListIsOrderedByName(sortOrder) { + this.sortByName(sortOrder); + this.dataTable.waitForTableBody(); + let deferred = protractor.promise.defer(); + this.contentList.checkListIsOrderedByNameColumn(sortOrder).then((result) => { + deferred.fulfill(result); + }); + return deferred.promise; + } + + sortAndCheckListIsOrderedByAuthor(sortOrder) { + this.sortByAuthor(sortOrder); + let deferred = protractor.promise.defer(); + this.contentList.checkListIsOrderedByAuthorColumn(sortOrder).then((result) => { + deferred.fulfill(result); + }); + return deferred.promise; + } + + sortAndCheckListIsOrderedByCreated(sortOrder) { + this.sortByCreated(sortOrder); + let deferred = protractor.promise.defer(); + this.contentList.checkListIsOrderedByCreatedColumn(sortOrder).then((result) => { + deferred.fulfill(result); + }); + return deferred.promise; + } + +} diff --git a/protractor.conf.js b/protractor.conf.js index a5dddc0f33..865a708211 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -267,7 +267,11 @@ exports.config = { } - rimraf(`${projectRoot}/e2e-output/screenshots/`, function () { console.log('done delete screenshot'); }); + if (saveScreenshot === 'true') { + rimraf(`${projectRoot}/e2e-output/screenshots/`, function () { + console.log('done delete screenshot'); + }); + } return retry.afterLaunch(3); }