Files
alfresco-ng2-components/lib/content-services/src/lib/search/components/search-date-range-advanced-tabbed/search-date-range-advanced/search-date-range-advanced.component.ts
swapnil.verma 640a736530 [ACS-4985] Resolved e2e test cases
[ACS-4985] Revert test fix for e2e execution. Updated search.config.ts for e2e test cases
Testing global install of webdriver-manager for e2e webdriver fix
[ACS-4985] Resolved e2e test failures
[ACS-4985] Increased value for drag emulation to account for increased width of the side filters panel in demo-shell search results window.
[ACS-4985] Resolved unit test failures
[ACS-4985] Resolved lint issues
[ACS-4985] Moved new components to v6.2.0 in versionIndex.md
[ACS-4985] Added documentation to versionIndex.md and README.md
[ACS-4985] Moved inLast input field back to input type number.
[ACS-4985] Resolved issue where typing a special character after adding some numbers in the 'In the last' input field would clear out the field
[ACS-4985] Updated test cases after query generation changes
[ACS-4985] Added missing null check when generating query
[ACS-4985] Added *ngFor back to the search-date-range-advanced-tabbed.component.html
[ACS-4985] Updated query generation logic. Now both 'In the last' and 'Between' options use the start date to end date query format
[ACS-4985] Removed ANY case from switch (will be handled by default case)
[ACS-4985] Split declarations into multiple lines
[ACS-4985] Fixed code smell in regex
[ACS-4985] Updated dates in documentation
[ACS-4985] Updated documentation
[ACS-4985] Added link for AngularMaterial bug for CSS workaround
[ACS-4985] Added test cases for end date validation. Fixed minor issue when setting invalid date error on between date form fields
[ACS-4985] Added validation when user manually enters the start and end dates
[ACS-4985] Added borders to inputs
[ACS-4985] Updated test cases for SearchDateRangeAdvancedTabbedComponent
[ACS-4985] Transferred business logic from SearchDateRangeAdvancedComponent and SearchFilterTabbedComponent to SearchDateRangeAdvancedTabbedComponent. Updated test cases accordingly
[ACS-4985] Resolved PR review comments
[ACS-4985] Removed unused code from base-query-builder.service.ts
[ACS-4985] Resolved linting and unit test issues
[ACS-4985] Resolved minor issues where switching between tabs could sometime cause the tab content to not show up
[ACS-4985] Resolved minor issues with display label creation
[ACS-4985] Updated component to use MatDateFnsAdapter. BetweenStartDate and BetweenEndDate are now formatted when selected from the calender
[ACS-4985] Resolved issue where clear button would not clear the values properly
[ACS-4985] Added @angular/material-date-fns-adapter package
[ACS-4985] Added image for updated documentation
[ACS-4985] Added validation to SearchDateRangeAdvancedComponent
[ACS-4985] Updated documentation for components
[ACS-4985] Removed disableUpdateOnSubmit flag from search widgets
[ACS-4985] Updated the documentation for the components
[ACS-4985] Added test cases for SearchDateRangeAdvancedTabbedComponent. Moved pending logic from template to typescript
[ACS-4985] Added clear and apply button to SearchDateRangeAdvancedTabbedComponent. Moved logic from template to typescript file
[ACS-4985] Updated test cases for SearchFilterTabbedComponent. Added safety checks to component
[ACS-4985] Added field validation to test case
[ACS-4985] Updated SearchDateRangeAdvancedTabbed component to no longer use getters and setters
[ACS-4985] Updated test cases for SearchDateRangeAdvancedComponent. Minor updates to the component template and logic. Component no longer uses getters and setters in template
[ACS-4985] Updated SearchDateRangeAdvancedTabbed component to use variables instead of getters and setters
[ACS-4985] Updated app.cconfig for demo-shell to use new date-range-advanced configuration
ACS-4985 Fixed issue with nx build, some clean ups, using changes in configuration
[ACS-4985] Updated test cases for changed date format
[ACS-4985] Updated date formats for SearchDateRangeAdvancedComponent
[ACS-4985] Removed fdescribe test cases for SearchDateRangeAdvancedComponent.
[ACS-4985] Fixed test cases for SearchDateRangeAdvancedComponent.
[ACS-4985] Fixed erroneous imports
[ACS-4985] Added license headers and re-ordered imports
[ACS-4985] Updated test cases for SearchDateRangeAdvancedComponent from moment.js to date-fns
[ACS-4985] Migrated SearchDateRangeAdvancedComponent from moment.js to date-fns
Added import for BaseQueryBuilderService in public-api.ts. Fixes #8647
[ACS-4985] Updated imports in test cases
[ACS-4985] Added exports for SearchDateRangeAdvanced and SearchFilterTabbed components to public-api.ts. Updated imports in both components
[ACS-4985] Resolved minor issue where the reset method would still trigger multiple api calls when used with the TabbedComponent
[ACS-4985] Added test cases for SearchDateRangeAdvancedComponent. Minor update to test cases for SearchFilterTabbedComponent
[ACS-4985] Updated Labels for 'In last' date range option
[ACS-4985] Updated SearchModule declarations. Fixed minor typo in SearchFilterTabbedComponent
[ACS-4985] Added test cases for SearchFilterTabbedComponent. Added test case placeholders for SearchDateRangeAdvancedComponent
[ACS-4985] Added data-automation-id to search-date-range-advanced.component.html
[ACS-4985] Added test cases for SearchFilterTabbedComponent
[ACS-4985] Removed vertical mode from SearchFilterTabbedComponent
[ACS-4985] Updated UI for search filters. Minor fixes
[ACS-4985] Added documentation for SearchFilterTabbedComponent and SearchDateRangeAdvancedComponent
[ACS-4985] Added compatibility of all search filters/facets with SearchFilterTabbedComponent
[ACS-4985] Using widget-composite component now correctly updates the search query on submit. Added optional property to disable update on submit button click for widget-composite.
[ACS-4985] Added SearchFilterTabbedComponent and SearchDateRangeAdvancedComponent. Added config for using the new components
2023-07-24 09:28:11 +02:00

181 lines
7.0 KiB
TypeScript

/*!
* @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 { Component, EventEmitter, Inject, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';
import { Subject } from 'rxjs';
import { endOfDay, parse, isValid, isBefore, isAfter } from 'date-fns';
import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, MatDateFormats } from '@angular/material/core';
import { DateFnsAdapter, MAT_DATE_FNS_FORMATS } from '@angular/material-date-fns-adapter';
import { InLastDateType } from './in-last-date-type';
import { DateRangeType } from './date-range-type';
import { SearchDateRangeAdvanced } from './search-date-range-advanced';
import { FormBuilder, UntypedFormControl, Validators } from '@angular/forms';
import { takeUntil } from 'rxjs/operators';
import { UserPreferencesService, UserPreferenceValues, DateFnsUtils } from '@alfresco/adf-core';
const DEFAULT_DATE_DISPLAY_FORMAT = 'dd-MMM-yy';
@Component({
selector: 'adf-search-date-range-advanced',
templateUrl: './search-date-range-advanced.component.html',
styleUrls: ['./search-date-range-advanced.component.scss'],
providers: [
{ provide: DateAdapter, useClass: DateFnsAdapter, deps: [ MAT_DATE_LOCALE ] },
{ provide: MAT_DATE_FORMATS, useValue: MAT_DATE_FNS_FORMATS }
],
encapsulation: ViewEncapsulation.None,
host: {class: 'adf-search-date-range-advanced'}
})
export class SearchDateRangeAdvancedComponent implements OnInit, OnDestroy {
@Input()
dateFormat = DEFAULT_DATE_DISPLAY_FORMAT;
@Input()
maxDate: string;
@Input()
field: string;
@Input()
set initialValue(value: SearchDateRangeAdvanced) {
if (value) {
this.form.patchValue(value);
}
}
@Output()
changed = new EventEmitter<Partial<SearchDateRangeAdvanced>>();
@Output()
valid = new EventEmitter<boolean>();
form = this.formBuilder.group<SearchDateRangeAdvanced>({
dateRangeType: DateRangeType.ANY,
inLastValueType: InLastDateType.DAYS,
inLastValue: undefined,
betweenStartDate: undefined,
betweenEndDate: undefined
});
betweenStartDateFormControl = this.form.controls.betweenStartDate;
betweenEndDateFormControl = this.form.controls.betweenEndDate;
convertedMaxDate: Date;
private destroy$ = new Subject<void>();
readonly DateRangeType = DateRangeType;
readonly InLastDateType = InLastDateType;
constructor(private formBuilder: FormBuilder,
private userPreferencesService: UserPreferencesService,
private dateAdapter: DateAdapter<DateFnsAdapter>,
@Inject(MAT_DATE_FORMATS) private dateFormatConfig: MatDateFormats) {}
readonly endDateValidator = (formControl: UntypedFormControl): ({ [key: string]: boolean } | null) => {
if (isBefore(formControl.value, this.betweenStartDateFormControl.value) || isAfter(formControl.value, this.convertedMaxDate)) {
return {
invalidDate: true
};
}
return {};
};
ngOnInit(): void {
this.dateFormatConfig.display.dateInput = this.dateFormat;
this.convertedMaxDate = endOfDay(this.maxDate && this.maxDate !== 'today' ?
parse(this.maxDate, this.dateFormat, new Date()) : new Date());
this.userPreferencesService
.select(UserPreferenceValues.Locale)
.pipe(takeUntil(this.destroy$))
.subscribe(locale => this.dateAdapter.setLocale(DateFnsUtils.getLocaleFromString(locale)));
this.form.controls.dateRangeType.valueChanges.pipe(takeUntil(this.destroy$))
.subscribe((dateRangeType) => this.updateValidators(dateRangeType));
this.form.valueChanges.pipe(takeUntil(this.destroy$))
.subscribe(() => this.onChange());
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
private updateValidators(dateRangeType: DateRangeType) {
switch(dateRangeType) {
case DateRangeType.BETWEEN:
this.betweenStartDateFormControl.setValidators(Validators.required);
this.betweenEndDateFormControl.setValidators([Validators.required, this.endDateValidator]);
this.form.controls.inLastValue.clearValidators();
break;
case DateRangeType.IN_LAST:
this.form.controls.inLastValue.setValidators(Validators.required);
this.betweenStartDateFormControl.clearValidators();
this.betweenEndDateFormControl.clearValidators();
break;
default:
this.form.controls.inLastValue.clearValidators();
this.betweenStartDateFormControl.clearValidators();
this.betweenEndDateFormControl.clearValidators();
break;
}
this.betweenStartDateFormControl.updateValueAndValidity();
this.betweenEndDateFormControl.updateValueAndValidity();
this.form.controls.inLastValue.updateValueAndValidity();
}
private onChange(): void {
if (this.form.valid) {
this.changed.emit(this.form.value);
}
this.valid.emit(this.form.valid);
}
dateChanged(event: Event, formControl: UntypedFormControl) {
if (event?.target['value']?.trim()) {
const date = parse(event.target['value'], this.dateFormat, new Date());
if(!isValid(date)) {
formControl.setErrors({
...formControl.errors,
required: false,
invalidDate: true
});
} else {
formControl.setErrors({
...formControl.errors,
invalidDate: false
});
formControl.setValue(date);
}
}
}
narrowDownAllowedCharacters(event: Event) {
if (parseInt((event.target as HTMLInputElement).value, 10) === 0) {
(event.target as HTMLInputElement).value = '';
} else {
(event.target as HTMLInputElement).value = (event.target as HTMLInputElement).value.replace(/\D/g, '');
}
}
preventIncorrectNumberCharacters(event: KeyboardEvent): boolean {
switch(event.key) {
case '.':
case '-':
case 'e':
case '+':
return false;
case '0':
return !!(event.target as HTMLInputElement).value;
default:
return true;
}
}
}