ngx-material-entity 15.1.3 → 15.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -0
- package/components/confirm-dialog/confirm-dialog.component.d.ts +1 -1
- package/components/edit-page/edit-page.component.d.ts +112 -0
- package/components/edit-page/page-edit-data.builder.d.ts +17 -0
- package/components/input/array/array-date-input/array-date-input.component.d.ts +1 -1
- package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +1 -1
- package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +1 -1
- package/components/input/array/array-table.class.d.ts +1 -1
- package/components/input/date/date-input/date-input.component.d.ts +1 -1
- package/components/input/date/date-time-input/date-time-input.component.d.ts +1 -1
- package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
- package/components/input/file/file-image-input/file-image-input.component.d.ts +1 -1
- package/components/input/file/file-input/file-input.component.d.ts +3 -3
- package/components/input/input.component.d.ts +3 -3
- package/components/input/relations/references-many-input/references-many-input.component.d.ts +1 -1
- package/components/input/string/string-password-input/string-password-input.component.d.ts +1 -1
- package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +3 -3
- package/components/table/create-dialog/create-entity-dialog-data.d.ts +1 -1
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +4 -4
- package/components/table/default.actions.d.ts +21 -0
- package/components/table/edit-dialog/{edit-dialog-data.builder.d.ts → edit-data.builder.d.ts} +7 -7
- package/components/table/edit-dialog/{edit-entity-dialog-data.d.ts → edit-entity-data.d.ts} +5 -5
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +6 -6
- package/components/table/edit-dialog/edit-entity.builder.d.ts +24 -0
- package/components/table/table-data.builder.d.ts +11 -7
- package/components/table/table-data.d.ts +29 -8
- package/components/table/table.component.d.ts +14 -7
- package/components/table/table.module.d.ts +4 -3
- package/encapsulation/js-2-xml.utilities.d.ts +15 -0
- package/encapsulation/jszip.utilities.d.ts +3 -2
- package/encapsulation/lodash.utilities.d.ts +7 -0
- package/esm2020/classes/entity.model.mjs +2 -2
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
- package/esm2020/components/edit-page/edit-page.component.mjs +203 -0
- package/esm2020/components/edit-page/page-edit-data.builder.mjs +32 -0
- package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-table.class.mjs +3 -3
- package/esm2020/components/input/base-input.component.mjs +2 -2
- package/esm2020/components/input/date/date-input/date-input.component.mjs +2 -2
- package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +5 -5
- package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +2 -2
- package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-input/file-input.component.mjs +5 -5
- package/esm2020/components/input/input.component.mjs +6 -6
- package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +4 -4
- package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +2 -2
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +5 -5
- package/esm2020/components/table/default.actions.mjs +65 -0
- package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +41 -0
- package/esm2020/components/table/edit-dialog/edit-entity-data.mjs +2 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +16 -16
- package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +28 -0
- package/esm2020/components/table/table-data.builder.mjs +19 -8
- package/esm2020/components/table/table-data.mjs +1 -1
- package/esm2020/components/table/table.component.mjs +73 -29
- package/esm2020/components/table/table.module.mjs +5 -1
- package/esm2020/decorators/array/array-decorator-internal.data.mjs +2 -2
- package/esm2020/decorators/base/base-property.decorator.mjs +2 -2
- package/esm2020/decorators/date/date-decorator-internal.data.mjs +2 -2
- package/esm2020/decorators/date/date.decorator.mjs +2 -2
- package/esm2020/decorators/file/file.decorator.mjs +2 -2
- package/esm2020/decorators/string/string.decorator.mjs +2 -2
- package/esm2020/encapsulation/js-2-xml.utilities.mjs +18 -0
- package/esm2020/encapsulation/jszip.utilities.mjs +1 -1
- package/esm2020/encapsulation/lodash.utilities.mjs +13 -1
- package/esm2020/public-api.mjs +31 -26
- package/esm2020/services/entity.service.mjs +252 -0
- package/esm2020/services/unsaved-changes.guard.mjs +14 -0
- package/esm2020/utilities/date.utilities.mjs +158 -0
- package/esm2020/utilities/entity.utilities.mjs +828 -0
- package/esm2020/utilities/file.utilities.mjs +176 -0
- package/esm2020/utilities/selection.utilities.mjs +50 -0
- package/fesm2015/ngx-material-entity.mjs +1071 -644
- package/fesm2015/ngx-material-entity.mjs.map +1 -1
- package/fesm2020/ngx-material-entity.mjs +992 -571
- package/fesm2020/ngx-material-entity.mjs.map +1 -1
- package/package.json +3 -2
- package/public-api.d.ts +28 -25
- package/{classes → services}/entity.service.d.ts +25 -1
- package/services/unsaved-changes.guard.d.ts +4 -0
- package/{classes → utilities}/entity.utilities.d.ts +1 -1
- package/{classes → utilities}/file.utilities.d.ts +7 -0
- package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +0 -24
- package/esm2020/classes/date.utilities.mjs +0 -158
- package/esm2020/classes/entity.service.mjs +0 -213
- package/esm2020/classes/entity.utilities.mjs +0 -828
- package/esm2020/classes/file.utilities.mjs +0 -163
- package/esm2020/classes/selection.utilities.mjs +0 -50
- package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +0 -41
- package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +0 -2
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +0 -28
- /package/{classes → utilities}/date.utilities.d.ts +0 -0
- /package/{classes → utilities}/selection.utilities.d.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-material-entity",
|
|
3
|
-
"version": "15.1.
|
|
3
|
+
"version": "15.1.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"@angular/material": "15",
|
|
18
18
|
"lodash": "4",
|
|
19
19
|
"reflect-metadata": "^0.1.13",
|
|
20
|
-
"jszip": "^3.10.1"
|
|
20
|
+
"jszip": "^3.10.1",
|
|
21
|
+
"js2xmlparser": "^5.0.0"
|
|
21
22
|
},
|
|
22
23
|
"dependencies": {
|
|
23
24
|
"tslib": "^2.4.0"
|
package/public-api.d.ts
CHANGED
|
@@ -3,44 +3,47 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import 'reflect-metadata';
|
|
5
5
|
export * from './classes/entity.model';
|
|
6
|
-
export * from './classes/entity.service';
|
|
7
|
-
export * from './classes/entity.utilities';
|
|
8
|
-
export * from './classes/date.utilities';
|
|
9
|
-
export * from './classes/file.utilities';
|
|
10
6
|
export * from './components/confirm-dialog/confirm-dialog-data';
|
|
11
7
|
export * from './components/confirm-dialog/confirm-dialog.component';
|
|
12
8
|
export * from './components/confirm-dialog/confirm-dialog.module';
|
|
13
|
-
export * from './components/
|
|
9
|
+
export * from './components/edit-page/edit-page.component';
|
|
10
|
+
export * from './components/get-validation-error-message.function';
|
|
11
|
+
export * from './components/input/base-input.component';
|
|
14
12
|
export * from './components/input/input.component';
|
|
15
|
-
export * from './components/
|
|
16
|
-
export * from './components/table/table.component';
|
|
17
|
-
export * from './components/table/table.module';
|
|
13
|
+
export * from './components/input/input.module';
|
|
18
14
|
export * from './components/table/create-dialog/create-entity-dialog-data';
|
|
19
|
-
export * from './components/table/create-dialog/create-entity-dialog.module';
|
|
20
15
|
export * from './components/table/create-dialog/create-entity-dialog.component';
|
|
21
|
-
export * from './components/table/
|
|
22
|
-
export * from './components/table/edit-dialog/edit-entity-
|
|
16
|
+
export * from './components/table/create-dialog/create-entity-dialog.module';
|
|
17
|
+
export * from './components/table/edit-dialog/edit-entity-data';
|
|
23
18
|
export * from './components/table/edit-dialog/edit-entity-dialog.component';
|
|
24
|
-
export * from './components/
|
|
25
|
-
export * from './components/
|
|
26
|
-
export * from './
|
|
19
|
+
export * from './components/table/edit-dialog/edit-entity-dialog.module';
|
|
20
|
+
export * from './components/table/table-data';
|
|
21
|
+
export * from './components/table/table.component';
|
|
22
|
+
export * from './components/table/table.module';
|
|
23
|
+
export * from './components/table/default.actions';
|
|
27
24
|
export * from './decorators/array/array-decorator.data';
|
|
25
|
+
export * from './decorators/array/array.decorator';
|
|
28
26
|
export * from './decorators/base/decorator-types.enum';
|
|
29
27
|
export * from './decorators/base/dropdown-value.interface';
|
|
30
28
|
export { Col, Position } from './decorators/base/property-decorator.data';
|
|
31
|
-
export * from './decorators/boolean/boolean.decorator';
|
|
32
29
|
export * from './decorators/boolean/boolean-decorator.data';
|
|
33
|
-
export * from './decorators/
|
|
30
|
+
export * from './decorators/boolean/boolean.decorator';
|
|
31
|
+
export * from './decorators/custom/custom-decorator.data';
|
|
32
|
+
export * from './decorators/custom/custom.decorator';
|
|
34
33
|
export * from './decorators/date/date-decorator.data';
|
|
35
|
-
export * from './decorators/
|
|
34
|
+
export * from './decorators/date/date.decorator';
|
|
35
|
+
export * from './decorators/file/file-decorator.data';
|
|
36
|
+
export * from './decorators/file/file.decorator';
|
|
36
37
|
export * from './decorators/number/number-decorator.data';
|
|
37
|
-
export * from './decorators/
|
|
38
|
+
export * from './decorators/number/number.decorator';
|
|
38
39
|
export * from './decorators/object/object-decorator.data';
|
|
39
|
-
export * from './decorators/
|
|
40
|
-
export * from './decorators/string/string-decorator.data';
|
|
41
|
-
export * from './decorators/references-many/references-many.decorator';
|
|
40
|
+
export * from './decorators/object/object.decorator';
|
|
42
41
|
export * from './decorators/references-many/references-many-decorator.data';
|
|
43
|
-
export * from './decorators/
|
|
44
|
-
export * from './decorators/
|
|
45
|
-
export * from './decorators/
|
|
46
|
-
export * from './
|
|
42
|
+
export * from './decorators/references-many/references-many.decorator';
|
|
43
|
+
export * from './decorators/string/string-decorator.data';
|
|
44
|
+
export * from './decorators/string/string.decorator';
|
|
45
|
+
export * from './services/entity.service';
|
|
46
|
+
export * from './services/unsaved-changes.guard';
|
|
47
|
+
export * from './utilities/date.utilities';
|
|
48
|
+
export * from './utilities/entity.utilities';
|
|
49
|
+
export * from './utilities/file.utilities';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { BaseEntityType } from '
|
|
3
|
+
import { BaseEntityType } from '../classes/entity.model';
|
|
4
4
|
/**
|
|
5
5
|
* A generic EntityService class.
|
|
6
6
|
* Offers basic CRUD-functionality.
|
|
@@ -22,6 +22,10 @@ export declare abstract class EntityService<EntityType extends BaseEntityType<En
|
|
|
22
22
|
* Delete Sends a DEL-Request to baseUrl/{id}.
|
|
23
23
|
*/
|
|
24
24
|
abstract readonly baseUrl: string;
|
|
25
|
+
/**
|
|
26
|
+
* The route segment that comes before the id when editing an entity in a separate page.
|
|
27
|
+
*/
|
|
28
|
+
readonly editBaseRoute: string;
|
|
25
29
|
/**
|
|
26
30
|
* The key which holds the id value.
|
|
27
31
|
*
|
|
@@ -33,12 +37,18 @@ export declare abstract class EntityService<EntityType extends BaseEntityType<En
|
|
|
33
37
|
* Can be subscribed to when you want to do a specific thing whenever the entities change.
|
|
34
38
|
*/
|
|
35
39
|
readonly entitiesSubject: BehaviorSubject<EntityType[]>;
|
|
40
|
+
/**
|
|
41
|
+
* A subject of all the entity values.
|
|
42
|
+
* Can be subscribed to when you want to do a specific thing whenever the entities change.
|
|
43
|
+
*/
|
|
44
|
+
protected readonly READ_EXPIRATION_IN_MS: number;
|
|
36
45
|
/**
|
|
37
46
|
* Gets the entities in an array from the internal entitiesSubject.
|
|
38
47
|
*
|
|
39
48
|
* @returns The current entities in form of an array.
|
|
40
49
|
*/
|
|
41
50
|
get entities(): EntityType[];
|
|
51
|
+
lastRead?: Date;
|
|
42
52
|
constructor(http: HttpClient);
|
|
43
53
|
/**
|
|
44
54
|
* Creates a new Entity and pushes it to the entities array.
|
|
@@ -48,6 +58,13 @@ export declare abstract class EntityService<EntityType extends BaseEntityType<En
|
|
|
48
58
|
* @returns A Promise of the created entity.
|
|
49
59
|
*/
|
|
50
60
|
create(entity: EntityType): Promise<EntityType>;
|
|
61
|
+
/**
|
|
62
|
+
* Imports everything from the provided json file.
|
|
63
|
+
*
|
|
64
|
+
* @param file - The json file to import from.
|
|
65
|
+
* @returns All entities that have been imported.
|
|
66
|
+
*/
|
|
67
|
+
import(file: File): Promise<EntityType[]>;
|
|
51
68
|
/**
|
|
52
69
|
* Creates the entity with form data when the entity contains files in contrast to creating it with a normal json body.
|
|
53
70
|
* All file values are stored inside their respective property key and their name.
|
|
@@ -72,6 +89,13 @@ export declare abstract class EntityService<EntityType extends BaseEntityType<En
|
|
|
72
89
|
* @returns A Promise of all received Entities.
|
|
73
90
|
*/
|
|
74
91
|
read(): Promise<EntityType[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Tries to find an entity with the given id.
|
|
94
|
+
*
|
|
95
|
+
* @param id - The id of the entity to find.
|
|
96
|
+
* @returns The found entity.
|
|
97
|
+
*/
|
|
98
|
+
findById(id: EntityType[keyof EntityType]): Promise<EntityType>;
|
|
75
99
|
/**
|
|
76
100
|
* Updates a specific Entity.
|
|
77
101
|
*
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { UrlTree } from '@angular/router';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { NgxMatEntityEditPageComponent } from '../components/edit-page/edit-page.component';
|
|
4
|
+
export declare function UnsavedChangesGuard(component: NgxMatEntityEditPageComponent<any>): Observable<boolean | UrlTree>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { BaseEntityType } from '../classes/entity.model';
|
|
1
2
|
import { DecoratorType, DecoratorTypes } from '../decorators/base/decorator-types.enum';
|
|
2
3
|
import { PropertyDecoratorConfigInternal } from '../decorators/base/property-decorator-internal.data';
|
|
3
|
-
import { BaseEntityType } from './entity.model';
|
|
4
4
|
/**
|
|
5
5
|
* Contains HelperMethods around handling Entities and their property-metadata.
|
|
6
6
|
*/
|
|
@@ -38,6 +38,13 @@ export declare abstract class FileUtilities {
|
|
|
38
38
|
* @param fileData - The file data. Needs to contain a blob.
|
|
39
39
|
*/
|
|
40
40
|
static downloadSingleFile(fileData: FileDataWithFile): void;
|
|
41
|
+
/**
|
|
42
|
+
* Downloads a blob.
|
|
43
|
+
*
|
|
44
|
+
* @param blob - The blob to download.
|
|
45
|
+
* @param name - The name of the downloaded file.
|
|
46
|
+
*/
|
|
47
|
+
static downLoadBlob(blob: Blob, name?: string): void;
|
|
41
48
|
/**
|
|
42
49
|
* Downloads multiple files as a zip with the given name.
|
|
43
50
|
*
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { EntityService } from '../../../classes/entity.service';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { EditEntityDialogData } from './edit-entity-dialog-data';
|
|
4
|
-
import { EditDialogDataInternal } from './edit-dialog-data.builder';
|
|
5
|
-
import { BaseBuilder } from '../../../classes/base.builder';
|
|
6
|
-
import { BaseEntityType } from '../../../classes/entity.model';
|
|
7
|
-
/**
|
|
8
|
-
* The internal EditEntityDialogData. Requires all default values the user can leave out.
|
|
9
|
-
*/
|
|
10
|
-
export declare class EditEntityDialogDataInternal<EntityType extends BaseEntityType<EntityType>> implements EditEntityDialogData<EntityType> {
|
|
11
|
-
entity: EntityType;
|
|
12
|
-
EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>;
|
|
13
|
-
editDialogData: EditDialogDataInternal<EntityType>;
|
|
14
|
-
allowUpdate: (entity: EntityType) => boolean;
|
|
15
|
-
allowDelete: (entity: EntityType) => boolean;
|
|
16
|
-
constructor(entity: EntityType, EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>, editDialogData: EditDialogDataInternal<EntityType>, allowUpdate: (entity: EntityType) => boolean, allowDelete: (entity: EntityType) => boolean);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* The Builder for the EditEntityDialogData. Sets default values.
|
|
20
|
-
*/
|
|
21
|
-
export declare class EditEntityDialogDataBuilder<EntityType extends BaseEntityType<EntityType>> extends BaseBuilder<EditEntityDialogDataInternal<EntityType>, EditEntityDialogData<EntityType>> {
|
|
22
|
-
constructor(data: EditEntityDialogData<EntityType>);
|
|
23
|
-
protected generateBaseData(data: EditEntityDialogData<EntityType>): EditEntityDialogDataInternal<EntityType>;
|
|
24
|
-
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { LodashUtilities } from '../encapsulation/lodash.utilities';
|
|
2
|
-
const DAY_IN_MS = 1000 * 60 * 60 * 24;
|
|
3
|
-
/**
|
|
4
|
-
* Contains Helper Functions for handling date properties.
|
|
5
|
-
*/
|
|
6
|
-
export class DateUtilities {
|
|
7
|
-
/**
|
|
8
|
-
* Gets the given value as a date value.
|
|
9
|
-
*
|
|
10
|
-
* @param value - The value to get as a date.
|
|
11
|
-
* @returns The given value as a date.
|
|
12
|
-
*/
|
|
13
|
-
static asDate(value) {
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Gets the default times used by the DateTime picker when nothing is specified by the user.
|
|
18
|
-
*
|
|
19
|
-
* @param format - The time format. Defaults to 24.
|
|
20
|
-
* @param minuteSteps - The steps from one time value to the next. Defaults to 30.
|
|
21
|
-
* @returns Times in the 24 hour format from 0:00 until 23:30 in 30 minute steps.
|
|
22
|
-
*/
|
|
23
|
-
static getDefaultTimes(format = 24, minuteSteps = 30) {
|
|
24
|
-
const res = [{ displayName: '-', value: undefined }];
|
|
25
|
-
for (let hour = 0; hour < 24; hour++) {
|
|
26
|
-
for (let minute = 0; minute < 60; minute += minuteSteps) {
|
|
27
|
-
res.push(DateUtilities.getTimeDropdownValue(format, hour, minute));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return res;
|
|
31
|
-
}
|
|
32
|
-
static getTimeDropdownValue(format, hour, minute) {
|
|
33
|
-
const displayHour = DateUtilities.getFormattedHour(format, LodashUtilities.cloneDeep(hour));
|
|
34
|
-
const displayMinute = DateUtilities.getFormattedMinute(format, hour, minute);
|
|
35
|
-
return {
|
|
36
|
-
displayName: `${displayHour}:${displayMinute}`,
|
|
37
|
-
value: {
|
|
38
|
-
hours: hour,
|
|
39
|
-
minutes: minute
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
static getFormattedHour(format, hour) {
|
|
44
|
-
if (format === 12 && hour > 12) {
|
|
45
|
-
hour -= 12;
|
|
46
|
-
}
|
|
47
|
-
return hour;
|
|
48
|
-
}
|
|
49
|
-
static getFormattedMinute(format, hour, minute) {
|
|
50
|
-
let res = `${minute}`;
|
|
51
|
-
if (format === 12) {
|
|
52
|
-
if (hour > 12) {
|
|
53
|
-
res = `${minute} PM`;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
res = `${minute} AM`;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (minute.toString().length === 1) {
|
|
60
|
-
res = '0'.concat(res);
|
|
61
|
-
}
|
|
62
|
-
return res;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Gets the Time object from the given date.
|
|
66
|
-
*
|
|
67
|
-
* @param value - The date to get the time object from.
|
|
68
|
-
* @returns The Time object build from the date value.
|
|
69
|
-
*/
|
|
70
|
-
static getTimeFromDate(value) {
|
|
71
|
-
if (!value) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
return {
|
|
76
|
-
hours: new Date(value).getHours(),
|
|
77
|
-
minutes: new Date(value).getMinutes()
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Gets the dates between the two given gates. Does additional filtering based on the provided DateRange metadata.
|
|
83
|
-
*
|
|
84
|
-
* @param startDate - The start date.
|
|
85
|
-
* @param endDate - The end date.
|
|
86
|
-
* @param filter - The custom filter from the metadata.
|
|
87
|
-
* @returns All dates between the two provided dates. Includes start and end date.
|
|
88
|
-
*/
|
|
89
|
-
static getDatesBetween(startDate, endDate, filter) {
|
|
90
|
-
const res = [];
|
|
91
|
-
while (startDate.getFullYear() < endDate.getFullYear()
|
|
92
|
-
|| startDate.getMonth() < endDate.getMonth()
|
|
93
|
-
|| startDate.getDate() <= endDate.getDate()) {
|
|
94
|
-
res.push(new Date(startDate));
|
|
95
|
-
startDate.setTime(startDate.getTime() + DAY_IN_MS);
|
|
96
|
-
}
|
|
97
|
-
if (filter) {
|
|
98
|
-
return res.filter(d => filter(d));
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
return res;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Get all valid times for the dropdown of a datetime property.
|
|
106
|
-
*
|
|
107
|
-
* @param times - All given times to filter.
|
|
108
|
-
* @param date - The date of the datetime.
|
|
109
|
-
* @param min - The function that defines the minimum time.
|
|
110
|
-
* @param max - The function that defines the maximum time.
|
|
111
|
-
* @param filter - A filter function to do more specific time filtering. This could be e.g. The removal of lunch breaks.
|
|
112
|
-
* @returns All valid dropdown values for the datetime property.
|
|
113
|
-
*/
|
|
114
|
-
static getValidTimesForDropdown(times, date, min, max, filter) {
|
|
115
|
-
if (min) {
|
|
116
|
-
const minTime = min(date);
|
|
117
|
-
times = times.filter(t => !t.value
|
|
118
|
-
|| t.value.hours > minTime.hours
|
|
119
|
-
|| (t.value.hours === minTime.hours
|
|
120
|
-
&& t.value.minutes >= minTime.minutes));
|
|
121
|
-
}
|
|
122
|
-
if (max) {
|
|
123
|
-
const maxTime = max(date);
|
|
124
|
-
times = times.filter(t => !t.value
|
|
125
|
-
|| t.value.hours < maxTime.hours
|
|
126
|
-
|| (t.value.hours === maxTime.hours
|
|
127
|
-
&& t.value.minutes <= maxTime.minutes));
|
|
128
|
-
}
|
|
129
|
-
if (filter) {
|
|
130
|
-
times = times.filter(t => !t.value || filter(t.value));
|
|
131
|
-
}
|
|
132
|
-
return times;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Checks if the time object has processable hours and minutes properties.
|
|
136
|
-
* Doesn't check custom validators like min/max from the metadata configuration.
|
|
137
|
-
*
|
|
138
|
-
* @param time - The time to check.
|
|
139
|
-
* @returns Whether or not the time object is unprocessable.
|
|
140
|
-
*/
|
|
141
|
-
static timeIsUnprocessable(time) {
|
|
142
|
-
if (!time
|
|
143
|
-
|| time.hours == null
|
|
144
|
-
|| typeof time.hours !== 'number'
|
|
145
|
-
|| Number.isNaN(time.hours)
|
|
146
|
-
|| time.minutes == null
|
|
147
|
-
|| typeof time.minutes !== 'number'
|
|
148
|
-
|| Number.isNaN(time.minutes)) {
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* The default filter function to user when none was provided by the user.
|
|
156
|
-
*/
|
|
157
|
-
DateUtilities.defaultDateFilter = () => true;
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jbGFzc2VzL2RhdGUudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdwRSxNQUFNLFNBQVMsR0FBVyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFPOUM7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGFBQWE7SUFPL0I7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQWM7UUFDeEIsT0FBTyxLQUFhLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBa0IsRUFBRSxFQUFFLGNBQTJCLEVBQUU7UUFDdEUsTUFBTSxHQUFHLEdBQTBCLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUE0QixFQUFFLENBQUMsQ0FBQztRQUMvRixLQUFLLElBQUksSUFBSSxHQUFXLENBQUMsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzFDLEtBQUssSUFBSSxNQUFNLEdBQVcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsTUFBTSxJQUFJLFdBQVcsRUFBRTtnQkFDN0QsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBZSxFQUFFLElBQVksRUFBRSxNQUFjO1FBQzdFLE1BQU0sV0FBVyxHQUFXLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxN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O2VBQ3hCLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSTtlQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUTtlQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDL0I7WUFDRSxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7QUFyTEQ7O0dBRUc7QUFDSSwrQkFBaUIsR0FBMEMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGltZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRm4gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uL2VuY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBEcm9wZG93blZhbHVlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9iYXNlL2Ryb3Bkb3duLXZhbHVlLmludGVyZmFjZSc7XG5cbmNvbnN0IERBWV9JTl9NUzogbnVtYmVyID0gMTAwMCAqIDYwICogNjAgKiAyNDtcblxuLyoqXG4gKiBWYWxpZCBzdGVwcyBmcm9tIG9uZSB0aW1lIHZhbHVlIHRvIHRoZSBuZXh0LiBOZWVkcyB0byBiZSBhYmxlIHRvIGRpdmlkZSA2MCBtaW51dGVzIHdpdGhvdXQgcmVtYWluZGVyLlxuICovXG50eXBlIE1pbnV0ZVN0ZXBzID0gMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgMTAgfCAxMiB8IDE1IHwgMjAgfCAzMCB8IDYwO1xuXG4vKipcbiAqIENvbnRhaW5zIEhlbHBlciBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGRhdGUgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGVVdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZmlsdGVyIGZ1bmN0aW9uIHRvIHVzZXIgd2hlbiBub25lIHdhcyBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmYXVsdERhdGVGaWx0ZXI6IERhdGVGaWx0ZXJGbjxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4gPSAoKSA9PiB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSBkYXRlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGdldCBhcyBhIGRhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGdpdmVuIHZhbHVlIGFzIGEgZGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXNEYXRlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBEYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdGltZXMgdXNlZCBieSB0aGUgRGF0ZVRpbWUgcGlja2VyIHdoZW4gbm90aGluZyBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9ybWF0IC0gVGhlIHRpbWUgZm9ybWF0LiBEZWZhdWx0cyB0byAyNC5cbiAgICAgKiBAcGFyYW0gbWludXRlU3RlcHMgLSBUaGUgc3RlcHMgZnJvbSBvbmUgdGltZSB2YWx1ZSB0byB0aGUgbmV4dC4gRGVmYXVsdHMgdG8gMzAuXG4gICAgICogQHJldHVybnMgVGltZXMgaW4gdGhlIDI0IGhvdXIgZm9ybWF0IGZyb20gMDowMCB1bnRpbCAyMzozMCBpbiAzMCBtaW51dGUgc3RlcHMuXG4gICAgICovXG4gICAgc3RhdGljIGdldERlZmF1bHRUaW1lcyhmb3JtYXQ6IDEyIHwgMjQgPSAyNCwgbWludXRlU3RlcHM6IE1pbnV0ZVN0ZXBzID0gMzApOiBEcm9wZG93blZhbHVlPFRpbWU+W10ge1xuICAgICAgICBjb25zdCByZXM6IERyb3Bkb3duVmFsdWU8VGltZT5bXSA9IFt7IGRpc3BsYXlOYW1lOiAnLScsIHZhbHVlOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUaW1lIH1dO1xuICAgICAgICBmb3IgKGxldCBob3VyOiBudW1iZXIgPSAwOyBob3VyIDwgMjQ7IGhvdXIrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgbWludXRlOiBudW1iZXIgPSAwOyBtaW51dGUgPCA2MDsgbWludXRlICs9IG1pbnV0ZVN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goRGF0ZVV0aWxpdGllcy5nZXRUaW1lRHJvcGRvd25WYWx1ZShmb3JtYXQsIGhvdXIsIG1pbnV0ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGltZURyb3Bkb3duVmFsdWUoZm9ybWF0OiAxMiB8IDI0LCBob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogRHJvcGRvd25WYWx1ZTxUaW1lPiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlIb3VyOiBudW1iZXIgPSBEYXRlVXRpbGl0aWVzLmdldEZvcm1hdHRlZEhvdXIoZm9ybWF0LCBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGhvdXIpKTtcbiAgICAgICAgY29uc3QgZGlzcGxheU1pbnV0ZTogc3RyaW5nID0gRGF0ZVV0aWxpdGllcy5nZXRGb3JtYXR0ZWRNaW51dGUoZm9ybWF0LCBob3VyLCBtaW51dGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke2Rpc3BsYXlIb3VyfToke2Rpc3BsYXlNaW51dGV9YCxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaG91cnM6IGhvdXIsXG4gICAgICAgICAgICAgICAgbWludXRlczogbWludXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0dGVkSG91cihmb3JtYXQ6IDEyIHwgMjQsIGhvdXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDEyICYmIGhvdXIgPiAxMikge1xuICAgICAgICAgICAgaG91ciAtPSAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaG91cjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXR0ZWRNaW51dGUoZm9ybWF0OiAxMiB8IDI0LCBob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlczogc3RyaW5nID0gYCR7bWludXRlfWA7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDEyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+IDEyKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gYCR7bWludXRlfSBQTWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXMgPSBgJHttaW51dGV9IEFNYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWludXRlLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXMgPSAnMCcuY29uY2F0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBUaW1lIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGRhdGUgdG8gZ2V0IHRoZSB0aW1lIG9iamVjdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBUaW1lIG9iamVjdCBidWlsZCBmcm9tIHRoZSBkYXRlIHZhbHVlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUaW1lRnJvbURhdGUodmFsdWU/OiBEYXRlKTogVGltZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhvdXJzOiBuZXcgRGF0ZSh2YWx1ZSkuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgICAgICBtaW51dGVzOiBuZXcgRGF0ZSh2YWx1ZSkuZ2V0TWludXRlcygpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0ZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGdhdGVzLiBEb2VzIGFkZGl0aW9uYWwgZmlsdGVyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBEYXRlUmFuZ2UgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhcnREYXRlIC0gVGhlIHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIGVuZERhdGUgLSBUaGUgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIGZpbHRlciAtIFRoZSBjdXN0b20gZmlsdGVyIGZyb20gdGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIEFsbCBkYXRlcyBiZXR3ZWVuIHRoZSB0d28gcHJvdmlkZWQgZGF0ZXMuIEluY2x1ZGVzIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICBzdGFydERhdGU6IERhdGUsXG4gICAgICAgIGVuZERhdGU6IERhdGUsXG4gICAgICAgIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPlxuICAgICk6IERhdGVbXSB7XG4gICAgICAgIGNvbnN0IHJlczogRGF0ZVtdID0gW107XG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpIDwgZW5kRGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICAgICB8fCBzdGFydERhdGUuZ2V0TW9udGgoKSA8IGVuZERhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgfHwgc3RhcnREYXRlLmdldERhdGUoKSA8PSBlbmREYXRlLmdldERhdGUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBEYXRlKHN0YXJ0RGF0ZSkpO1xuICAgICAgICAgICAgc3RhcnREYXRlLnNldFRpbWUoc3RhcnREYXRlLmdldFRpbWUoKSArIERBWV9JTl9NUyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZCA9PiBmaWx0ZXIoZCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgdmFsaWQgdGltZXMgZm9yIHRoZSBkcm9wZG93biBvZiBhIGRhdGV0aW1lIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVzIC0gQWxsIGdpdmVuIHRpbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIG9mIHRoZSBkYXRldGltZS5cbiAgICAgKiBAcGFyYW0gbWluIC0gVGhlIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbWluaW11bSB0aW1lLlxuICAgICAqIEBwYXJhbSBtYXggLSBUaGUgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBtYXhpbXVtIHRpbWUuXG4gICAgICogQHBhcmFtIGZpbHRlciAtIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGRvIG1vcmUgc3BlY2lmaWMgdGltZSBmaWx0ZXJpbmcuIFRoaXMgY291bGQgYmUgZS5nLiBUaGUgcmVtb3ZhbCBvZiBsdW5jaCBicmVha3MuXG4gICAgICogQHJldHVybnMgQWxsIHZhbGlkIGRyb3Bkb3duIHZhbHVlcyBmb3IgdGhlIGRhdGV0aW1lIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRWYWxpZFRpbWVzRm9yRHJvcGRvd24oXG4gICAgICAgIHRpbWVzOiBEcm9wZG93blZhbHVlPFRpbWUgfCB1bmRlZmluZWQ+W10sXG4gICAgICAgIGRhdGU/OiBEYXRlLFxuICAgICAgICBtaW4/OiAoZGF0ZT86IERhdGUpID0+IFRpbWUsXG4gICAgICAgIG1heD86IChkYXRlPzogRGF0ZSkgPT4gVGltZSxcbiAgICAgICAgZmlsdGVyPzogKCh0aW1lOiBUaW1lKSA9PiBib29sZWFuKSB8ICgoKSA9PiBib29sZWFuKVxuICAgICk6IERyb3Bkb3duVmFsdWU8VGltZSB8IHVuZGVmaW5lZD5bXSB7XG4gICAgICAgIGlmIChtaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblRpbWU6IFRpbWUgPSBtaW4oZGF0ZSk7XG4gICAgICAgICAgICB0aW1lcyA9IHRpbWVzLmZpbHRlcih0ID0+XG4gICAgICAgICAgICAgICAgIXQudmFsdWVcbiAgICAgICAgICAgICAgICB8fCB0LnZhbHVlLmhvdXJzID4gbWluVGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgIHx8IChcbiAgICAgICAgICAgICAgICAgICAgdC52YWx1ZS5ob3VycyA9PT0gbWluVGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICAmJiB0LnZhbHVlLm1pbnV0ZXMgPj0gbWluVGltZS5taW51dGVzXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4KSB7XG4gICAgICAgICAgICBjb25zdCBtYXhUaW1lOiBUaW1lID0gbWF4KGRhdGUpO1xuICAgICAgICAgICAgdGltZXMgPSB0aW1lcy5maWx0ZXIodCA9PlxuICAgICAgICAgICAgICAgICF0LnZhbHVlXG4gICAgICAgICAgICAgICAgfHwgdC52YWx1ZS5ob3VycyA8IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgIHQudmFsdWUuaG91cnMgPT09IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgJiYgdC52YWx1ZS5taW51dGVzIDw9IG1heFRpbWUubWludXRlc1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgdGltZXMgPSB0aW1lcy5maWx0ZXIodCA9PiAhdC52YWx1ZSB8fCBmaWx0ZXIodC52YWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdGltZSBvYmplY3QgaGFzIHByb2Nlc3NhYmxlIGhvdXJzIGFuZCBtaW51dGVzIHByb3BlcnRpZXMuXG4gICAgICogRG9lc24ndCBjaGVjayBjdXN0b20gdmFsaWRhdG9ycyBsaWtlIG1pbi9tYXggZnJvbSB0aGUgbWV0YWRhdGEgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aW1lIC0gVGhlIHRpbWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHRpbWUgb2JqZWN0IGlzIHVucHJvY2Vzc2FibGUuXG4gICAgICovXG4gICAgc3RhdGljIHRpbWVJc1VucHJvY2Vzc2FibGUodGltZT86IFRpbWUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRpbWVcbiAgICAgICAgICAgIHx8IHRpbWUuaG91cnMgPT0gbnVsbFxuICAgICAgICAgICAgfHwgdHlwZW9mIHRpbWUuaG91cnMgIT09ICdudW1iZXInXG4gICAgICAgICAgICB8fCBOdW1iZXIuaXNOYU4odGltZS5ob3VycylcbiAgICAgICAgICAgIHx8IHRpbWUubWludXRlcyA9PSBudWxsXG4gICAgICAgICAgICB8fCB0eXBlb2YgdGltZS5taW51dGVzICE9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgfHwgTnVtYmVyLmlzTmFOKHRpbWUubWludXRlcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSJdfQ==
|