diff --git a/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts b/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts index 8de3740a56e..04dcb68ff53 100644 --- a/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts +++ b/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts @@ -30,12 +30,12 @@ import { MetadataViewPage } from '../../core/pages/metadata-view.page'; import { FileModel } from '../../models/ACS/file.model'; import { browser } from 'protractor'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; -import * as moment from 'moment'; +import { format } from 'date-fns'; describe('Metadata component', () => { const METADATA = { - DATA_FORMAT: 'll', + DATA_FORMAT: 'PP', TITLE: 'Details', COMMENTS_TAB: 'COMMENTS', PROPERTY_TAB: 'PROPERTIES', @@ -108,21 +108,36 @@ describe('Metadata component', () => { await viewerPage.checkInfoSideBarIsDisplayed(); await metadataViewPage.clickOnPropertiesTab(); - await expect(await metadataViewPage.getTitle()).toEqual(METADATA.TITLE); - await expect(await viewerPage.getActiveTab()).toEqual(METADATA.PROPERTY_TAB); - await expect(await metadataViewPage.getExpandedAspectName()).toEqual(METADATA.DEFAULT_ASPECT); - await expect(await metadataViewPage.getName()).toEqual(pngFileModel.name); - await expect(await metadataViewPage.getCreator()).toEqual(pngFileModel.getCreatedByUser().displayName); - await expect(await metadataViewPage.getCreatedDate()).toEqual(moment(pngFileModel.createdAt).format(METADATA.DATA_FORMAT)); - await expect(await metadataViewPage.getModifier()).toEqual(pngFileModel.getCreatedByUser().displayName); - await expect(await metadataViewPage.getModifiedDate()).toEqual(moment(pngFileModel.createdAt).format(METADATA.DATA_FORMAT)); - await expect(await metadataViewPage.getMimetypeName()).toEqual(pngFileModel.getContent().mimeTypeName); - await expect(await metadataViewPage.getSize()).toEqual(pngFileModel.getContent().getSizeInBytes()); + const title = await metadataViewPage.getTitle(); + const activeTab = await viewerPage.getActiveTab(); + const expandedAspectName = await metadataViewPage.getExpandedAspectName(); + const name = await metadataViewPage.getName(); + const creator = await metadataViewPage.getCreator(); + const createdDate = await metadataViewPage.getCreatedDate(); + const modifier = await metadataViewPage.getModifier(); + const modifiedDate = await metadataViewPage.getModifiedDate(); + const mimeTypeName = await metadataViewPage.getMimetypeName(); + const size = await metadataViewPage.getSize(); + + expect(title).toEqual(METADATA.TITLE); + expect(activeTab).toEqual(METADATA.PROPERTY_TAB); + expect(expandedAspectName).toEqual(METADATA.DEFAULT_ASPECT); + expect(name).toEqual(pngFileModel.name); + expect(creator).toEqual(pngFileModel.getCreatedByUser().displayName); + expect(createdDate).toEqual(format(new Date(pngFileModel.createdAt), METADATA.DATA_FORMAT), pngFileModel.createdAt); + expect(modifier).toEqual(pngFileModel.getCreatedByUser().displayName); + expect(modifiedDate).toEqual(format(new Date(pngFileModel.createdAt), METADATA.DATA_FORMAT), pngFileModel.createdAt); + expect(mimeTypeName).toEqual(pngFileModel.getContent().mimeTypeName); + expect(size).toEqual(pngFileModel.getContent().getSizeInBytes()); await metadataViewPage.editIconIsDisplayed(); await metadataViewPage.informationButtonIsDisplayed(); - await expect(await metadataViewPage.getInformationButtonText()).toEqual(METADATA.MORE_INFO_BUTTON); - await expect(await metadataViewPage.getInformationIconText()).toEqual(METADATA.ARROW_DOWN); + + const informationButtonText = await metadataViewPage.getInformationButtonText(); + const informationIconText = await metadataViewPage.getInformationIconText(); + + expect(informationButtonText).toEqual(METADATA.MORE_INFO_BUTTON); + expect(informationIconText).toEqual(METADATA.ARROW_DOWN); }); it('[C272769] Should be possible to display more details when clicking on More Information button', async () => { @@ -131,8 +146,12 @@ describe('Metadata component', () => { await metadataViewPage.clickOnPropertiesTab(); await metadataViewPage.informationButtonIsDisplayed(); await metadataViewPage.clickOnInformationButton(); - await expect(await metadataViewPage.getInformationButtonText()).toEqual(METADATA.LESS_INFO_BUTTON); - await expect(await metadataViewPage.getInformationIconText()).toEqual(METADATA.ARROW_UP); + + const informationButtonText = await metadataViewPage.getInformationButtonText(); + const informationIconText = await metadataViewPage.getInformationIconText(); + + expect(informationButtonText).toEqual(METADATA.LESS_INFO_BUTTON); + expect(informationIconText).toEqual(METADATA.ARROW_UP); }); it('[C270952] Should be possible to open/close properties using info icon', async () => { diff --git a/e2e/protractor.excludes.json b/e2e/protractor.excludes.json index 7c542acc776..e7070b431fa 100644 --- a/e2e/protractor.excludes.json +++ b/e2e/protractor.excludes.json @@ -10,5 +10,6 @@ "C313200": "https://alfresco.atlassian.net/browse/APPS-2234", "C311318-3": "https://alfresco.atlassian.net/browse/APPS-2254", "C311319-2": "https://alfresco.atlassian.net/browse/APPS-2254", - "C311319-4": "https://alfresco.atlassian.net/browse/APPS-2254" + "C311319-4": "https://alfresco.atlassian.net/browse/APPS-2254", + "C297691": "https://alfresco.atlassian.net/browse/APPS-2254" } diff --git a/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts b/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts index fa7be54f037..2dce8738c68 100644 --- a/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts +++ b/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts @@ -17,7 +17,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import moment from 'moment'; import { CardViewDateItemModel } from '../../models/card-view-dateitem.model'; import { CardViewUpdateService } from '../../services/card-view-update.service'; import { CardViewDateItemComponent } from './card-view-dateitem.component'; @@ -26,6 +25,7 @@ import { ClipboardService } from '../../../clipboard/clipboard.service'; import { CardViewDatetimeItemModel } from '../../models/card-view-datetimeitem.model'; import { TranslateModule } from '@ngx-translate/core'; import { AppConfigService } from '@alfresco/adf-core'; +import { MatDatetimepickerInputEvent } from '@mat-datetimepicker/core'; describe('CardViewDateItemComponent', () => { @@ -192,15 +192,15 @@ describe('CardViewDateItemComponent', () => { const itemUpdatedSpy = spyOn(cardViewUpdateService.itemUpdated$, 'next'); component.editable = true; component.property.editable = true; - const expectedDate = moment('Jul 10 2017', 'MMM DD YYYY'); + const expectedDate = new Date('Jul 10 2017'); fixture.detectChanges(); const property = { ...component.property }; - component.onDateChanged({ value: expectedDate }); + component.onDateChanged({ value: expectedDate } as MatDatetimepickerInputEvent); expect(itemUpdatedSpy).toHaveBeenCalledWith({ target: property, changed: { - dateKey: expectedDate.toDate() + dateKey: expectedDate } }); }); @@ -209,13 +209,13 @@ describe('CardViewDateItemComponent', () => { component.editable = true; component.property.editable = true; component.property.value = null; - const expectedDate = moment('Jul 10 2017', 'MMM DD YY'); + const expectedDate = new Date('Jul 10 2017'); fixture.detectChanges(); - component.onDateChanged({ value: expectedDate }); + component.onDateChanged({ value: expectedDate } as MatDatetimepickerInputEvent); await fixture.whenStable(); - expect(component.property.value).toEqual(expectedDate.toDate()); + expect(component.property.value).toEqual(expectedDate); }); it('should copy value to clipboard on double click', () => { @@ -236,7 +236,7 @@ describe('CardViewDateItemComponent', () => { it('should render the clear icon in case of displayClearAction:true', () => { component.editable = true; component.property.editable = true; - component.property.value = 'Jul 10 2017'; + component.property.value = new Date('Jul 10 2017'); fixture.detectChanges(); const datePickerClearToggle = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-date-clear-${component.property.key}"]`)); @@ -257,7 +257,7 @@ describe('CardViewDateItemComponent', () => { component.editable = true; component.property.editable = true; component.displayClearAction = false; - component.property.value = 'Jul 10 2017'; + component.property.value = new Date('Jul 10 2017'); fixture.detectChanges(); const datePickerClearToggle = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-date-clear--${component.property.key}"]`)); @@ -267,7 +267,7 @@ describe('CardViewDateItemComponent', () => { it('should remove the property value after a successful clear attempt', async () => { component.editable = true; component.property.editable = true; - component.property.value = 'Jul 10 2017'; + component.property.value = new Date('Jul 10 2017'); fixture.detectChanges(); component.onDateClear(); @@ -294,7 +294,7 @@ describe('CardViewDateItemComponent', () => { component.editable = true; component.property.editable = true; component.property.default = 'Jul 10 2017'; - component.property.value = 'Jul 10 2017'; + component.property.value = new Date('Jul 10 2017'); fixture.detectChanges(); const property = { ...component.property }; @@ -320,8 +320,8 @@ describe('CardViewDateItemComponent', () => { component.property.default = 'Jul 10 2017 00:01:00'; component.property.key = 'fake-key'; component.dateFormat = 'M/d/yy, h:mm a'; - component.property.value = 'Jul 10 2017 00:01:00'; - const expectedDate = moment('Jul 10 2018', 'MMM DD YY h:m:s'); + component.property.value = new Date('Jul 10 2017 00:01:00'); + const expectedDate = new Date('Jul 10 2018'); fixture.detectChanges(); await fixture.whenStable(); @@ -329,10 +329,10 @@ describe('CardViewDateItemComponent', () => { const element = fixture.debugElement.nativeElement.querySelector('span[data-automation-id="card-date-value-fake-key"]'); expect(element).toBeDefined(); expect(element.innerText).toEqual('Jul 10, 2017'); - component.onDateChanged({ value: expectedDate }); + component.onDateChanged({ value: expectedDate } as MatDatetimepickerInputEvent); fixture.detectChanges(); - expect(component.property.value).toEqual(expectedDate.toDate()); + expect(component.property.value).toEqual(expectedDate); }); it('should render chips for multivalue dates when chips are enabled', async () => { diff --git a/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.ts b/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.ts index a7c9c30a7e7..875b2ccd4e6 100644 --- a/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.ts +++ b/lib/core/src/lib/card-view/components/card-view-dateitem/card-view-dateitem.component.ts @@ -17,26 +17,26 @@ import { Component, Input, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core'; -import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepickerComponent } from '@mat-datetimepicker/core'; -import { MAT_MOMENT_DATETIME_FORMATS, MomentDatetimeAdapter } from '@mat-datetimepicker/moment'; -import moment, { Moment } from 'moment'; +import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepickerComponent, MatDatetimepickerInputEvent } from '@mat-datetimepicker/core'; import { CardViewDateItemModel } from '../../models/card-view-dateitem.model'; import { UserPreferencesService, UserPreferenceValues } from '../../../common/services/user-preferences.service'; -import { MomentDateAdapter } from '../../../common/utils/moment-date-adapter'; -import { MOMENT_DATE_FORMATS } from '../../../common/utils/moment-date-formats.model'; import { AppConfigService } from '../../../app-config/app-config.service'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { BaseCardView } from '../base-card-view'; import { ClipboardService } from '../../../clipboard/clipboard.service'; import { TranslationService } from '../../../translation/translation.service'; +import { ADF_DATE_FORMATS, AdfDateFnsAdapter } from '../../../common/utils/date-fns-adapter'; +import { ADF_DATETIME_FORMATS, AdfDateTimeFnsAdapter } from '../../../common/utils/datetime-fns-adapter'; +import { DateFnsUtils } from '../../../common'; +import { isValid } from 'date-fns'; @Component({ providers: [ - { provide: DateAdapter, useClass: MomentDateAdapter }, - { provide: MAT_DATE_FORMATS, useValue: MOMENT_DATE_FORMATS }, - { provide: DatetimeAdapter, useClass: MomentDatetimeAdapter }, - { provide: MAT_DATETIME_FORMATS, useValue: MAT_MOMENT_DATETIME_FORMATS } + { provide: MAT_DATE_FORMATS, useValue: ADF_DATE_FORMATS }, + { provide: MAT_DATETIME_FORMATS, useValue: ADF_DATETIME_FORMATS }, + { provide: DateAdapter, useClass: AdfDateFnsAdapter }, + { provide: DatetimeAdapter, useClass: AdfDateTimeFnsAdapter } ], selector: 'adf-card-view-dateitem', templateUrl: './card-view-dateitem.component.html', @@ -44,7 +44,6 @@ import { TranslationService } from '../../../translation/translation.service'; encapsulation: ViewEncapsulation.None }) export class CardViewDateItemComponent extends BaseCardView implements OnInit, OnDestroy { - @Input() property: CardViewDateItemModel; @@ -60,16 +59,18 @@ export class CardViewDateItemComponent extends BaseCardView; - valueDate: Moment; + valueDate: Date; dateFormat: string; private onDestroy$ = new Subject(); - constructor(private dateAdapter: DateAdapter, - private userPreferencesService: UserPreferencesService, - private appConfig: AppConfigService, - private clipboardService: ClipboardService, - private translateService: TranslationService) { + constructor( + private dateAdapter: DateAdapter, + private userPreferencesService: UserPreferencesService, + private appConfig: AppConfigService, + private clipboardService: ClipboardService, + private translateService: TranslationService + ) { super(); this.dateFormat = this.appConfig.get('dateValues.defaultDateFormat'); } @@ -78,16 +79,20 @@ export class CardViewDateItemComponent extends BaseCardView { + .subscribe((locale) => { this.property.locale = locale; }); - (this.dateAdapter as MomentDateAdapter).overrideDisplayFormat = 'MMM DD'; + (this.dateAdapter as AdfDateFnsAdapter).displayFormat = 'MMM DD'; - if (this.property.value) { - this.valueDate = moment(this.property.value, this.dateFormat); - } else if (this.property.multivalued && !this.property.value) { - this.property.value = []; + if (this.property.multivalued) { + if (!this.property.value) { + this.property.value = []; + } + } else { + if (this.property.value && !Array.isArray(this.property.value)) { + this.valueDate = DateFnsUtils.localToUtc(DateFnsUtils.parseDate(this.property.value, this.dateFormat)); + } } } @@ -112,12 +117,11 @@ export class CardViewDateItemComponent extends BaseCardView) { + if (event.value) { + if (isValid(event.value)) { + this.valueDate = event.value; + this.property.value = DateFnsUtils.utcToLocal(event.value); this.update(); } } @@ -130,24 +134,27 @@ export class CardViewDateItemComponent extends BaseCardView) { + if (event.value) { + if (isValid(event.value) && this.property.multivalued && Array.isArray(this.property.value)) { + this.property.value.push(DateFnsUtils.utcToLocal(event.value)); this.update(); } } } removeValueFromList(itemIndex: number) { - this.property.value.splice(itemIndex, 1); - this.update(); + if (this.property.multivalued && Array.isArray(this.property.value)) { + this.property.value.splice(itemIndex, 1); + this.update(); + } } update() { diff --git a/lib/core/src/lib/card-view/models/card-view-baseitem.model.ts b/lib/core/src/lib/card-view/models/card-view-baseitem.model.ts index de49a9b5270..46042f665ca 100644 --- a/lib/core/src/lib/card-view/models/card-view-baseitem.model.ts +++ b/lib/core/src/lib/card-view/models/card-view-baseitem.model.ts @@ -18,9 +18,9 @@ import { CardViewItemProperties, CardViewItemValidator } from '../interfaces/card-view.interfaces'; import validatorsMap from '../validators/validators.map'; -export abstract class CardViewBaseItemModel { +export abstract class CardViewBaseItemModel { label: string; - value: any; + value: T; key: any; default: any; editable: boolean; @@ -32,21 +32,21 @@ export abstract class CardViewBaseItemModel { type?: string; multivalued?: boolean; - constructor(cardViewItemProperties: CardViewItemProperties) { - this.label = cardViewItemProperties.label || ''; - this.value = cardViewItemProperties.value?.displayName || cardViewItemProperties.value; - this.key = cardViewItemProperties.key; - this.default = cardViewItemProperties.default; - this.editable = !!cardViewItemProperties.editable; - this.clickable = !!cardViewItemProperties.clickable; - this.icon = cardViewItemProperties.icon || ''; - this.hint = cardViewItemProperties.hint || ''; - this.validators = cardViewItemProperties.validators || []; - this.data = cardViewItemProperties.data || null; - this.multivalued = !!cardViewItemProperties.multivalued; + constructor(props: CardViewItemProperties) { + this.label = props.label || ''; + this.value = props.value?.displayName || props.value; + this.key = props.key; + this.default = props.default; + this.editable = !!props.editable; + this.clickable = !!props.clickable; + this.icon = props.icon || ''; + this.hint = props.hint || ''; + this.validators = props.validators || []; + this.data = props.data || null; + this.multivalued = !!props.multivalued; - if (cardViewItemProperties?.constraints?.length ?? 0) { - for (const constraint of cardViewItemProperties.constraints) { + if (props?.constraints?.length ?? 0) { + for (const constraint of props.constraints) { if (constraint.type !== 'LIST') { this.validators.push(validatorsMap[constraint.type.toLowerCase()](constraint.parameters)); } @@ -55,10 +55,15 @@ export abstract class CardViewBaseItemModel { } isEmpty(): boolean { - return this.value === undefined || this.value === null || this.value.length === 0; + return ( + this.value === undefined || + this.value === null || + (typeof this.value === 'string' && this.value.length === 0) || + (Array.isArray(this.value) && this.value.length === 0) + ); } - isValid(newValue: any): boolean { + isValid(newValue: T): boolean { if (!this.validators.length) { return true; } @@ -66,7 +71,7 @@ export abstract class CardViewBaseItemModel { return this.validators.map((validator) => validator.isValid(newValue)).reduce((isValidUntilNow, isValid) => isValidUntilNow && isValid, true); } - getValidationErrors(value): CardViewItemValidator[] { + getValidationErrors(value: T): CardViewItemValidator[] { if (!this.validators.length) { return []; } diff --git a/lib/core/src/lib/card-view/models/card-view-dateitem.model.ts b/lib/core/src/lib/card-view/models/card-view-dateitem.model.ts index 6a2dac24c0b..9d1d99ad5f9 100644 --- a/lib/core/src/lib/card-view/models/card-view-dateitem.model.ts +++ b/lib/core/src/lib/card-view/models/card-view-dateitem.model.ts @@ -21,7 +21,9 @@ import { CardViewBaseItemModel } from './card-view-baseitem.model'; import { CardViewDateItemProperties } from '../interfaces/card-view.interfaces'; import { LocalizedDatePipe } from '../../pipes/localized-date.pipe'; -export class CardViewDateItemModel extends CardViewBaseItemModel implements CardViewItem, DynamicComponentModel { +type DateItemType = Date | Date[] | null; + +export class CardViewDateItemModel extends CardViewBaseItemModel implements CardViewItem, DynamicComponentModel { type: string = 'date'; format: string; locale: string; @@ -41,19 +43,19 @@ export class CardViewDateItemModel extends CardViewBaseItemModel implements Card } - get displayValue() { + get displayValue(): string | string[] { if (this.multivalued) { - if (this.value) { + if (this.value && Array.isArray(this.value)) { return this.value.map((date) => this.transformDate(date)); } else { return this.default ? [this.default] : []; } } else { - return this.value ? this.transformDate(this.value) : this.default; + return this.value && !Array.isArray(this.value) ? this.transformDate(this.value) : this.default; } } - transformDate(value: any) { + transformDate(value: Date | string | number): string { this.localizedDatePipe = new LocalizedDatePipe(); return this.localizedDatePipe.transform(value, this.format, this.locale); } diff --git a/lib/core/src/lib/card-view/validators/card-view-item-float.validator.ts b/lib/core/src/lib/card-view/validators/card-view-item-float.validator.ts index 96a1afb3a83..b3324257016 100644 --- a/lib/core/src/lib/card-view/validators/card-view-item-float.validator.ts +++ b/lib/core/src/lib/card-view/validators/card-view-item-float.validator.ts @@ -21,7 +21,7 @@ export class CardViewItemFloatValidator implements CardViewItemValidator { message = 'CORE.CARDVIEW.VALIDATORS.FLOAT_VALIDATION_ERROR'; - isValid(value: any): boolean { + isValid(value: any | any[]): boolean { if (Array.isArray(value)) { return value.every(this.isDecimalNumber); } diff --git a/lib/core/src/lib/card-view/validators/card-view-item-int.validator.ts b/lib/core/src/lib/card-view/validators/card-view-item-int.validator.ts index b4776a19a32..9104194acdb 100644 --- a/lib/core/src/lib/card-view/validators/card-view-item-int.validator.ts +++ b/lib/core/src/lib/card-view/validators/card-view-item-int.validator.ts @@ -21,7 +21,7 @@ export class CardViewItemIntValidator implements CardViewItemValidator { message = 'CORE.CARDVIEW.VALIDATORS.INT_VALIDATION_ERROR'; - isValid(value: any): boolean { + isValid(value: any | any[]): boolean { if (Array.isArray(value)) { return value.every(this.isIntegerNumber); } diff --git a/lib/core/src/lib/common/utils/moment-date-adapter.ts b/lib/core/src/lib/common/utils/moment-date-adapter.ts index 2ebc6234b8b..aecdada5f0a 100644 --- a/lib/core/src/lib/common/utils/moment-date-adapter.ts +++ b/lib/core/src/lib/common/utils/moment-date-adapter.ts @@ -20,6 +20,10 @@ import { DateAdapter } from '@angular/material/core'; import moment, { isMoment, Moment } from 'moment'; import { UserPreferencesService, UserPreferenceValues } from '../services/user-preferences.service'; +/** + * @deprecated this class is deprecated and should not be used. + * Consider using `AdfDateFnsAdapter` or `AdfDateTimeFnsAdapter` instead + */ @Injectable() export class MomentDateAdapter extends DateAdapter { private localeData: any = moment.localeData(); diff --git a/lib/core/src/lib/pipes/localized-date.pipe.ts b/lib/core/src/lib/pipes/localized-date.pipe.ts index ee2e58e92a4..d9e22dba44f 100644 --- a/lib/core/src/lib/pipes/localized-date.pipe.ts +++ b/lib/core/src/lib/pipes/localized-date.pipe.ts @@ -55,10 +55,10 @@ export class LocalizedDatePipe implements PipeTransform, OnDestroy { } } - transform(value: any, format?: string, locale?: string): any { + transform(value: Date | string | number, format?: string, locale?: string): string { const actualFormat = format || this.defaultFormat; const actualLocale = locale || this.defaultLocale; - const datePipe: DatePipe = new DatePipe(actualLocale); + const datePipe = new DatePipe(actualLocale); return datePipe.transform(value, actualFormat); } diff --git a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.ts b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.ts index 0ebeaef2412..8773144574d 100644 --- a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.ts @@ -20,18 +20,18 @@ import { AssignmentType, FilterOptions, TaskFilterAction, TaskFilterProperties, import { TaskCloudService } from './../../../services/task-cloud.service'; import { AppsProcessCloudService } from './../../../../app/services/apps-process-cloud.service'; import { DateCloudFilterType, DateRangeFilter } from '../../../../models/date-cloud-filter.model'; -import moment, { Moment } from 'moment'; import { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { debounceTime, filter, finalize, switchMap, takeUntil } from 'rxjs/operators'; import { Observable, Subject } from 'rxjs'; import { DateAdapter } from '@angular/material/core'; -import { TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core'; +import { DateFnsUtils, TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core'; import { TaskFilterDialogCloudComponent } from '../task-filter-dialog/task-filter-dialog-cloud.component'; import { MatDialog } from '@angular/material/dialog'; import { IdentityUserModel } from '../../../../people/models/identity-user.model'; import { IdentityGroupModel } from '../../../../group/models/identity-group.model'; import { MatSelectChange } from '@angular/material/select'; import { Environment } from '../../../../common/interface/environment.interface'; +import { isValid } from 'date-fns'; /* eslint-disable @typescript-eslint/naming-convention */ @@ -142,7 +142,7 @@ export abstract class BaseEditTaskFilterCloudComponent implements OnInit, OnC protected appsProcessCloudService = inject(AppsProcessCloudService); protected dialog = inject(MatDialog); protected formBuilder = inject(UntypedFormBuilder); - protected dateAdapter = inject>(DateAdapter); + protected dateAdapter = inject>(DateAdapter); ngOnInit() { this.userPreferencesService @@ -283,13 +283,20 @@ export abstract class BaseEditTaskFilterCloudComponent implements OnInit, OnC return this.editTaskFilterForm.get(property.key); } - onDateChanged(newDateValue: string | Moment, dateProperty: TaskFilterProperties) { + onDateChanged(newDateValue: string | Date, dateProperty: TaskFilterProperties) { if (newDateValue) { - const momentDate = moment(newDateValue, DATE_FORMAT, true); + let date: Date; + + if (typeof newDateValue === 'string') { + date = DateFnsUtils.parseDate(newDateValue, DATE_FORMAT); + } else { + date = newDateValue; + } + const controller = this.getPropertyController(dateProperty); - if (momentDate.isValid()) { - controller.setValue(momentDate.toISOString(true)); + if (isValid(date)) { + controller.setValue(date.toISOString()); controller.setErrors(null); } else { controller.setErrors({ invalid: true });