mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-19 17:14:57 +00:00
[ADF-3728] Automation tests for Search Number Range (#3974)
* [ADF-3728] Automation tests for Search Number Range * Deleting Slider page and removing expects from PO * Improving readability
This commit is contained in:
parent
28fdd4e008
commit
885b8fb8b5
@ -30,7 +30,7 @@ import TestConfig = require('../../../test.config');
|
||||
import AlfrescoApi = require('alfresco-js-api-node');
|
||||
import { browser } from 'protractor';
|
||||
|
||||
describe('Search Filters', () => {
|
||||
describe('Search Date Range Filter', () => {
|
||||
|
||||
let loginPage = new LoginPage();
|
||||
let searchDialog = new SearchDialog();
|
||||
@ -138,13 +138,11 @@ describe('Search Filters', () => {
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
|
||||
this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then((node) => {
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
let nodeCreation = new Date(node.entry.createdAt);
|
||||
nodeCreation.setHours(0, 0, 0, 0);
|
||||
browser.controlFlow().execute(async () => {
|
||||
await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true);
|
||||
await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true);
|
||||
});
|
||||
await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true);
|
||||
await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@ -152,13 +150,11 @@ describe('Search Filters', () => {
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
|
||||
this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then((node) => {
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
let nodeCreation = new Date(node.entry.createdAt);
|
||||
nodeCreation.setHours(0, 0, 0, 0);
|
||||
browser.controlFlow().execute(async () => {
|
||||
await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true);
|
||||
await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true);
|
||||
});
|
||||
await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true);
|
||||
await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
@ -0,0 +1,519 @@
|
||||
/*!
|
||||
* @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 { LoginPage } from '../../../pages/adf/loginPage';
|
||||
import SearchDialog = require('../../../pages/adf/dialog/searchDialog');
|
||||
import DataTablePage = require('../../../pages/adf/dataTablePage');
|
||||
import { SearchResultsPage } from '../../../pages/adf/searchResultsPage';
|
||||
import { NavigationBarPage } from '../../../pages/adf/navigationBarPage';
|
||||
import { ConfigEditorPage } from '../../../pages/adf/configEditorPage';
|
||||
import { SearchFiltersPage } from '../../../pages/adf/searchFiltersPage';
|
||||
|
||||
import TestConfig = require('../../../test.config');
|
||||
|
||||
import AlfrescoApi = require('alfresco-js-api-node');
|
||||
import { UploadActions } from '../../../actions/ACS/upload.actions';
|
||||
import AcsUserModel = require('../../../models/ACS/acsUserModel');
|
||||
import FileModel = require('../../../models/ACS/fileModel');
|
||||
import { browser } from 'protractor';
|
||||
import resources = require('../../../util/resources');
|
||||
import { SearchConfiguration } from '../search.config';
|
||||
|
||||
describe('Search Number Range Filter', () => {
|
||||
|
||||
const loginPage = new LoginPage();
|
||||
const searchDialog = new SearchDialog();
|
||||
const searchFilters = new SearchFiltersPage();
|
||||
const sizeRangeFilter = searchFilters.sizeRangeFilterPage();
|
||||
const searchResults = new SearchResultsPage();
|
||||
const navigationBar = new NavigationBarPage();
|
||||
const configEditor = new ConfigEditorPage();
|
||||
const dataTable = new DataTablePage();
|
||||
|
||||
const acsUser = new AcsUserModel();
|
||||
|
||||
const file2BytesModel = new FileModel({
|
||||
'name': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_name,
|
||||
'location': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_location
|
||||
});
|
||||
|
||||
const file0BytesModel = new FileModel({
|
||||
'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name,
|
||||
'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location
|
||||
});
|
||||
|
||||
let file2Bytes, file0Bytes;
|
||||
const uploadActions = new UploadActions();
|
||||
|
||||
beforeAll(async (done) => {
|
||||
|
||||
this.alfrescoJsApi = new AlfrescoApi({
|
||||
provider: 'ECM',
|
||||
hostEcm: TestConfig.adf.url
|
||||
});
|
||||
|
||||
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
|
||||
|
||||
await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser);
|
||||
|
||||
await this.alfrescoJsApi.login(acsUser.id, acsUser.password);
|
||||
|
||||
file2Bytes = await uploadActions.uploadFile(this.alfrescoJsApi, file2BytesModel.location, file2BytesModel.name, '-my-');
|
||||
file0Bytes = await uploadActions.uploadFile(this.alfrescoJsApi, file0BytesModel.location, file0BytesModel.name, '-my-');
|
||||
await browser.driver.sleep(15000);
|
||||
|
||||
loginPage.loginToContentServices(acsUser.id, acsUser.password);
|
||||
|
||||
searchDialog.checkSearchIconIsVisible()
|
||||
.clickOnSearchIcon()
|
||||
.enterTextAndPressEnter('*');
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
afterAll(async (done) => {
|
||||
await this.alfrescoJsApi.login(acsUser.id, acsUser.password);
|
||||
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, file2Bytes.entry.id);
|
||||
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, file0Bytes.entry.id);
|
||||
done();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
searchFilters.checkSizeRangeFilterIsDisplayed()
|
||||
.clickSizeRangeFilterHeader()
|
||||
.checkSizeRangeFilterIsExpanded();
|
||||
});
|
||||
|
||||
afterEach(async (done) => {
|
||||
await browser.refresh();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[C276921] Should display default values for Number Range widget', () => {
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.checkToFieldIsDisplayed()
|
||||
.checkApplyButtonIsDisplayed()
|
||||
.checkClearButtonIsDisplayed();
|
||||
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
});
|
||||
|
||||
it('[C276922] Should be keep value when Number Range widget is collapsed', () => {
|
||||
let size = 5;
|
||||
sizeRangeFilter.putFromNumber(size);
|
||||
sizeRangeFilter.putToNumber(size);
|
||||
searchFilters.clickSizeRangeFilterHeader()
|
||||
.checkSizeRangeFilterIsCollapsed()
|
||||
.clickSizeRangeFilterHeader()
|
||||
.checkSizeRangeFilterIsExpanded();
|
||||
expect(sizeRangeFilter.getFromNumber()).toEqual(`${size}`);
|
||||
expect(sizeRangeFilter.getToNumber()).toEqual(`${size}`);
|
||||
});
|
||||
|
||||
it('[C276924] Should display error message when input had an invalid format', () => {
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.putFromNumber('a').putToNumber('A')
|
||||
.checkFromErrorInvalidIsDisplayed().checkToErrorInvalidIsDisplayed();
|
||||
|
||||
expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
|
||||
sizeRangeFilter.putFromNumber('@').putToNumber('£')
|
||||
.checkFromErrorInvalidIsDisplayed().checkToErrorInvalidIsDisplayed();
|
||||
expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
|
||||
sizeRangeFilter.putFromNumber('4.5').putToNumber('4,5')
|
||||
.checkFromErrorInvalidIsDisplayed().checkToErrorInvalidIsDisplayed();
|
||||
expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
|
||||
sizeRangeFilter.putFromNumber('01').putToNumber('-1');
|
||||
expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
|
||||
sizeRangeFilter.clearFromField().clearToField()
|
||||
.checkFromErrorRequiredIsDisplayed().checkToErrorRequiredIsDisplayed();
|
||||
expect(sizeRangeFilter.getFromErrorRequired()).toEqual('Required value');
|
||||
expect(sizeRangeFilter.getToErrorRequired()).toEqual('Required value');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
});
|
||||
|
||||
it('[C276943] Should be able to put a big value in To field', () => {
|
||||
let toSize = 999999999;
|
||||
let fromSize = 0;
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(toSize)
|
||||
.putFromNumber(fromSize);
|
||||
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.sortBySize(false);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes <= toSize).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('[C276944] Should be able to filter by name when size range filter is applied', () => {
|
||||
let nameFilter = searchFilters.textFiltersPage();
|
||||
let toSize = 40;
|
||||
let fromSize = 0;
|
||||
searchFilters.checkNameFilterIsDisplayed()
|
||||
.checkNameFilterIsExpanded();
|
||||
nameFilter.searchByName('*');
|
||||
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.putFromNumber(fromSize)
|
||||
.putToNumber(toSize);
|
||||
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.sortBySize(false);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes <= toSize).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
searchFilters.checkNameFilterIsDisplayed()
|
||||
.checkNameFilterIsExpanded();
|
||||
nameFilter.searchByName('z*');
|
||||
searchResults.sortBySize(false);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes <= toSize).toBe(true);
|
||||
let name = node.entry.name;
|
||||
await expect(/z*/i.test(name)).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('[C276950] Should be able to filter by size (slider) when size range filter is applied', () => {
|
||||
let sizeSliderFilter = searchFilters.sizeSliderFilterPage();
|
||||
let toSize = 20;
|
||||
let sliderSize = 18;
|
||||
|
||||
searchFilters.checkSizeSliderFilterIsDisplayed()
|
||||
.clickSizeSliderFilterHeader()
|
||||
.checkSizeSliderFilterIsExpanded();
|
||||
sizeSliderFilter.checkSliderIsDisplayed().setValue(sliderSize);
|
||||
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.putFromNumber(0)
|
||||
.putToNumber(toSize);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.sortBySize(false);
|
||||
searchResults.tableIsLoaded();
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes <= sliderSize).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.putFromNumber(1);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.sortBySize(true);
|
||||
searchResults.tableIsLoaded();
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes >= 1).toBe(true);
|
||||
await expect(node.entry.content.sizeInBytes <= sliderSize).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.putFromNumber(19);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.checkNoResultMessageIsDisplayed();
|
||||
});
|
||||
|
||||
it('[C276951] Should not display folders when Size range is applied', () => {
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(99999999)
|
||||
.putFromNumber(0);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.tableIsLoaded();
|
||||
searchFilters.checkCheckListFilterIsDisplayed();
|
||||
searchFilters.clickCheckListFilter();
|
||||
searchFilters.checkCheckListFilterIsExpanded();
|
||||
|
||||
searchFilters.checkListFiltersPage()
|
||||
.clickCheckListOption('Folder');
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkNoResultMessageIsDisplayed();
|
||||
});
|
||||
|
||||
it('[C276952] Should only display empty files when size range is set from 0 to 1', () => {
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(1)
|
||||
.putFromNumber(0);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.sortBySize(false);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes).toEqual(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('[C277092] Should disable apply button when from field value equal/is bigger than to field value', () => {
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed()
|
||||
.putFromNumber(10);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
|
||||
sizeRangeFilter.putToNumber('5');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
|
||||
sizeRangeFilter.putToNumber('10');
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false);
|
||||
});
|
||||
|
||||
it('[C289930] Should be able to clear values in number range fields', () => {
|
||||
sizeRangeFilter.checkFromFieldIsDisplayed().checkClearButtonIsDisplayed().checkNoErrorMessageIsDisplayed()
|
||||
.clickClearButton().checkNoErrorMessageIsDisplayed()
|
||||
.putFromNumber(0).putToNumber(1).clickClearButton();
|
||||
|
||||
expect(sizeRangeFilter.getFromNumber()).toEqual('');
|
||||
expect(sizeRangeFilter.getToNumber()).toEqual('');
|
||||
|
||||
sizeRangeFilter.putFromNumber(0).putToNumber(1).clickApplyButton();
|
||||
searchResults.sortBySize(false);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes <= 1).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
sizeRangeFilter.clickClearButton();
|
||||
|
||||
expect(sizeRangeFilter.getFromNumber()).toEqual('');
|
||||
expect(sizeRangeFilter.getToNumber()).toEqual('');
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect(node.entry.content.sizeInBytes >= 1).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('[C277137] Number Range should be inclusive', () => {
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(2)
|
||||
.putFromNumber(1);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsDisplayed(file2BytesModel.name);
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(1)
|
||||
.putFromNumber(0);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsNotDisplayed(file2BytesModel.name);
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(3)
|
||||
.putFromNumber(2);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsDisplayed(file2BytesModel.name);
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(4)
|
||||
.putFromNumber(3);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsNotDisplayed(file2BytesModel.name);
|
||||
});
|
||||
|
||||
describe('Configuration change', () => {
|
||||
let jsonFile;
|
||||
|
||||
beforeEach(() => {
|
||||
let searchConfiguration = new SearchConfiguration();
|
||||
jsonFile = searchConfiguration.getConfiguration();
|
||||
});
|
||||
|
||||
it('[C276928] Should be able to change the field property for number range', () => {
|
||||
jsonFile.categories[3].component.settings.field = 'cm:created';
|
||||
|
||||
navigationBar.clickConfigEditorButton();
|
||||
configEditor.clickSearchConfiguration();
|
||||
configEditor.clickClearButton();
|
||||
configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton();
|
||||
|
||||
searchDialog.checkSearchIconIsVisible()
|
||||
.clickOnSearchIcon()
|
||||
.enterTextAndPressEnter('*');
|
||||
|
||||
searchFilters.checkSizeRangeFilterIsDisplayed()
|
||||
.clickSizeRangeFilterHeader()
|
||||
.checkSizeRangeFilterIsExpanded();
|
||||
|
||||
let fromYear = (new Date()).getFullYear();
|
||||
let toYear = fromYear + 1;
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(toYear)
|
||||
.putFromNumber(fromYear);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.sortByCreated(false);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect((node.entry.createdAt.getFullYear()) <= toYear).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
searchResults.sortByCreated(true);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
let firstResult = await dataTable.getNodeIdFirstElement();
|
||||
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
|
||||
await expect((node.entry.createdAt.getFullYear()) >= fromYear).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('[C277139] Should be able to set To field to be exclusive', () => {
|
||||
jsonFile.categories[3].component.settings.format = '[{FROM} TO {TO}>';
|
||||
|
||||
navigationBar.clickConfigEditorButton();
|
||||
configEditor.clickSearchConfiguration();
|
||||
configEditor.clickClearButton();
|
||||
configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton();
|
||||
|
||||
searchDialog.checkSearchIconIsVisible()
|
||||
.clickOnSearchIcon()
|
||||
.enterTextAndPressEnter('*');
|
||||
|
||||
searchFilters.checkSizeRangeFilterIsDisplayed()
|
||||
.clickSizeRangeFilterHeader()
|
||||
.checkSizeRangeFilterIsExpanded();
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(2)
|
||||
.putFromNumber(1);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsNotDisplayed(file2BytesModel.name);
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(3)
|
||||
.putFromNumber(1);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsDisplayed(file2BytesModel.name);
|
||||
});
|
||||
|
||||
it('[C277140] Should be able to set From field to be exclusive', () => {
|
||||
jsonFile.categories[3].component.settings.format = '<{FROM} TO {TO}]';
|
||||
|
||||
navigationBar.clickConfigEditorButton();
|
||||
configEditor.clickSearchConfiguration();
|
||||
configEditor.clickClearButton();
|
||||
configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton();
|
||||
|
||||
searchDialog.checkSearchIconIsVisible()
|
||||
.clickOnSearchIcon()
|
||||
.enterTextAndPressEnter('*');
|
||||
|
||||
searchFilters.checkSizeRangeFilterIsDisplayed()
|
||||
.clickSizeRangeFilterHeader()
|
||||
.checkSizeRangeFilterIsExpanded();
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(3)
|
||||
.putFromNumber(1);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsDisplayed(file2BytesModel.name);
|
||||
|
||||
sizeRangeFilter.checkToFieldIsDisplayed()
|
||||
.putToNumber(3)
|
||||
.putFromNumber(2);
|
||||
expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true);
|
||||
|
||||
sizeRangeFilter.clickApplyButton();
|
||||
|
||||
searchResults.tableIsLoaded();
|
||||
searchResults.checkContentIsNotDisplayed(file2BytesModel.name);
|
||||
});
|
||||
});
|
||||
});
|
@ -0,0 +1,141 @@
|
||||
/*!
|
||||
* @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 { by, protractor, browser } from 'protractor';
|
||||
|
||||
export class NumberRangeFilterPage {
|
||||
|
||||
fromInput = by.css('input[data-automation-id="number-range-from-input"]');
|
||||
toInput = by.css('input[data-automation-id="number-range-to-input"]');
|
||||
applyButton = by.css('button[data-automation-id="number-range-btn-apply"]');
|
||||
clearButton = by.css('button[data-automation-id="number-range-btn-clear"]');
|
||||
fromErrorInvalid = by.css('mat-error[data-automation-id="number-range-from-error-invalid"]');
|
||||
fromErrorRequired = by.css('mat-error[data-automation-id="number-range-from-error-required"]');
|
||||
toErrorInvalid = by.css('mat-error[data-automation-id="number-range-to-error-invalid"]');
|
||||
toErrorRequired = by.css('mat-error[data-automation-id="number-range-to-error-required"]');
|
||||
filter;
|
||||
|
||||
constructor(filter) {
|
||||
this.filter = filter;
|
||||
}
|
||||
clearFromField() {
|
||||
Util.waitUntilElementIsClickable(this.filter.element(this.fromInput));
|
||||
this.filter.element(this.fromInput).getAttribute('value').then((value) => {
|
||||
for (let i = value.length; i >= 0; i--) {
|
||||
this.filter.element(this.fromInput).sendKeys(protractor.Key.BACK_SPACE);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
getFromNumber() {
|
||||
return this.filter.element(this.fromInput).getAttribute('value');
|
||||
}
|
||||
putFromNumber(value) {
|
||||
this.checkFromFieldIsDisplayed();
|
||||
this.filter.element(this.fromInput).clear();
|
||||
this.filter.element(this.fromInput).sendKeys(value);
|
||||
this.filter.element(this.fromInput).sendKeys(protractor.Key.ENTER);
|
||||
return this;
|
||||
}
|
||||
getFromErrorRequired() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorRequired));
|
||||
return this.filter.element(this.fromErrorRequired).getText();
|
||||
}
|
||||
checkFromErrorRequiredIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorRequired));
|
||||
return this;
|
||||
}
|
||||
getFromErrorInvalid() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorInvalid));
|
||||
return this.filter.element(this.fromErrorInvalid).getText();
|
||||
}
|
||||
checkFromErrorInvalidIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorInvalid));
|
||||
return this;
|
||||
}
|
||||
checkFromFieldIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.fromInput));
|
||||
return this;
|
||||
}
|
||||
clearToField() {
|
||||
Util.waitUntilElementIsClickable(this.filter.element(this.toInput));
|
||||
this.filter.element(this.toInput).getAttribute('value').then((value) => {
|
||||
for (let i = value.length; i >= 0; i--) {
|
||||
this.filter.element(this.toInput).sendKeys(protractor.Key.BACK_SPACE);
|
||||
}
|
||||
});
|
||||
return this;
|
||||
}
|
||||
getToNumber() {
|
||||
return this.filter.element(this.toInput).getAttribute('value');
|
||||
}
|
||||
putToNumber(value) {
|
||||
this.checkToFieldIsDisplayed();
|
||||
this.filter.element(this.toInput).clear();
|
||||
this.filter.element(this.toInput).sendKeys(value);
|
||||
this.filter.element(this.toInput).sendKeys(protractor.Key.ENTER);
|
||||
return this;
|
||||
}
|
||||
getToErrorRequired() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.toErrorRequired));
|
||||
return this.filter.element(this.toErrorRequired).getText();
|
||||
}
|
||||
checkToErrorRequiredIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.toErrorRequired));
|
||||
return this;
|
||||
}
|
||||
getToErrorInvalid() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.toErrorInvalid));
|
||||
return this.filter.element(this.toErrorInvalid).getText();
|
||||
}
|
||||
checkToErrorInvalidIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.toErrorInvalid));
|
||||
return this;
|
||||
}
|
||||
checkToFieldIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.toInput));
|
||||
return this;
|
||||
}
|
||||
clickApplyButton() {
|
||||
Util.waitUntilElementIsClickable(this.filter.element(this.applyButton));
|
||||
this.filter.element(this.applyButton).click();
|
||||
return this;
|
||||
}
|
||||
checkApplyButtonIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.applyButton));
|
||||
return this;
|
||||
}
|
||||
checkApplyButtonIsEnabled() {
|
||||
return this.filter.element(this.applyButton).isEnabled();
|
||||
}
|
||||
clickClearButton() {
|
||||
Util.waitUntilElementIsClickable(this.filter.element(this.clearButton));
|
||||
this.filter.element(this.clearButton).click();
|
||||
return this;
|
||||
}
|
||||
checkClearButtonIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.clearButton));
|
||||
return this;
|
||||
}
|
||||
checkNoErrorMessageIsDisplayed() {
|
||||
Util.waitUntilElementIsNotVisible(this.filter.element(this.fromErrorInvalid));
|
||||
Util.waitUntilElementIsNotVisible(this.filter.element(this.fromErrorRequired));
|
||||
Util.waitUntilElementIsNotVisible(this.filter.element(this.toErrorInvalid));
|
||||
Util.waitUntilElementIsNotVisible(this.filter.element(this.toErrorRequired));
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
/*!
|
||||
* @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 { browser, by, protractor } from 'protractor';
|
||||
import Util = require('../../../../../util/util');
|
||||
|
||||
export class SearchSliderPage {
|
||||
|
||||
filter;
|
||||
slider = by.css('mat-slider');
|
||||
|
||||
constructor(filter) {
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
setValue(value) {
|
||||
this.clickSlider();
|
||||
browser.controlFlow().execute(async () => {
|
||||
let actualValue;
|
||||
do {
|
||||
actualValue = await this.filter.element(this.slider).getAttribute('aria-valuenow');
|
||||
if (actualValue < value) {
|
||||
await browser.actions().sendKeys(protractor.Key.ARROW_RIGHT).perform();
|
||||
} else if (actualValue > value) {
|
||||
await browser.actions().sendKeys(protractor.Key.ARROW_LEFT).perform();
|
||||
}
|
||||
}while (Number(actualValue) !== value);
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
clickSlider() {
|
||||
Util.waitUntilElementIsClickable(this.filter.element(this.slider));
|
||||
this.filter.element(this.slider).click();
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSliderIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.filter.element(this.slider));
|
||||
return this;
|
||||
}
|
||||
}
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
import Util = require('../../../../../util/util');
|
||||
import { element, by } from 'protractor';
|
||||
import { protractor, by } from 'protractor';
|
||||
|
||||
export class SearchTextPage {
|
||||
|
||||
|
@ -16,11 +16,13 @@
|
||||
*/
|
||||
|
||||
import Util = require('../../../../util/util');
|
||||
import { element, by } from 'protractor';
|
||||
import { by } from 'protractor';
|
||||
import { SearchTextPage } from './components/search-text';
|
||||
import { SearchCheckListPage } from './components/search-checkList';
|
||||
import { SearchRadioPage } from './components/search-radio';
|
||||
import { DateRangeFilterPage } from './components/dateRangeFilterPage';
|
||||
import { NumberRangeFilterPage } from './components/numberRangeFilterPage';
|
||||
import { SearchSliderPage } from './components/search-slider.page';
|
||||
|
||||
export class SearchCategoriesPage {
|
||||
|
||||
@ -40,6 +42,14 @@ export class SearchCategoriesPage {
|
||||
return new DateRangeFilterPage(filter);
|
||||
}
|
||||
|
||||
numberRangeFilter(filter) {
|
||||
return new NumberRangeFilterPage(filter);
|
||||
}
|
||||
|
||||
sliderFilter(filter) {
|
||||
return new SearchSliderPage(filter);
|
||||
}
|
||||
|
||||
checkFilterIsDisplayed(filter) {
|
||||
Util.waitUntilElementIsVisible(filter);
|
||||
return this;
|
||||
|
@ -31,11 +31,17 @@ export class SearchFiltersPage {
|
||||
checkListFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Check List"]'));
|
||||
createdDateRangeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Created Date (range)"]'));
|
||||
typeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Type"]'));
|
||||
sizeRangeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Content Size (range)"]'));
|
||||
sizeSliderFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Content Size"]'));
|
||||
|
||||
checkSearchFiltersIsDisplayed() {
|
||||
Util.waitUntilElementIsVisible(this.searchFilters);
|
||||
}
|
||||
|
||||
sizeRangeFilterPage() {
|
||||
return this.searchCategoriesPage.numberRangeFilter(this.sizeRangeFilter);
|
||||
}
|
||||
|
||||
createdDateRangeFilterPage() {
|
||||
return this.searchCategoriesPage.dateRangeFilter(this.createdDateRangeFilter);
|
||||
}
|
||||
@ -56,6 +62,10 @@ export class SearchFiltersPage {
|
||||
return this.searchCategoriesPage.checkListFiltersPage(this.fileTypeFilter);
|
||||
}
|
||||
|
||||
sizeSliderFilterPage() {
|
||||
return this.searchCategoriesPage.sliderFilter(this.sizeSliderFilter);
|
||||
}
|
||||
|
||||
checkFileTypeFilterIsDisplayed() {
|
||||
this.searchCategoriesPage.checkFilterIsDisplayed(this.fileTypeFilter);
|
||||
return this;
|
||||
@ -71,6 +81,11 @@ export class SearchFiltersPage {
|
||||
return this;
|
||||
}
|
||||
|
||||
checkNameFilterIsExpanded() {
|
||||
this.searchCategoriesPage.checkFilterIsExpanded(this.nameFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkNameFilterIsDisplayed() {
|
||||
this.searchCategoriesPage.checkFilterIsDisplayed(this.nameFilter);
|
||||
return this;
|
||||
@ -90,6 +105,10 @@ export class SearchFiltersPage {
|
||||
this.searchCategoriesPage.clickFilterHeader(this.fileSizeFilter);
|
||||
return this;
|
||||
}
|
||||
checkFileSizeFilterIsCollapsed() {
|
||||
this.searchCategoriesPage.checkFilterIsCollapsed(this.fileSizeFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
clickFileTypeFilterHeader() {
|
||||
this.searchCategoriesPage.clickFilterHeader(this.fileTypeFilter);
|
||||
@ -110,6 +129,11 @@ export class SearchFiltersPage {
|
||||
this.searchCategoriesPage.checkFilterIsCollapsed(this.checkListFilter);
|
||||
}
|
||||
|
||||
checkCheckListFilterIsExpanded() {
|
||||
this.searchCategoriesPage.checkFilterIsExpanded(this.checkListFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkCreatedRangeFilterIsDisplayed() {
|
||||
this.searchCategoriesPage.checkFilterIsDisplayed(this.createdDateRangeFilter);
|
||||
return this;
|
||||
@ -149,4 +173,42 @@ export class SearchFiltersPage {
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSizeRangeFilterIsDisplayed() {
|
||||
this.searchCategoriesPage.checkFilterIsDisplayed(this.createdDateRangeFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
clickSizeRangeFilterHeader() {
|
||||
this.searchCategoriesPage.clickFilterHeader(this.sizeRangeFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSizeRangeFilterIsExpanded() {
|
||||
this.searchCategoriesPage.checkFilterIsExpanded(this.sizeRangeFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSizeRangeFilterIsCollapsed() {
|
||||
this.searchCategoriesPage.checkFilterIsCollapsed(this.sizeRangeFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSizeSliderFilterIsDisplayed() {
|
||||
this.searchCategoriesPage.checkFilterIsDisplayed(this.sizeSliderFilter);
|
||||
return this;
|
||||
}
|
||||
clickSizeSliderFilterHeader() {
|
||||
this.searchCategoriesPage.clickFilterHeader(this.sizeSliderFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSizeSliderFilterIsExpanded() {
|
||||
this.searchCategoriesPage.checkFilterIsExpanded(this.sizeSliderFilter);
|
||||
return this;
|
||||
}
|
||||
|
||||
checkSizeSliderFilterIsCollapsed() {
|
||||
this.searchCategoriesPage.checkFilterIsCollapsed(this.sizeSliderFilter);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -87,13 +87,9 @@ export class SearchResultsPage {
|
||||
Util.waitUntilElementIsClickable(this.sortingArrow);
|
||||
this.sortingArrow.click();
|
||||
|
||||
let selectedSortingOption = element(by.xpath(``));
|
||||
let selectedSortingOption = element(by.cssContainingText('span[class="mat-option-text"]', sortType));
|
||||
Util.waitUntilElementIsClickable(selectedSortingOption);
|
||||
browser.executeScript(`document.evaluate('//span [contains(text(), "${sortType}")]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();`);
|
||||
|
||||
browser.controlFlow().execute(async () => {
|
||||
await browser.actions().sendKeys(protractor.Key.ESCAPE).perform();
|
||||
});
|
||||
selectedSortingOption.click();
|
||||
|
||||
this.sortByOrder(sortOrder);
|
||||
}
|
||||
@ -123,6 +119,10 @@ export class SearchResultsPage {
|
||||
this.sortBy(sortOrder, 'Created');
|
||||
}
|
||||
|
||||
sortBySize(sortOrder) {
|
||||
this.sortBy(sortOrder, 'Size');
|
||||
}
|
||||
|
||||
sortAndCheckListIsOrderedByName(sortOrder) {
|
||||
this.sortByName(sortOrder);
|
||||
this.dataTable.waitForTableBody();
|
||||
|
@ -4,11 +4,12 @@
|
||||
<input
|
||||
matInput [formControl]="from" [errorStateMatcher]="matcher"
|
||||
placeholder="{{ 'SEARCH.FILTER.RANGE.FROM' | translate }}"
|
||||
autocomplete="off">
|
||||
<mat-error *ngIf="from.hasError('pattern') || from.hasError('min')">
|
||||
autocomplete="off"
|
||||
data-automation-id="number-range-from-input">
|
||||
<mat-error *ngIf="from.hasError('pattern') || from.hasError('min')" data-automation-id="number-range-from-error-invalid">
|
||||
{{ 'SEARCH.FILTER.VALIDATION.INVALID-FORMAT' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="from.hasError('required')">
|
||||
<mat-error *ngIf="from.hasError('required')" data-automation-id="number-range-from-error-required">
|
||||
{{ 'SEARCH.FILTER.VALIDATION.REQUIRED-VALUE' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
@ -17,21 +18,22 @@
|
||||
<input
|
||||
matInput [formControl]="to" [errorStateMatcher]="matcher"
|
||||
placeholder="{{ 'SEARCH.FILTER.RANGE.TO' | translate }}"
|
||||
autocomplete="off">
|
||||
<mat-error *ngIf="to.hasError('pattern') || to.hasError('min')">
|
||||
autocomplete="off"
|
||||
data-automation-id="number-range-to-input">
|
||||
<mat-error *ngIf="to.hasError('pattern') || to.hasError('min')" data-automation-id="number-range-to-error-invalid">
|
||||
{{ 'SEARCH.FILTER.VALIDATION.INVALID-FORMAT' | translate }}
|
||||
</mat-error>
|
||||
<mat-error *ngIf="to.hasError('required')">
|
||||
<mat-error *ngIf="to.hasError('required')" data-automation-id="number-range-to-error-required">
|
||||
{{ 'SEARCH.FILTER.VALIDATION.REQUIRED-VALUE' | translate }}
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
|
||||
<div class="facet-buttons">
|
||||
<button mat-button color="primary" type="button" (click)="reset()">
|
||||
<button mat-button color="primary" type="button" (click)="reset()" data-automation-id="number-range-btn-clear">
|
||||
{{ 'SEARCH.FILTER.ACTIONS.CLEAR' | translate }}
|
||||
</button>
|
||||
<button mat-button color="primary" type="submit" [disabled]="!form.valid">
|
||||
<button mat-button color="primary" type="submit" [disabled]="!form.valid" data-automation-id="number-range-btn-apply">
|
||||
{{ 'SEARCH.FILTER.ACTIONS.APPLY' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
Loading…
x
Reference in New Issue
Block a user