@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.
Files changed (56) hide show
  1. package/README.md +100 -0
  2. package/_index.scss +1 -0
  3. package/_timepicker-theme.scss +109 -0
  4. package/bundles/dhutaryan-ngx-mat-timepicker.umd.js +2476 -0
  5. package/bundles/dhutaryan-ngx-mat-timepicker.umd.js.map +1 -0
  6. package/dhutaryan-ngx-mat-timepicker.d.ts +5 -0
  7. package/esm2015/dhutaryan-ngx-mat-timepicker.js +5 -0
  8. package/esm2015/lib/adapter/index.js +26 -0
  9. package/esm2015/lib/adapter/native-date-time-adapter.js +130 -0
  10. package/esm2015/lib/adapter/time-adapter.js +62 -0
  11. package/esm2015/lib/clock-dials.js +59 -0
  12. package/esm2015/lib/hours-clock-dial.js +159 -0
  13. package/esm2015/lib/minutes-clock-dial.js +124 -0
  14. package/esm2015/lib/time-face-base.js +75 -0
  15. package/esm2015/lib/time-inputs.js +140 -0
  16. package/esm2015/lib/time-period.js +55 -0
  17. package/esm2015/lib/time-selection-model.js +76 -0
  18. package/esm2015/lib/timepicker-actions-default.js +3 -0
  19. package/esm2015/lib/timepicker-actions.js +125 -0
  20. package/esm2015/lib/timepicker-animations.js +22 -0
  21. package/esm2015/lib/timepicker-base.js +335 -0
  22. package/esm2015/lib/timepicker-content-layout.js +23 -0
  23. package/esm2015/lib/timepicker-content.js +104 -0
  24. package/esm2015/lib/timepicker-input-base.js +203 -0
  25. package/esm2015/lib/timepicker-input.js +92 -0
  26. package/esm2015/lib/timepicker-scroll-strategy.js +15 -0
  27. package/esm2015/lib/timepicker-toggle.js +71 -0
  28. package/esm2015/lib/timepicker.js +26 -0
  29. package/esm2015/lib/timepicker.module.js +144 -0
  30. package/esm2015/public-api.js +19 -0
  31. package/fesm2015/dhutaryan-ngx-mat-timepicker.js +1967 -0
  32. package/fesm2015/dhutaryan-ngx-mat-timepicker.js.map +1 -0
  33. package/lib/adapter/index.d.ts +9 -0
  34. package/lib/adapter/native-date-time-adapter.d.ts +43 -0
  35. package/lib/adapter/time-adapter.d.ts +120 -0
  36. package/lib/clock-dials.d.ts +21 -0
  37. package/lib/hours-clock-dial.d.ts +41 -0
  38. package/lib/minutes-clock-dial.d.ts +27 -0
  39. package/lib/time-face-base.d.ts +30 -0
  40. package/lib/time-inputs.d.ts +37 -0
  41. package/lib/time-period.d.ts +19 -0
  42. package/lib/time-selection-model.d.ts +62 -0
  43. package/lib/timepicker-actions-default.d.ts +3 -0
  44. package/lib/timepicker-actions.d.ts +41 -0
  45. package/lib/timepicker-animations.d.ts +6 -0
  46. package/lib/timepicker-base.d.ts +121 -0
  47. package/lib/timepicker-content-layout.d.ts +7 -0
  48. package/lib/timepicker-content.d.ts +50 -0
  49. package/lib/timepicker-input-base.d.ts +94 -0
  50. package/lib/timepicker-input.d.ts +33 -0
  51. package/lib/timepicker-scroll-strategy.d.ts +12 -0
  52. package/lib/timepicker-toggle.d.ts +26 -0
  53. package/lib/timepicker.d.ts +6 -0
  54. package/lib/timepicker.module.d.ts +28 -0
  55. package/package.json +36 -0
  56. 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==