@dhutaryan/ngx-mat-timepicker 0.0.1
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/_index.scss +1 -0
- package/_timepicker-theme.scss +109 -0
- package/bundles/dhutaryan-ngx-mat-timepicker.umd.js +2476 -0
- package/bundles/dhutaryan-ngx-mat-timepicker.umd.js.map +1 -0
- package/dhutaryan-ngx-mat-timepicker.d.ts +5 -0
- package/esm2015/dhutaryan-ngx-mat-timepicker.js +5 -0
- package/esm2015/lib/adapter/index.js +26 -0
- package/esm2015/lib/adapter/native-date-time-adapter.js +130 -0
- package/esm2015/lib/adapter/time-adapter.js +62 -0
- package/esm2015/lib/clock-dials.js +59 -0
- package/esm2015/lib/hours-clock-dial.js +159 -0
- package/esm2015/lib/minutes-clock-dial.js +124 -0
- package/esm2015/lib/time-face-base.js +75 -0
- package/esm2015/lib/time-inputs.js +140 -0
- package/esm2015/lib/time-period.js +55 -0
- package/esm2015/lib/time-selection-model.js +76 -0
- package/esm2015/lib/timepicker-actions-default.js +3 -0
- package/esm2015/lib/timepicker-actions.js +125 -0
- package/esm2015/lib/timepicker-animations.js +22 -0
- package/esm2015/lib/timepicker-base.js +335 -0
- package/esm2015/lib/timepicker-content-layout.js +23 -0
- package/esm2015/lib/timepicker-content.js +104 -0
- package/esm2015/lib/timepicker-input-base.js +203 -0
- package/esm2015/lib/timepicker-input.js +92 -0
- package/esm2015/lib/timepicker-scroll-strategy.js +15 -0
- package/esm2015/lib/timepicker-toggle.js +71 -0
- package/esm2015/lib/timepicker.js +26 -0
- package/esm2015/lib/timepicker.module.js +144 -0
- package/esm2015/public-api.js +19 -0
- package/fesm2015/dhutaryan-ngx-mat-timepicker.js +1967 -0
- package/fesm2015/dhutaryan-ngx-mat-timepicker.js.map +1 -0
- package/lib/adapter/index.d.ts +9 -0
- package/lib/adapter/native-date-time-adapter.d.ts +43 -0
- package/lib/adapter/time-adapter.d.ts +120 -0
- package/lib/clock-dials.d.ts +21 -0
- package/lib/hours-clock-dial.d.ts +41 -0
- package/lib/minutes-clock-dial.d.ts +27 -0
- package/lib/time-face-base.d.ts +30 -0
- package/lib/time-inputs.d.ts +37 -0
- package/lib/time-period.d.ts +19 -0
- package/lib/time-selection-model.d.ts +62 -0
- package/lib/timepicker-actions-default.d.ts +3 -0
- package/lib/timepicker-actions.d.ts +41 -0
- package/lib/timepicker-animations.d.ts +6 -0
- package/lib/timepicker-base.d.ts +121 -0
- package/lib/timepicker-content-layout.d.ts +7 -0
- package/lib/timepicker-content.d.ts +50 -0
- package/lib/timepicker-input-base.d.ts +94 -0
- package/lib/timepicker-input.d.ts +33 -0
- package/lib/timepicker-scroll-strategy.d.ts +12 -0
- package/lib/timepicker-toggle.d.ts +26 -0
- package/lib/timepicker.d.ts +6 -0
- package/lib/timepicker.module.d.ts +28 -0
- package/package.json +36 -0
- package/public-api.d.ts +15 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { MAT_TIME_LOCALE, TimeAdapter } from './time-adapter';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Matches strings that have the form of a valid RFC 3339 string
|
|
6
|
+
* (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date
|
|
7
|
+
* because the regex will match strings an with out of bounds month, date, etc.
|
|
8
|
+
*/
|
|
9
|
+
const ISO_8601_REGEX = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|(?:(?:\+|-)\d{2}:\d{2}))?)?$/;
|
|
10
|
+
/** Adapts the native JS Date for components that work with time. */
|
|
11
|
+
export class NativeDateTimeAdapter extends TimeAdapter {
|
|
12
|
+
constructor(matTimeLocale) {
|
|
13
|
+
super();
|
|
14
|
+
super.setLocale(matTimeLocale);
|
|
15
|
+
}
|
|
16
|
+
now() {
|
|
17
|
+
return new Date();
|
|
18
|
+
}
|
|
19
|
+
parse(value, parseFormat) {
|
|
20
|
+
// We have no way using the native JS Date to set the parse format or locale, so we ignore these
|
|
21
|
+
// parameters.
|
|
22
|
+
if (typeof value == 'number') {
|
|
23
|
+
return new Date(value);
|
|
24
|
+
}
|
|
25
|
+
const { hour, minute } = this.parseTime(value);
|
|
26
|
+
const date = new Date();
|
|
27
|
+
date.setHours(Number(hour));
|
|
28
|
+
date.setMinutes(Number(minute));
|
|
29
|
+
return value ? new Date(date) : null;
|
|
30
|
+
}
|
|
31
|
+
parseTime(value) {
|
|
32
|
+
const [hour, minute] = value
|
|
33
|
+
.replace(/(\sam|\spm|\sAM|\sPM|am|pm|AM|PM)/g, '')
|
|
34
|
+
.split(':');
|
|
35
|
+
return { hour, minute };
|
|
36
|
+
}
|
|
37
|
+
getHour(date) {
|
|
38
|
+
return date.getHours();
|
|
39
|
+
}
|
|
40
|
+
getMinute(date) {
|
|
41
|
+
return date.getMinutes();
|
|
42
|
+
}
|
|
43
|
+
updateHour(date, hour) {
|
|
44
|
+
const copy = new Date(date.getTime());
|
|
45
|
+
copy.setHours(hour);
|
|
46
|
+
return copy;
|
|
47
|
+
}
|
|
48
|
+
updateMinute(date, minute) {
|
|
49
|
+
const copy = new Date(date.getTime());
|
|
50
|
+
copy.setMinutes(minute);
|
|
51
|
+
return copy;
|
|
52
|
+
}
|
|
53
|
+
getPeriod(date) {
|
|
54
|
+
return date.getHours() < 12 ? 'am' : 'pm';
|
|
55
|
+
}
|
|
56
|
+
format(date, displayFormat) {
|
|
57
|
+
if (!this.isValid(date)) {
|
|
58
|
+
throw Error('NativeDateTimeAdapter: Cannot format invalid date.');
|
|
59
|
+
}
|
|
60
|
+
const dtf = new Intl.DateTimeFormat(this.locale, Object.assign(Object.assign({}, displayFormat), { timeZone: 'utc' }));
|
|
61
|
+
return this._format(dtf, date);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings
|
|
65
|
+
* (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an
|
|
66
|
+
* invalid date for all other values.
|
|
67
|
+
*/
|
|
68
|
+
deserialize(value) {
|
|
69
|
+
if (typeof value === 'string') {
|
|
70
|
+
if (!value) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the
|
|
74
|
+
// string is the right format first.
|
|
75
|
+
if (ISO_8601_REGEX.test(value)) {
|
|
76
|
+
const date = new Date(value);
|
|
77
|
+
if (this.isValid(date)) {
|
|
78
|
+
return date;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return super.deserialize(value);
|
|
83
|
+
}
|
|
84
|
+
isTimeInstance(obj) {
|
|
85
|
+
return obj instanceof Date;
|
|
86
|
+
}
|
|
87
|
+
isValid(date) {
|
|
88
|
+
return !isNaN(date.getTime());
|
|
89
|
+
}
|
|
90
|
+
invalid() {
|
|
91
|
+
return new Date(NaN);
|
|
92
|
+
}
|
|
93
|
+
compareTime(first, second) {
|
|
94
|
+
return (first.getFullYear() - second.getFullYear() ||
|
|
95
|
+
first.getMonth() - second.getMonth() ||
|
|
96
|
+
first.getDate() - second.getDate() ||
|
|
97
|
+
first.getHours() - second.getHours() ||
|
|
98
|
+
first.getMinutes() - first.getMinutes());
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* When converting Date object to string, javascript built-in functions may return wrong
|
|
102
|
+
* results because it applies its internal DST rules. The DST rules around the world change
|
|
103
|
+
* very frequently, and the current valid rule is not always valid in previous years though.
|
|
104
|
+
* We work around this problem building a new Date object which has its internal UTC
|
|
105
|
+
* representation with the local date and time.
|
|
106
|
+
* @param dtf Intl.DateTimeFormat object, containing the desired string format. It must have
|
|
107
|
+
* timeZone set to 'utc' to work fine.
|
|
108
|
+
* @param date Date from which we want to get the string representation according to dtf
|
|
109
|
+
* @returns A Date object with its UTC representation based on the passed in date info
|
|
110
|
+
*/
|
|
111
|
+
_format(dtf, date) {
|
|
112
|
+
// Passing the year to the constructor causes year numbers <100 to be converted to 19xx.
|
|
113
|
+
// To work around this we use `setUTCFullYear` and `setUTCHours` instead.
|
|
114
|
+
const d = new Date();
|
|
115
|
+
d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());
|
|
116
|
+
d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
|
|
117
|
+
return dtf.format(d);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
NativeDateTimeAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NativeDateTimeAdapter, deps: [{ token: MAT_TIME_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
121
|
+
NativeDateTimeAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NativeDateTimeAdapter });
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: NativeDateTimeAdapter, decorators: [{
|
|
123
|
+
type: Injectable
|
|
124
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
125
|
+
type: Optional
|
|
126
|
+
}, {
|
|
127
|
+
type: Inject,
|
|
128
|
+
args: [MAT_TIME_LOCALE]
|
|
129
|
+
}] }]; } });
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWRhdGUtdGltZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi9hZGFwdGVyL25hdGl2ZS1kYXRlLXRpbWUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFHOUQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUNsQixvRkFBb0YsQ0FBQztBQUV2RixvRUFBb0U7QUFFcEUsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFdBQWlCO0lBQzFELFlBQWlELGFBQXFCO1FBQ3BFLEtBQUssRUFBRSxDQUFDO1FBQ1IsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsR0FBRztRQUNELE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQVUsRUFBRSxXQUFpQjtRQUNqQyxnR0FBZ0c7UUFDaEcsY0FBYztRQUNkLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEI7UUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7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LEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQzFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ3hDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLE9BQU8sQ0FBQyxHQUF3QixFQUFFLElBQVU7UUFDbEQsd0ZBQXdGO1FBQ3hGLHlFQUF5RTtRQUN6RSxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsV0FBVyxDQUNYLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ2pCLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUN2QixDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7O21IQTNJVSxxQkFBcUIsa0JBQ0EsZUFBZTt1SEFEcEMscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVU7OzBCQUVJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IE1BVF9USU1FX0xPQ0FMRSwgVGltZUFkYXB0ZXIgfSBmcm9tICcuL3RpbWUtYWRhcHRlcic7XHJcbmltcG9ydCB7IE1hdFRpbWVQZXJpb2RUeXBlIH0gZnJvbSAnLi4vdGltZS1wZXJpb2QnO1xyXG5cclxuLyoqXHJcbiAqIE1hdGNoZXMgc3RyaW5ncyB0aGF0IGhhdmUgdGhlIGZvcm0gb2YgYSB2YWxpZCBSRkMgMzMzOSBzdHJpbmdcclxuICogKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5KS4gTm90ZSB0aGF0IHRoZSBzdHJpbmcgbWF5IG5vdCBhY3R1YWxseSBiZSBhIHZhbGlkIGRhdGVcclxuICogYmVjYXVzZSB0aGUgcmVnZXggd2lsbCBtYXRjaCBzdHJpbmdzIGFuIHdpdGggb3V0IG9mIGJvdW5kcyBtb250aCwgZGF0ZSwgZXRjLlxyXG4gKi9cclxuY29uc3QgSVNPXzg2MDFfUkVHRVggPVxyXG4gIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpUXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT8oPzpafCg/Oig/OlxcK3wtKVxcZHsyfTpcXGR7Mn0pKT8pPyQvO1xyXG5cclxuLyoqIEFkYXB0cyB0aGUgbmF0aXZlIEpTIERhdGUgZm9yIGNvbXBvbmVudHMgdGhhdCB3b3JrIHdpdGggdGltZS4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmF0aXZlRGF0ZVRpbWVBZGFwdGVyIGV4dGVuZHMgVGltZUFkYXB0ZXI8RGF0ZT4ge1xyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX1RJTUVfTE9DQUxFKSBtYXRUaW1lTG9jYWxlOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBzdXBlci5zZXRMb2NhbGUobWF0VGltZUxvY2FsZSk7XHJcbiAgfVxyXG5cclxuICBub3coKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoKTtcclxuICB9XHJcblxyXG4gIHBhcnNlKHZhbHVlOiBhbnksIHBhcnNlRm9ybWF0PzogYW55KTogRGF0ZSB8IG51bGwge1xyXG4gICAgLy8gV2UgaGF2ZSBubyB3YXkgdXNpbmcgdGhlIG5hdGl2ZSBKUyBEYXRlIHRvIHNldCB0aGUgcGFyc2UgZm9ybWF0IG9yIGxvY2FsZSwgc28gd2UgaWdub3JlIHRoZXNlXHJcbiAgICAvLyBwYXJhbWV0ZXJzLlxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHsgaG91ciwgbWludXRlIH0gPSB0aGlzLnBhcnNlVGltZSh2YWx1ZSk7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGRhdGUuc2V0SG91cnMoTnVtYmVyKGhvdXIpKTtcclxuICAgIGRhdGUuc2V0TWludXRlcyhOdW1iZXIobWludXRlKSk7XHJcblxyXG4gICAgcmV0dXJuIHZhbHVlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcGFyc2VUaW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IFtob3VyLCBtaW51dGVdID0gdmFsdWVcclxuICAgICAgLnJlcGxhY2UoLyhcXHNhbXxcXHNwbXxcXHNBTXxcXHNQTXxhbXxwbXxBTXxQTSkvZywgJycpXHJcbiAgICAgIC5zcGxpdCgnOicpO1xyXG5cclxuICAgIHJldHVybiB7IGhvdXIsIG1pbnV0ZSB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0SG91cihkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRNaW51dGUoZGF0ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVIb3VyKGRhdGU6IERhdGUsIGhvdXI6IG51bWJlcik6IERhdGUge1xyXG4gICAgY29uc3QgY29weSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcclxuICAgIGNvcHkuc2V0SG91cnMoaG91cik7XHJcblxyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVNaW51dGUoZGF0ZTogRGF0ZSwgbWludXRlOiBudW1iZXIpOiBEYXRlIHtcclxuICAgIGNvbnN0IGNvcHkgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XHJcbiAgICBjb3B5LnNldE1pbnV0ZXMobWludXRlKTtcclxuXHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcblxyXG4gIGdldFBlcmlvZChkYXRlOiBEYXRlKTogTWF0VGltZVBlcmlvZFR5cGUge1xyXG4gICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gJ2FtJyA6ICdwbSc7XHJcbiAgfVxyXG5cclxuICBmb3JtYXQoZGF0ZTogRGF0ZSwgZGlzcGxheUZvcm1hdDogT2JqZWN0KTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5pc1ZhbGlkKGRhdGUpKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdOYXRpdmVEYXRlVGltZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCB7XHJcbiAgICAgIC4uLmRpc3BsYXlGb3JtYXQsXHJcbiAgICAgIHRpbWVab25lOiAndXRjJyxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9mb3JtYXQoZHRmLCBkYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGdpdmVuIHZhbHVlIGlmIGdpdmVuIGEgdmFsaWQgRGF0ZSBvciBudWxsLiBEZXNlcmlhbGl6ZXMgdmFsaWQgSVNPIDg2MDEgc3RyaW5nc1xyXG4gICAqIChodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGludG8gdmFsaWQgRGF0ZXMgYW5kIGVtcHR5IHN0cmluZyBpbnRvIG51bGwuIFJldHVybnMgYW5cclxuICAgKiBpbnZhbGlkIGRhdGUgZm9yIGFsbCBvdGhlciB2YWx1ZXMuXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUodmFsdWU6IGFueSk6IERhdGUgfCBudWxsIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICAvLyBUaGUgYERhdGVgIGNvbnN0cnVjdG9yIGFjY2VwdHMgZm9ybWF0cyBvdGhlciB0aGFuIElTTyA4NjAxLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGVcclxuICAgICAgLy8gc3RyaW5nIGlzIHRoZSByaWdodCBmb3JtYXQgZmlyc3QuXHJcbiAgICAgIGlmIChJU09fODYwMV9SRUdFWC50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZChkYXRlKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgaXNUaW1lSW5zdGFuY2Uob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEYXRlO1xyXG4gIH1cclxuXHJcbiAgaXNWYWxpZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIWlzTmFOKGRhdGUuZ2V0VGltZSgpKTtcclxuICB9XHJcblxyXG4gIGludmFsaWQoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcclxuICB9XHJcblxyXG4gIGNvbXBhcmVUaW1lKGZpcnN0OiBEYXRlLCBzZWNvbmQ6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZmlyc3QuZ2V0RnVsbFllYXIoKSAtIHNlY29uZC5nZXRGdWxsWWVhcigpIHx8XHJcbiAgICAgIGZpcnN0LmdldE1vbnRoKCkgLSBzZWNvbmQuZ2V0TW9udGgoKSB8fFxyXG4gICAgICBmaXJzdC5nZXREYXRlKCkgLSBzZWNvbmQuZ2V0RGF0ZSgpIHx8XHJcbiAgICAgIGZpcnN0LmdldEhvdXJzKCkgLSBzZWNvbmQuZ2V0SG91cnMoKSB8fFxyXG4gICAgICBmaXJzdC5nZXRNaW51dGVzKCkgLSBmaXJzdC5nZXRNaW51dGVzKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGNvbnZlcnRpbmcgRGF0ZSBvYmplY3QgdG8gc3RyaW5nLCBqYXZhc2NyaXB0IGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgcmV0dXJuIHdyb25nXHJcbiAgICogcmVzdWx0cyBiZWNhdXNlIGl0IGFwcGxpZXMgaXRzIGludGVybmFsIERTVCBydWxlcy4gVGhlIERTVCBydWxlcyBhcm91bmQgdGhlIHdvcmxkIGNoYW5nZVxyXG4gICAqIHZlcnkgZnJlcXVlbnRseSwgYW5kIHRoZSBjdXJyZW50IHZhbGlkIHJ1bGUgaXMgbm90IGFsd2F5cyB2YWxpZCBpbiBwcmV2aW91cyB5ZWFycyB0aG91Z2guXHJcbiAgICogV2Ugd29yayBhcm91bmQgdGhpcyBwcm9ibGVtIGJ1aWxkaW5nIGEgbmV3IERhdGUgb2JqZWN0IHdoaWNoIGhhcyBpdHMgaW50ZXJuYWwgVVRDXHJcbiAgICogcmVwcmVzZW50YXRpb24gd2l0aCB0aGUgbG9jYWwgZGF0ZSBhbmQgdGltZS5cclxuICAgKiBAcGFyYW0gZHRmIEludGwuRGF0ZVRpbWVGb3JtYXQgb2JqZWN0LCBjb250YWluaW5nIHRoZSBkZXNpcmVkIHN0cmluZyBmb3JtYXQuIEl0IG11c3QgaGF2ZVxyXG4gICAqICAgIHRpbWVab25lIHNldCB0byAndXRjJyB0byB3b3JrIGZpbmUuXHJcbiAgICogQHBhcmFtIGRhdGUgRGF0ZSBmcm9tIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYWNjb3JkaW5nIHRvIGR0ZlxyXG4gICAqIEByZXR1cm5zIEEgRGF0ZSBvYmplY3Qgd2l0aCBpdHMgVVRDIHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIHRoZSBwYXNzZWQgaW4gZGF0ZSBpbmZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZm9ybWF0KGR0ZjogSW50bC5EYXRlVGltZUZvcm1hdCwgZGF0ZTogRGF0ZSkge1xyXG4gICAgLy8gUGFzc2luZyB0aGUgeWVhciB0byB0aGUgY29uc3RydWN0b3IgY2F1c2VzIHllYXIgbnVtYmVycyA8MTAwIHRvIGJlIGNvbnZlcnRlZCB0byAxOXh4LlxyXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcyB3ZSB1c2UgYHNldFVUQ0Z1bGxZZWFyYCBhbmQgYHNldFVUQ0hvdXJzYCBpbnN0ZWFkLlxyXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XHJcbiAgICBkLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XHJcbiAgICBkLnNldFVUQ0hvdXJzKFxyXG4gICAgICBkYXRlLmdldEhvdXJzKCksXHJcbiAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxyXG4gICAgICBkYXRlLmdldFNlY29uZHMoKSxcclxuICAgICAgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKVxyXG4gICAgKTtcclxuICAgIHJldHVybiBkdGYuZm9ybWF0KGQpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { InjectionToken, LOCALE_ID } from '@angular/core';
|
|
2
|
+
/** InjectionToken for timepicker that can be used to override default locale code. */
|
|
3
|
+
export const MAT_TIME_LOCALE = new InjectionToken('MAT_TIME_LOCALE');
|
|
4
|
+
/** Provider for MAT_TIME_LOCALE injection token. */
|
|
5
|
+
export const MAT_TIME_LOCALE_PROVIDER = {
|
|
6
|
+
provide: MAT_TIME_LOCALE,
|
|
7
|
+
useExisting: LOCALE_ID,
|
|
8
|
+
};
|
|
9
|
+
export class TimeAdapter {
|
|
10
|
+
/**
|
|
11
|
+
* Given a potential time object, returns that same time object if it is
|
|
12
|
+
* a valid time, or `null` if it's not a valid time.
|
|
13
|
+
* @param obj The object to check.
|
|
14
|
+
* @returns A time or `null`.
|
|
15
|
+
*/
|
|
16
|
+
getValidTimeOrNull(obj) {
|
|
17
|
+
return this.isTimeInstance(obj) && this.isValid(obj)
|
|
18
|
+
? obj
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Attempts to deserialize a value to a valid time object. The `<mat-timepicker>` will call this
|
|
23
|
+
* method on all of its `@Input()` properties that accept time. It is therefore possible to
|
|
24
|
+
* support passing values from your backend directly to these properties by overriding this method
|
|
25
|
+
* to also deserialize the format used by your backend.
|
|
26
|
+
* @param value The value to be deserialized into a time object.
|
|
27
|
+
* @returns The deserialized time object, either a valid time, null if the value can be
|
|
28
|
+
* deserialized into a null time (e.g. the empty string), or an invalid date.
|
|
29
|
+
*/
|
|
30
|
+
deserialize(value) {
|
|
31
|
+
if (value == null || (this.isTimeInstance(value) && this.isValid(value))) {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
return this.invalid();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Sets the locale used for all time.
|
|
38
|
+
* @param locale The new locale.
|
|
39
|
+
*/
|
|
40
|
+
setLocale(locale) {
|
|
41
|
+
this.locale = locale;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if two time are equal.
|
|
45
|
+
* @param first The first time to check.
|
|
46
|
+
* @param second The second time to check.
|
|
47
|
+
* @returns Whether the two time are equal.
|
|
48
|
+
* Null time are considered equal to other null time.
|
|
49
|
+
*/
|
|
50
|
+
sameTime(first, second) {
|
|
51
|
+
if (first && second) {
|
|
52
|
+
let firstValid = this.isValid(first);
|
|
53
|
+
let secondValid = this.isValid(second);
|
|
54
|
+
if (firstValid && secondValid) {
|
|
55
|
+
return !this.compareTime(first, second);
|
|
56
|
+
}
|
|
57
|
+
return firstValid == secondValid;
|
|
58
|
+
}
|
|
59
|
+
return first == second;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi9hZGFwdGVyL3RpbWUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcxRCxzRkFBc0Y7QUFDdEYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUFTLGlCQUFpQixDQUFDLENBQUM7QUFFN0Usb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHO0lBQ3RDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFdBQVcsRUFBRSxTQUFTO0NBQ3ZCLENBQUM7QUFFRixNQUFNLE9BQWdCLFdBQVc7SUFvRi9COzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsR0FBWTtRQUM3QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFRLENBQUM7WUFDdkQsQ0FBQyxDQUFFLEdBQVM7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsV0FBVyxDQUFDLEtBQVU7UUFDcEIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsTUFBUztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBV0Q7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLEtBQWUsRUFBRSxNQUFnQjtRQUN4QyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDbkIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksVUFBVSxJQUFJLFdBQVcsRUFBRTtnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsT0FBTyxVQUFVLElBQUksV0FBVyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuLCBMT0NBTEVfSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0VGltZVBlcmlvZFR5cGUgfSBmcm9tICcuLi90aW1lLXBlcmlvZCc7XHJcblxyXG4vKiogSW5qZWN0aW9uVG9rZW4gZm9yIHRpbWVwaWNrZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBkZWZhdWx0IGxvY2FsZSBjb2RlLiAqL1xyXG5leHBvcnQgY29uc3QgTUFUX1RJTUVfTE9DQUxFID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ01BVF9USU1FX0xPQ0FMRScpO1xyXG5cclxuLyoqIFByb3ZpZGVyIGZvciBNQVRfVElNRV9MT0NBTEUgaW5qZWN0aW9uIHRva2VuLiAqL1xyXG5leHBvcnQgY29uc3QgTUFUX1RJTUVfTE9DQUxFX1BST1ZJREVSID0ge1xyXG4gIHByb3ZpZGU6IE1BVF9USU1FX0xPQ0FMRSxcclxuICB1c2VFeGlzdGluZzogTE9DQUxFX0lELFxyXG59O1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRpbWVBZGFwdGVyPFQsIEwgPSBhbnk+IHtcclxuICAvKiogVGhlIGxvY2FsZSB0byB1c2UgZm9yIHRpbWUuICovXHJcbiAgcHJvdGVjdGVkIGxvY2FsZTogTDtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBub3cncyB0aW1lLlxyXG4gICAqIEByZXR1cm5zIE5vdydzIHRpbWUuXHJcbiAgICovXHJcbiAgYWJzdHJhY3Qgbm93KCk6IFQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNlcyBhIHRpbWUgZnJvbSBhIHVzZXItcHJvdmlkZWQgdmFsdWUuXHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBwYXJzZS5cclxuICAgKiBAcGFyYW0gcGFyc2VGb3JtYXQgVGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgdmFsdWUgYmVpbmcgcGFyc2VkXHJcbiAgICogICAgICh0eXBlIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCkuXHJcbiAgICogQHJldHVybnMgVGhlIHBhcnNlZCB0aW1lLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IHBhcnNlKHZhbHVlOiBhbnksIHBhcnNlRm9ybWF0OiBhbnkpOiBUIHwgbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgaG91ciBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgdG8gZXh0cmFjdCB0aGUgaG91ciBmcm9tLlxyXG4gICAqIEByZXR1cm5zIFRoZSBob3VyIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXRIb3VyKHRpbWU6IFQpOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIG1pbnV0ZSBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgdG8gZXh0cmFjdCB0aGUgbWludXRlIGZyb20uXHJcbiAgICogQHJldHVybnMgVGhlIG1pbnV0ZSBjb21wb25lbnQuXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0TWludXRlKHRpbWU6IFQpOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgaG91ciBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgdG8gdXBkYXRlIHRoZSBob3VyLlxyXG4gICAqIEBwYXJhbSBob3VyIFRoZSBuZXcgaG91ciB0byB1cGRhdGUgZ2l2ZW4gdGltZS5cclxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHRpbWUgd2l0aCB1cGRhdGVkIGhvdXIgY29tcG9uZW50LlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IHVwZGF0ZUhvdXIodGltZTogVCwgaG91cjogbnVtYmVyKTogVDtcclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBtaW51dGUgY29tcG9uZW50IG9mIHRoZSBnaXZlbiB0aW1lLlxyXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIHRvIHVwZGF0ZSB0aGUgbWludXRlLlxyXG4gICAqIEBwYXJhbSBtaW51dGUgVGhlIG5ldyBtaW51dGUgdG8gdXBkYXRlIGdpdmVuIHRpbWUuXHJcbiAgICogQHJldHVybnMgVGhlIG5ldyB0aW1lIHdpdGggdXBkYXRlZCBtaW51dGUgY29tcG9uZW50LlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IHVwZGF0ZU1pbnV0ZSh0aW1lOiBULCBtaW51dGU6IG51bWJlcik6IFQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIHBlcmlvZCBjb21wb25lbnQgb2YgdGhlIGdpdmVuIHRpbWUuXHJcbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgdG8gZXh0cmFjdCB0aGUgcGVyaW9kIGZyb20uXHJcbiAgICogQHJldHVybnMgVGhlIHBlcmlvZCBjb21wb25lbnQuXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0UGVyaW9kKHRpbWU6IFQpOiBNYXRUaW1lUGVyaW9kVHlwZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0cyBhIHRpbWUgYXMgYSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBmb3JtYXQuXHJcbiAgICogQHBhcmFtIHRpbWUgVGhlIHZhbHVlIHRvIGZvcm1hdC5cclxuICAgKiBAcGFyYW0gZGlzcGxheUZvcm1hdCBUaGUgZm9ybWF0IHRvIHVzZSB0byBkaXNwbGF5IHRoZSB0aW1lIGFzIGEgc3RyaW5nLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgdGltZSBzdHJpbmcuXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZm9ybWF0KHRpbWU6IFQsIGRpc3BsYXlGb3JtYXQ6IGFueSk6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBjb25zaWRlcmVkIGEgdGltZSBpbnN0YW5jZSBieSB0aGlzIHRpbWVBZGFwdGVyLlxyXG4gICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjaGVja1xyXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG9iamVjdCBpcyBhIHRpbWUgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgaXNUaW1lSW5zdGFuY2Uob2JqOiBhbnkpOiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdGltZSBpcyB2YWxpZC5cclxuICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSB0byBjaGVjay5cclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB0aW1lIGlzIHZhbGlkLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGlzVmFsaWQodGltZTogVCk6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGltZSBpbnN0YW5jZSB0aGF0IGlzIG5vdCB2YWxpZC5cclxuICAgKiBAcmV0dXJucyBBbiBpbnZhbGlkIHRpbWUuXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgaW52YWxpZCgpOiBUO1xyXG5cclxuICAvKipcclxuICAgKiBHaXZlbiBhIHBvdGVudGlhbCB0aW1lIG9iamVjdCwgcmV0dXJucyB0aGF0IHNhbWUgdGltZSBvYmplY3QgaWYgaXQgaXNcclxuICAgKiBhIHZhbGlkIHRpbWUsIG9yIGBudWxsYCBpZiBpdCdzIG5vdCBhIHZhbGlkIHRpbWUuXHJcbiAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrLlxyXG4gICAqIEByZXR1cm5zIEEgdGltZSBvciBgbnVsbGAuXHJcbiAgICovXHJcbiAgZ2V0VmFsaWRUaW1lT3JOdWxsKG9iajogdW5rbm93bik6IFQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmlzVGltZUluc3RhbmNlKG9iaikgJiYgdGhpcy5pc1ZhbGlkKG9iaiBhcyBUKVxyXG4gICAgICA/IChvYmogYXMgVClcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR0ZW1wdHMgdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0byBhIHZhbGlkIHRpbWUgb2JqZWN0LiBUaGUgYDxtYXQtdGltZXBpY2tlcj5gIHdpbGwgY2FsbCB0aGlzXHJcbiAgICogbWV0aG9kIG9uIGFsbCBvZiBpdHMgYEBJbnB1dCgpYCBwcm9wZXJ0aWVzIHRoYXQgYWNjZXB0IHRpbWUuIEl0IGlzIHRoZXJlZm9yZSBwb3NzaWJsZSB0b1xyXG4gICAqIHN1cHBvcnQgcGFzc2luZyB2YWx1ZXMgZnJvbSB5b3VyIGJhY2tlbmQgZGlyZWN0bHkgdG8gdGhlc2UgcHJvcGVydGllcyBieSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kXHJcbiAgICogdG8gYWxzbyBkZXNlcmlhbGl6ZSB0aGUgZm9ybWF0IHVzZWQgYnkgeW91ciBiYWNrZW5kLlxyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgZGVzZXJpYWxpemVkIGludG8gYSB0aW1lIG9iamVjdC5cclxuICAgKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIHRpbWUgb2JqZWN0LCBlaXRoZXIgYSB2YWxpZCB0aW1lLCBudWxsIGlmIHRoZSB2YWx1ZSBjYW4gYmVcclxuICAgKiAgICAgZGVzZXJpYWxpemVkIGludG8gYSBudWxsIHRpbWUgKGUuZy4gdGhlIGVtcHR5IHN0cmluZyksIG9yIGFuIGludmFsaWQgZGF0ZS5cclxuICAgKi9cclxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55KTogVCB8IG51bGwge1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKHRoaXMuaXNUaW1lSW5zdGFuY2UodmFsdWUpICYmIHRoaXMuaXNWYWxpZCh2YWx1ZSkpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmludmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGxvY2FsZSB1c2VkIGZvciBhbGwgdGltZS5cclxuICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBuZXcgbG9jYWxlLlxyXG4gICAqL1xyXG4gIHNldExvY2FsZShsb2NhbGU6IEwpIHtcclxuICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcGFyZXMgdHdvIHRpbWUuXHJcbiAgICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCB0aW1lIHRvIGNvbXBhcmUuXHJcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRpbWUgdG8gY29tcGFyZS5cclxuICAgKiBAcmV0dXJucyAwIGlmIHRoZSB0aW1lIGFyZSBlcXVhbCwgYSBudW1iZXIgbGVzcyB0aGFuIDAgaWYgdGhlIGZpcnN0IHRpbWUgaXMgZWFybGllcixcclxuICAgKiAgICAgYSBudW1iZXIgZ3JlYXRlciB0aGFuIDAgaWYgdGhlIGZpcnN0IHRpbWUgaXMgbGF0ZXIuXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgY29tcGFyZVRpbWUoZmlyc3Q6IFQsIHNlY29uZDogVCk6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHR3byB0aW1lIGFyZSBlcXVhbC5cclxuICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRpbWUgdG8gY2hlY2suXHJcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRpbWUgdG8gY2hlY2suXHJcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgdHdvIHRpbWUgYXJlIGVxdWFsLlxyXG4gICAqICAgICBOdWxsIHRpbWUgYXJlIGNvbnNpZGVyZWQgZXF1YWwgdG8gb3RoZXIgbnVsbCB0aW1lLlxyXG4gICAqL1xyXG4gIHNhbWVUaW1lKGZpcnN0OiBUIHwgbnVsbCwgc2Vjb25kOiBUIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xyXG4gICAgICBsZXQgZmlyc3RWYWxpZCA9IHRoaXMuaXNWYWxpZChmaXJzdCk7XHJcbiAgICAgIGxldCBzZWNvbmRWYWxpZCA9IHRoaXMuaXNWYWxpZChzZWNvbmQpO1xyXG4gICAgICBpZiAoZmlyc3RWYWxpZCAmJiBzZWNvbmRWYWxpZCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5jb21wYXJlVGltZShmaXJzdCwgc2Vjb25kKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlyc3RWYWxpZCA9PSBzZWNvbmRWYWxpZDtcclxuICAgIH1cclxuICAgIHJldHVybiBmaXJzdCA9PSBzZWNvbmQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, ViewEncapsulation, Optional, } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
3
|
+
import { MatTimeFaceBase } from './time-face-base';
|
|
4
|
+
import { withZeroPrefix } from './time-inputs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./adapter";
|
|
7
|
+
import * as i2 from "./timepicker-content-layout";
|
|
8
|
+
import * as i3 from "./time-period";
|
|
9
|
+
import * as i4 from "./hours-clock-dial";
|
|
10
|
+
import * as i5 from "./minutes-clock-dial";
|
|
11
|
+
import * as i6 from "@angular/common";
|
|
12
|
+
export class MatClockDials extends MatTimeFaceBase {
|
|
13
|
+
constructor(_timeAdapter) {
|
|
14
|
+
super(_timeAdapter);
|
|
15
|
+
this.isHoursView = true;
|
|
16
|
+
/** Specifies the view of clock dial. */
|
|
17
|
+
this._view = new BehaviorSubject('hours');
|
|
18
|
+
this._viewSubscription = Subscription.EMPTY;
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this._viewSubscription = this._view.subscribe((view) => (this.isHoursView = view === 'hours'));
|
|
22
|
+
}
|
|
23
|
+
ngOnDestroy() {
|
|
24
|
+
var _a;
|
|
25
|
+
(_a = this._viewSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
26
|
+
this._viewSubscription = null;
|
|
27
|
+
}
|
|
28
|
+
/** Changes clock dial view. */
|
|
29
|
+
onViewChange(view) {
|
|
30
|
+
this._view.next(view);
|
|
31
|
+
}
|
|
32
|
+
_withZeroPrefix(value) {
|
|
33
|
+
return withZeroPrefix(value, this.isMeridiem);
|
|
34
|
+
}
|
|
35
|
+
/** Handles hour selection. */
|
|
36
|
+
_onHourChanged(hour) {
|
|
37
|
+
this._view.next('minutes');
|
|
38
|
+
this._onHourSelected(hour);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
MatClockDials.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MatClockDials, deps: [{ token: i1.TimeAdapter, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
42
|
+
MatClockDials.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MatClockDials, selector: "mat-clock-dials", host: { classAttribute: "mat-clock-dials" }, exportAs: ["matClockDials"], usesInheritance: true, ngImport: i0, template: "<mat-timepicker-content-layout title=\"Select time\">\r\n <div\r\n class=\"mat-clock-dial-value\"\r\n hours\r\n [class.mat-clock-dial-value-active]=\"isHoursView\"\r\n (click)=\"onViewChange('hours')\"\r\n >\r\n {{ _withZeroPrefix(selectedHour) }}\r\n </div>\r\n <div\r\n class=\"mat-clock-dial-value\"\r\n minutes\r\n [class.mat-clock-dial-value-active]=\"!isHoursView\"\r\n (click)=\"onViewChange('minutes')\"\r\n >\r\n {{ _withZeroPrefix(selectedMinute) }}\r\n </div>\r\n\r\n <ng-template mat-time-period [ngIf]=\"isMeridiem\">\r\n <mat-time-period\r\n [period]=\"period\"\r\n (periodChanged)=\"_onPeriodChanged($event)\"\r\n ></mat-time-period>\r\n </ng-template>\r\n\r\n <div class=\"mat-clock-dial-faces\">\r\n <ng-template [ngIf]=\"isHoursView\">\r\n <mat-hours-clock-dial\r\n [selectedHour]=\"selectedHour\"\r\n [isMeridiem]=\"isMeridiem\"\r\n (selectedChange)=\"_onHourChanged($event)\"\r\n ></mat-hours-clock-dial>\r\n </ng-template>\r\n <ng-template [ngIf]=\"!isHoursView\">\r\n <mat-minutes-clock-dial\r\n [selectedMinute]=\"selectedMinute\"\r\n (selectedChange)=\"_onMinuteSelected($event)\"\r\n ></mat-minutes-clock-dial>\r\n </ng-template>\r\n </div>\r\n</mat-timepicker-content-layout>\r\n", styles: [".mat-clock-dial-values{display:flex;width:100%}.mat-clock-dial-value{display:flex;align-items:center;justify-content:center;height:4.375rem;border-radius:.25rem;cursor:pointer}.mat-clock-dial-faces{margin-top:2.25rem}\n"], components: [{ type: i2.MatTimepickerContentLayout, selector: "mat-timepicker-content-layout", inputs: ["title"], exportAs: ["matTimepickerContent"] }, { type: i3.MatTimePeriod, selector: "mat-time-period", inputs: ["vertical", "period"], outputs: ["periodChanged"] }, { type: i4.MatHoursClockDial, selector: "mat-hours-clock-dial", inputs: ["selectedHour", "isMeridiem"], outputs: ["selectedChange"], exportAs: ["matHoursClockDial"] }, { type: i5.MatMinutesClockDial, selector: "mat-minutes-clock-dial", inputs: ["selectedMinute"], outputs: ["selectedChange"], exportAs: ["matMinutesClockDial"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MatClockDials, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{
|
|
46
|
+
selector: 'mat-clock-dials',
|
|
47
|
+
templateUrl: './clock-dials.html',
|
|
48
|
+
styleUrls: ['./clock-dials.scss'],
|
|
49
|
+
exportAs: 'matClockDials',
|
|
50
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
51
|
+
encapsulation: ViewEncapsulation.None,
|
|
52
|
+
host: {
|
|
53
|
+
class: 'mat-clock-dials',
|
|
54
|
+
},
|
|
55
|
+
}]
|
|
56
|
+
}], ctorParameters: function () { return [{ type: i1.TimeAdapter, decorators: [{
|
|
57
|
+
type: Optional
|
|
58
|
+
}] }]; } });
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stZGlhbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGltZXBpY2tlci9zcmMvbGliL2Nsb2NrLWRpYWxzLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi9jbG9jay1kaWFscy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUlqQixRQUFRLEdBR1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBZS9DLE1BQU0sT0FBTyxhQUNYLFNBQVEsZUFBa0I7SUFTMUIsWUFBd0IsWUFBNEI7UUFDbEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBUHRCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5CLHdDQUF3QztRQUN2QixVQUFLLEdBQUcsSUFBSSxlQUFlLENBQWMsT0FBTyxDQUFDLENBQUM7UUFDM0Qsc0JBQWlCLEdBQXdCLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFJcEUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQzNDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7O1FBQ1QsTUFBQSxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELCtCQUErQjtJQUMvQixZQUFZLENBQUMsSUFBaUI7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixjQUFjLENBQUMsSUFBWTtRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7OzJHQXRDVSxhQUFhOytGQUFiLGFBQWEsd0pDL0IxQixrekNBeUNBOzRGRFZhLGFBQWE7a0JBWHpCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsU0FBUyxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQ2pDLFFBQVEsRUFBRSxlQUFlO29CQUN6QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLElBQUksRUFBRTt3QkFDSixLQUFLLEVBQUUsaUJBQWlCO3FCQUN6QjtpQkFDRjs7MEJBV2MsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgSW5wdXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcclxuaW1wb3J0IHsgTWF0VGltZVBlcmlvZFR5cGUgfSBmcm9tICcuL3RpbWUtcGVyaW9kJztcclxuaW1wb3J0IHsgTWF0VGltZUZhY2VCYXNlIH0gZnJvbSAnLi90aW1lLWZhY2UtYmFzZSc7XHJcbmltcG9ydCB7IHdpdGhaZXJvUHJlZml4IH0gZnJvbSAnLi90aW1lLWlucHV0cyc7XHJcblxyXG5leHBvcnQgdHlwZSBNYXREaWFsVmlldyA9ICdob3VycycgfCAnbWludXRlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ21hdC1jbG9jay1kaWFscycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Nsb2NrLWRpYWxzLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Nsb2NrLWRpYWxzLnNjc3MnXSxcclxuICBleHBvcnRBczogJ21hdENsb2NrRGlhbHMnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6ICdtYXQtY2xvY2stZGlhbHMnLFxyXG4gIH0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRDbG9ja0RpYWxzPFQ+XHJcbiAgZXh0ZW5kcyBNYXRUaW1lRmFjZUJhc2U8VD5cclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XHJcbntcclxuICBpc0hvdXJzVmlldyA9IHRydWU7XHJcblxyXG4gIC8qKiBTcGVjaWZpZXMgdGhlIHZpZXcgb2YgY2xvY2sgZGlhbC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXREaWFsVmlldz4oJ2hvdXJzJyk7XHJcbiAgcHJpdmF0ZSBfdmlld1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcclxuXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgX3RpbWVBZGFwdGVyOiBUaW1lQWRhcHRlcjxUPikge1xyXG4gICAgc3VwZXIoX3RpbWVBZGFwdGVyKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmlld1N1YnNjcmlwdGlvbiA9IHRoaXMuX3ZpZXcuc3Vic2NyaWJlKFxyXG4gICAgICAodmlldykgPT4gKHRoaXMuaXNIb3Vyc1ZpZXcgPSB2aWV3ID09PSAnaG91cnMnKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmlld1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3ZpZXdTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoYW5nZXMgY2xvY2sgZGlhbCB2aWV3LiAqL1xyXG4gIG9uVmlld0NoYW5nZSh2aWV3OiBNYXREaWFsVmlldyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmlldy5uZXh0KHZpZXcpO1xyXG4gIH1cclxuXHJcbiAgX3dpdGhaZXJvUHJlZml4KHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHdpdGhaZXJvUHJlZml4KHZhbHVlLCB0aGlzLmlzTWVyaWRpZW0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZXMgaG91ciBzZWxlY3Rpb24uICovXHJcbiAgX29uSG91ckNoYW5nZWQoaG91cjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl92aWV3Lm5leHQoJ21pbnV0ZXMnKTtcclxuICAgIHRoaXMuX29uSG91clNlbGVjdGVkKGhvdXIpO1xyXG4gIH1cclxufVxyXG4iLCI8bWF0LXRpbWVwaWNrZXItY29udGVudC1sYXlvdXQgdGl0bGU9XCJTZWxlY3QgdGltZVwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtdmFsdWVcIlxyXG4gICAgaG91cnNcclxuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC12YWx1ZS1hY3RpdmVdPVwiaXNIb3Vyc1ZpZXdcIlxyXG4gICAgKGNsaWNrKT1cIm9uVmlld0NoYW5nZSgnaG91cnMnKVwiXHJcbiAgPlxyXG4gICAge3sgX3dpdGhaZXJvUHJlZml4KHNlbGVjdGVkSG91cikgfX1cclxuICA8L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cIm1hdC1jbG9jay1kaWFsLXZhbHVlXCJcclxuICAgIG1pbnV0ZXNcclxuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC12YWx1ZS1hY3RpdmVdPVwiIWlzSG91cnNWaWV3XCJcclxuICAgIChjbGljayk9XCJvblZpZXdDaGFuZ2UoJ21pbnV0ZXMnKVwiXHJcbiAgPlxyXG4gICAge3sgX3dpdGhaZXJvUHJlZml4KHNlbGVjdGVkTWludXRlKSB9fVxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctdGVtcGxhdGUgbWF0LXRpbWUtcGVyaW9kIFtuZ0lmXT1cImlzTWVyaWRpZW1cIj5cclxuICAgIDxtYXQtdGltZS1wZXJpb2RcclxuICAgICAgW3BlcmlvZF09XCJwZXJpb2RcIlxyXG4gICAgICAocGVyaW9kQ2hhbmdlZCk9XCJfb25QZXJpb2RDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgPjwvbWF0LXRpbWUtcGVyaW9kPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtYXQtY2xvY2stZGlhbC1mYWNlc1wiPlxyXG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzSG91cnNWaWV3XCI+XHJcbiAgICAgIDxtYXQtaG91cnMtY2xvY2stZGlhbFxyXG4gICAgICAgIFtzZWxlY3RlZEhvdXJdPVwic2VsZWN0ZWRIb3VyXCJcclxuICAgICAgICBbaXNNZXJpZGllbV09XCJpc01lcmlkaWVtXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiX29uSG91ckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgID48L21hdC1ob3Vycy1jbG9jay1kaWFsPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaXNIb3Vyc1ZpZXdcIj5cclxuICAgICAgPG1hdC1taW51dGVzLWNsb2NrLWRpYWxcclxuICAgICAgICBbc2VsZWN0ZWRNaW51dGVdPVwic2VsZWN0ZWRNaW51dGVcIlxyXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJfb25NaW51dGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgPjwvbWF0LW1pbnV0ZXMtY2xvY2stZGlhbD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbjwvbWF0LXRpbWVwaWNrZXItY29udGVudC1sYXlvdXQ+XHJcbiJdfQ==
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
3
|
+
import { debounceTime, fromEvent, merge, take } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/material/button";
|
|
6
|
+
import * as i2 from "@angular/common";
|
|
7
|
+
const HOURS = Array(24)
|
|
8
|
+
.fill(null)
|
|
9
|
+
.map((_, i) => i);
|
|
10
|
+
const CLOCK_RADIUS = 128;
|
|
11
|
+
const CLOCK_TICK_RADIUS = 16;
|
|
12
|
+
const CLOCK_CORRECTED_RADIUS = CLOCK_RADIUS - CLOCK_TICK_RADIUS;
|
|
13
|
+
const CLOCK_OUTER_RADIUS = 100;
|
|
14
|
+
const CLOCK_INNER_RADIUS = CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS * 2;
|
|
15
|
+
export class MatHoursClockDial {
|
|
16
|
+
constructor(_element, _cdr, _document, _window) {
|
|
17
|
+
this._element = _element;
|
|
18
|
+
this._cdr = _cdr;
|
|
19
|
+
this._document = _document;
|
|
20
|
+
this._window = _window;
|
|
21
|
+
/** Emits selected hour. */
|
|
22
|
+
this.selectedChange = new EventEmitter();
|
|
23
|
+
this.hours = [];
|
|
24
|
+
}
|
|
25
|
+
/** Selected hour. */
|
|
26
|
+
get selectedHour() {
|
|
27
|
+
return this._selectedHour;
|
|
28
|
+
}
|
|
29
|
+
set selectedHour(value) {
|
|
30
|
+
const edgeValue = this.isMeridiem ? 12 : 0;
|
|
31
|
+
this._selectedHour = value === 0 ? edgeValue : value;
|
|
32
|
+
}
|
|
33
|
+
/** Whether the clock uses 12 hour format. */
|
|
34
|
+
get isMeridiem() {
|
|
35
|
+
return this._isMeridiem;
|
|
36
|
+
}
|
|
37
|
+
set isMeridiem(value) {
|
|
38
|
+
this._isMeridiem = value;
|
|
39
|
+
const edgeValue = value ? 12 : 0;
|
|
40
|
+
this._selectedHour =
|
|
41
|
+
this._selectedHour === 0 ? edgeValue : this._selectedHour;
|
|
42
|
+
}
|
|
43
|
+
ngOnInit() {
|
|
44
|
+
this._initHours();
|
|
45
|
+
}
|
|
46
|
+
/** Hand styles based on selected hour. */
|
|
47
|
+
_handStyles() {
|
|
48
|
+
const deg = Math.round(this.selectedHour * (360 / (24 / 2)));
|
|
49
|
+
const radius = this._getRadius(this.selectedHour);
|
|
50
|
+
const height = radius;
|
|
51
|
+
const marginTop = CLOCK_RADIUS - radius;
|
|
52
|
+
return {
|
|
53
|
+
transform: `rotate(${deg}deg)`,
|
|
54
|
+
height: `${height}px`,
|
|
55
|
+
'margin-top': `${marginTop}px`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Handles mouse and touch events on dial and document. */
|
|
59
|
+
_onMouseDown(event) {
|
|
60
|
+
this._setHour(event);
|
|
61
|
+
const eventsSubscription = merge(fromEvent(this._document, 'mousemove'), fromEvent(this._document, 'touchmove'))
|
|
62
|
+
.pipe(debounceTime(0))
|
|
63
|
+
.subscribe({
|
|
64
|
+
next: (event) => {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
this._setHour(event);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
merge(fromEvent(this._document, 'mouseup'), fromEvent(this._document, 'touchend'))
|
|
70
|
+
.pipe(take(1))
|
|
71
|
+
.subscribe({
|
|
72
|
+
next: () => {
|
|
73
|
+
eventsSubscription.unsubscribe();
|
|
74
|
+
this.selectedChange.emit(this.selectedHour);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** Changes selected hour based on coordinates. */
|
|
79
|
+
_setHour(event) {
|
|
80
|
+
const element = this._element.nativeElement;
|
|
81
|
+
const elementRect = element.getBoundingClientRect();
|
|
82
|
+
const width = element.offsetWidth;
|
|
83
|
+
const height = element.offsetHeight;
|
|
84
|
+
const pageX = event instanceof MouseEvent ? event.pageX : event.touches[0].pageX;
|
|
85
|
+
const pageY = event instanceof MouseEvent ? event.pageY : event.touches[0].pageY;
|
|
86
|
+
const x = width / 2 - (pageX - elementRect.left - this._window.scrollX);
|
|
87
|
+
const y = height / 2 - (pageY - elementRect.top - this._window.scrollY);
|
|
88
|
+
const unit = Math.PI / 6;
|
|
89
|
+
const atan2 = Math.atan2(-x, y);
|
|
90
|
+
const radian = atan2 < 0 ? Math.PI * 2 + atan2 : atan2;
|
|
91
|
+
const initialValue = Math.round(radian / unit);
|
|
92
|
+
const z = Math.sqrt(x * x + y * y);
|
|
93
|
+
const outer = z > CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS;
|
|
94
|
+
const value = this._getHourValue(initialValue, outer);
|
|
95
|
+
this.selectedHour = value;
|
|
96
|
+
this._cdr.detectChanges();
|
|
97
|
+
}
|
|
98
|
+
/** Return value of hour. */
|
|
99
|
+
_getHourValue(value, outer) {
|
|
100
|
+
const edgeValue = value === 0 || value === 12;
|
|
101
|
+
if (outer || this.isMeridiem) {
|
|
102
|
+
return edgeValue ? 0 : value;
|
|
103
|
+
}
|
|
104
|
+
return edgeValue ? 12 : value + 12;
|
|
105
|
+
}
|
|
106
|
+
/** Creates list of hours. */
|
|
107
|
+
_initHours() {
|
|
108
|
+
const initialHours = this.isMeridiem ? HOURS.slice(1, 13) : HOURS;
|
|
109
|
+
this.hours = initialHours.map((hour) => {
|
|
110
|
+
const radian = (hour / 6) * Math.PI;
|
|
111
|
+
const radius = this._getRadius(hour);
|
|
112
|
+
return {
|
|
113
|
+
value: hour,
|
|
114
|
+
displayValue: hour === 0 ? '00' : String(hour),
|
|
115
|
+
left: CLOCK_CORRECTED_RADIUS + Math.sin(radian) * radius,
|
|
116
|
+
top: CLOCK_CORRECTED_RADIUS - Math.cos(radian) * radius,
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/** Returns radius based on hour */
|
|
121
|
+
_getRadius(hour) {
|
|
122
|
+
if (this.isMeridiem) {
|
|
123
|
+
return CLOCK_OUTER_RADIUS;
|
|
124
|
+
}
|
|
125
|
+
const outer = hour >= 0 && hour < 12;
|
|
126
|
+
const radius = outer ? CLOCK_OUTER_RADIUS : CLOCK_INNER_RADIUS;
|
|
127
|
+
return radius;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
MatHoursClockDial.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MatHoursClockDial, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }, { token: Window }], target: i0.ɵɵFactoryTarget.Component });
|
|
131
|
+
MatHoursClockDial.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MatHoursClockDial, selector: "mat-hours-clock-dial", inputs: { selectedHour: "selectedHour", isMeridiem: "isMeridiem" }, outputs: { selectedChange: "selectedChange" }, host: { listeners: { "mousedown": "_onMouseDown($event)" }, classAttribute: "mat-clock-dial mat-clock-dial-hours" }, exportAs: ["matHoursClockDial"], ngImport: i0, template: "<div class=\"mat-clock-dial-hand\" [ngStyle]=\"_handStyles()\"></div>\r\n<ng-template ngFor let-hour [ngForOf]=\"hours\">\r\n <button\r\n class=\"mat-clock-dial-cell mat-elevation-z0\"\r\n mat-mini-fab\r\n disableRipple\r\n [style.left.px]=\"hour.left\"\r\n [style.top.px]=\"hour.top\"\r\n [color]=\"selectedHour === hour.value ? 'primary' : undefined\"\r\n >\r\n {{ hour.displayValue }}\r\n </button>\r\n</ng-template>\r\n", styles: [".mat-clock-dial{position:relative;display:block;width:16rem;height:16rem;margin:0 auto;border-radius:50%}.mat-clock-dial:before{position:absolute;top:50%;left:50%;width:.4375rem;height:.4375rem;border-radius:50%;transform:translate(-50%,-50%);content:\"\"}.mat-clock-dial [mat-mini-fab]{box-shadow:none}.mat-clock-dial-cell{position:absolute;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%}.mat-clock-dial-hand{position:absolute;top:0;right:0;bottom:0;left:0;width:1px;margin:0 auto;transform-origin:bottom}.mat-clock-dial-hand:before{position:absolute;top:calc(.5rem / -2);left:calc(.5rem / -2);width:calc(.5rem + 1px);height:calc(.5rem + 1px);border-radius:50%;content:\"\"}\n"], components: [{ type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MatHoursClockDial, decorators: [{
|
|
133
|
+
type: Component,
|
|
134
|
+
args: [{
|
|
135
|
+
selector: 'mat-hours-clock-dial',
|
|
136
|
+
templateUrl: 'hours-clock-dial.html',
|
|
137
|
+
styleUrls: ['clock-dial.scss'],
|
|
138
|
+
exportAs: 'matHoursClockDial',
|
|
139
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
140
|
+
encapsulation: ViewEncapsulation.None,
|
|
141
|
+
host: {
|
|
142
|
+
class: 'mat-clock-dial mat-clock-dial-hours',
|
|
143
|
+
'(mousedown)': '_onMouseDown($event)',
|
|
144
|
+
},
|
|
145
|
+
}]
|
|
146
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
|
|
147
|
+
type: Inject,
|
|
148
|
+
args: [DOCUMENT]
|
|
149
|
+
}] }, { type: Window, decorators: [{
|
|
150
|
+
type: Inject,
|
|
151
|
+
args: [Window]
|
|
152
|
+
}] }]; }, propDecorators: { selectedHour: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], isMeridiem: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], selectedChange: [{
|
|
157
|
+
type: Output
|
|
158
|
+
}] } });
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91cnMtY2xvY2stZGlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvaG91cnMtY2xvY2stZGlhbC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvaG91cnMtY2xvY2stZGlhbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFTNUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztLQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxHQUFHLGlCQUFpQixDQUFDO0FBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsa0JBQWtCLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBY3RFLE1BQU0sT0FBTyxpQkFBaUI7SUE4QjVCLFlBQ1UsUUFBaUMsRUFDakMsSUFBdUIsRUFDTCxTQUFtQixFQUNyQixPQUFlO1FBSC9CLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBQ2pDLFNBQUksR0FBSixJ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QUFFLHVCQUF1QjtvQkFDcEMsU0FBUyxFQUFFLENBQUMsaUJBQWlCLENBQUM7b0JBQzlCLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsSUFBSSxFQUFFO3dCQUNKLEtBQUssRUFBRSxxQ0FBcUM7d0JBQzVDLGFBQWEsRUFBRSxzQkFBc0I7cUJBQ3RDO2lCQUNGO21IQWtDd0MsUUFBUTswQkFBNUMsTUFBTTsyQkFBQyxRQUFROzhCQUNpQixNQUFNOzBCQUF0QyxNQUFNOzJCQUFDLE1BQU07NENBL0JaLFlBQVk7c0JBRGYsS0FBSztnQkFZRixVQUFVO3NCQURiLEtBQUs7Z0JBYUksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZnJvbUV2ZW50LCBtZXJnZSwgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDbG9ja0RpYWxWaWV3Q2VsbCB7XHJcbiAgdmFsdWU6IG51bWJlcjtcclxuICBkaXNwbGF5VmFsdWU6IHN0cmluZztcclxuICBsZWZ0OiBudW1iZXI7XHJcbiAgdG9wOiBudW1iZXI7XHJcbn1cclxuXHJcbmNvbnN0IEhPVVJTID0gQXJyYXkoMjQpXHJcbiAgLmZpbGwobnVsbClcclxuICAubWFwKChfLCBpKSA9PiBpKTtcclxuY29uc3QgQ0xPQ0tfUkFESVVTID0gMTI4O1xyXG5jb25zdCBDTE9DS19USUNLX1JBRElVUyA9IDE2O1xyXG5jb25zdCBDTE9DS19DT1JSRUNURURfUkFESVVTID0gQ0xPQ0tfUkFESVVTIC0gQ0xPQ0tfVElDS19SQURJVVM7XHJcbmNvbnN0IENMT0NLX09VVEVSX1JBRElVUyA9IDEwMDtcclxuY29uc3QgQ0xPQ0tfSU5ORVJfUkFESVVTID0gQ0xPQ0tfT1VURVJfUkFESVVTIC0gQ0xPQ0tfVElDS19SQURJVVMgKiAyO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtYXQtaG91cnMtY2xvY2stZGlhbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICdob3Vycy1jbG9jay1kaWFsLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydjbG9jay1kaWFsLnNjc3MnXSxcclxuICBleHBvcnRBczogJ21hdEhvdXJzQ2xvY2tEaWFsJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiAnbWF0LWNsb2NrLWRpYWwgbWF0LWNsb2NrLWRpYWwtaG91cnMnLFxyXG4gICAgJyhtb3VzZWRvd24pJzogJ19vbk1vdXNlRG93bigkZXZlbnQpJyxcclxuICB9LFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0SG91cnNDbG9ja0RpYWwgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKiBTZWxlY3RlZCBob3VyLiAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHNlbGVjdGVkSG91cigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSG91cjtcclxuICB9XHJcbiAgc2V0IHNlbGVjdGVkSG91cih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBlZGdlVmFsdWUgPSB0aGlzLmlzTWVyaWRpZW0gPyAxMiA6IDA7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEhvdXIgPSB2YWx1ZSA9PT0gMCA/IGVkZ2VWYWx1ZSA6IHZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIF9zZWxlY3RlZEhvdXI6IG51bWJlcjtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNsb2NrIHVzZXMgMTIgaG91ciBmb3JtYXQuICovXHJcbiAgQElucHV0KClcclxuICBnZXQgaXNNZXJpZGllbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc01lcmlkaWVtO1xyXG4gIH1cclxuICBzZXQgaXNNZXJpZGllbSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNNZXJpZGllbSA9IHZhbHVlO1xyXG4gICAgY29uc3QgZWRnZVZhbHVlID0gdmFsdWUgPyAxMiA6IDA7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEhvdXIgPVxyXG4gICAgICB0aGlzLl9zZWxlY3RlZEhvdXIgPT09IDAgPyBlZGdlVmFsdWUgOiB0aGlzLl9zZWxlY3RlZEhvdXI7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2lzTWVyaWRpZW06IGJvb2xlYW47XHJcblxyXG4gIC8qKiBFbWl0cyBzZWxlY3RlZCBob3VyLiAqL1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICBwdWJsaWMgaG91cnM6IENsb2NrRGlhbFZpZXdDZWxsW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXHJcbiAgICBASW5qZWN0KFdpbmRvdykgcHJpdmF0ZSBfd2luZG93OiBXaW5kb3dcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5faW5pdEhvdXJzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogSGFuZCBzdHlsZXMgYmFzZWQgb24gc2VsZWN0ZWQgaG91ci4gKi9cclxuICBfaGFuZFN0eWxlcygpOiBhbnkge1xyXG4gICAgY29uc3QgZGVnID0gTWF0aC5yb3VuZCh0aGlzLnNlbGVjdGVkSG91ciAqICgzNjAgLyAoMjQgLyAyKSkpO1xyXG4gICAgY29uc3QgcmFkaXVzID0gdGhpcy5fZ2V0UmFkaXVzKHRoaXMuc2VsZWN0ZWRIb3VyKTtcclxuICAgIGNvbnN0IGhlaWdodCA9IHJhZGl1cztcclxuICAgIGNvbnN0IG1hcmdpblRvcCA9IENMT0NLX1JBRElVUyAtIHJhZGl1cztcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0cmFuc2Zvcm06IGByb3RhdGUoJHtkZWd9ZGVnKWAsXHJcbiAgICAgIGhlaWdodDogYCR7aGVpZ2h0fXB4YCxcclxuICAgICAgJ21hcmdpbi10b3AnOiBgJHttYXJnaW5Ub3B9cHhgLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kbGVzIG1vdXNlIGFuZCB0b3VjaCBldmVudHMgb24gZGlhbCBhbmQgZG9jdW1lbnQuICovXHJcbiAgX29uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2V0SG91cihldmVudCk7XHJcblxyXG4gICAgY29uc3QgZXZlbnRzU3Vic2NyaXB0aW9uID0gbWVyZ2UoXHJcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ21vdXNlbW92ZScpLFxyXG4gICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4odGhpcy5fZG9jdW1lbnQsICd0b3VjaG1vdmUnKVxyXG4gICAgKVxyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuX3NldEhvdXIoZXZlbnQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIG1lcmdlKFxyXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJyksXHJcbiAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ3RvdWNoZW5kJylcclxuICAgIClcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgZXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEhvdXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoYW5nZXMgc2VsZWN0ZWQgaG91ciBiYXNlZCBvbiBjb29yZGluYXRlcy4gKi9cclxuICBwcml2YXRlIF9zZXRIb3VyKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgY29uc3QgcGFnZVggPVxyXG4gICAgICBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQgPyBldmVudC5wYWdlWCA6IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVg7XHJcbiAgICBjb25zdCBwYWdlWSA9XHJcbiAgICAgIGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCA/IGV2ZW50LnBhZ2VZIDogZXZlbnQudG91Y2hlc1swXS5wYWdlWTtcclxuICAgIGNvbnN0IHggPSB3aWR0aCAvIDIgLSAocGFnZVggLSBlbGVtZW50UmVjdC5sZWZ0IC0gdGhpcy5fd2luZG93LnNjcm9sbFgpO1xyXG4gICAgY29uc3QgeSA9IGhlaWdodCAvIDIgLSAocGFnZVkgLSBlbGVtZW50UmVjdC50b3AgLSB0aGlzLl93aW5kb3cuc2Nyb2xsWSk7XHJcbiAgICBjb25zdCB1bml0ID0gTWF0aC5QSSAvIDY7XHJcbiAgICBjb25zdCBhdGFuMiA9IE1hdGguYXRhbjIoLXgsIHkpO1xyXG4gICAgY29uc3QgcmFkaWFuID0gYXRhbjIgPCAwID8gTWF0aC5QSSAqIDIgKyBhdGFuMiA6IGF0YW4yO1xyXG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gTWF0aC5yb3VuZChyYWRpYW4gLyB1bml0KTtcclxuICAgIGNvbnN0IHogPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XHJcbiAgICBjb25zdCBvdXRlciA9IHogPiBDTE9DS19PVVRFUl9SQURJVVMgLSBDTE9DS19USUNLX1JBRElVUztcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0SG91clZhbHVlKGluaXRpYWxWYWx1ZSwgb3V0ZXIpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEhvdXIgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIHZhbHVlIG9mIGhvdXIuICovXHJcbiAgcHJpdmF0ZSBfZ2V0SG91clZhbHVlKHZhbHVlOiBudW1iZXIsIG91dGVyOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGVkZ2VWYWx1ZSA9IHZhbHVlID09PSAwIHx8IHZhbHVlID09PSAxMjtcclxuXHJcbiAgICBpZiAob3V0ZXIgfHwgdGhpcy5pc01lcmlkaWVtKSB7XHJcbiAgICAgIHJldHVybiBlZGdlVmFsdWUgPyAwIDogdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGVkZ2VWYWx1ZSA/IDEyIDogdmFsdWUgKyAxMjtcclxuICB9XHJcblxyXG4gIC8qKiBDcmVhdGVzIGxpc3Qgb2YgaG91cnMuICovXHJcbiAgcHJpdmF0ZSBfaW5pdEhvdXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5pdGlhbEhvdXJzID0gdGhpcy5pc01lcmlkaWVtID8gSE9VUlMuc2xpY2UoMSwgMTMpIDogSE9VUlM7XHJcblxyXG4gICAgdGhpcy5ob3VycyA9IGluaXRpYWxIb3Vycy5tYXAoKGhvdXIpID0+IHtcclxuICAgICAgY29uc3QgcmFkaWFuID0gKGhvdXIgLyA2KSAqIE1hdGguUEk7XHJcbiAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuX2dldFJhZGl1cyhob3VyKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdmFsdWU6IGhvdXIsXHJcbiAgICAgICAgZGlzcGxheVZhbHVlOiBob3VyID09PSAwID8gJzAwJyA6IFN0cmluZyhob3VyKSxcclxuICAgICAgICBsZWZ0OiBDTE9DS19DT1JSRUNURURfUkFESVVTICsgTWF0aC5zaW4ocmFkaWFuKSAqIHJhZGl1cyxcclxuICAgICAgICB0b3A6IENMT0NLX0NPUlJFQ1RFRF9SQURJVVMgLSBNYXRoLmNvcyhyYWRpYW4pICogcmFkaXVzLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyByYWRpdXMgYmFzZWQgb24gaG91ciAqL1xyXG4gIHByaXZhdGUgX2dldFJhZGl1cyhob3VyOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuaXNNZXJpZGllbSkge1xyXG4gICAgICByZXR1cm4gQ0xPQ0tfT1VURVJfUkFESVVTO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG91dGVyID0gaG91ciA+PSAwICYmIGhvdXIgPCAxMjtcclxuICAgIGNvbnN0IHJhZGl1cyA9IG91dGVyID8gQ0xPQ0tfT1VURVJfUkFESVVTIDogQ0xPQ0tfSU5ORVJfUkFESVVTO1xyXG5cclxuICAgIHJldHVybiByYWRpdXM7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtYXQtY2xvY2stZGlhbC1oYW5kXCIgW25nU3R5bGVdPVwiX2hhbmRTdHlsZXMoKVwiPjwvZGl2PlxyXG48bmctdGVtcGxhdGUgbmdGb3IgbGV0LWhvdXIgW25nRm9yT2ZdPVwiaG91cnNcIj5cclxuICA8YnV0dG9uXHJcbiAgICBjbGFzcz1cIm1hdC1jbG9jay1kaWFsLWNlbGwgbWF0LWVsZXZhdGlvbi16MFwiXHJcbiAgICBtYXQtbWluaS1mYWJcclxuICAgIGRpc2FibGVSaXBwbGVcclxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdXIubGVmdFwiXHJcbiAgICBbc3R5bGUudG9wLnB4XT1cImhvdXIudG9wXCJcclxuICAgIFtjb2xvcl09XCJzZWxlY3RlZEhvdXIgPT09IGhvdXIudmFsdWUgPyAncHJpbWFyeScgOiB1bmRlZmluZWRcIlxyXG4gID5cclxuICAgIHt7IGhvdXIuZGlzcGxheVZhbHVlIH19XHJcbiAgPC9idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|