@skyux/datetime 5.1.3 → 5.5.0-beta.0

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 (198) hide show
  1. package/README.md +6 -4
  2. package/bundles/skyux-datetime.umd.js +85 -84
  3. package/documentation.json +412 -49
  4. package/esm2015/index.js +28 -0
  5. package/esm2015/index.js.map +1 -0
  6. package/esm2015/lib/modules/date-pipe/date-format-utility.js +48 -0
  7. package/esm2015/lib/modules/date-pipe/date-format-utility.js.map +1 -0
  8. package/esm2015/lib/modules/date-pipe/date-pipe.module.js +21 -0
  9. package/esm2015/lib/modules/date-pipe/date-pipe.module.js.map +1 -0
  10. package/esm2015/lib/modules/date-pipe/date.pipe.js +65 -0
  11. package/esm2015/lib/modules/date-pipe/date.pipe.js.map +1 -0
  12. package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js +47 -0
  13. package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js.map +1 -0
  14. package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js +464 -0
  15. package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js.map +1 -0
  16. package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js +47 -0
  17. package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js.map +1 -0
  18. package/esm2015/lib/modules/date-range-picker/date-range.service.js +97 -0
  19. package/esm2015/lib/modules/date-range-picker/date-range.service.js.map +1 -0
  20. package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js +2 -0
  21. package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js.map +1 -0
  22. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js +2 -0
  23. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js.map +1 -0
  24. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js +2 -0
  25. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js.map +1 -0
  26. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js +118 -0
  27. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js.map +1 -0
  28. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js +23 -0
  29. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js.map +1 -0
  30. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js +2 -0
  31. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js.map +1 -0
  32. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js +56 -0
  33. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js.map +1 -0
  34. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js +2 -0
  35. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js.map +1 -0
  36. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js +147 -0
  37. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js.map +1 -0
  38. package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js +252 -0
  39. package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js.map +1 -0
  40. package/esm2015/lib/modules/date-range-picker/types/date-range.js +2 -0
  41. package/esm2015/lib/modules/date-range-picker/types/date-range.js.map +1 -0
  42. package/esm2015/lib/modules/datepicker/date-formatter.js +38 -0
  43. package/esm2015/lib/modules/datepicker/date-formatter.js.map +1 -0
  44. package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js +33 -0
  45. package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js.map +1 -0
  46. package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js +2 -0
  47. package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js.map +1 -0
  48. package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js +315 -0
  49. package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js.map +1 -0
  50. package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js +109 -0
  51. package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js.map +1 -0
  52. package/esm2015/lib/modules/datepicker/datepicker-config.service.js +21 -0
  53. package/esm2015/lib/modules/datepicker/datepicker-config.service.js.map +1 -0
  54. package/esm2015/lib/modules/datepicker/datepicker-custom-date.js +2 -0
  55. package/esm2015/lib/modules/datepicker/datepicker-custom-date.js.map +1 -0
  56. package/esm2015/lib/modules/datepicker/datepicker-date.js +2 -0
  57. package/esm2015/lib/modules/datepicker/datepicker-date.js.map +1 -0
  58. package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js +457 -0
  59. package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js.map +1 -0
  60. package/esm2015/lib/modules/datepicker/datepicker-input.directive.js +435 -0
  61. package/esm2015/lib/modules/datepicker/datepicker-input.directive.js.map +1 -0
  62. package/esm2015/lib/modules/datepicker/datepicker.component.js +333 -0
  63. package/esm2015/lib/modules/datepicker/datepicker.component.js.map +1 -0
  64. package/esm2015/lib/modules/datepicker/datepicker.module.js +95 -0
  65. package/esm2015/lib/modules/datepicker/datepicker.module.js.map +1 -0
  66. package/esm2015/lib/modules/datepicker/datepicker.service.js +21 -0
  67. package/esm2015/lib/modules/datepicker/datepicker.service.js.map +1 -0
  68. package/esm2015/lib/modules/datepicker/daypicker-button.component.js +26 -0
  69. package/esm2015/lib/modules/datepicker/daypicker-button.component.js.map +1 -0
  70. package/esm2015/lib/modules/datepicker/daypicker-cell.component.js +130 -0
  71. package/esm2015/lib/modules/datepicker/daypicker-cell.component.js.map +1 -0
  72. package/esm2015/lib/modules/datepicker/daypicker.component.js +215 -0
  73. package/esm2015/lib/modules/datepicker/daypicker.component.js.map +1 -0
  74. package/esm2015/lib/modules/datepicker/fuzzy-date.js +2 -0
  75. package/esm2015/lib/modules/datepicker/fuzzy-date.js.map +1 -0
  76. package/esm2015/lib/modules/datepicker/fuzzy-date.service.js +403 -0
  77. package/esm2015/lib/modules/datepicker/fuzzy-date.service.js.map +1 -0
  78. package/esm2015/lib/modules/datepicker/monthpicker.component.js +84 -0
  79. package/esm2015/lib/modules/datepicker/monthpicker.component.js.map +1 -0
  80. package/esm2015/lib/modules/datepicker/yearpicker.component.js +90 -0
  81. package/esm2015/lib/modules/datepicker/yearpicker.component.js.map +1 -0
  82. package/esm2015/lib/modules/shared/sky-datetime-resources.module.js +131 -0
  83. package/esm2015/lib/modules/shared/sky-datetime-resources.module.js.map +1 -0
  84. package/esm2015/lib/modules/timepicker/timepicker.component.js +367 -0
  85. package/esm2015/lib/modules/timepicker/timepicker.component.js.map +1 -0
  86. package/esm2015/lib/modules/timepicker/timepicker.directive.js +229 -0
  87. package/esm2015/lib/modules/timepicker/timepicker.directive.js.map +1 -0
  88. package/esm2015/lib/modules/timepicker/timepicker.interface.js +2 -0
  89. package/esm2015/lib/modules/timepicker/timepicker.interface.js.map +1 -0
  90. package/esm2015/lib/modules/timepicker/timepicker.module.js +46 -0
  91. package/esm2015/lib/modules/timepicker/timepicker.module.js.map +1 -0
  92. package/esm2015/skyux-datetime.js +2 -2
  93. package/esm2015/skyux-datetime.js.map +1 -0
  94. package/esm2015/testing/datepicker-fixture.js +1 -1
  95. package/esm2015/testing/datepicker-fixture.js.map +1 -0
  96. package/esm2015/testing/public-api.js +1 -1
  97. package/esm2015/testing/public-api.js.map +1 -0
  98. package/esm2015/testing/skyux-datetime-testing.js +1 -1
  99. package/esm2015/testing/skyux-datetime-testing.js.map +1 -0
  100. package/esm2015/testing/timepicker-fixture.js +1 -1
  101. package/esm2015/testing/timepicker-fixture.js.map +1 -0
  102. package/fesm2015/skyux-datetime-testing.js.map +1 -1
  103. package/fesm2015/skyux-datetime.js +305 -304
  104. package/fesm2015/skyux-datetime.js.map +1 -1
  105. package/index.d.ts +25 -0
  106. package/{modules → lib/modules}/date-pipe/date-format-utility.d.ts +0 -0
  107. package/{modules → lib/modules}/date-pipe/date-pipe.module.d.ts +0 -0
  108. package/{modules → lib/modules}/date-pipe/date.pipe.d.ts +0 -0
  109. package/{modules → lib/modules}/date-pipe/fuzzy-date.pipe.d.ts +0 -0
  110. package/{modules → lib/modules}/date-range-picker/date-range-picker.component.d.ts +1 -1
  111. package/{modules → lib/modules}/date-range-picker/date-range-picker.module.d.ts +0 -0
  112. package/{modules → lib/modules}/date-range-picker/date-range.service.d.ts +0 -0
  113. package/{modules → lib/modules}/date-range-picker/types/date-range-calculation.d.ts +0 -0
  114. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-config.d.ts +0 -0
  115. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-date-range-function.d.ts +0 -0
  116. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-id.d.ts +0 -0
  117. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-type.d.ts +0 -0
  118. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-validate-function.d.ts +0 -0
  119. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator.d.ts +0 -0
  120. package/{modules → lib/modules}/date-range-picker/types/date-range-default-calculator-config.d.ts +0 -0
  121. package/{modules → lib/modules}/date-range-picker/types/date-range-default-calculator-configs.d.ts +0 -0
  122. package/{modules → lib/modules}/date-range-picker/types/date-range-relative-value.d.ts +0 -0
  123. package/{modules → lib/modules}/date-range-picker/types/date-range.d.ts +0 -0
  124. package/{modules → lib/modules}/datepicker/date-formatter.d.ts +0 -0
  125. package/{modules → lib/modules}/datepicker/datepicker-adapter.service.d.ts +0 -0
  126. package/{modules → lib/modules}/datepicker/datepicker-calendar-change.d.ts +0 -0
  127. package/{modules → lib/modules}/datepicker/datepicker-calendar-inner.component.d.ts +0 -0
  128. package/{modules → lib/modules}/datepicker/datepicker-calendar.component.d.ts +0 -0
  129. package/{modules → lib/modules}/datepicker/datepicker-config.service.d.ts +1 -1
  130. package/{modules → lib/modules}/datepicker/datepicker-custom-date.d.ts +0 -0
  131. package/{modules → lib/modules}/datepicker/datepicker-date.d.ts +0 -0
  132. package/{modules → lib/modules}/datepicker/datepicker-input-fuzzy.directive.d.ts +1 -1
  133. package/{modules → lib/modules}/datepicker/datepicker-input.directive.d.ts +1 -1
  134. package/{modules → lib/modules}/datepicker/datepicker.component.d.ts +1 -0
  135. package/{modules → lib/modules}/datepicker/datepicker.module.d.ts +0 -0
  136. package/{modules → lib/modules}/datepicker/datepicker.service.d.ts +0 -0
  137. package/{modules → lib/modules}/datepicker/daypicker-button.component.d.ts +0 -0
  138. package/{modules → lib/modules}/datepicker/daypicker-cell.component.d.ts +0 -0
  139. package/{modules → lib/modules}/datepicker/daypicker.component.d.ts +0 -0
  140. package/{modules → lib/modules}/datepicker/fuzzy-date.d.ts +0 -0
  141. package/{modules → lib/modules}/datepicker/fuzzy-date.service.d.ts +0 -0
  142. package/{modules → lib/modules}/datepicker/monthpicker.component.d.ts +0 -0
  143. package/{modules → lib/modules}/datepicker/yearpicker.component.d.ts +0 -0
  144. package/{modules → lib/modules}/shared/sky-datetime-resources.module.d.ts +0 -0
  145. package/{modules → lib/modules}/timepicker/timepicker.component.d.ts +0 -0
  146. package/{modules → lib/modules}/timepicker/timepicker.directive.d.ts +1 -1
  147. package/{modules → lib/modules}/timepicker/timepicker.interface.d.ts +0 -0
  148. package/{modules → lib/modules}/timepicker/timepicker.module.d.ts +0 -0
  149. package/package.json +24 -9
  150. package/skyux-datetime.d.ts +1 -1
  151. package/LICENSE +0 -21
  152. package/bundles/skyux-datetime-testing.umd.js.map +0 -1
  153. package/bundles/skyux-datetime.umd.js.map +0 -1
  154. package/esm2015/modules/date-pipe/date-format-utility.js +0 -48
  155. package/esm2015/modules/date-pipe/date-pipe.module.js +0 -21
  156. package/esm2015/modules/date-pipe/date.pipe.js +0 -64
  157. package/esm2015/modules/date-pipe/fuzzy-date.pipe.js +0 -46
  158. package/esm2015/modules/date-range-picker/date-range-picker.component.js +0 -460
  159. package/esm2015/modules/date-range-picker/date-range-picker.module.js +0 -47
  160. package/esm2015/modules/date-range-picker/date-range.service.js +0 -96
  161. package/esm2015/modules/date-range-picker/types/date-range-calculation.js +0 -2
  162. package/esm2015/modules/date-range-picker/types/date-range-calculator-config.js +0 -2
  163. package/esm2015/modules/date-range-picker/types/date-range-calculator-date-range-function.js +0 -2
  164. package/esm2015/modules/date-range-picker/types/date-range-calculator-id.js +0 -118
  165. package/esm2015/modules/date-range-picker/types/date-range-calculator-type.js +0 -23
  166. package/esm2015/modules/date-range-picker/types/date-range-calculator-validate-function.js +0 -2
  167. package/esm2015/modules/date-range-picker/types/date-range-calculator.js +0 -56
  168. package/esm2015/modules/date-range-picker/types/date-range-default-calculator-config.js +0 -2
  169. package/esm2015/modules/date-range-picker/types/date-range-default-calculator-configs.js +0 -147
  170. package/esm2015/modules/date-range-picker/types/date-range-relative-value.js +0 -252
  171. package/esm2015/modules/date-range-picker/types/date-range.js +0 -2
  172. package/esm2015/modules/datepicker/date-formatter.js +0 -38
  173. package/esm2015/modules/datepicker/datepicker-adapter.service.js +0 -33
  174. package/esm2015/modules/datepicker/datepicker-calendar-change.js +0 -2
  175. package/esm2015/modules/datepicker/datepicker-calendar-inner.component.js +0 -315
  176. package/esm2015/modules/datepicker/datepicker-calendar.component.js +0 -108
  177. package/esm2015/modules/datepicker/datepicker-config.service.js +0 -21
  178. package/esm2015/modules/datepicker/datepicker-custom-date.js +0 -2
  179. package/esm2015/modules/datepicker/datepicker-date.js +0 -2
  180. package/esm2015/modules/datepicker/datepicker-input-fuzzy.directive.js +0 -453
  181. package/esm2015/modules/datepicker/datepicker-input.directive.js +0 -432
  182. package/esm2015/modules/datepicker/datepicker.component.js +0 -330
  183. package/esm2015/modules/datepicker/datepicker.module.js +0 -95
  184. package/esm2015/modules/datepicker/datepicker.service.js +0 -21
  185. package/esm2015/modules/datepicker/daypicker-button.component.js +0 -25
  186. package/esm2015/modules/datepicker/daypicker-cell.component.js +0 -128
  187. package/esm2015/modules/datepicker/daypicker.component.js +0 -214
  188. package/esm2015/modules/datepicker/fuzzy-date.js +0 -2
  189. package/esm2015/modules/datepicker/fuzzy-date.service.js +0 -402
  190. package/esm2015/modules/datepicker/monthpicker.component.js +0 -83
  191. package/esm2015/modules/datepicker/yearpicker.component.js +0 -89
  192. package/esm2015/modules/shared/sky-datetime-resources.module.js +0 -131
  193. package/esm2015/modules/timepicker/timepicker.component.js +0 -365
  194. package/esm2015/modules/timepicker/timepicker.directive.js +0 -227
  195. package/esm2015/modules/timepicker/timepicker.interface.js +0 -2
  196. package/esm2015/modules/timepicker/timepicker.module.js +0 -46
  197. package/esm2015/public-api.js +0 -28
  198. package/public-api.d.ts +0 -25
@@ -0,0 +1,403 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { SkyAppLocaleProvider } from '@skyux/i18n';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import moment from 'moment';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@skyux/i18n";
8
+ /**
9
+ * @internal
10
+ */
11
+ export class SkyFuzzyDateService {
12
+ constructor(localeProvider) {
13
+ this.localeProvider = localeProvider;
14
+ this.ngUnsubscribe = new Subject();
15
+ this.localeProvider
16
+ .getLocaleInfo()
17
+ .pipe(takeUntil(this.ngUnsubscribe))
18
+ .subscribe((localeInfo) => {
19
+ this.currentLocale = localeInfo.locale;
20
+ });
21
+ }
22
+ /* istanbul ignore next */
23
+ ngOnDestroy() {
24
+ this.ngUnsubscribe.next();
25
+ this.ngUnsubscribe.complete();
26
+ }
27
+ /**
28
+ * Returns the browser's current locale string.
29
+ */
30
+ getCurrentLocale() {
31
+ return this.currentLocale;
32
+ }
33
+ /**
34
+ * Returns the short format of the provided locale.
35
+ * If not provided, the locale will be taken from the browser's default locale.
36
+ */
37
+ getLocaleShortFormat(locale) {
38
+ return moment.localeData(locale || this.currentLocale).longDateFormat('L');
39
+ }
40
+ /**
41
+ * Formats a fuzzy date by using the provided format and locale strings.
42
+ * If not provided, the locale will be taken from the browser's default locale.
43
+ */
44
+ format(fuzzyDate, format, locale) {
45
+ if (!this.isFuzzyDateValid(fuzzyDate)) {
46
+ return '';
47
+ }
48
+ if (!format) {
49
+ return '';
50
+ }
51
+ const separator = this.getDateSeparator(format);
52
+ let dateParts = [];
53
+ let formatTokens = format.split(separator);
54
+ locale = locale || this.currentLocale;
55
+ let fuzzyDateMoment = this.getMomentFromFuzzyDate(fuzzyDate).locale(locale);
56
+ for (let index = 0; index < formatTokens.length; index++) {
57
+ const token = formatTokens[index];
58
+ /* istanbul ignore else */
59
+ if (token) {
60
+ // tslint:disable-next-line: switch-default
61
+ switch (token.substr(0, 1).toLowerCase()) {
62
+ case 'y':
63
+ if (fuzzyDate.year) {
64
+ dateParts.push(fuzzyDateMoment.format(token));
65
+ }
66
+ break;
67
+ case 'm':
68
+ if (fuzzyDate.month) {
69
+ dateParts.push(fuzzyDateMoment.format(token));
70
+ }
71
+ break;
72
+ case 'd':
73
+ if (fuzzyDate.day) {
74
+ dateParts.push(fuzzyDateMoment.format(token));
75
+ }
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ return dateParts.join(separator);
81
+ }
82
+ /**
83
+ * If not provided, years will default to current year; months will default to January;
84
+ * days will default to 1st of the month.
85
+ */
86
+ getMomentFromFuzzyDate(fuzzyDate) {
87
+ if (!fuzzyDate) {
88
+ return;
89
+ }
90
+ const year = fuzzyDate.year || this.getDefaultYear(fuzzyDate);
91
+ const month = fuzzyDate.month > 0 ? fuzzyDate.month - 1 : 0;
92
+ const day = fuzzyDate.day || 1;
93
+ return moment([year, month, day]);
94
+ }
95
+ /**
96
+ * Gets a string instance of a fuzzy date.
97
+ * @deprecated Deprecated in favor of the `format` function.
98
+ */
99
+ getStringFromFuzzyDate(fuzzyDate, dateFormat) {
100
+ if (!fuzzyDate || !dateFormat) {
101
+ return;
102
+ }
103
+ const separator = this.getDateSeparator(dateFormat);
104
+ const dateFormatIndexes = this.getDateFormatIndexes(dateFormat);
105
+ let dateString = '';
106
+ // Get the components of the date in the order expected of the local format.
107
+ let dateComponents = [
108
+ { value: fuzzyDate.year || 0, index: dateFormatIndexes.yearIndex },
109
+ { value: fuzzyDate.month || 0, index: dateFormatIndexes.monthIndex },
110
+ { value: fuzzyDate.day || 0, index: dateFormatIndexes.dayIndex },
111
+ ];
112
+ dateComponents.sort((a, b) => a.index - b.index);
113
+ dateComponents.forEach((component) => {
114
+ if (component.value > 0 && component.index > -1) {
115
+ if (dateString) {
116
+ dateString += separator;
117
+ }
118
+ dateString += component.value.toString();
119
+ }
120
+ });
121
+ return dateString.trim();
122
+ }
123
+ getFuzzyDateFromSelectedDate(selectedDate, dateFormat) {
124
+ if (!selectedDate || !dateFormat) {
125
+ return;
126
+ }
127
+ let fuzzyDate = {};
128
+ const dateFormatIndexes = this.getDateFormatIndexes(dateFormat);
129
+ if (dateFormatIndexes.yearIndex > -1) {
130
+ fuzzyDate.year = selectedDate.getFullYear();
131
+ }
132
+ if (dateFormatIndexes.dayIndex > -1) {
133
+ fuzzyDate.day = selectedDate.getDate();
134
+ }
135
+ if (dateFormatIndexes.monthIndex > -1) {
136
+ fuzzyDate.month = selectedDate.getMonth() + 1; // getMonth() is 0-indexed.
137
+ }
138
+ return fuzzyDate;
139
+ }
140
+ getFuzzyDateFromString(date, dateFormat) {
141
+ if (!date || !dateFormat) {
142
+ return;
143
+ }
144
+ let day;
145
+ let month;
146
+ let year;
147
+ const dateComponents = this.getDateComponents(date);
148
+ const indexes = this.getDateValueIndexes(date, dateFormat);
149
+ // Look at the date string's component count:
150
+ // 3 indicates a full date
151
+ // 2 indicates a month-year or month-day date
152
+ // 1 indicates a year
153
+ // Other indicates a problem
154
+ switch (dateComponents.length) {
155
+ case 3:
156
+ year = dateComponents[indexes.yearIndex];
157
+ month = dateComponents[indexes.monthIndex];
158
+ day = dateComponents[indexes.dayIndex];
159
+ break;
160
+ case 2:
161
+ // First, check for a 4-digit year. If year exists, then we assume the other component
162
+ // is the month. Otherwise, we can assume the input is mm/dd or mm/yy (2-digit year).
163
+ year = this.get4DigitYearFromDateString(date);
164
+ if (year) {
165
+ month =
166
+ dateComponents[0] === year.toString()
167
+ ? dateComponents[1]
168
+ : dateComponents[0];
169
+ }
170
+ else {
171
+ if (indexes.dayIndex > -1) {
172
+ // mm/dd
173
+ month =
174
+ indexes.monthIndex < indexes.dayIndex
175
+ ? dateComponents[0]
176
+ : dateComponents[1];
177
+ day =
178
+ month === dateComponents[1]
179
+ ? dateComponents[0]
180
+ : dateComponents[1];
181
+ }
182
+ else {
183
+ // mm/yy
184
+ month =
185
+ indexes.monthIndex < indexes.yearIndex
186
+ ? dateComponents[0]
187
+ : dateComponents[1];
188
+ year =
189
+ month === dateComponents[1]
190
+ ? dateComponents[0]
191
+ : dateComponents[1];
192
+ }
193
+ }
194
+ break;
195
+ case 1:
196
+ year = date;
197
+ break;
198
+ default:
199
+ return;
200
+ }
201
+ if (month) {
202
+ // Check if month is valid.
203
+ month = this.getMonthNumber(month);
204
+ if (month === undefined) {
205
+ return;
206
+ }
207
+ // Check if day is valid.
208
+ if (day) {
209
+ day = parseInt(day, 10);
210
+ let fuzzyMoment = this.getMomentFromFuzzyDate({
211
+ month: month,
212
+ day: day,
213
+ year: year,
214
+ });
215
+ if (isNaN(day) || !fuzzyMoment.isValid()) {
216
+ return;
217
+ }
218
+ }
219
+ }
220
+ if (year) {
221
+ year =
222
+ year.toString().length === 2
223
+ ? moment.parseTwoDigitYear(year)
224
+ : parseInt(year.toString(), 10);
225
+ if (isNaN(year) || year.toString().length !== 4) {
226
+ return;
227
+ }
228
+ }
229
+ return {
230
+ month: month,
231
+ day: day,
232
+ year: year,
233
+ };
234
+ }
235
+ getFuzzyDateRange(startFuzzyDate, endFuzzyDate) {
236
+ let start;
237
+ let end;
238
+ let days;
239
+ let months;
240
+ let years;
241
+ let valid = false;
242
+ if (startFuzzyDate &&
243
+ startFuzzyDate.year &&
244
+ endFuzzyDate &&
245
+ endFuzzyDate.year) {
246
+ start = this.getMomentFromFuzzyDate(startFuzzyDate);
247
+ end = this.getMomentFromFuzzyDate(endFuzzyDate);
248
+ years = end.diff(start, 'years');
249
+ months = end.diff(start, 'months');
250
+ days = end.diff(start, 'days');
251
+ valid = end.diff(start) >= 0;
252
+ }
253
+ return {
254
+ years: years,
255
+ months: months,
256
+ days: days,
257
+ valid: valid,
258
+ };
259
+ }
260
+ getCurrentFuzzyDate() {
261
+ let currentDate = moment();
262
+ return {
263
+ day: currentDate.date(),
264
+ month: currentDate.month() + 1,
265
+ year: currentDate.year(),
266
+ };
267
+ }
268
+ getMostRecentLeapYear() {
269
+ let leapYear = new Date().getFullYear();
270
+ while (!this.isLeapYear(leapYear)) {
271
+ leapYear -= 1;
272
+ }
273
+ return leapYear;
274
+ }
275
+ /**
276
+ * Returns the first separator found in the provided date format string.
277
+ * Accepted separators: ['/', '.', '-', ' '].
278
+ * @param dateFormat
279
+ */
280
+ getDateSeparator(dateFormat) {
281
+ let returnValue;
282
+ let separators = ['/', '.', '-', ' '];
283
+ separators.forEach((separator) => {
284
+ if (!returnValue && dateFormat.indexOf(separator) > 0) {
285
+ returnValue = separator;
286
+ }
287
+ });
288
+ return returnValue;
289
+ }
290
+ get4DigitYearFromDateString(date) {
291
+ let year;
292
+ const separator = this.getDateSeparator(date);
293
+ // Find the number value in the string that is 4 digits long.
294
+ date.split(separator).forEach((dateComponent) => {
295
+ if (!year && parseInt(dateComponent, 10).toString().length === 4) {
296
+ year = dateComponent;
297
+ }
298
+ });
299
+ if (year && !isNaN(Number(year))) {
300
+ return parseInt(year, 10);
301
+ }
302
+ }
303
+ isLeapYear(year) {
304
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
305
+ }
306
+ getMonthNumber(month) {
307
+ let returnValue;
308
+ const monthAsNumber = parseInt(month, 10);
309
+ // If the month component is a string ("Janaury"), we check to see if it is a valid month
310
+ if (isNaN(monthAsNumber)) {
311
+ if (!moment(month, 'MMMM').isValid()) {
312
+ return;
313
+ }
314
+ returnValue = parseInt(moment().month(month).format('M'), 10);
315
+ }
316
+ else {
317
+ returnValue = monthAsNumber;
318
+ }
319
+ // Ensure that the month is between 1 and 12
320
+ if (!(1 <= returnValue && returnValue <= 12)) {
321
+ return;
322
+ }
323
+ return returnValue;
324
+ }
325
+ getDefaultYear(fuzzyDate) {
326
+ // Check if we need to return a leap year or the current year.
327
+ if (fuzzyDate.month === 2 && fuzzyDate.day === 29) {
328
+ return this.getMostRecentLeapYear();
329
+ }
330
+ else {
331
+ return new Date().getFullYear();
332
+ }
333
+ }
334
+ getDateComponents(date) {
335
+ const separator = this.getDateSeparator(date);
336
+ return date.split(separator);
337
+ }
338
+ // Returns the order of year, month, and day from the provided date format.
339
+ getDateFormatIndexes(dateFormat) {
340
+ dateFormat = dateFormat.toLowerCase();
341
+ return {
342
+ yearIndex: dateFormat.indexOf('y'),
343
+ monthIndex: dateFormat.indexOf('m'),
344
+ dayIndex: dateFormat.indexOf('d'),
345
+ };
346
+ }
347
+ // Returns the index of each of the date components in the provided string (month, day, year).
348
+ getDateValueIndexes(date, dateFormat) {
349
+ const dateFormatIndexes = this.getDateFormatIndexes(dateFormat);
350
+ let dateComponentIndexes = [];
351
+ if (dateFormatIndexes.yearIndex > -1) {
352
+ dateComponentIndexes.push(dateFormatIndexes.yearIndex);
353
+ }
354
+ if (dateFormatIndexes.monthIndex > -1) {
355
+ dateComponentIndexes.push(dateFormatIndexes.monthIndex);
356
+ }
357
+ if (dateFormatIndexes.dayIndex > -1) {
358
+ dateComponentIndexes.push(dateFormatIndexes.dayIndex);
359
+ }
360
+ dateComponentIndexes.sort(function (a, b) {
361
+ return a - b;
362
+ });
363
+ return {
364
+ yearIndex: dateComponentIndexes.indexOf(dateFormatIndexes.yearIndex),
365
+ monthIndex: dateComponentIndexes.indexOf(dateFormatIndexes.monthIndex),
366
+ dayIndex: dateComponentIndexes.indexOf(dateFormatIndexes.dayIndex),
367
+ };
368
+ }
369
+ /**
370
+ * Validates the provided SkyFuzzyDate object. Valid fuzzy dates are as follows:
371
+ * month, day, year
372
+ * month, year
373
+ * month, day
374
+ * year only
375
+ */
376
+ isFuzzyDateValid(fuzzyDate) {
377
+ if (!fuzzyDate) {
378
+ return false;
379
+ }
380
+ // If none of the dates part are specified, return false.
381
+ if (!fuzzyDate.day && !fuzzyDate.month && !fuzzyDate.year) {
382
+ return false;
383
+ }
384
+ // If only month is specified, return false.
385
+ if (!fuzzyDate.day && fuzzyDate.month && !fuzzyDate.year) {
386
+ return false;
387
+ }
388
+ // If only day is specified, return false.
389
+ if (fuzzyDate.day && !fuzzyDate.month && !fuzzyDate.year) {
390
+ return false;
391
+ }
392
+ return true;
393
+ }
394
+ }
395
+ SkyFuzzyDateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFuzzyDateService, deps: [{ token: i1.SkyAppLocaleProvider }], target: i0.ɵɵFactoryTarget.Injectable });
396
+ SkyFuzzyDateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFuzzyDateService, providedIn: 'root' });
397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFuzzyDateService, decorators: [{
398
+ type: Injectable,
399
+ args: [{
400
+ providedIn: 'root',
401
+ }]
402
+ }], ctorParameters: function () { return [{ type: i1.SkyAppLocaleProvider }]; } });
403
+ //# sourceMappingURL=fuzzy-date.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy-date.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/datetime/src/lib/modules/datepicker/fuzzy-date.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\n\nimport { SkyAppLocaleProvider } from '@skyux/i18n';\n\nimport { Subject } from 'rxjs';\n\nimport { takeUntil } from 'rxjs/operators';\n\nimport { SkyFuzzyDate } from './fuzzy-date';\n\nimport moment from 'moment';\n\n/**\n * @internal\n */\ninterface SkyDateIndexes {\n yearIndex: number;\n monthIndex: number;\n dayIndex: number;\n}\n\n/**\n * @internal\n */\ninterface SkyFuzzyDateRange {\n years: string;\n months: string;\n days: string;\n valid: boolean;\n}\n\n/**\n * @internal\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SkyFuzzyDateService implements OnDestroy {\n private currentLocale: string;\n\n private ngUnsubscribe = new Subject<void>();\n\n constructor(private localeProvider: SkyAppLocaleProvider) {\n this.localeProvider\n .getLocaleInfo()\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((localeInfo) => {\n this.currentLocale = localeInfo.locale;\n });\n }\n\n /* istanbul ignore next */\n public ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n /**\n * Returns the browser's current locale string.\n */\n public getCurrentLocale(): string {\n return this.currentLocale;\n }\n\n /**\n * Returns the short format of the provided locale.\n * If not provided, the locale will be taken from the browser's default locale.\n */\n public getLocaleShortFormat(locale?: string): string {\n return moment.localeData(locale || this.currentLocale).longDateFormat('L');\n }\n\n /**\n * Formats a fuzzy date by using the provided format and locale strings.\n * If not provided, the locale will be taken from the browser's default locale.\n */\n public format(\n fuzzyDate: SkyFuzzyDate,\n format: string,\n locale?: string\n ): string {\n if (!this.isFuzzyDateValid(fuzzyDate)) {\n return '';\n }\n\n if (!format) {\n return '';\n }\n\n const separator = this.getDateSeparator(format);\n let dateParts: string[] = [];\n let formatTokens: string[] = format.split(separator);\n locale = locale || this.currentLocale;\n let fuzzyDateMoment = this.getMomentFromFuzzyDate(fuzzyDate).locale(locale);\n\n for (let index = 0; index < formatTokens.length; index++) {\n const token = formatTokens[index];\n\n /* istanbul ignore else */\n if (token) {\n // tslint:disable-next-line: switch-default\n switch (token.substr(0, 1).toLowerCase()) {\n case 'y':\n if (fuzzyDate.year) {\n dateParts.push(fuzzyDateMoment.format(token));\n }\n break;\n case 'm':\n if (fuzzyDate.month) {\n dateParts.push(fuzzyDateMoment.format(token));\n }\n break;\n case 'd':\n if (fuzzyDate.day) {\n dateParts.push(fuzzyDateMoment.format(token));\n }\n break;\n }\n }\n }\n\n return dateParts.join(separator);\n }\n\n /**\n * If not provided, years will default to current year; months will default to January;\n * days will default to 1st of the month.\n */\n public getMomentFromFuzzyDate(fuzzyDate: SkyFuzzyDate): any {\n if (!fuzzyDate) {\n return;\n }\n\n const year = fuzzyDate.year || this.getDefaultYear(fuzzyDate);\n const month = fuzzyDate.month > 0 ? fuzzyDate.month - 1 : 0;\n const day = fuzzyDate.day || 1;\n\n return moment([year, month, day]);\n }\n\n /**\n * Gets a string instance of a fuzzy date.\n * @deprecated Deprecated in favor of the `format` function.\n */\n public getStringFromFuzzyDate(\n fuzzyDate: SkyFuzzyDate,\n dateFormat: string\n ): string {\n if (!fuzzyDate || !dateFormat) {\n return;\n }\n\n const separator = this.getDateSeparator(dateFormat);\n const dateFormatIndexes = this.getDateFormatIndexes(dateFormat);\n let dateString: string = '';\n\n // Get the components of the date in the order expected of the local format.\n let dateComponents = [\n { value: fuzzyDate.year || 0, index: dateFormatIndexes.yearIndex },\n { value: fuzzyDate.month || 0, index: dateFormatIndexes.monthIndex },\n { value: fuzzyDate.day || 0, index: dateFormatIndexes.dayIndex },\n ];\n dateComponents.sort((a: any, b: any) => a.index - b.index);\n\n dateComponents.forEach((component) => {\n if (component.value > 0 && component.index > -1) {\n if (dateString) {\n dateString += separator;\n }\n dateString += component.value.toString();\n }\n });\n\n return dateString.trim();\n }\n\n public getFuzzyDateFromSelectedDate(\n selectedDate: Date,\n dateFormat: string\n ): SkyFuzzyDate {\n if (!selectedDate || !dateFormat) {\n return;\n }\n\n let fuzzyDate: SkyFuzzyDate = {};\n const dateFormatIndexes = this.getDateFormatIndexes(dateFormat);\n\n if (dateFormatIndexes.yearIndex > -1) {\n fuzzyDate.year = selectedDate.getFullYear();\n }\n\n if (dateFormatIndexes.dayIndex > -1) {\n fuzzyDate.day = selectedDate.getDate();\n }\n\n if (dateFormatIndexes.monthIndex > -1) {\n fuzzyDate.month = selectedDate.getMonth() + 1; // getMonth() is 0-indexed.\n }\n\n return fuzzyDate;\n }\n\n public getFuzzyDateFromString(\n date: string,\n dateFormat: string\n ): SkyFuzzyDate {\n if (!date || !dateFormat) {\n return;\n }\n\n let day: any;\n let month: any;\n let year: any;\n\n const dateComponents = this.getDateComponents(date);\n const indexes = this.getDateValueIndexes(date, dateFormat);\n\n // Look at the date string's component count:\n // 3 indicates a full date\n // 2 indicates a month-year or month-day date\n // 1 indicates a year\n // Other indicates a problem\n switch (dateComponents.length) {\n case 3:\n year = dateComponents[indexes.yearIndex];\n month = dateComponents[indexes.monthIndex];\n day = dateComponents[indexes.dayIndex];\n break;\n case 2:\n // First, check for a 4-digit year. If year exists, then we assume the other component\n // is the month. Otherwise, we can assume the input is mm/dd or mm/yy (2-digit year).\n year = this.get4DigitYearFromDateString(date);\n if (year) {\n month =\n dateComponents[0] === year.toString()\n ? dateComponents[1]\n : dateComponents[0];\n } else {\n if (indexes.dayIndex > -1) {\n // mm/dd\n month =\n indexes.monthIndex < indexes.dayIndex\n ? dateComponents[0]\n : dateComponents[1];\n day =\n month === dateComponents[1]\n ? dateComponents[0]\n : dateComponents[1];\n } else {\n // mm/yy\n month =\n indexes.monthIndex < indexes.yearIndex\n ? dateComponents[0]\n : dateComponents[1];\n year =\n month === dateComponents[1]\n ? dateComponents[0]\n : dateComponents[1];\n }\n }\n break;\n case 1:\n year = date;\n break;\n default:\n return;\n }\n\n if (month) {\n // Check if month is valid.\n month = this.getMonthNumber(month);\n if (month === undefined) {\n return;\n }\n\n // Check if day is valid.\n if (day) {\n day = parseInt(day, 10);\n let fuzzyMoment = this.getMomentFromFuzzyDate({\n month: month,\n day: day,\n year: year,\n });\n if (isNaN(day) || !fuzzyMoment.isValid()) {\n return;\n }\n }\n }\n\n if (year) {\n year =\n year.toString().length === 2\n ? moment.parseTwoDigitYear(year)\n : parseInt(year.toString(), 10);\n if (isNaN(year) || year.toString().length !== 4) {\n return;\n }\n }\n\n return {\n month: month,\n day: day,\n year: year,\n };\n }\n\n public getFuzzyDateRange(\n startFuzzyDate: SkyFuzzyDate,\n endFuzzyDate: SkyFuzzyDate\n ): SkyFuzzyDateRange {\n let start;\n let end;\n let days;\n let months;\n let years;\n let valid = false;\n\n if (\n startFuzzyDate &&\n startFuzzyDate.year &&\n endFuzzyDate &&\n endFuzzyDate.year\n ) {\n start = this.getMomentFromFuzzyDate(startFuzzyDate);\n end = this.getMomentFromFuzzyDate(endFuzzyDate);\n\n years = end.diff(start, 'years');\n months = end.diff(start, 'months');\n days = end.diff(start, 'days');\n valid = end.diff(start) >= 0;\n }\n\n return {\n years: years,\n months: months,\n days: days,\n valid: valid,\n };\n }\n\n public getCurrentFuzzyDate(): SkyFuzzyDate {\n let currentDate = moment();\n\n return {\n day: currentDate.date(),\n month: currentDate.month() + 1, // month() is 0-indexed.\n year: currentDate.year(),\n };\n }\n\n private getMostRecentLeapYear(): number {\n let leapYear = new Date().getFullYear();\n\n while (!this.isLeapYear(leapYear)) {\n leapYear -= 1;\n }\n\n return leapYear;\n }\n\n /**\n * Returns the first separator found in the provided date format string.\n * Accepted separators: ['/', '.', '-', ' '].\n * @param dateFormat\n */\n private getDateSeparator(dateFormat: string): string {\n let returnValue: string;\n let separators = ['/', '.', '-', ' '];\n\n separators.forEach((separator) => {\n if (!returnValue && dateFormat.indexOf(separator) > 0) {\n returnValue = separator;\n }\n });\n\n return returnValue;\n }\n\n private get4DigitYearFromDateString(date: string): number {\n let year: string;\n const separator = this.getDateSeparator(date);\n\n // Find the number value in the string that is 4 digits long.\n date.split(separator).forEach((dateComponent) => {\n if (!year && parseInt(dateComponent, 10).toString().length === 4) {\n year = dateComponent;\n }\n });\n\n if (year && !isNaN(Number(year))) {\n return parseInt(year, 10);\n }\n }\n\n private isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n private getMonthNumber(month: string): number {\n let returnValue: number;\n const monthAsNumber = parseInt(month, 10);\n\n // If the month component is a string (\"Janaury\"), we check to see if it is a valid month\n if (isNaN(monthAsNumber)) {\n if (!moment(month, 'MMMM').isValid()) {\n return;\n }\n returnValue = parseInt(moment().month(month).format('M'), 10);\n } else {\n returnValue = monthAsNumber;\n }\n\n // Ensure that the month is between 1 and 12\n if (!(1 <= returnValue && returnValue <= 12)) {\n return;\n }\n\n return returnValue;\n }\n\n private getDefaultYear(fuzzyDate: SkyFuzzyDate): number {\n // Check if we need to return a leap year or the current year.\n if (fuzzyDate.month === 2 && fuzzyDate.day === 29) {\n return this.getMostRecentLeapYear();\n } else {\n return new Date().getFullYear();\n }\n }\n\n private getDateComponents(date: string): string[] {\n const separator = this.getDateSeparator(date);\n return date.split(separator);\n }\n\n // Returns the order of year, month, and day from the provided date format.\n private getDateFormatIndexes(dateFormat: string): SkyDateIndexes {\n dateFormat = dateFormat.toLowerCase();\n return {\n yearIndex: dateFormat.indexOf('y'),\n monthIndex: dateFormat.indexOf('m'),\n dayIndex: dateFormat.indexOf('d'),\n };\n }\n\n // Returns the index of each of the date components in the provided string (month, day, year).\n private getDateValueIndexes(\n date: string,\n dateFormat: string\n ): SkyDateIndexes {\n const dateFormatIndexes = this.getDateFormatIndexes(dateFormat);\n let dateComponentIndexes = [];\n if (dateFormatIndexes.yearIndex > -1) {\n dateComponentIndexes.push(dateFormatIndexes.yearIndex);\n }\n\n if (dateFormatIndexes.monthIndex > -1) {\n dateComponentIndexes.push(dateFormatIndexes.monthIndex);\n }\n\n if (dateFormatIndexes.dayIndex > -1) {\n dateComponentIndexes.push(dateFormatIndexes.dayIndex);\n }\n\n dateComponentIndexes.sort(function (a, b) {\n return a - b;\n });\n\n return {\n yearIndex: dateComponentIndexes.indexOf(dateFormatIndexes.yearIndex),\n monthIndex: dateComponentIndexes.indexOf(dateFormatIndexes.monthIndex),\n dayIndex: dateComponentIndexes.indexOf(dateFormatIndexes.dayIndex),\n };\n }\n\n /**\n * Validates the provided SkyFuzzyDate object. Valid fuzzy dates are as follows:\n * month, day, year\n * month, year\n * month, day\n * year only\n */\n private isFuzzyDateValid(fuzzyDate: SkyFuzzyDate): boolean {\n if (!fuzzyDate) {\n return false;\n }\n\n // If none of the dates part are specified, return false.\n if (!fuzzyDate.day && !fuzzyDate.month && !fuzzyDate.year) {\n return false;\n }\n\n // If only month is specified, return false.\n if (!fuzzyDate.day && fuzzyDate.month && !fuzzyDate.year) {\n return false;\n }\n\n // If only day is specified, return false.\n if (fuzzyDate.day && !fuzzyDate.month && !fuzzyDate.year) {\n return false;\n }\n\n return true;\n }\n}\n"]}
@@ -0,0 +1,84 @@
1
+ import { Component } from '@angular/core';
2
+ import { SkyDatepickerCalendarInnerComponent } from './datepicker-calendar-inner.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./datepicker-calendar-inner.component";
5
+ import * as i2 from "@skyux/indicators";
6
+ import * as i3 from "@angular/common";
7
+ /**
8
+ * @internal
9
+ */
10
+ export class SkyMonthPickerComponent {
11
+ constructor(datepicker) {
12
+ this.rows = [];
13
+ this.datepicker = datepicker;
14
+ }
15
+ ngOnInit() {
16
+ this.datepicker.stepMonth = {
17
+ years: 1,
18
+ };
19
+ this.datepicker.setRefreshViewHandler(() => {
20
+ this.refreshMonthView();
21
+ }, 'month');
22
+ this.datepicker.setCompareHandler(this.compareMonth, 'month');
23
+ this.datepicker.refreshView();
24
+ this.datepicker.setKeydownHandler((key, event) => {
25
+ this.keydownMonths(key, event);
26
+ }, 'month');
27
+ }
28
+ compareMonth(date1, date2) {
29
+ let d1 = new Date(date1.getFullYear(), date1.getMonth());
30
+ let d2 = new Date(date2.getFullYear(), date2.getMonth());
31
+ return d1.getTime() - d2.getTime();
32
+ }
33
+ refreshMonthView() {
34
+ let months = new Array(12);
35
+ let year = this.datepicker.activeDate.getFullYear();
36
+ let date;
37
+ for (let i = 0; i < 12; i++) {
38
+ date = new Date(year, i, 1);
39
+ date = this.datepicker.fixTimeZone(date);
40
+ months[i] = this.datepicker.createDateObject(date, this.datepicker.formatMonth, false, this.datepicker.datepickerId + '-' + i);
41
+ }
42
+ this.title = this.datepicker.dateFilter(this.datepicker.activeDate, this.datepicker.formatMonthTitle);
43
+ this.rows = this.datepicker.createCalendarRows(months, this.datepicker.monthColLimit);
44
+ }
45
+ keydownMonths(key, event) {
46
+ let date = this.datepicker.activeDate.getMonth();
47
+ /* istanbul ignore else */
48
+ /* sanity check */
49
+ if (key === 'left') {
50
+ date = date - 1;
51
+ }
52
+ else if (key === 'up') {
53
+ date = date - this.datepicker.monthColLimit;
54
+ }
55
+ else if (key === 'right') {
56
+ date = date + 1;
57
+ }
58
+ else if (key === 'down') {
59
+ date = date + this.datepicker.monthColLimit;
60
+ }
61
+ else if (key === 'pageup' || key === 'pagedown') {
62
+ let year = this.datepicker.activeDate.getFullYear() + (key === 'pageup' ? -1 : 1);
63
+ this.datepicker.activeDate.setFullYear(year);
64
+ }
65
+ else if (key === 'home') {
66
+ date = 0;
67
+ }
68
+ else if (key === 'end') {
69
+ date = 11;
70
+ }
71
+ this.datepicker.activeDate.setMonth(date);
72
+ }
73
+ }
74
+ SkyMonthPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyMonthPickerComponent, deps: [{ token: i1.SkyDatepickerCalendarInnerComponent }], target: i0.ɵɵFactoryTarget.Component });
75
+ SkyMonthPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyMonthPickerComponent, selector: "sky-monthpicker", ngImport: i0, template: "<table *ngIf=\"datepicker.datepickerMode === 'month'\" role=\"grid\">\n <thead>\n <tr>\n <th class=\"sky-datepicker-header-left\">\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-btn-sm sky-datepicker-btn-previous\"\n (click)=\"datepicker.moveCalendar($event, -1)\"\n tabindex=\"-1\"\n >\n <sky-icon\n class=\"sky-datepicker-chevron-default\"\n icon=\"chevron-left\"\n ></sky-icon>\n <sky-icon\n class=\"sky-datepicker-chevron-modern\"\n icon=\"chevron-left\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </th>\n <th\n [attr.colspan]=\"\n datepicker.monthColLimit - 2 <= 0 ? 1 : datepicker.monthColLimit - 2\n \"\n >\n <button\n [id]=\"datepicker.datepickerId + '-title'\"\n type=\"button\"\n class=\"\n sky-btn sky-btn-default sky-btn-sm sky-datepicker-calendar-title\n \"\n (click)=\"datepicker.toggleModeCalendar($event)\"\n [disabled]=\"datepicker.datepickerMode === maxMode\"\n [ngClass]=\"{\n 'sky-btn-disabled': datepicker.datepickerMode === maxMode\n }\"\n tabindex=\"-1\"\n >\n <strong>{{ title }}</strong>\n </button>\n </th>\n <th class=\"sky-datepicker-header-right\">\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-btn-sm sky-datepicker-btn-next\"\n (click)=\"datepicker.moveCalendar($event, 1)\"\n tabindex=\"-1\"\n >\n <sky-icon\n class=\"sky-datepicker-chevron-default\"\n icon=\"chevron-right\"\n ></sky-icon>\n <sky-icon\n class=\"sky-datepicker-chevron-modern\"\n icon=\"chevron-right\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of rows\">\n <td\n *ngFor=\"let date of row\"\n class=\"text-center\"\n role=\"gridcell\"\n id=\"{{ date.uid }}\"\n >\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-datepicker-btn-date\"\n [ngClass]=\"{\n 'sky-datepicker-btn-selected': date.selected,\n 'sky-btn-disabled': date.disabled,\n 'sky-btn-active': datepicker.isActive(date)\n }\"\n [disabled]=\"date.disabled\"\n (click)=\"datepicker.selectCalendar($event, date.date)\"\n tabindex=\"-1\"\n >\n <span [ngClass]=\"{ 'sky-datepicker-current': date.current }\">{{\n date.label\n }}</span>\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [":host-context(.sky-theme-modern) :host:focus{outline:none}.sky-theme-modern :host:focus{outline:none}\n"], components: [{ type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyMonthPickerComponent, decorators: [{
77
+ type: Component,
78
+ args: [{
79
+ selector: 'sky-monthpicker',
80
+ templateUrl: 'monthpicker.component.html',
81
+ styleUrls: ['./monthpicker.component.scss'],
82
+ }]
83
+ }], ctorParameters: function () { return [{ type: i1.SkyDatepickerCalendarInnerComponent }]; } });
84
+ //# sourceMappingURL=monthpicker.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monthpicker.component.js","sourceRoot":"","sources":["../../../../../../../../libs/components/datetime/src/lib/modules/datepicker/monthpicker.component.ts","../../../../../../../../libs/components/datetime/src/lib/modules/datepicker/monthpicker.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { SkyDatepickerCalendarInnerComponent } from './datepicker-calendar-inner.component';\n\nimport { SkyDatepickerDate } from './datepicker-date';\n\n/**\n * @internal\n */\n@Component({\n selector: 'sky-monthpicker',\n templateUrl: 'monthpicker.component.html',\n styleUrls: ['./monthpicker.component.scss'],\n})\nexport class SkyMonthPickerComponent implements OnInit {\n public datepicker: SkyDatepickerCalendarInnerComponent;\n\n public maxMode: string;\n\n public rows: Array<Array<SkyDatepickerDate>> = [];\n\n public title: string;\n\n public constructor(datepicker: SkyDatepickerCalendarInnerComponent) {\n this.datepicker = datepicker;\n }\n\n public ngOnInit(): void {\n this.datepicker.stepMonth = {\n years: 1,\n };\n\n this.datepicker.setRefreshViewHandler(() => {\n this.refreshMonthView();\n }, 'month');\n\n this.datepicker.setCompareHandler(this.compareMonth, 'month');\n\n this.datepicker.refreshView();\n\n this.datepicker.setKeydownHandler((key: string, event: KeyboardEvent) => {\n this.keydownMonths(key, event);\n }, 'month');\n }\n\n private compareMonth(date1: Date, date2: Date): number {\n let d1 = new Date(date1.getFullYear(), date1.getMonth());\n let d2 = new Date(date2.getFullYear(), date2.getMonth());\n return d1.getTime() - d2.getTime();\n }\n\n private refreshMonthView(): void {\n let months: Array<SkyDatepickerDate> = new Array(12);\n let year: number = this.datepicker.activeDate.getFullYear();\n let date: Date;\n\n for (let i = 0; i < 12; i++) {\n date = new Date(year, i, 1);\n date = this.datepicker.fixTimeZone(date);\n months[i] = this.datepicker.createDateObject(\n date,\n this.datepicker.formatMonth,\n false,\n this.datepicker.datepickerId + '-' + i\n );\n }\n\n this.title = this.datepicker.dateFilter(\n this.datepicker.activeDate,\n this.datepicker.formatMonthTitle\n );\n this.rows = this.datepicker.createCalendarRows(\n months,\n this.datepicker.monthColLimit\n );\n }\n\n private keydownMonths(key: string, event: KeyboardEvent) {\n let date = this.datepicker.activeDate.getMonth();\n\n /* istanbul ignore else */\n /* sanity check */\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - this.datepicker.monthColLimit;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + this.datepicker.monthColLimit;\n } else if (key === 'pageup' || key === 'pagedown') {\n let year =\n this.datepicker.activeDate.getFullYear() + (key === 'pageup' ? -1 : 1);\n this.datepicker.activeDate.setFullYear(year);\n } else if (key === 'home') {\n date = 0;\n } else if (key === 'end') {\n date = 11;\n }\n this.datepicker.activeDate.setMonth(date);\n }\n}\n","<table *ngIf=\"datepicker.datepickerMode === 'month'\" role=\"grid\">\n <thead>\n <tr>\n <th class=\"sky-datepicker-header-left\">\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-btn-sm sky-datepicker-btn-previous\"\n (click)=\"datepicker.moveCalendar($event, -1)\"\n tabindex=\"-1\"\n >\n <sky-icon\n class=\"sky-datepicker-chevron-default\"\n icon=\"chevron-left\"\n ></sky-icon>\n <sky-icon\n class=\"sky-datepicker-chevron-modern\"\n icon=\"chevron-left\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </th>\n <th\n [attr.colspan]=\"\n datepicker.monthColLimit - 2 <= 0 ? 1 : datepicker.monthColLimit - 2\n \"\n >\n <button\n [id]=\"datepicker.datepickerId + '-title'\"\n type=\"button\"\n class=\"\n sky-btn sky-btn-default sky-btn-sm sky-datepicker-calendar-title\n \"\n (click)=\"datepicker.toggleModeCalendar($event)\"\n [disabled]=\"datepicker.datepickerMode === maxMode\"\n [ngClass]=\"{\n 'sky-btn-disabled': datepicker.datepickerMode === maxMode\n }\"\n tabindex=\"-1\"\n >\n <strong>{{ title }}</strong>\n </button>\n </th>\n <th class=\"sky-datepicker-header-right\">\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-btn-sm sky-datepicker-btn-next\"\n (click)=\"datepicker.moveCalendar($event, 1)\"\n tabindex=\"-1\"\n >\n <sky-icon\n class=\"sky-datepicker-chevron-default\"\n icon=\"chevron-right\"\n ></sky-icon>\n <sky-icon\n class=\"sky-datepicker-chevron-modern\"\n icon=\"chevron-right\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of rows\">\n <td\n *ngFor=\"let date of row\"\n class=\"text-center\"\n role=\"gridcell\"\n id=\"{{ date.uid }}\"\n >\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-datepicker-btn-date\"\n [ngClass]=\"{\n 'sky-datepicker-btn-selected': date.selected,\n 'sky-btn-disabled': date.disabled,\n 'sky-btn-active': datepicker.isActive(date)\n }\"\n [disabled]=\"date.disabled\"\n (click)=\"datepicker.selectCalendar($event, date.date)\"\n tabindex=\"-1\"\n >\n <span [ngClass]=\"{ 'sky-datepicker-current': date.current }\">{{\n date.label\n }}</span>\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n"]}