diff --git a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.html b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.html index 8702520ae5..45047255aa 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.html +++ b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.html @@ -11,13 +11,3 @@ - -
- - -
- diff --git a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.spec.ts b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.spec.ts index 4f5e41c99a..065e683a6d 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.spec.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.spec.ts @@ -47,7 +47,7 @@ export class MockSearchFilterTabbedComponent {} selector: 'adf-search-date-range-advanced', template: `` }) -export class MockSearchDateRangeAdvancedComponent { +class MockSearchDateRangeAdvancedComponent { @Input() dateFormat: string; @Input() @@ -62,7 +62,7 @@ export class MockSearchDateRangeAdvancedComponent { @Output() valid = new EventEmitter(); } -fdescribe('SearchDateRangeAdvancedTabbedComponent', () => { +describe('SearchDateRangeAdvancedTabbedComponent', () => { let component: SearchDateRangeAdvancedTabbedComponent; let fixture: ComponentFixture; let betweenMockData: SearchDateRangeAdvanced; @@ -82,6 +82,7 @@ fdescribe('SearchDateRangeAdvancedTabbedComponent', () => { ] }); fixture = TestBed.createComponent(SearchDateRangeAdvancedTabbedComponent); + component = fixture.componentInstance; component.id = 'dateRangeAdvanced'; component.context = { @@ -128,6 +129,10 @@ fdescribe('SearchDateRangeAdvancedTabbedComponent', () => { }; fixture.detectChanges(); + + const searchDateRangeAdvancedComponentList = fixture.debugElement.queryAll(By.directive(SearchDateRangeAdvancedComponent)); + createdDateRangeComponent = searchDateRangeAdvancedComponentList.find(searchDateRangeAdvancedComponent => (searchDateRangeAdvancedComponent.componentInstance as SearchDateRangeAdvancedComponent).field === 'createdDate').componentInstance; + // modifiedDateRangeComponent = searchDateRangeAdvancedComponentList.find(searchDateRangeAdvancedComponent => searchDateRangeAdvancedComponent.attributes['field'] === 'modifiedDate').componentInstance; }); it('should be able to generate separate fields on init', () => { @@ -232,4 +237,6 @@ fdescribe('SearchDateRangeAdvancedTabbedComponent', () => { expect(component.context.queryFragments['dateRangeAdvanced']).toEqual(''); expect(component.context.update).toHaveBeenCalled(); }); + + }); diff --git a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.ts b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.ts index cbcc39e26d..f5123725bb 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced-tabbed.component.ts @@ -177,19 +177,46 @@ export class SearchDateRangeAdvancedTabbedComponent implements SearchWidget, OnI this.combinedValuesToDisplay = valuesToDisplay; } - onTabValid(tabValid: boolean, field: string) { - this.tabsValidity[field] = tabValid; + private generateQuery(value: Partial, field: string): string { + let query = ''; + if (value.dateRangeType === DateRangeType.IN_LAST) { + query = `${field}:[NOW/DAY-${value.inLastValue}${value.inLastValueType} TO NOW/DAY+1DAY]`; + } else if (value.dateRangeType === DateRangeType.BETWEEN) { + query = `${field}:['${formatISO(startOfDay(value.betweenStartDate))}' TO '${formatISO(endOfDay(value.betweenEndDate))}']`; + } + return query; } - onDateRangedValueChanged(value: Partial, field: string) { - this.value[field] = value; + private generateDisplayValue(value: Partial): string { + let displayValue = ''; + if (value.dateRangeType === DateRangeType.IN_LAST && value.inLastValue) { + displayValue = this.translateService.instant(`SEARCH.DATE_RANGE_ADVANCED.IN_LAST_DISPLAY_LABELS.${value.inLastValueType}`, { + value: value.inLastValue + }); + } else if (value.dateRangeType === DateRangeType.BETWEEN && value.betweenStartDate && value.betweenEndDate) { + displayValue = `${format(startOfDay(value.betweenStartDate), this.settings.dateFormat)} - ${format(endOfDay(value.betweenEndDate), this.settings.dateFormat)}`; + } + return displayValue; } - onFieldsChanged(fields: string[]) { - this.fields = fields; + private updateQuery(value: Partial, field: string) { + this.combinedQuery = ''; + this.queryMapByField.set(field, this.generateQuery(value, field)); + this.queryMapByField.forEach((query: string) => { + if (query) { + this.combinedQuery = this.combinedQuery ? `${this.combinedQuery} AND ${query}` : `${query}`; + } + }); } - onDisplayLabelsByFieldsTranslated(displayedLabelsByField: { [p: string]: string }) { - this.displayedLabelsByField = displayedLabelsByField; + private updateDisplayValue(value: Partial, field: string) { + this.combinedDisplayValue = ''; + this.displayValueMapByField.set(field, this.generateDisplayValue(value)); + this.displayValueMapByField.forEach((displayValue: string, field: string) => { + if (displayValue) { + const displayLabelForField = `${this.translateService.instant(this.settings.displayedLabelsByField[field]).toUpperCase()}: ${displayValue}`; + this.combinedDisplayValue = this.combinedDisplayValue ? `${this.combinedDisplayValue} ${displayLabelForField}` : `${displayLabelForField}` + } + }); } } diff --git a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.spec.ts b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.spec.ts index fa570f6c6b..099d6509b1 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.spec.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.spec.ts @@ -278,4 +278,125 @@ describe('SearchDateRangeAdvancedComponent', () => { fixture.detectChanges(); expect(component.changed.emit).toHaveBeenCalledWith(value); }); + + it('should not be able to set zero or negative values in In the last input field', () => { + component.form.controls.dateRangeType.setValue(component.DateRangeType.IN_LAST); + fixture.detectChanges(); + enterValueInInputField('date-range-advanced-in-last-input', '-5'); + fixture.detectChanges(); + let inLastInputFieldValue = getElementBySelector('[data-automation-id="date-range-advanced-in-last-input"]').value; + expect(inLastInputFieldValue).toBe('5'); + + enterValueInInputField('date-range-advanced-in-last-input', '0'); + fixture.detectChanges(); + inLastInputFieldValue = getElementBySelector('[data-automation-id="date-range-advanced-in-last-input"]').value; + expect(inLastInputFieldValue).toBe(''); + }); + + it('should emit valid as false when form is invalid', () => { + spyOn(component.valid, 'emit'); + component.form.controls.dateRangeType.setValue(component.DateRangeType.IN_LAST); + fixture.detectChanges(); + enterValueInInputField('date-range-advanced-in-last-input', ''); + selectDropdownOption('date-range-advanced-in-last-option-weeks'); + fixture.detectChanges(); + expect(component.valid.emit).toHaveBeenCalledWith(false); + + component.form.controls.dateRangeType.setValue(component.DateRangeType.BETWEEN); + fixture.detectChanges(); + expect(component.valid.emit).toHaveBeenCalledWith(false); + }); + + it('should emit valid as true when form is valid', () => { + spyOn(component.valid, 'emit'); + component.form.controls.dateRangeType.setValue(component.DateRangeType.IN_LAST); + fixture.detectChanges(); + enterValueInInputField('date-range-advanced-in-last-input', '5'); + selectDropdownOption('date-range-advanced-in-last-option-weeks'); + fixture.detectChanges(); + expect(component.valid.emit).toHaveBeenCalledWith(true); + + component.form.controls.dateRangeType.setValue(component.DateRangeType.BETWEEN); + fixture.detectChanges(); + component.betweenStartDateFormControl.setValue(startDateSampleValue); + component.betweenEndDateFormControl.setValue(endDateSampleValue); + fixture.detectChanges(); + expect(component.valid.emit).toHaveBeenCalledWith(true); + }); + + it('should not emit values when form is invalid', () => { + spyOn(component.changed, 'emit'); + let value = { + dateRangeType: component.DateRangeType.IN_LAST, + inLastValueType: component.InLastDateType.WEEKS, + inLastValue: '', + betweenStartDate: undefined, + betweenEndDate: undefined + }; + let dateRangeTypeRadioButton = getElementBySelector('[data-automation-id="date-range-advanced-in-last"] .mat-radio-input'); + dateRangeTypeRadioButton.click(); + selectDropdownOption('date-range-advanced-in-last-option-weeks'); + enterValueInInputField('date-range-advanced-in-last-input', ''); + fixture.detectChanges(); + expect(component.changed.emit).not.toHaveBeenCalledWith(value); + + component.form.patchValue({ + dateRangeType: component.DateRangeType.ANY, + inLastValueType: component.InLastDateType.DAYS, + inLastValue: undefined, + betweenStartDate: undefined, + betweenEndDate: undefined + }); + + value = { + dateRangeType: component.DateRangeType.BETWEEN, + inLastValueType: component.InLastDateType.DAYS, + inLastValue: undefined, + betweenStartDate: '', + betweenEndDate: '' + } + dateRangeTypeRadioButton = getElementBySelector('[data-automation-id="date-range-advanced-between"] .mat-radio-input'); + dateRangeTypeRadioButton.click(); + fixture.detectChanges(); + expect(component.changed.emit).not.toHaveBeenCalledWith(value); + }); + + it('should emit values when form is valid', () => { + spyOn(component.changed, 'emit'); + let value = { + dateRangeType: component.DateRangeType.IN_LAST, + inLastValueType: component.InLastDateType.WEEKS, + inLastValue: 5, + betweenStartDate: null, + betweenEndDate: null + }; + let dateRangeTypeRadioButton = getElementBySelector('[data-automation-id="date-range-advanced-in-last"] .mat-radio-input'); + dateRangeTypeRadioButton.click(); + selectDropdownOption('date-range-advanced-in-last-option-weeks'); + enterValueInInputField('date-range-advanced-in-last-input', '5'); + fixture.detectChanges(); + expect(component.changed.emit).toHaveBeenCalledWith(value); + + component.form.patchValue({ + dateRangeType: component.DateRangeType.ANY, + inLastValueType: component.InLastDateType.DAYS, + inLastValue: undefined, + betweenStartDate: undefined, + betweenEndDate: undefined + }); + + value = { + dateRangeType: component.DateRangeType.BETWEEN, + inLastValueType: component.InLastDateType.DAYS, + inLastValue: undefined, + betweenStartDate: startDateSampleValue, + betweenEndDate: endDateSampleValue + } + dateRangeTypeRadioButton = getElementBySelector('[data-automation-id="date-range-advanced-between"] .mat-radio-input'); + dateRangeTypeRadioButton.click(); + component.betweenStartDateFormControl.setValue(startDateSampleValue); + component.betweenEndDateFormControl.setValue(endDateSampleValue); + fixture.detectChanges(); + expect(component.changed.emit).toHaveBeenCalledWith(value); + }); }); diff --git a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.ts b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.ts index 99c26ce011..804c181a71 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.ts @@ -185,7 +185,7 @@ export class SearchDateRangeAdvancedComponent implements OnInit, OnDestroy { // formControl.errors.required = true; // formControl.errors.dateFormatInvalid = false; // } else { - // const date = parse(event.target['value'], this.datePickerFormat, new Date()); + // const date = parse(event.target['value'], this.dateFormat, new Date()); // if(!isValid(date)) { // formControl.errors.dateFormatInvalid = true; // } else { diff --git a/lib/content-services/src/lib/search/components/search-filter-tabbed/search-filter-tabbed.component.spec.ts b/lib/content-services/src/lib/search/components/search-filter-tabbed/search-filter-tabbed.component.spec.ts deleted file mode 100644 index 0f744fcd6d..0000000000 --- a/lib/content-services/src/lib/search/components/search-filter-tabbed/search-filter-tabbed.component.spec.ts +++ /dev/null @@ -1,97 +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 { ComponentFixture, TestBed } from '@angular/core/testing'; -import { TranslateModule } from '@ngx-translate/core'; -import { ContentTestingModule } from '../../../testing/content.testing.module'; -import { SearchFilterTabbedComponent } from './search-filter-tabbed.component'; - -fdescribe('SearchFilterTabbedComponent', () => { - let component: SearchFilterTabbedComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - declarations: [SearchFilterTabbedComponent], - imports: [ - TranslateModule.forRoot(), - ContentTestingModule - ] - }); - fixture = TestBed.createComponent(SearchFilterTabbedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should emit a single combined query when multiple queries are provided', () => { - spyOn(component.queriesCombined, 'emit'); - component.queries = { - testField1: 'test-query-1', - testField2: 'test-query-2', - testField3: 'test-query-3' - }; - fixture.detectChanges(); - expect(component.queriesCombined.emit).toHaveBeenCalledWith('test-query-1 AND test-query-2 AND test-query-3'); - }); - - it ('should emit a single combined value to display when multiple display values are provided', () => { - spyOn(component.valuesToDisplayCombined, 'emit'); - component.settings = { - field: 'testField1, testField2, testField3', - displayedLabelsByField: { - testField1: 'Field 1', - testField2: 'Field 2', - testField3: 'Field 3' - } - }; - component.valuesToDisplay = { - testField1: 'test-display-value-1', - testField2: 'test-display-value-2', - testField3: 'test-display-value-3' - }; - fixture.detectChanges(); - expect(component.valuesToDisplayCombined.emit).toHaveBeenCalledWith('FIELD 1: test-display-value-1 FIELD 2: test-display-value-2 FIELD 3: test-display-value-3'); - }); - - it('should emit translated display labels by field when settings are set', () => { - spyOn(component.displayedLabelsByFieldTranslated, 'emit'); - component.settings = { - field: 'testField1, testField2, testField3', - displayedLabelsByField: { - testField1: 'Field 1', - testField2: 'Field 2', - testField3: 'Field 3' - } - }; - fixture.detectChanges(); - const displayedLabelsMap = { - testField1: 'Field 1', - testField2: 'Field 2', - testField3: 'Field 3' - }; - expect(component.displayedLabelsByFieldTranslated.emit).toHaveBeenCalledWith(displayedLabelsMap); - }); - - it('should emit an array of fields when all the fields are provided in a combined string via settings', () => { - spyOn(component.fieldsChanged, 'emit'); - component.settings = { - field: 'testField1, testField2, testField3' - }; - fixture.detectChanges(); - expect(component.fieldsChanged.emit).toHaveBeenCalledWith(['testField1', 'testField2', 'testField3']); - }); -});