From d6e28a17dec02ff5c7636189c00502c93679d9ae Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Tue, 27 Sep 2022 13:34:48 +0200 Subject: [PATCH 1/7] [NAE-1544] Timezone for Date a DateTime field - added timezone offset to http request --- .../authentication/authentication.module.ts | 4 +++- .../services/timezone-interceptor.ts | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.ts diff --git a/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts b/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts index 160aaaf5e4..13bea4a6d4 100644 --- a/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts +++ b/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts @@ -6,8 +6,9 @@ import {authenticationServiceFactory} from './authentication.factory'; import {ConfigurationService} from '../configuration/configuration.service'; import {AuthenticationMethodService} from './services/authentication-method.service'; import {OverlayModule} from '@angular/cdk/overlay'; -import {MatProgressSpinnerModule, MatSpinner} from '@angular/material/progress-spinner'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; import {AnonymousAuthenticationInterceptor} from './services/anonymous-authentication-interceptor'; +import { TimezoneInterceptor } from './services/timezone-interceptor'; @NgModule({ @@ -24,6 +25,7 @@ import {AnonymousAuthenticationInterceptor} from './services/anonymous-authentic providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthenticationInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: AnonymousAuthenticationInterceptor, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: TimezoneInterceptor, multi: true }, { provide: AuthenticationMethodService, useFactory: authenticationServiceFactory, deps: [ConfigurationService, HttpClient] }, // AuthenticationEffects ] diff --git a/projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.ts b/projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.ts new file mode 100644 index 0000000000..2f0dfc0872 --- /dev/null +++ b/projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +@Injectable() +export class TimezoneInterceptor implements HttpInterceptor { + + private readonly TIMEZONE_OFFSET_HEADER_NAME = 'X-Timezone-Offset' + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + req = req.clone({ + headers: req.headers.set(this.TIMEZONE_OFFSET_HEADER_NAME, this.getTimeZoneOffset()) + }); + return next.handle(req) + } + + private getTimeZoneOffset(): string { + return (new Date()).getTimezoneOffset().toString(); + } + +} From f4185786e668353bcdf1aa8903eebc90503cbdf4 Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Thu, 29 Sep 2022 07:52:51 +0200 Subject: [PATCH 2/7] [NAE-1717] Banned roles not hiding menu entries - implemented tests. --- .../services/timezone-interceptor.spec.ts | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.spec.ts diff --git a/projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.spec.ts b/projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.spec.ts new file mode 100644 index 0000000000..a03816a6b4 --- /dev/null +++ b/projects/netgrif-components-core/src/lib/authentication/services/timezone-interceptor.spec.ts @@ -0,0 +1,52 @@ +import {inject, TestBed} from '@angular/core/testing'; +import {ConfigurationService} from '../../configuration/configuration.service'; +import {TestConfigurationService} from '../../utility/tests/test-config'; +import {HTTP_INTERCEPTORS, HttpClient, HttpHeaders} from '@angular/common/http'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {RouterTestingModule} from '@angular/router/testing'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {LoggerService} from '../../logger/services/logger.service'; +import { TimezoneInterceptor } from './timezone-interceptor'; + +describe('TimezoneInterceptor', () => { + let warnSpy: jasmine.Spy; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NoopAnimationsModule, RouterTestingModule.withRoutes([])], + providers: [ + {provide: ConfigurationService, useClass: TestConfigurationService}, + { + provide: HTTP_INTERCEPTORS, + useClass: TimezoneInterceptor, + multi: true + } + ] + }); + warnSpy = spyOn(TestBed.inject(LoggerService), 'warn'); + }); + + describe('intercept HTTP request', () => { + it('should add timezone to Headers', (done) => { + inject([HttpClient, HttpTestingController], + (http: HttpClient, mock: HttpTestingController) => { + + http.get('/api').subscribe(response => { + expect(response).toBeTruthy(); + done(); + }); + const request = mock.expectOne(req => (req.headers.has('X-Timezone-Offset'))); + request.flush({data: 'test'}, {headers: new HttpHeaders({'X-Timezone-Offset': '-120'})}); + mock.verify(); + })(); + }); + afterEach(inject([HttpTestingController], (mock: HttpTestingController) => { + mock.verify(); + TestBed.resetTestingModule(); + })); + }); + + afterEach(() => { + TestBed.resetTestingModule(); + }); +}); From 421b00d5df72ae5004a390b7140ab2c2d9c3091a Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Fri, 30 Sep 2022 13:13:22 +0200 Subject: [PATCH 3/7] [NAE-1544] Time zone in Date and Datetime field - time zone added to hint of field. - implemented two components for dateTimeField. --- ...t-simple-date-time-field.component.spec.ts | 97 +++++++++++++++++++ ...stract-simple-date-time-field.component.ts | 25 +++++ ...ct-zoned-date-time-field.component.spec.ts | 97 +++++++++++++++++++ ...bstract-zoned-date-time-field.component.ts | 28 ++++++ .../src/lib/data-fields/public-api.ts | 2 + .../src/lib/data-fields/data-fields.module.ts | 4 + .../date-time-field.component.html | 30 ++---- .../simple-date-time-field.component.html | 22 +++++ .../simple-date-time-field.component.scss | 5 + .../simple-date-time-field.component.spec.ts | 82 ++++++++++++++++ .../simple-date-time-field.component.ts | 25 +++++ .../zoned-date-time-field.component.html | 22 +++++ .../zoned-date-time-field.component.scss | 5 + .../zoned-date-time-field.component.spec.ts | 82 ++++++++++++++++ .../zoned-date-time-field.component.ts | 25 +++++ 15 files changed, 528 insertions(+), 23 deletions(-) create mode 100644 projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts create mode 100644 projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts create mode 100644 projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts create mode 100644 projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.scss create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts create mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts new file mode 100644 index 0000000000..93940b7fd3 --- /dev/null +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts @@ -0,0 +1,97 @@ +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import {AngularResizeEventModule} from 'angular-resize-event'; +import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import {HttpClientTestingModule} from '@angular/common/http/testing'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {Component, CUSTOM_ELEMENTS_SCHEMA, Inject, Optional} from '@angular/core'; +import moment from 'moment'; +import {BehaviorSubject} from 'rxjs'; +import {DateTimeField} from '../models/date-time-field'; +import {ChangedFields} from '../../models/changed-fields'; +import {TranslateService} from '@ngx-translate/core'; +import {MaterialModule} from '../../../material/material.module'; +import {TranslateLibModule} from '../../../translate/translate-lib.module'; +import {MockAuthenticationMethodService} from '../../../utility/tests/mocks/mock-authentication-method-service'; +import {AuthenticationMethodService} from '../../../authentication/services/authentication-method.service'; +import {AuthenticationService} from '../../../authentication/services/authentication/authentication.service'; +import {MockAuthenticationService} from '../../../utility/tests/mocks/mock-authentication.service'; +import {UserResourceService} from '../../../resources/engine-endpoint/user-resource.service'; +import {MockUserResourceService} from '../../../utility/tests/mocks/mock-user-resource.service'; +import {TestConfigurationService} from '../../../utility/tests/test-config'; +import {ConfigurationService} from '../../../configuration/configuration.service'; +import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; +import { AbstractSimpleDateTimeFieldComponent } from './abstract-simple-date-time-field.component'; + +describe('AbstractSimpleDateTimeFieldComponent', () => { + let component: TestDateTimeFieldComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + MaterialModule, + AngularResizeEventModule, + NgxMatDatetimePickerModule, + TranslateLibModule, + HttpClientTestingModule, + NoopAnimationsModule + ], + providers: [ + {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService}, + {provide: AuthenticationService, useClass: MockAuthenticationService}, + {provide: UserResourceService, useClass: MockUserResourceService}, + {provide: ConfigurationService, useClass: TestConfigurationService} + ], + declarations: [ + TestDateTimeFieldComponent, + TestWrapperComponent + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }).compileComponents(); + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.debugElement.children[0].componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should get error message', () => { + expect(component.getErrorMessage()).toEqual('This is custom message!'); + }); + + afterEach(() => { + TestBed.resetTestingModule(); + }); +}); + +@Component({ + selector: 'ncc-simple-test-date-time', + template: '' +}) +class TestDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { + constructor(translate: TranslateService, + @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { + super(translate, informAboutInvalidData); + } +} + +@Component({ + selector: 'ncc-test-wrapper', + template: '' +}) +class TestWrapperComponent { + field = new DateTimeField('', '', moment('2020-03-09'), { + required: true, + optional: true, + visible: true, + editable: true, + hidden: true + }, undefined, undefined, undefined, [ + {validationRule: 'between today,future', validationMessage: 'This is custom message!'}, + {validationRule: 'between past,today', validationMessage: 'This is custom message!'}, + {validationRule: 'between 2020-03-03,today', validationMessage: 'This is custom message!'}, + ]); + changedFields = new BehaviorSubject({behavior: {editable: true}, taskId: 'testTaskId'}); +} diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts new file mode 100644 index 0000000000..53012e35cf --- /dev/null +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts @@ -0,0 +1,25 @@ +import {Component, Inject, Input, Optional} from '@angular/core'; +import {DateTimeField} from '../models/date-time-field'; +import {AbstractTimeInstanceFieldComponent} from '../../time-instance-abstract-field/abstract-time-instance-field.component'; +import {TranslateService} from '@ngx-translate/core'; +import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; +import { WrappedBoolean } from '../../data-field-template/models/wrapped-boolean'; + +@Component({ + selector: 'ncc-abstract-date-time-field', + template: '' +}) +export abstract class AbstractSimpleDateTimeFieldComponent extends AbstractTimeInstanceFieldComponent { + + @Input() public dataField: DateTimeField; + @Input() public showLargeLayout: WrappedBoolean; + + protected constructor(protected _translate: TranslateService, + @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { + super(_translate, informAboutInvalidData); + } + + getErrorMessage() { + return this.buildErrorMessage(this.dataField); + } +} diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts new file mode 100644 index 0000000000..0ece876b26 --- /dev/null +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts @@ -0,0 +1,97 @@ +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import {AngularResizeEventModule} from 'angular-resize-event'; +import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import {HttpClientTestingModule} from '@angular/common/http/testing'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {Component, CUSTOM_ELEMENTS_SCHEMA, Inject, Optional} from '@angular/core'; +import moment from 'moment'; +import {BehaviorSubject} from 'rxjs'; +import {DateTimeField} from '../models/date-time-field'; +import {ChangedFields} from '../../models/changed-fields'; +import {TranslateService} from '@ngx-translate/core'; +import {MaterialModule} from '../../../material/material.module'; +import {TranslateLibModule} from '../../../translate/translate-lib.module'; +import {MockAuthenticationMethodService} from '../../../utility/tests/mocks/mock-authentication-method-service'; +import {AuthenticationMethodService} from '../../../authentication/services/authentication-method.service'; +import {AuthenticationService} from '../../../authentication/services/authentication/authentication.service'; +import {MockAuthenticationService} from '../../../utility/tests/mocks/mock-authentication.service'; +import {UserResourceService} from '../../../resources/engine-endpoint/user-resource.service'; +import {MockUserResourceService} from '../../../utility/tests/mocks/mock-user-resource.service'; +import {TestConfigurationService} from '../../../utility/tests/test-config'; +import {ConfigurationService} from '../../../configuration/configuration.service'; +import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; +import { AbstractZonedDateTimeFieldComponent } from './abstract-zoned-date-time-field.component'; + +describe('AbstractZonedDateTimeFieldComponent', () => { + let component: TestDateTimeFieldComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + MaterialModule, + AngularResizeEventModule, + NgxMatDatetimePickerModule, + TranslateLibModule, + HttpClientTestingModule, + NoopAnimationsModule + ], + providers: [ + {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService}, + {provide: AuthenticationService, useClass: MockAuthenticationService}, + {provide: UserResourceService, useClass: MockUserResourceService}, + {provide: ConfigurationService, useClass: TestConfigurationService} + ], + declarations: [ + TestDateTimeFieldComponent, + TestWrapperComponent + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }).compileComponents(); + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.debugElement.children[0].componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should get error message', () => { + expect(component.getErrorMessage()).toEqual('This is custom message!'); + }); + + afterEach(() => { + TestBed.resetTestingModule(); + }); +}); + +@Component({ + selector: 'ncc-simple-test-date-time', + template: '' +}) +class TestDateTimeFieldComponent extends AbstractZonedDateTimeFieldComponent { + constructor(translate: TranslateService, + @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { + super(translate, informAboutInvalidData); + } +} + +@Component({ + selector: 'ncc-test-wrapper', + template: '' +}) +class TestWrapperComponent { + field = new DateTimeField('', '', moment('2020-03-09'), { + required: true, + optional: true, + visible: true, + editable: true, + hidden: true + }, undefined, undefined, undefined, [ + {validationRule: 'between today,future', validationMessage: 'This is custom message!'}, + {validationRule: 'between past,today', validationMessage: 'This is custom message!'}, + {validationRule: 'between 2020-03-03,today', validationMessage: 'This is custom message!'}, + ]); + changedFields = new BehaviorSubject({behavior: {editable: true}, taskId: 'testTaskId'}); +} diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts new file mode 100644 index 0000000000..d94ab7f79a --- /dev/null +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts @@ -0,0 +1,28 @@ +import {Component, Inject, Input, Optional} from '@angular/core'; +import {DateTimeField} from '../models/date-time-field'; +import {AbstractTimeInstanceFieldComponent} from '../../time-instance-abstract-field/abstract-time-instance-field.component'; +import {TranslateService} from '@ngx-translate/core'; +import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; +import { WrappedBoolean } from '../../data-field-template/models/wrapped-boolean'; +import { + AbstractSimpleDateTimeFieldComponent +} from '../simple-date-time-field/abstract-simple-date-time-field.component'; + +@Component({ + selector: 'ncc-abstract-date-time-field', + template: '' +}) +export abstract class AbstractZonedDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { + + public timeZone: string; + + protected constructor(protected _translate: TranslateService, + @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { + super(_translate, informAboutInvalidData); + this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + getErrorMessage() { + return this.buildErrorMessage(this.dataField); + } +} diff --git a/projects/netgrif-components-core/src/lib/data-fields/public-api.ts b/projects/netgrif-components-core/src/lib/data-fields/public-api.ts index cdc0c2ead9..d6ffbc5426 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/public-api.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/public-api.ts @@ -39,6 +39,8 @@ export * from './i18n-field/i18n-text-field/abstract-i18n-text-field.component'; export * from './i18n-field/i18n-divider-field/abstract-i18n-divider-field.component'; export * from './i18n-field/abstract-i18n-errors.component'; export * from './user-list-field/abstract-user-list-field.component'; +export * from './date-time-field/simple-date-time-field/abstract-simple-date-time-field.component'; +export * from './date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component'; /* Class */ export * from './models/abstract-data-field'; diff --git a/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts b/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts index 1952fb294b..871a856fa9 100644 --- a/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts +++ b/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts @@ -65,6 +65,8 @@ import { MultichoiceAutocompleteFieldComponent } from './multichoice-field/multichoice-autocomplete-field/multichoice-autocomplete-field.component'; import { UserListFieldComponent } from './user-list-field/user-list-field.component'; +import { SimpleDateTimeFieldComponent } from './date-time-field/simple-date-time-field/simple-date-time-field.component'; +import { ZonedDateTimeFieldComponent } from './date-time-field/zoned-date-time-field/zoned-date-time-field.component'; @NgModule({ declarations: [ @@ -106,6 +108,8 @@ import { UserListFieldComponent } from './user-list-field/user-list-field.compon I18nTextFieldComponent, EasymdeWrapperComponent, UserListFieldComponent, + SimpleDateTimeFieldComponent, + ZonedDateTimeFieldComponent ], exports: [ BooleanFieldComponent, diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/date-time-field.component.html b/projects/netgrif-components/src/lib/data-fields/date-time-field/date-time-field.component.html index 274ad2f244..4e361053cf 100644 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/date-time-field.component.html +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/date-time-field.component.html @@ -4,27 +4,11 @@ [offset]="taskOffset"> - - - {{dataField.title}} - - - - - {{dataField.description}} - {{getErrorMessage()}} - + + + diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html new file mode 100644 index 0000000000..fa75f4fb78 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html @@ -0,0 +1,22 @@ + + {{dataField.title}} + + + + + {{dataField.description}} + {{getErrorMessage()}} + diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss new file mode 100644 index 0000000000..94f24bbe92 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss @@ -0,0 +1,5 @@ +.full-width { + display: block; + margin: 0 auto; + width: 100%; +} diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts new file mode 100644 index 0000000000..db4964502c --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts @@ -0,0 +1,82 @@ +import {waitForAsync, ComponentFixture, TestBed} from '@angular/core/testing'; +import {AngularResizeEventModule} from 'angular-resize-event'; +import {DataFieldTemplateComponent} from '../../data-field-template/data-field-template.component'; +import {RequiredLabelComponent} from '../../required-label/required-label.component'; +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import moment from 'moment'; +import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import {BehaviorSubject} from 'rxjs'; +import {HttpClientTestingModule} from '@angular/common/http/testing'; +import { + AuthenticationMethodService, + AuthenticationService, + ChangedFields, + ConfigurationService, + DateTimeField, + MaterialModule, + MockAuthenticationMethodService, + MockAuthenticationService, + MockUserResourceService, + TestConfigurationService, + TranslateLibModule, + UserResourceService +} from '@netgrif/components-core'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import { SimpleDateTimeFieldComponent } from './simple-date-time-field.component'; + +describe('SimpleDatetimeFieldComponent', () => { + let component: SimpleDateTimeFieldComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + MaterialModule, + AngularResizeEventModule, + NgxMatDatetimePickerModule, + TranslateLibModule, HttpClientTestingModule, NoopAnimationsModule + ], + providers: [ + {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService}, + {provide: AuthenticationService, useClass: MockAuthenticationService}, + {provide: UserResourceService, useClass: MockUserResourceService}, + {provide: ConfigurationService, useClass: TestConfigurationService} + ], + declarations: [ + SimpleDateTimeFieldComponent, + DataFieldTemplateComponent, + RequiredLabelComponent, + TestWrapperComponent, + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }) + .compileComponents(); + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.debugElement.children[0].componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + afterEach(() => { + TestBed.resetTestingModule(); + }); +}); + +@Component({ + selector: 'nc-test-wrapper', + template: '' +}) +class TestWrapperComponent { + field = new DateTimeField('', '', moment('2020-03-09'), { + required: true, + optional: true, + visible: true, + editable: true, + hidden: true + }, undefined, undefined, undefined, []); + changedFields = new BehaviorSubject({behavior: {editable: true}}); +} + diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts new file mode 100644 index 0000000000..3ebd7a16ba --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts @@ -0,0 +1,25 @@ +import { Component, Inject, OnInit, Optional } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { + AbstractSimpleDateTimeFieldComponent, + DATE_TIME_FORMAT, + NAE_INFORM_ABOUT_INVALID_DATA +} from 'netgrif-components-core'; +import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker'; + +@Component({ + selector: 'nc-simple-date-time-field', + templateUrl: './simple-date-time-field.component.html', + styleUrls: ['./simple-date-time-field.component.scss'], + providers: [ + {provide: NGX_MAT_DATE_FORMATS, useValue: DATE_TIME_FORMAT} + ] +}) +export class SimpleDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { + + constructor(translate: TranslateService, + @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { + super(translate, informAboutInvalidData); + } + +} diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html new file mode 100644 index 0000000000..cfb4594202 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html @@ -0,0 +1,22 @@ + + {{dataField.title}} + + + + + Time zone: {{this.timeZone}} {{!!dataField.description ? '-' + dataField.description : ''}} + {{getErrorMessage()}} + diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.scss b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.scss new file mode 100644 index 0000000000..94f24bbe92 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.scss @@ -0,0 +1,5 @@ +.full-width { + display: block; + margin: 0 auto; + width: 100%; +} diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts new file mode 100644 index 0000000000..8b77b0cbb9 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts @@ -0,0 +1,82 @@ +import {waitForAsync, ComponentFixture, TestBed} from '@angular/core/testing'; +import {AngularResizeEventModule} from 'angular-resize-event'; +import {DataFieldTemplateComponent} from '../../data-field-template/data-field-template.component'; +import {RequiredLabelComponent} from '../../required-label/required-label.component'; +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import moment from 'moment'; +import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import {BehaviorSubject} from 'rxjs'; +import {HttpClientTestingModule} from '@angular/common/http/testing'; +import { + AuthenticationMethodService, + AuthenticationService, + ChangedFields, + ConfigurationService, + DateTimeField, + MaterialModule, + MockAuthenticationMethodService, + MockAuthenticationService, + MockUserResourceService, + TestConfigurationService, + TranslateLibModule, + UserResourceService +} from '@netgrif/components-core'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import { ZonedDateTimeFieldComponent } from './zoned-date-time-field.component'; + +describe('ZonedDateTimeFieldComponent', () => { + let component: ZonedDateTimeFieldComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + MaterialModule, + AngularResizeEventModule, + NgxMatDatetimePickerModule, + TranslateLibModule, HttpClientTestingModule, NoopAnimationsModule + ], + providers: [ + {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService}, + {provide: AuthenticationService, useClass: MockAuthenticationService}, + {provide: UserResourceService, useClass: MockUserResourceService}, + {provide: ConfigurationService, useClass: TestConfigurationService} + ], + declarations: [ + ZonedDateTimeFieldComponent, + DataFieldTemplateComponent, + RequiredLabelComponent, + TestWrapperComponent, + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }) + .compileComponents(); + fixture = TestBed.createComponent(TestWrapperComponent); + component = fixture.debugElement.children[0].componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + afterEach(() => { + TestBed.resetTestingModule(); + }); +}); + +@Component({ + selector: 'nc-test-wrapper', + template: '' +}) +class TestWrapperComponent { + field = new DateTimeField('', '', moment('2020-03-09'), { + required: true, + optional: true, + visible: true, + editable: true, + hidden: true + }, undefined, undefined, undefined, []); + changedFields = new BehaviorSubject({behavior: {editable: true}}); +} + diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts new file mode 100644 index 0000000000..af3a7a2055 --- /dev/null +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts @@ -0,0 +1,25 @@ +import { Component, Inject, OnInit, Optional } from '@angular/core'; +import { + AbstractZonedDateTimeFieldComponent, + NAE_INFORM_ABOUT_INVALID_DATA, + DATE_TIME_FORMAT +} from '@netgrif/components-core'; +import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'nc-zoned-date-time-field', + templateUrl: './zoned-date-time-field.component.html', + styleUrls: ['./zoned-date-time-field.component.scss'], + providers: [ + {provide: NGX_MAT_DATE_FORMATS, useValue: DATE_TIME_FORMAT} + ] +}) +export class ZonedDateTimeFieldComponent extends AbstractZonedDateTimeFieldComponent { + + constructor(translate: TranslateService, + @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { + super(translate, informAboutInvalidData); + } + +} From cabf216218a57d0755a9acb0c3f622f1d5250f40 Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Fri, 30 Sep 2022 15:48:10 +0200 Subject: [PATCH 4/7] [NAE-1544] Time zone in Date and Datetime field - correcting tests --- .../abstract-simple-date-time-field.component.spec.ts | 2 +- .../abstract-zoned-date-time-field.component.spec.ts | 4 ++-- .../abstract-zoned-date-time-field.component.ts | 9 +-------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts index 93940b7fd3..bc3b99d7f5 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts @@ -79,7 +79,7 @@ class TestDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { @Component({ selector: 'ncc-test-wrapper', - template: '' + template: '' }) class TestWrapperComponent { field = new DateTimeField('', '', moment('2020-03-09'), { diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts index 0ece876b26..a871679efb 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.spec.ts @@ -67,7 +67,7 @@ describe('AbstractZonedDateTimeFieldComponent', () => { }); @Component({ - selector: 'ncc-simple-test-date-time', + selector: 'ncc-zoned-test-date-time', template: '' }) class TestDateTimeFieldComponent extends AbstractZonedDateTimeFieldComponent { @@ -79,7 +79,7 @@ class TestDateTimeFieldComponent extends AbstractZonedDateTimeFieldComponent { @Component({ selector: 'ncc-test-wrapper', - template: '' + template: '' }) class TestWrapperComponent { field = new DateTimeField('', '', moment('2020-03-09'), { diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts index d94ab7f79a..57d731e96b 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts @@ -1,9 +1,6 @@ -import {Component, Inject, Input, Optional} from '@angular/core'; -import {DateTimeField} from '../models/date-time-field'; -import {AbstractTimeInstanceFieldComponent} from '../../time-instance-abstract-field/abstract-time-instance-field.component'; +import {Component, Inject, Optional} from '@angular/core'; import {TranslateService} from '@ngx-translate/core'; import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; -import { WrappedBoolean } from '../../data-field-template/models/wrapped-boolean'; import { AbstractSimpleDateTimeFieldComponent } from '../simple-date-time-field/abstract-simple-date-time-field.component'; @@ -21,8 +18,4 @@ export abstract class AbstractZonedDateTimeFieldComponent extends AbstractSimple super(_translate, informAboutInvalidData); this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; } - - getErrorMessage() { - return this.buildErrorMessage(this.dataField); - } } From a76f0266755801c6a3c03fabb6dbd4884ba33ced Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Fri, 30 Sep 2022 16:06:33 +0200 Subject: [PATCH 5/7] [NAE-1544] Time zone in Date and Datetime field - correcting tests --- .../simple-date-time-field.component.spec.ts | 13 ++++++++++--- .../zoned-date-time-field.component.spec.ts | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts index db4964502c..cddc2d042a 100644 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts @@ -4,7 +4,7 @@ import {DataFieldTemplateComponent} from '../../data-field-template/data-field-t import {RequiredLabelComponent} from '../../required-label/required-label.component'; import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import moment from 'moment'; -import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import { NgxMatDatetimePickerModule, NgxMatNativeDateModule } from '@angular-material-components/datetime-picker'; import {BehaviorSubject} from 'rxjs'; import {HttpClientTestingModule} from '@angular/common/http/testing'; import { @@ -19,7 +19,8 @@ import { MockUserResourceService, TestConfigurationService, TranslateLibModule, - UserResourceService + UserResourceService, + WrappedBoolean } from '@netgrif/components-core'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import { SimpleDateTimeFieldComponent } from './simple-date-time-field.component'; @@ -34,6 +35,7 @@ describe('SimpleDatetimeFieldComponent', () => { MaterialModule, AngularResizeEventModule, NgxMatDatetimePickerModule, + NgxMatNativeDateModule, TranslateLibModule, HttpClientTestingModule, NoopAnimationsModule ], providers: [ @@ -67,7 +69,7 @@ describe('SimpleDatetimeFieldComponent', () => { @Component({ selector: 'nc-test-wrapper', - template: '' + template: '' }) class TestWrapperComponent { field = new DateTimeField('', '', moment('2020-03-09'), { @@ -78,5 +80,10 @@ class TestWrapperComponent { hidden: true }, undefined, undefined, undefined, []); changedFields = new BehaviorSubject({behavior: {editable: true}}); + showLargeLayout = new WrappedBoolean(); + + constructor() { + this.showLargeLayout.value = true; + } } diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts index 8b77b0cbb9..659a4a7b9c 100644 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.spec.ts @@ -4,7 +4,7 @@ import {DataFieldTemplateComponent} from '../../data-field-template/data-field-t import {RequiredLabelComponent} from '../../required-label/required-label.component'; import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import moment from 'moment'; -import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import { NgxMatDatetimePickerModule, NgxMatNativeDateModule } from '@angular-material-components/datetime-picker'; import {BehaviorSubject} from 'rxjs'; import {HttpClientTestingModule} from '@angular/common/http/testing'; import { @@ -19,7 +19,8 @@ import { MockUserResourceService, TestConfigurationService, TranslateLibModule, - UserResourceService + UserResourceService, + WrappedBoolean } from '@netgrif/components-core'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import { ZonedDateTimeFieldComponent } from './zoned-date-time-field.component'; @@ -34,6 +35,7 @@ describe('ZonedDateTimeFieldComponent', () => { MaterialModule, AngularResizeEventModule, NgxMatDatetimePickerModule, + NgxMatNativeDateModule, TranslateLibModule, HttpClientTestingModule, NoopAnimationsModule ], providers: [ @@ -67,7 +69,7 @@ describe('ZonedDateTimeFieldComponent', () => { @Component({ selector: 'nc-test-wrapper', - template: '' + template: '' }) class TestWrapperComponent { field = new DateTimeField('', '', moment('2020-03-09'), { @@ -78,5 +80,10 @@ class TestWrapperComponent { hidden: true }, undefined, undefined, undefined, []); changedFields = new BehaviorSubject({behavior: {editable: true}}); + showLargeLayout = new WrappedBoolean(); + + constructor() { + this.showLargeLayout.value = true; + } } From d7193c61f61052bc6a822d31115e24832173e177 Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Mon, 12 Dec 2022 09:46:05 +0100 Subject: [PATCH 6/7] [NAE-1544] Timezone for Date a DateTime field - corrected bad import --- .../simple-date-time-field/simple-date-time-field.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts index 3ebd7a16ba..ca301b619c 100644 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts @@ -4,7 +4,7 @@ import { AbstractSimpleDateTimeFieldComponent, DATE_TIME_FORMAT, NAE_INFORM_ABOUT_INVALID_DATA -} from 'netgrif-components-core'; +} from '@netgrif/components-core'; import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker'; @Component({ From 9aad264e308f18320dd8bb9a2bf4cbb244e82e2a Mon Sep 17 00:00:00 2001 From: Stefan Renczes Date: Mon, 4 Mar 2024 12:49:18 +0100 Subject: [PATCH 7/7] [NAE-1544] DataTime ZONEID field componentn - updated according to PR --- .../abstract-date-default-field.component.ts | 8 +- ...tract-date-time-default-field.component.ts | 4 +- ...t-simple-date-time-field.component.spec.ts | 97 ------------------- ...stract-simple-date-time-field.component.ts | 25 ----- ...bstract-zoned-date-time-field.component.ts | 26 +++-- .../src/lib/data-fields/public-api.ts | 1 - .../src/lib/data-fields/data-fields.module.ts | 3 +- .../simple-date-time-field.component.html | 22 ----- .../simple-date-time-field.component.scss | 5 - .../simple-date-time-field.component.spec.ts | 89 ----------------- .../simple-date-time-field.component.ts | 25 ----- .../zoned-date-time-field.component.html | 4 +- .../zoned-date-time-field.component.ts | 17 ++-- 13 files changed, 38 insertions(+), 288 deletions(-) delete mode 100644 projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts delete mode 100644 projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts delete mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html delete mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss delete mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts delete mode 100644 projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-field/date-default-field/abstract-date-default-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-field/date-default-field/abstract-date-default-field.component.ts index d981615052..ef0c52bf92 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/date-field/date-default-field/abstract-date-default-field.component.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/date-field/date-default-field/abstract-date-default-field.component.ts @@ -14,10 +14,10 @@ import {LanguageService} from "../../../translate/language.service"; }) export abstract class AbstractDateDefaultFieldComponent extends AbstractTimeInstanceFieldComponent { - constructor(protected _translate: TranslateService, - protected _adapter: DateAdapter, - @Inject(MAT_DATE_LOCALE) protected _locale: string, - protected _languageService: LanguageService, + constructor(_translate: TranslateService, + _adapter: DateAdapter, + @Inject(MAT_DATE_LOCALE) _locale: string, + _languageService: LanguageService, @Optional() @Inject(DATA_FIELD_PORTAL_DATA) dataFieldPortalData: DataFieldPortalData) { super(_translate, _adapter, _locale, _languageService, dataFieldPortalData) } diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/date-time-default-field/abstract-date-time-default-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/date-time-default-field/abstract-date-time-default-field.component.ts index 0c6517d1c4..bcdfa156f9 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/date-time-default-field/abstract-date-time-default-field.component.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/date-time-default-field/abstract-date-time-default-field.component.ts @@ -15,8 +15,8 @@ import {LanguageService} from "../../../translate/language.service"; }) export abstract class AbstractDateTimeDefaultFieldComponent extends AbstractTimeInstanceFieldComponent { - constructor(protected _translate: TranslateService, - protected _adapter: NgxMatDateAdapter, + constructor(_translate: TranslateService, + _adapter: NgxMatDateAdapter, @Inject(MAT_DATE_LOCALE) protected _locale: string, protected _languageService: LanguageService, @Optional() @Inject(DATA_FIELD_PORTAL_DATA) dataFieldPortalData: DataFieldPortalData) { diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts deleted file mode 100644 index bc3b99d7f5..0000000000 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {AngularResizeEventModule} from 'angular-resize-event'; -import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; -import {HttpClientTestingModule} from '@angular/common/http/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {Component, CUSTOM_ELEMENTS_SCHEMA, Inject, Optional} from '@angular/core'; -import moment from 'moment'; -import {BehaviorSubject} from 'rxjs'; -import {DateTimeField} from '../models/date-time-field'; -import {ChangedFields} from '../../models/changed-fields'; -import {TranslateService} from '@ngx-translate/core'; -import {MaterialModule} from '../../../material/material.module'; -import {TranslateLibModule} from '../../../translate/translate-lib.module'; -import {MockAuthenticationMethodService} from '../../../utility/tests/mocks/mock-authentication-method-service'; -import {AuthenticationMethodService} from '../../../authentication/services/authentication-method.service'; -import {AuthenticationService} from '../../../authentication/services/authentication/authentication.service'; -import {MockAuthenticationService} from '../../../utility/tests/mocks/mock-authentication.service'; -import {UserResourceService} from '../../../resources/engine-endpoint/user-resource.service'; -import {MockUserResourceService} from '../../../utility/tests/mocks/mock-user-resource.service'; -import {TestConfigurationService} from '../../../utility/tests/test-config'; -import {ConfigurationService} from '../../../configuration/configuration.service'; -import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; -import { AbstractSimpleDateTimeFieldComponent } from './abstract-simple-date-time-field.component'; - -describe('AbstractSimpleDateTimeFieldComponent', () => { - let component: TestDateTimeFieldComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MaterialModule, - AngularResizeEventModule, - NgxMatDatetimePickerModule, - TranslateLibModule, - HttpClientTestingModule, - NoopAnimationsModule - ], - providers: [ - {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService}, - {provide: AuthenticationService, useClass: MockAuthenticationService}, - {provide: UserResourceService, useClass: MockUserResourceService}, - {provide: ConfigurationService, useClass: TestConfigurationService} - ], - declarations: [ - TestDateTimeFieldComponent, - TestWrapperComponent - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] - }).compileComponents(); - fixture = TestBed.createComponent(TestWrapperComponent); - component = fixture.debugElement.children[0].componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should get error message', () => { - expect(component.getErrorMessage()).toEqual('This is custom message!'); - }); - - afterEach(() => { - TestBed.resetTestingModule(); - }); -}); - -@Component({ - selector: 'ncc-simple-test-date-time', - template: '' -}) -class TestDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { - constructor(translate: TranslateService, - @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { - super(translate, informAboutInvalidData); - } -} - -@Component({ - selector: 'ncc-test-wrapper', - template: '' -}) -class TestWrapperComponent { - field = new DateTimeField('', '', moment('2020-03-09'), { - required: true, - optional: true, - visible: true, - editable: true, - hidden: true - }, undefined, undefined, undefined, [ - {validationRule: 'between today,future', validationMessage: 'This is custom message!'}, - {validationRule: 'between past,today', validationMessage: 'This is custom message!'}, - {validationRule: 'between 2020-03-03,today', validationMessage: 'This is custom message!'}, - ]); - changedFields = new BehaviorSubject({behavior: {editable: true}, taskId: 'testTaskId'}); -} diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts deleted file mode 100644 index 53012e35cf..0000000000 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/simple-date-time-field/abstract-simple-date-time-field.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {Component, Inject, Input, Optional} from '@angular/core'; -import {DateTimeField} from '../models/date-time-field'; -import {AbstractTimeInstanceFieldComponent} from '../../time-instance-abstract-field/abstract-time-instance-field.component'; -import {TranslateService} from '@ngx-translate/core'; -import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; -import { WrappedBoolean } from '../../data-field-template/models/wrapped-boolean'; - -@Component({ - selector: 'ncc-abstract-date-time-field', - template: '' -}) -export abstract class AbstractSimpleDateTimeFieldComponent extends AbstractTimeInstanceFieldComponent { - - @Input() public dataField: DateTimeField; - @Input() public showLargeLayout: WrappedBoolean; - - protected constructor(protected _translate: TranslateService, - @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { - super(_translate, informAboutInvalidData); - } - - getErrorMessage() { - return this.buildErrorMessage(this.dataField); - } -} diff --git a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts index 57d731e96b..89b3b87e4d 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component.ts @@ -1,21 +1,33 @@ import {Component, Inject, Optional} from '@angular/core'; import {TranslateService} from '@ngx-translate/core'; -import {NAE_INFORM_ABOUT_INVALID_DATA} from '../../models/invalid-data-policy-token'; import { - AbstractSimpleDateTimeFieldComponent -} from '../simple-date-time-field/abstract-simple-date-time-field.component'; + AbstractDateDefaultFieldComponent +} from "../../date-field/date-default-field/abstract-date-default-field.component"; +import {DateAdapter, MAT_DATE_LOCALE} from "@angular/material/core"; +import {LanguageService} from "../../../translate/language.service"; +import {DATA_FIELD_PORTAL_DATA, DataFieldPortalData} from "../../models/data-field-portal-data-injection-token"; +import {DateField} from "../../date-field/models/date-field"; +import {DateTimeField} from "../models/date-time-field"; +import { + AbstractDateTimeDefaultFieldComponent +} from "../date-time-default-field/abstract-date-time-default-field.component"; +import {NgxMatDateAdapter} from "@angular-material-components/datetime-picker"; + @Component({ selector: 'ncc-abstract-date-time-field', template: '' }) -export abstract class AbstractZonedDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { +export abstract class AbstractZonedDateTimeFieldComponent extends AbstractDateTimeDefaultFieldComponent { public timeZone: string; - protected constructor(protected _translate: TranslateService, - @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { - super(_translate, informAboutInvalidData); + constructor(_translate: TranslateService, + _adapter: NgxMatDateAdapter, + @Inject(MAT_DATE_LOCALE) _locale: string, + _languageService: LanguageService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) dataFieldPortalData: DataFieldPortalData) { + super(_translate, _adapter, _locale, _languageService, dataFieldPortalData) this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; } } diff --git a/projects/netgrif-components-core/src/lib/data-fields/public-api.ts b/projects/netgrif-components-core/src/lib/data-fields/public-api.ts index d3751e4443..3cc65a8e87 100644 --- a/projects/netgrif-components-core/src/lib/data-fields/public-api.ts +++ b/projects/netgrif-components-core/src/lib/data-fields/public-api.ts @@ -58,7 +58,6 @@ export * from './i18n-field/i18n-text-field/abstract-i18n-text-field.component'; export * from './i18n-field/i18n-divider-field/abstract-i18n-divider-field.component'; export * from './i18n-field/abstract-i18n-errors.component'; export * from './user-list-field/abstract-user-list-field.component'; -export * from './date-time-field/simple-date-time-field/abstract-simple-date-time-field.component'; export * from './date-time-field/zoned-date-time-field/abstract-zoned-date-time-field.component'; export * from './user-list-field/user-list-default-field/abstract-user-list-default-field.component'; export * from './task-ref-field/abstract-task-ref-field.component'; diff --git a/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts b/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts index 821aa137bc..6b7323aa5c 100644 --- a/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts +++ b/projects/netgrif-components/src/lib/data-fields/data-fields.module.ts @@ -80,7 +80,6 @@ import { MultichoiceAutocompleteFieldComponent } from './multichoice-field/multichoice-autocomplete-field/multichoice-autocomplete-field.component'; import { UserListFieldComponent } from './user-list-field/user-list-field.component'; -import { SimpleDateTimeFieldComponent } from './date-time-field/simple-date-time-field/simple-date-time-field.component'; import { ZonedDateTimeFieldComponent } from './date-time-field/zoned-date-time-field/zoned-date-time-field.component'; import { SideMenuMultiUserAssignComponentModule @@ -191,7 +190,6 @@ import { StringCollectionDefaultFieldComponent } from './string-collection-field MultichoiceCaserefFieldComponent, EnumerationCaserefFieldComponent, StringCollectionDefaultFieldComponent, - SimpleDateTimeFieldComponent, ZonedDateTimeFieldComponent ], exports: [ @@ -232,6 +230,7 @@ export class DataFieldsComponentModule { registry.register("button-default", (injector: Injector) => new ComponentPortal(ButtonDefaultFieldComponent, null, injector)); registry.register("date-default", (injector: Injector) => new ComponentPortal(DateDefaultFieldComponent, null, injector)); registry.register("date-time-default", (injector: Injector) => new ComponentPortal(DateTimeDefaultFieldComponent, null, injector)); + registry.register("date-time-timeZone", (injector: Injector) => new ComponentPortal(DateTimeDefaultFieldComponent, null, injector)); registry.register("enumeration-default", (injector: Injector) => new ComponentPortal(EnumerationSelectFieldComponent, null, injector)); registry.register("enumeration-autocomplete_dynamic", (injector: Injector) => new ComponentPortal(EnumerationAutocompleteDynamicFieldComponent, null, injector)); registry.register("enumeration-autocomplete", (injector: Injector) => new ComponentPortal(EnumerationAutocompleteSelectFieldComponent, null, injector)); diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html deleted file mode 100644 index fa75f4fb78..0000000000 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.html +++ /dev/null @@ -1,22 +0,0 @@ - - {{dataField.title}} - - - - - {{dataField.description}} - {{getErrorMessage()}} - diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss deleted file mode 100644 index 94f24bbe92..0000000000 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -.full-width { - display: block; - margin: 0 auto; - width: 100%; -} diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts deleted file mode 100644 index cddc2d042a..0000000000 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -import {waitForAsync, ComponentFixture, TestBed} from '@angular/core/testing'; -import {AngularResizeEventModule} from 'angular-resize-event'; -import {DataFieldTemplateComponent} from '../../data-field-template/data-field-template.component'; -import {RequiredLabelComponent} from '../../required-label/required-label.component'; -import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; -import moment from 'moment'; -import { NgxMatDatetimePickerModule, NgxMatNativeDateModule } from '@angular-material-components/datetime-picker'; -import {BehaviorSubject} from 'rxjs'; -import {HttpClientTestingModule} from '@angular/common/http/testing'; -import { - AuthenticationMethodService, - AuthenticationService, - ChangedFields, - ConfigurationService, - DateTimeField, - MaterialModule, - MockAuthenticationMethodService, - MockAuthenticationService, - MockUserResourceService, - TestConfigurationService, - TranslateLibModule, - UserResourceService, - WrappedBoolean -} from '@netgrif/components-core'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import { SimpleDateTimeFieldComponent } from './simple-date-time-field.component'; - -describe('SimpleDatetimeFieldComponent', () => { - let component: SimpleDateTimeFieldComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - imports: [ - MaterialModule, - AngularResizeEventModule, - NgxMatDatetimePickerModule, - NgxMatNativeDateModule, - TranslateLibModule, HttpClientTestingModule, NoopAnimationsModule - ], - providers: [ - {provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService}, - {provide: AuthenticationService, useClass: MockAuthenticationService}, - {provide: UserResourceService, useClass: MockUserResourceService}, - {provide: ConfigurationService, useClass: TestConfigurationService} - ], - declarations: [ - SimpleDateTimeFieldComponent, - DataFieldTemplateComponent, - RequiredLabelComponent, - TestWrapperComponent, - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] - }) - .compileComponents(); - fixture = TestBed.createComponent(TestWrapperComponent); - component = fixture.debugElement.children[0].componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - afterEach(() => { - TestBed.resetTestingModule(); - }); -}); - -@Component({ - selector: 'nc-test-wrapper', - template: '' -}) -class TestWrapperComponent { - field = new DateTimeField('', '', moment('2020-03-09'), { - required: true, - optional: true, - visible: true, - editable: true, - hidden: true - }, undefined, undefined, undefined, []); - changedFields = new BehaviorSubject({behavior: {editable: true}}); - showLargeLayout = new WrappedBoolean(); - - constructor() { - this.showLargeLayout.value = true; - } -} - diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts deleted file mode 100644 index ca301b619c..0000000000 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/simple-date-time-field/simple-date-time-field.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Inject, OnInit, Optional } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { - AbstractSimpleDateTimeFieldComponent, - DATE_TIME_FORMAT, - NAE_INFORM_ABOUT_INVALID_DATA -} from '@netgrif/components-core'; -import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker'; - -@Component({ - selector: 'nc-simple-date-time-field', - templateUrl: './simple-date-time-field.component.html', - styleUrls: ['./simple-date-time-field.component.scss'], - providers: [ - {provide: NGX_MAT_DATE_FORMATS, useValue: DATE_TIME_FORMAT} - ] -}) -export class SimpleDateTimeFieldComponent extends AbstractSimpleDateTimeFieldComponent { - - constructor(translate: TranslateService, - @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { - super(translate, informAboutInvalidData); - } - -} diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html index cfb4594202..3dd335a7a4 100644 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.html @@ -4,7 +4,7 @@ [ngxMatDatetimePicker]="picker" [required]="dataField.behavior.required" [placeholder]="dataField.placeholder" - [formControl]="formControl" + [formControl]="formControlRef" [min]="dataField.min" [max]="dataField.max" (click)="picker.open()"> @@ -18,5 +18,5 @@ [enableMeridian]="false"> Time zone: {{this.timeZone}} {{!!dataField.description ? '-' + dataField.description : ''}} - {{getErrorMessage()}} + {{getErrorMessage()}} diff --git a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts index af3a7a2055..c75f722648 100644 --- a/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts +++ b/projects/netgrif-components/src/lib/data-fields/date-time-field/zoned-date-time-field/zoned-date-time-field.component.ts @@ -1,11 +1,11 @@ -import { Component, Inject, OnInit, Optional } from '@angular/core'; +import { Component, Inject, Optional } from '@angular/core'; import { AbstractZonedDateTimeFieldComponent, - NAE_INFORM_ABOUT_INVALID_DATA, - DATE_TIME_FORMAT + DATE_TIME_FORMAT, LanguageService, DATA_FIELD_PORTAL_DATA, DataFieldPortalData, DateTimeField } from '@netgrif/components-core'; -import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker'; +import {NGX_MAT_DATE_FORMATS, NgxMatDateAdapter} from '@angular-material-components/datetime-picker'; import { TranslateService } from '@ngx-translate/core'; +import {MAT_DATE_LOCALE} from "@angular/material/core"; @Component({ selector: 'nc-zoned-date-time-field', @@ -17,9 +17,12 @@ import { TranslateService } from '@ngx-translate/core'; }) export class ZonedDateTimeFieldComponent extends AbstractZonedDateTimeFieldComponent { - constructor(translate: TranslateService, - @Optional() @Inject(NAE_INFORM_ABOUT_INVALID_DATA) informAboutInvalidData: boolean | null) { - super(translate, informAboutInvalidData); + constructor(_translate: TranslateService, + _adapter: NgxMatDateAdapter, + @Inject(MAT_DATE_LOCALE) protected _locale: string, + _languageService: LanguageService, + @Optional() @Inject(DATA_FIELD_PORTAL_DATA) dataFieldPortalData: DataFieldPortalData) { + super(_translate, _adapter, _locale, _languageService, dataFieldPortalData); } }