@ptsecurity/mosaic 14.6.2 → 14.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_theming.scss +1916 -173
- package/_visual.scss +341 -0
- package/button/button.component.d.ts +2 -0
- package/card/card.component.d.ts +2 -0
- package/checkbox/checkbox.d.ts +1 -0
- package/code-block/README.md +32 -0
- package/code-block/actionbar.component.d.ts +22 -0
- package/code-block/code-block.component.d.ts +74 -0
- package/code-block/code-block.module.d.ts +14 -0
- package/code-block/code-block.types.d.ts +16 -0
- package/code-block/index.d.ts +1 -0
- package/code-block/public-api.d.ts +3 -0
- package/core/formatters/date/formatter.d.ts +55 -1
- package/core/option/action.d.ts +2 -0
- package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +1 -0
- package/datepicker/calendar-body.component.d.ts +3 -11
- package/datepicker/calendar-header.component.d.ts +45 -0
- package/datepicker/calendar.component.d.ts +10 -81
- package/datepicker/datepicker-input.directive.d.ts +4 -3
- package/datepicker/datepicker-module.d.ts +8 -8
- package/datepicker/datepicker.component.d.ts +2 -12
- package/datepicker/month-view.component.d.ts +7 -26
- package/datepicker/public-api.d.ts +1 -2
- package/design-tokens/legacy-2017/tokens/components/code-block.json5 +704 -0
- package/design-tokens/legacy-2017/tokens.d.ts +341 -0
- package/design-tokens/pt-2022/tokens/components/code-block.json5 +697 -0
- package/design-tokens/pt-2022/tokens.d.ts +341 -0
- package/design-tokens/style-dictionary/configs/index.js +6 -8
- package/dropdown/dropdown-item.component.d.ts +1 -0
- package/esm2020/autocomplete/autocomplete.component.mjs +2 -2
- package/esm2020/button/button.component.mjs +3 -3
- package/esm2020/card/card.component.mjs +3 -3
- package/esm2020/checkbox/checkbox.mjs +2 -2
- package/esm2020/code-block/actionbar.component.mjs +67 -0
- package/esm2020/code-block/code-block.component.mjs +157 -0
- package/esm2020/code-block/code-block.module.mjs +60 -0
- package/esm2020/code-block/code-block.types.mjs +2 -0
- package/esm2020/code-block/index.mjs +2 -0
- package/esm2020/code-block/ptsecurity-mosaic-code-block.mjs +5 -0
- package/esm2020/code-block/public-api.mjs +4 -0
- package/esm2020/core/formatters/date/formatter.mjs +77 -1
- package/esm2020/core/formatters/date/templates/en-US.mjs +56 -1
- package/esm2020/core/formatters/date/templates/ru-RU.mjs +92 -1
- package/esm2020/core/option/action.mjs +3 -2
- package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +2 -2
- package/esm2020/core/version.mjs +2 -2
- package/esm2020/datepicker/calendar-body.component.mjs +9 -28
- package/esm2020/datepicker/calendar-header.component.mjs +135 -0
- package/esm2020/datepicker/calendar.component.mjs +25 -212
- package/esm2020/datepicker/datepicker-input.directive.mjs +65 -56
- package/esm2020/datepicker/datepicker-module.mjs +13 -17
- package/esm2020/datepicker/datepicker.component.mjs +10 -21
- package/esm2020/datepicker/month-view.component.mjs +32 -131
- package/esm2020/datepicker/public-api.mjs +2 -3
- package/esm2020/design-tokens/legacy-2017/tokens.mjs +342 -1
- package/esm2020/design-tokens/pt-2022/tokens.mjs +342 -1
- package/esm2020/dropdown/dropdown-item.component.mjs +2 -2
- package/esm2020/form-field/form-field.mjs +3 -2
- package/esm2020/form-field/hint.mjs +3 -2
- package/esm2020/form-field/validate.directive.mjs +6 -7
- package/esm2020/icon/icon.component.mjs +3 -2
- package/esm2020/input/input-number-validators.mjs +3 -7
- package/esm2020/input/input.mjs +3 -2
- package/esm2020/link/link.component.mjs +3 -2
- package/esm2020/list/list-selection.component.mjs +3 -2
- package/esm2020/modal/modal.component.mjs +4 -3
- package/esm2020/popover/popover.component.mjs +6 -2
- package/esm2020/progress-bar/progress-bar.component.mjs +3 -2
- package/esm2020/progress-spinner/progress-spinner.component.mjs +3 -2
- package/esm2020/radio/radio.component.mjs +3 -4
- package/esm2020/select/select.component.mjs +18 -6
- package/esm2020/select/select.module.mjs +6 -2
- package/esm2020/tabs/tab-group.component.mjs +2 -2
- package/esm2020/tabs/tab-label-wrapper.directive.mjs +2 -2
- package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +3 -2
- package/esm2020/tabs/tab.component.mjs +3 -2
- package/esm2020/tags/tag-list.component.mjs +3 -2
- package/esm2020/tags/tag.component.mjs +3 -2
- package/esm2020/textarea/textarea.component.mjs +3 -2
- package/esm2020/timezone/timezone-select.component.mjs +2 -2
- package/esm2020/toggle/toggle.component.mjs +3 -2
- package/esm2020/tree/control/flat-tree-control.mjs +1 -1
- package/esm2020/tree/toggle.mjs +3 -2
- package/esm2020/tree/tree-base.mjs +1 -1
- package/esm2020/tree-select/tree-select.component.mjs +3 -2
- package/fesm2015/ptsecurity-mosaic-autocomplete.mjs +2 -2
- package/fesm2015/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-button.mjs +2 -2
- package/fesm2015/ptsecurity-mosaic-button.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-card.mjs +2 -2
- package/fesm2015/ptsecurity-mosaic-card.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-checkbox.mjs +1 -1
- package/fesm2015/ptsecurity-mosaic-checkbox.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-code-block.mjs +280 -0
- package/fesm2015/ptsecurity-mosaic-code-block.mjs.map +1 -0
- package/fesm2015/ptsecurity-mosaic-core.mjs +226 -3
- package/fesm2015/ptsecurity-mosaic-core.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-datepicker.mjs +283 -908
- package/fesm2015/ptsecurity-mosaic-datepicker.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-design-tokens.mjs +1024 -1
- package/fesm2015/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-dropdown.mjs +1 -1
- package/fesm2015/ptsecurity-mosaic-dropdown.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-form-field.mjs +10 -8
- package/fesm2015/ptsecurity-mosaic-form-field.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-icon.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-icon.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-input.mjs +4 -7
- package/fesm2015/ptsecurity-mosaic-input.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-link.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-link.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-list.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-list.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-modal.mjs +3 -2
- package/fesm2015/ptsecurity-mosaic-modal.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-popover.mjs +5 -1
- package/fesm2015/ptsecurity-mosaic-popover.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-progress-bar.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-radio.mjs +2 -3
- package/fesm2015/ptsecurity-mosaic-radio.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-select.mjs +22 -6
- package/fesm2015/ptsecurity-mosaic-select.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-tabs.mjs +6 -4
- package/fesm2015/ptsecurity-mosaic-tabs.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-tags.mjs +4 -2
- package/fesm2015/ptsecurity-mosaic-tags.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-textarea.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-textarea.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-timezone.mjs +2 -2
- package/fesm2015/ptsecurity-mosaic-timezone.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-toggle.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-toggle.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-tree-select.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-tree-select.mjs.map +1 -1
- package/fesm2015/ptsecurity-mosaic-tree.mjs +2 -1
- package/fesm2015/ptsecurity-mosaic-tree.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-autocomplete.mjs +2 -2
- package/fesm2020/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-button.mjs +2 -2
- package/fesm2020/ptsecurity-mosaic-button.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-card.mjs +2 -2
- package/fesm2020/ptsecurity-mosaic-card.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-checkbox.mjs +1 -1
- package/fesm2020/ptsecurity-mosaic-checkbox.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-code-block.mjs +278 -0
- package/fesm2020/ptsecurity-mosaic-code-block.mjs.map +1 -0
- package/fesm2020/ptsecurity-mosaic-core.mjs +226 -3
- package/fesm2020/ptsecurity-mosaic-core.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-datepicker.mjs +281 -903
- package/fesm2020/ptsecurity-mosaic-datepicker.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-design-tokens.mjs +1024 -1
- package/fesm2020/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-dropdown.mjs +1 -1
- package/fesm2020/ptsecurity-mosaic-dropdown.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-form-field.mjs +9 -8
- package/fesm2020/ptsecurity-mosaic-form-field.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-icon.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-icon.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-input.mjs +4 -7
- package/fesm2020/ptsecurity-mosaic-input.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-link.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-link.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-list.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-list.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-modal.mjs +3 -2
- package/fesm2020/ptsecurity-mosaic-modal.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-popover.mjs +5 -1
- package/fesm2020/ptsecurity-mosaic-popover.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-progress-bar.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-radio.mjs +2 -3
- package/fesm2020/ptsecurity-mosaic-radio.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-select.mjs +22 -6
- package/fesm2020/ptsecurity-mosaic-select.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-tabs.mjs +6 -4
- package/fesm2020/ptsecurity-mosaic-tabs.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-tags.mjs +4 -2
- package/fesm2020/ptsecurity-mosaic-tags.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-textarea.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-textarea.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-timezone.mjs +2 -2
- package/fesm2020/ptsecurity-mosaic-timezone.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-toggle.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-toggle.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-tree-select.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-tree-select.mjs.map +1 -1
- package/fesm2020/ptsecurity-mosaic-tree.mjs +2 -1
- package/fesm2020/ptsecurity-mosaic-tree.mjs.map +1 -1
- package/form-field/form-field.d.ts +2 -0
- package/form-field/hint.d.ts +2 -0
- package/form-field/validate.directive.d.ts +1 -1
- package/icon/icon.component.d.ts +2 -0
- package/input/input-number-validators.d.ts +2 -6
- package/input/input.d.ts +2 -0
- package/link/link.component.d.ts +2 -0
- package/list/list-selection.component.d.ts +2 -0
- package/package.json +12 -4
- package/popover/popover.component.d.ts +1 -0
- package/prebuilt-themes/dark-theme.css +1 -1
- package/prebuilt-themes/default-theme.css +1 -1
- package/progress-bar/progress-bar.component.d.ts +2 -0
- package/progress-spinner/progress-spinner.component.d.ts +2 -0
- package/radio/radio.component.d.ts +2 -0
- package/select/select.component.d.ts +9 -2
- package/select/select.module.d.ts +1 -1
- package/tabs/tab-group.component.d.ts +1 -0
- package/tabs/tab-label-wrapper.directive.d.ts +1 -0
- package/tabs/tab-nav-bar/tab-nav-bar.d.ts +2 -0
- package/tabs/tab.component.d.ts +2 -0
- package/tags/tag-list.component.d.ts +2 -0
- package/tags/tag.component.d.ts +2 -0
- package/textarea/textarea.component.d.ts +2 -0
- package/toggle/toggle.component.d.ts +2 -0
- package/tree/control/flat-tree-control.d.ts +4 -4
- package/tree/toggle.d.ts +2 -0
- package/tree-select/tree-select.component.d.ts +2 -0
- package/datepicker/multi-year-view.component.d.ts +0 -72
- package/datepicker/year-view.component.d.ts +0 -90
- package/esm2020/datepicker/multi-year-view.component.mjs +0 -218
- package/esm2020/datepicker/year-view.component.mjs +0 -253
@@ -1,27 +1,30 @@
|
|
1
1
|
import { A11yModule } from '@angular/cdk/a11y';
|
2
|
-
import * as i3 from '@angular/cdk/overlay';
|
2
|
+
import * as i3$1 from '@angular/cdk/overlay';
|
3
3
|
import { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';
|
4
|
-
import * as i4 from '@angular/cdk/portal';
|
5
4
|
import { ComponentPortal, PortalModule } from '@angular/cdk/portal';
|
6
5
|
import * as i1 from '@angular/common';
|
7
6
|
import { DOCUMENT, CommonModule } from '@angular/common';
|
8
7
|
import * as i0 from '@angular/core';
|
9
8
|
import { EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, Optional, Inject, ViewChild, Injectable, forwardRef, Directive, ContentChild, InjectionToken, NgModule } from '@angular/core';
|
10
|
-
import * as
|
9
|
+
import * as i3 from '@ptsecurity/mosaic/button';
|
11
10
|
import { McButtonModule } from '@ptsecurity/mosaic/button';
|
12
|
-
import * as
|
11
|
+
import * as i7 from '@ptsecurity/mosaic/icon';
|
13
12
|
import { McIconModule } from '@ptsecurity/mosaic/icon';
|
14
|
-
import
|
13
|
+
import * as i5 from '@ptsecurity/mosaic/select';
|
14
|
+
import { McSelectModule } from '@ptsecurity/mosaic/select';
|
15
15
|
import * as i1$1 from '@ptsecurity/cdk/datetime';
|
16
16
|
import { MC_DATE_FORMATS } from '@ptsecurity/cdk/datetime';
|
17
|
+
import * as i4 from '@ptsecurity/mosaic/form-field';
|
18
|
+
import { McFormFieldControl } from '@ptsecurity/mosaic/form-field';
|
19
|
+
import * as i6 from '@ptsecurity/mosaic/core';
|
20
|
+
import { validationTooltipShowDelay, validationTooltipHideDelay } from '@ptsecurity/mosaic/core';
|
17
21
|
import { Subject, Subscription, of, merge } from 'rxjs';
|
18
|
-
import { SPACE, ENTER, PAGE_DOWN, PAGE_UP, END, HOME, DOWN_ARROW, UP_ARROW, RIGHT_ARROW, LEFT_ARROW, TAB, ESCAPE, isLetterKey, hasModifierKey, isVerticalMovement, isHorizontalMovement, DELETE, BACKSPACE } from '@ptsecurity/cdk/keycodes';
|
19
|
-
import * as i2 from '@angular/cdk/bidi';
|
20
22
|
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
21
23
|
import { NG_VALUE_ACCESSOR, NG_VALIDATORS, Validators } from '@angular/forms';
|
22
|
-
import {
|
23
|
-
import {
|
24
|
+
import { TAB, SPACE, UP_ARROW, DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, HOME, PAGE_UP, END, PAGE_DOWN, ESCAPE, isLetterKey, hasModifierKey, isVerticalMovement, isHorizontalMovement, DELETE, BACKSPACE } from '@ptsecurity/cdk/keycodes';
|
25
|
+
import { take } from 'rxjs/operators';
|
24
26
|
import { trigger, state, style, transition, animate } from '@angular/animations';
|
27
|
+
import * as i5$1 from '@angular/cdk/bidi';
|
25
28
|
|
26
29
|
// tslint:disable:no-magic-numbers
|
27
30
|
/**
|
@@ -29,10 +32,9 @@ import { trigger, state, style, transition, animate } from '@angular/animations'
|
|
29
32
|
* @docs-private
|
30
33
|
*/
|
31
34
|
class McCalendarCell {
|
32
|
-
constructor(value, displayValue,
|
35
|
+
constructor(value, displayValue, enabled, cssClasses) {
|
33
36
|
this.value = value;
|
34
37
|
this.displayValue = displayValue;
|
35
|
-
this.ariaLabel = ariaLabel;
|
36
38
|
this.enabled = enabled;
|
37
39
|
this.cssClasses = cssClasses;
|
38
40
|
}
|
@@ -42,9 +44,7 @@ class McCalendarCell {
|
|
42
44
|
* @docs-private
|
43
45
|
*/
|
44
46
|
class McCalendarBody {
|
45
|
-
constructor(
|
46
|
-
this.elementRef = elementRef;
|
47
|
-
this.ngZone = ngZone;
|
47
|
+
constructor() {
|
48
48
|
/** The number of columns in the table. */
|
49
49
|
this.numCols = 7;
|
50
50
|
/** The cell number of the active cell in the table. */
|
@@ -84,30 +84,15 @@ class McCalendarBody {
|
|
84
84
|
}
|
85
85
|
return cellNumber === this.activeCell;
|
86
86
|
}
|
87
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
88
|
-
focusActiveCell() {
|
89
|
-
this.ngZone.runOutsideAngular(() => {
|
90
|
-
this.ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {
|
91
|
-
const activeCell = this.elementRef.nativeElement.querySelector('.mc-calendar__body_active');
|
92
|
-
if (activeCell) {
|
93
|
-
activeCell.focus();
|
94
|
-
}
|
95
|
-
});
|
96
|
-
});
|
97
|
-
}
|
98
87
|
}
|
99
|
-
/** @nocollapse */ McCalendarBody.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarBody, deps: [
|
100
|
-
/** @nocollapse */ McCalendarBody.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McCalendarBody, selector: "[mc-calendar-body]", inputs: {
|
88
|
+
/** @nocollapse */ McCalendarBody.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarBody, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
89
|
+
/** @nocollapse */ McCalendarBody.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McCalendarBody, selector: "[mc-calendar-body]", inputs: { rows: "rows", todayValue: "todayValue", selectedValue: "selectedValue", labelMinRequiredCells: "labelMinRequiredCells", numCols: "numCols", activeCell: "activeCell", cellAspectRatio: "cellAspectRatio" }, outputs: { selectedValueChange: "selectedValueChange" }, host: { classAttribute: "mc-calendar__body" }, exportAs: ["mcCalendarBody"], usesOnChanges: true, ngImport: i0, template: "<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\">\n <!--\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n The aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n percentage of the width (a variant of the trick described here:\n https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n <td *ngIf=\"rowIndex === 0 && firstRowOffset\"\n class=\"mc-calendar__body-label\"\n [attr.colspan]=\"firstRowOffset\">\n </td>\n\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"mc-calendar__body-cell\"\n [ngClass]=\"item.cssClasses!\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.mc-calendar__body_disabled]=\"!item.enabled\"\n [class.mc-calendar__body_active]=\"isActiveCell(rowIndex, colIndex)\"\n (click)=\"cellClicked(item)\"\n [style.width]=\"cellWidth\"\n [style.paddingTop]=\"cellPadding\"\n [style.paddingBottom]=\"cellPadding\">\n <div class=\"mc-calendar__body-cell-content\"\n [class.mc-selected]=\"selectedValue === item.value\"\n [class.mc-calendar__body-today]=\"todayValue === item.value\">\n {{ item.displayValue }}\n </div>\n </td>\n</tr>\n", styles: [".mc-calendar__body{min-width:224px;min-width:calc(7 * var(--mc-datepicker-body-size-cell-min-size, 32px))}.mc-calendar__body-cell{position:relative;height:0;line-height:0;text-align:center;outline:none;cursor:pointer}.mc-calendar__body_disabled{cursor:default}.mc-calendar__body-cell-content{position:absolute;top:5%;top:var(--mc-datepicker-body-size-cell-margin, 5%);left:5%;left:var(--mc-datepicker-body-size-cell-margin, 5%);padding:8px;padding:var(--mc-datepicker-body-size-cell-padding, 8px);display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border-width:1px;border-width:var(--mc-datepicker-body-size-cell-border-width, 1px);border-radius:0;border-radius:var(--mc-datepicker-body-size-cell-border-radius, 0);border-style:solid}mc-month-view .mc-calendar__body-cell-content{justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
101
90
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarBody, decorators: [{
|
102
91
|
type: Component,
|
103
92
|
args: [{ selector: '[mc-calendar-body]', exportAs: 'mcCalendarBody', host: {
|
104
|
-
class: 'mc-calendar__body'
|
105
|
-
|
106
|
-
|
107
|
-
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n<tr *ngIf=\"firstRowOffset < labelMinRequiredCells\">\n <td class=\"mc-calendar__body-label\" [attr.colspan]=\"numCols\">\n {{ label }}\n </td>\n</tr>\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\">\n <!--\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n The aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n percentage of the width (a variant of the trick described here:\n https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n <td *ngIf=\"rowIndex === 0 && firstRowOffset\"\n class=\"mc-calendar__body-label\"\n [attr.colspan]=\"firstRowOffset\">\n {{ firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </td>\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"mc-calendar__body-cell\"\n [ngClass]=\"item.cssClasses!\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.mc-calendar__body_disabled]=\"!item.enabled\"\n [class.mc-calendar__body_active]=\"isActiveCell(rowIndex, colIndex)\"\n (click)=\"cellClicked(item)\"\n [style.width]=\"cellWidth\"\n [style.paddingTop]=\"cellPadding\"\n [style.paddingBottom]=\"cellPadding\">\n <div class=\"mc-calendar__body-cell-content\"\n [class.mc-selected]=\"selectedValue === item.value\"\n [class.mc-calendar__body-today]=\"todayValue === item.value\">\n {{ item.displayValue }}\n </div>\n </td>\n</tr>\n", styles: [".mc-calendar__body{min-width:224px;min-width:calc(7 * var(--mc-datepicker-body-size-cell-min-size, 32px))}.mc-calendar__body-label{text-align:left;padding:8px 28px 12px 12px;padding:var(--mc-datepicker-body-size-label-paddings, 8px 28px 12px 12px)}.mc-calendar__body-cell{position:relative;height:0;line-height:0;text-align:center;outline:none;cursor:pointer}.mc-calendar__body_disabled{cursor:default}.mc-calendar__body-cell-content{position:absolute;top:5%;top:var(--mc-datepicker-body-size-cell-margin, 5%);left:5%;left:var(--mc-datepicker-body-size-cell-margin, 5%);padding:8px;padding:var(--mc-datepicker-body-size-cell-padding, 8px);display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border-width:1px;border-width:var(--mc-datepicker-body-size-cell-border-width, 1px);border-radius:0;border-radius:var(--mc-datepicker-body-size-cell-border-radius, 0);border-style:solid}.cdk-high-contrast-active .mc-calendar__body-cell-content{border:none}.cdk-high-contrast-active :host .mc-calendar__body-cell-content{border:none}mc-month-view .mc-calendar__body-cell-content{justify-content:flex-end}mc-multi-year-view .mc-calendar__body-cell-content,mc-year-view .mc-calendar__body-cell-content{justify-content:center}.cdk-high-contrast-active .mc-datepicker__popup:not(:empty),.cdk-high-contrast-active .mc-selected{outline:solid 1px}.cdk-high-contrast-active .mc-calendar__body-today{outline:dotted 1px}.cdk-high-contrast-active :host .mc-datepicker__popup:not(:empty),.cdk-high-contrast-active :host .mc-selected{outline:solid 1px}.cdk-high-contrast-active :host .mc-calendar__body-today{outline:dotted 1px}[dir=rtl] .mc-calendar__body-label{text-align:right}\n"] }]
|
108
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { label: [{
|
109
|
-
type: Input
|
110
|
-
}], rows: [{
|
93
|
+
class: 'mc-calendar__body'
|
94
|
+
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\">\n <!--\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n The aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n percentage of the width (a variant of the trick described here:\n https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n <td *ngIf=\"rowIndex === 0 && firstRowOffset\"\n class=\"mc-calendar__body-label\"\n [attr.colspan]=\"firstRowOffset\">\n </td>\n\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"mc-calendar__body-cell\"\n [ngClass]=\"item.cssClasses!\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.mc-calendar__body_disabled]=\"!item.enabled\"\n [class.mc-calendar__body_active]=\"isActiveCell(rowIndex, colIndex)\"\n (click)=\"cellClicked(item)\"\n [style.width]=\"cellWidth\"\n [style.paddingTop]=\"cellPadding\"\n [style.paddingBottom]=\"cellPadding\">\n <div class=\"mc-calendar__body-cell-content\"\n [class.mc-selected]=\"selectedValue === item.value\"\n [class.mc-calendar__body-today]=\"todayValue === item.value\">\n {{ item.displayValue }}\n </div>\n </td>\n</tr>\n", styles: [".mc-calendar__body{min-width:224px;min-width:calc(7 * var(--mc-datepicker-body-size-cell-min-size, 32px))}.mc-calendar__body-cell{position:relative;height:0;line-height:0;text-align:center;outline:none;cursor:pointer}.mc-calendar__body_disabled{cursor:default}.mc-calendar__body-cell-content{position:absolute;top:5%;top:var(--mc-datepicker-body-size-cell-margin, 5%);left:5%;left:var(--mc-datepicker-body-size-cell-margin, 5%);padding:8px;padding:var(--mc-datepicker-body-size-cell-padding, 8px);display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border-width:1px;border-width:var(--mc-datepicker-body-size-cell-border-width, 1px);border-radius:0;border-radius:var(--mc-datepicker-body-size-cell-border-radius, 0);border-style:solid}mc-month-view .mc-calendar__body-cell-content{justify-content:flex-end}\n"] }]
|
95
|
+
}], propDecorators: { rows: [{
|
111
96
|
type: Input
|
112
97
|
}], todayValue: [{
|
113
98
|
type: Input
|
@@ -125,38 +110,163 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
125
110
|
type: Output
|
126
111
|
}] } });
|
127
112
|
|
113
|
+
const defaultMinYear = 1900;
|
114
|
+
const defaultMaxYear = 2099;
|
115
|
+
/** Default header for McCalendar */
|
116
|
+
class McCalendarHeader {
|
117
|
+
constructor(adapter) {
|
118
|
+
this.adapter = adapter;
|
119
|
+
this.years = [];
|
120
|
+
// tslint:disable-next-line:no-magic-numbers
|
121
|
+
this._maxDate = this.adapter.createDate(defaultMaxYear, 11);
|
122
|
+
this._minDate = this.adapter.createDate(defaultMinYear, 1);
|
123
|
+
/** Emits when any date is activated. */
|
124
|
+
this.activeDateChange = new EventEmitter();
|
125
|
+
this.monthSelected = new EventEmitter();
|
126
|
+
this.yearSelected = new EventEmitter();
|
127
|
+
this.monthNames = this.adapter.getMonthNames('long')
|
128
|
+
.map((name, i) => ({ name, value: i }));
|
129
|
+
}
|
130
|
+
get activeDate() {
|
131
|
+
return this._activeDate;
|
132
|
+
}
|
133
|
+
set activeDate(value) {
|
134
|
+
this._activeDate = value;
|
135
|
+
this.updateSelectedValues();
|
136
|
+
}
|
137
|
+
get maxDate() {
|
138
|
+
return this._maxDate;
|
139
|
+
}
|
140
|
+
set maxDate(value) {
|
141
|
+
if (!value) {
|
142
|
+
return;
|
143
|
+
}
|
144
|
+
this._maxDate = value;
|
145
|
+
this.updateYearsArray();
|
146
|
+
}
|
147
|
+
get minDate() {
|
148
|
+
return this._minDate;
|
149
|
+
}
|
150
|
+
set minDate(value) {
|
151
|
+
if (!value) {
|
152
|
+
return;
|
153
|
+
}
|
154
|
+
this._minDate = value;
|
155
|
+
this.updateYearsArray();
|
156
|
+
}
|
157
|
+
get previousDisabled() {
|
158
|
+
return this.compareDate(this.activeDate, this.minDate) < 0;
|
159
|
+
}
|
160
|
+
get nextDisabled() {
|
161
|
+
return this.compareDate(this.activeDate, this.maxDate) >= 0;
|
162
|
+
}
|
163
|
+
ngAfterContentInit() {
|
164
|
+
this.updateYearsArray();
|
165
|
+
this.updateSelectedValues();
|
166
|
+
}
|
167
|
+
/** Handles when a new month is selected. */
|
168
|
+
onMonthSelected(month) {
|
169
|
+
const year = this.adapter.getYear(this.activeDate);
|
170
|
+
const normalizedDate = this.adapter.createDate(year, month);
|
171
|
+
const daysInMonth = this.adapter.getNumDaysInMonth(normalizedDate);
|
172
|
+
this.activeDate = this.adapter.createDate(year, month, Math.min(this.adapter.getDate(this.activeDate), daysInMonth));
|
173
|
+
this.monthSelected.emit(this.activeDate);
|
174
|
+
this.activeDateChange.emit(this.activeDate);
|
175
|
+
}
|
176
|
+
/** Handles when a new year is selected. */
|
177
|
+
onYearSelected(year) {
|
178
|
+
const month = this.adapter.getMonth(this.activeDate);
|
179
|
+
const daysInMonth = this.adapter.getNumDaysInMonth(this.adapter.createDate(year, month));
|
180
|
+
this.activeDate = this.adapter.createDate(year, month, Math.min(this.adapter.getDate(this.activeDate), daysInMonth));
|
181
|
+
this.yearSelected.emit(this.activeDate);
|
182
|
+
this.activeDateChange.emit(this.activeDate);
|
183
|
+
}
|
184
|
+
selectCurrentDate() {
|
185
|
+
this.activeDate = this.adapter.today();
|
186
|
+
this.activeDateChange.emit(this.activeDate);
|
187
|
+
}
|
188
|
+
/** Handles user clicks on the previous button. */
|
189
|
+
selectPreviousMonth() {
|
190
|
+
this.activeDate = this.adapter.addCalendarMonths(this.activeDate, -1);
|
191
|
+
this.activeDateChange.emit(this.activeDate);
|
192
|
+
}
|
193
|
+
/** Handles user clicks on the next button. */
|
194
|
+
selectNextMonth() {
|
195
|
+
this.activeDate = this.adapter.addCalendarMonths(this.activeDate, 1);
|
196
|
+
this.activeDateChange.emit(this.activeDate);
|
197
|
+
}
|
198
|
+
compareDate(first, second) {
|
199
|
+
const normalizedFirst = this.adapter.createDate(this.adapter.getYear(first), this.adapter.getMonth(first));
|
200
|
+
const normalizedSecond = this.adapter.createDate(this.adapter.getYear(second), this.adapter.getMonth(second));
|
201
|
+
return this.adapter.compareDate(normalizedFirst, normalizedSecond);
|
202
|
+
}
|
203
|
+
updateSelectedValues() {
|
204
|
+
this.selectedMonth = this.monthNames[this.adapter.getMonth(this.activeDate)].value;
|
205
|
+
const selectedYear = this.adapter.getYear(this.activeDate);
|
206
|
+
this.selectedYear = this.years.includes(selectedYear) ? selectedYear : this.years[0];
|
207
|
+
}
|
208
|
+
updateYearsArray() {
|
209
|
+
const minYear = this.adapter.getYear(this.minDate);
|
210
|
+
const maxYear = this.adapter.getYear(this.maxDate);
|
211
|
+
this.years = [];
|
212
|
+
for (let i = minYear; i <= maxYear; i++) {
|
213
|
+
this.years.push(i);
|
214
|
+
}
|
215
|
+
}
|
216
|
+
}
|
217
|
+
/** @nocollapse */ McCalendarHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarHeader, deps: [{ token: i1$1.DateAdapter }], target: i0.ɵɵFactoryTarget.Component });
|
218
|
+
/** @nocollapse */ McCalendarHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McCalendarHeader, selector: "mc-calendar-header", inputs: { activeDate: "activeDate", maxDate: "maxDate", minDate: "minDate" }, outputs: { activeDateChange: "activeDateChange", monthSelected: "monthSelected", yearSelected: "yearSelected" }, host: { classAttribute: "mc-calendar-header" }, exportAs: ["mcCalendarHeader"], ngImport: i0, template: "<div class=\"mc-calendar-header__select-group\">\n <mc-select\n class=\"mc-calendar-header__select\"\n #monthSelect=\"mcSelect\"\n [value]=\"selectedMonth\"\n [panelClass]=\"'mc-calendar-select-panel'\"\n (selectionChange)=\"onMonthSelected($event.value)\">\n\n <button class=\"mc-button_transparent layout-padding-right-xs\"\n mc-button\n mc-select-matcher\n [class.mc-active]=\"monthSelect.panelOpen\"\n [tabindex]=\"-1\">\n {{ monthSelect.triggerValue }}\n\n <i class=\"layout-padding-left-3xs\" mc-icon=\"mc-angle-down-S_16\"></i>\n </button>\n\n <mc-option *ngFor=\"let month of monthNames\"\n [mcTooltipDisabled]=\"true\"\n [value]=\"month.value\">\n {{ month.name }}\n </mc-option>\n </mc-select>\n\n <mc-select\n #yearSelect=\"mcSelect\"\n [value]=\"selectedYear\"\n [panelClass]=\"'mc-calendar-select-panel'\"\n (selectionChange)=\"onYearSelected($event.value)\">\n <button class=\"mc-button_transparent layout-padding-right-xs\"\n mc-button\n mc-select-matcher\n [class.mc-active]=\"yearSelect.panelOpen\"\n [tabindex]=\"-1\">\n {{ yearSelect.triggerValue }}\n\n <i class=\"layout-padding-left-3xs\" mc-icon=\"mc-angle-down-S_16\"></i>\n </button>\n\n <mc-option *ngFor=\"let year of years\"\n [mcTooltipDisabled]=\"true\"\n [value]=\"year\">\n {{ year }}\n </mc-option>\n </mc-select>\n</div>\n\n<div class=\"mc-calendar-header__button-group\">\n <button mc-button\n class=\"mc-button_transparent mc-calendar-header__previous-button\"\n [tabindex]=\"-1\"\n [disabled]=\"previousDisabled\"\n (click)=\"selectPreviousMonth()\">\n\n <i mc-icon=\"mc-angle-left-L_16\"></i>\n </button>\n\n <button mc-button\n class=\"mc-button_transparent\"\n [tabindex]=\"-1\"\n (click)=\"selectCurrentDate()\">\n\n <i mc-icon=\"mc-circle-8_16\"></i>\n </button>\n\n <button mc-button\n class=\"mc-button_transparent mc-calendar-header__next-button\"\n [tabindex]=\"-1\"\n [disabled]=\"nextDisabled\"\n (click)=\"selectNextMonth()\">\n\n <i mc-icon=\"mc-angle-right-L_16\"></i>\n </button>\n</div>\n", styles: [".mc-calendar-header{display:flex;flex-direction:row;justify-content:space-between;padding:16px 8px 12px;padding:var(--mc-datepicker-calendar-size-padding-top, 16px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px) var(--mc-datepicker-calendar-size-padding-blocks, 12px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px)}.mc-calendar-header__previous-button:after{border-left-width:2px;border-left-width:var(--mc-datepicker-calendar-size-icon-border-width, 2px);transform:translate(2px) rotate(-45deg);transform:var(--mc-datepicker-calendar-size-icon-prev-icon-transform, translateX(2px) rotate(-45deg))}.mc-calendar-header__next-button:after{border-right-width:2px;border-right-width:var(--mc-datepicker-calendar-size-icon-border-width, 2px);transform:translate(-2px) rotate(45deg);transform:var(--mc-datepicker-calendar-size-icon-nex-icon-transform, translateX(-2px) rotate(45deg))}.mc-calendar-header__select{width:auto!important}.mc-calendar-header__button-group,.mc-calendar-header__select-group{display:flex;flex-direction:row}.mc-calendar-select-panel{margin-top:2px;min-width:98%!important}.mc-calendar-select-panel .mc-select__content{max-height:384px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.McButton, selector: "[mc-button]", inputs: ["color", "tabIndex", "disabled"] }, { kind: "directive", type: i3.McButtonCssStyler, selector: "[mc-button]" }, { kind: "directive", type: i4.McValidateDirective, selector: " input[mcInput], input[mcInputPassword], input[mcTimepicker], input[mcDatepicker], textarea[mcTextarea], mc-select, mc-tree-select, mc-tag-list ", exportAs: ["McValidate"] }, { kind: "component", type: i5.McSelect, selector: "mc-select", inputs: ["disabled", "tabIndex", "hiddenItemsText", "panelClass", "backdropClass", "errorStateMatcher", "sortComparator", "hasBackdrop", "placeholder", "required", "multiple", "compareWith", "value", "id", "hiddenItemsTextFormatter"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["mcSelect"] }, { kind: "directive", type: i5.McSelectMatcher, selector: "mc-select-matcher, [mc-select-matcher]" }, { kind: "directive", type: i5.McOptionTooltip, selector: "mc-option" }, { kind: "component", type: i6.McOption, selector: "mc-option", inputs: ["value", "showCheckbox", "disabled"], outputs: ["onSelectionChange"], exportAs: ["mcOption"] }, { kind: "component", type: i7.McIcon, selector: "[mc-icon]", inputs: ["color"] }, { kind: "directive", type: i7.McIconCSSStyler, selector: "[mc-icon]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
219
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarHeader, decorators: [{
|
220
|
+
type: Component,
|
221
|
+
args: [{ selector: 'mc-calendar-header', exportAs: 'mcCalendarHeader', host: {
|
222
|
+
class: 'mc-calendar-header'
|
223
|
+
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mc-calendar-header__select-group\">\n <mc-select\n class=\"mc-calendar-header__select\"\n #monthSelect=\"mcSelect\"\n [value]=\"selectedMonth\"\n [panelClass]=\"'mc-calendar-select-panel'\"\n (selectionChange)=\"onMonthSelected($event.value)\">\n\n <button class=\"mc-button_transparent layout-padding-right-xs\"\n mc-button\n mc-select-matcher\n [class.mc-active]=\"monthSelect.panelOpen\"\n [tabindex]=\"-1\">\n {{ monthSelect.triggerValue }}\n\n <i class=\"layout-padding-left-3xs\" mc-icon=\"mc-angle-down-S_16\"></i>\n </button>\n\n <mc-option *ngFor=\"let month of monthNames\"\n [mcTooltipDisabled]=\"true\"\n [value]=\"month.value\">\n {{ month.name }}\n </mc-option>\n </mc-select>\n\n <mc-select\n #yearSelect=\"mcSelect\"\n [value]=\"selectedYear\"\n [panelClass]=\"'mc-calendar-select-panel'\"\n (selectionChange)=\"onYearSelected($event.value)\">\n <button class=\"mc-button_transparent layout-padding-right-xs\"\n mc-button\n mc-select-matcher\n [class.mc-active]=\"yearSelect.panelOpen\"\n [tabindex]=\"-1\">\n {{ yearSelect.triggerValue }}\n\n <i class=\"layout-padding-left-3xs\" mc-icon=\"mc-angle-down-S_16\"></i>\n </button>\n\n <mc-option *ngFor=\"let year of years\"\n [mcTooltipDisabled]=\"true\"\n [value]=\"year\">\n {{ year }}\n </mc-option>\n </mc-select>\n</div>\n\n<div class=\"mc-calendar-header__button-group\">\n <button mc-button\n class=\"mc-button_transparent mc-calendar-header__previous-button\"\n [tabindex]=\"-1\"\n [disabled]=\"previousDisabled\"\n (click)=\"selectPreviousMonth()\">\n\n <i mc-icon=\"mc-angle-left-L_16\"></i>\n </button>\n\n <button mc-button\n class=\"mc-button_transparent\"\n [tabindex]=\"-1\"\n (click)=\"selectCurrentDate()\">\n\n <i mc-icon=\"mc-circle-8_16\"></i>\n </button>\n\n <button mc-button\n class=\"mc-button_transparent mc-calendar-header__next-button\"\n [tabindex]=\"-1\"\n [disabled]=\"nextDisabled\"\n (click)=\"selectNextMonth()\">\n\n <i mc-icon=\"mc-angle-right-L_16\"></i>\n </button>\n</div>\n", styles: [".mc-calendar-header{display:flex;flex-direction:row;justify-content:space-between;padding:16px 8px 12px;padding:var(--mc-datepicker-calendar-size-padding-top, 16px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px) var(--mc-datepicker-calendar-size-padding-blocks, 12px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px)}.mc-calendar-header__previous-button:after{border-left-width:2px;border-left-width:var(--mc-datepicker-calendar-size-icon-border-width, 2px);transform:translate(2px) rotate(-45deg);transform:var(--mc-datepicker-calendar-size-icon-prev-icon-transform, translateX(2px) rotate(-45deg))}.mc-calendar-header__next-button:after{border-right-width:2px;border-right-width:var(--mc-datepicker-calendar-size-icon-border-width, 2px);transform:translate(-2px) rotate(45deg);transform:var(--mc-datepicker-calendar-size-icon-nex-icon-transform, translateX(-2px) rotate(45deg))}.mc-calendar-header__select{width:auto!important}.mc-calendar-header__button-group,.mc-calendar-header__select-group{display:flex;flex-direction:row}.mc-calendar-select-panel{margin-top:2px;min-width:98%!important}.mc-calendar-select-panel .mc-select__content{max-height:384px}\n"] }]
|
224
|
+
}], ctorParameters: function () { return [{ type: i1$1.DateAdapter }]; }, propDecorators: { activeDate: [{
|
225
|
+
type: Input
|
226
|
+
}], maxDate: [{
|
227
|
+
type: Input
|
228
|
+
}], minDate: [{
|
229
|
+
type: Input
|
230
|
+
}], activeDateChange: [{
|
231
|
+
type: Output
|
232
|
+
}], monthSelected: [{
|
233
|
+
type: Output
|
234
|
+
}], yearSelected: [{
|
235
|
+
type: Output
|
236
|
+
}] } });
|
237
|
+
|
128
238
|
/** @docs-private */
|
129
239
|
function createMissingDateImplError(provider) {
|
130
240
|
return Error(`McDatepicker: No provider found for ${provider}. You must import one of the existing ` +
|
131
241
|
`modules at your application root or provide a custom implementation or use exists ones.`);
|
132
242
|
}
|
133
243
|
|
244
|
+
// tslint:disable:no-magic-numbers
|
134
245
|
const DAYS_PER_WEEK = 7;
|
135
246
|
/**
|
136
247
|
* An internal component used to display a single month in the datepicker.
|
137
248
|
* @docs-private
|
138
249
|
*/
|
139
250
|
class McMonthView {
|
140
|
-
constructor(changeDetectorRef, dateFormats,
|
251
|
+
constructor(changeDetectorRef, dateFormats, adapter) {
|
141
252
|
this.changeDetectorRef = changeDetectorRef;
|
142
253
|
this.dateFormats = dateFormats;
|
143
|
-
this.
|
144
|
-
this.dir = dir;
|
254
|
+
this.adapter = adapter;
|
145
255
|
/** Emits when a new date is selected. */
|
146
256
|
this.selectedChange = new EventEmitter();
|
147
257
|
/** Emits when any date is selected. */
|
148
258
|
this.userSelection = new EventEmitter();
|
149
259
|
/** Emits when any date is activated. */
|
150
260
|
this.activeDateChange = new EventEmitter();
|
151
|
-
if (!this.
|
261
|
+
if (!this.adapter) {
|
152
262
|
throw createMissingDateImplError('DateAdapter');
|
153
263
|
}
|
154
264
|
if (!this.dateFormats) {
|
155
265
|
throw createMissingDateImplError('MC_DATE_FORMATS');
|
156
266
|
}
|
157
|
-
const firstDayOfWeek = this.
|
158
|
-
const narrowWeekdays = this.
|
159
|
-
const longWeekdays = this.
|
267
|
+
const firstDayOfWeek = this.adapter.getFirstDayOfWeek();
|
268
|
+
const narrowWeekdays = this.adapter.getDayOfWeekNames('short');
|
269
|
+
const longWeekdays = this.adapter.getDayOfWeekNames('long');
|
160
270
|
// Rotate the labels for days of the week based on the configured first day of the week.
|
161
271
|
const weekdays = longWeekdays.map((long, i) => {
|
162
272
|
return { long, narrow: narrowWeekdays[i] };
|
@@ -164,7 +274,7 @@ class McMonthView {
|
|
164
274
|
this.weekdays = weekdays
|
165
275
|
.slice(firstDayOfWeek)
|
166
276
|
.concat(weekdays.slice(0, firstDayOfWeek));
|
167
|
-
this._activeDate = this.
|
277
|
+
this._activeDate = this.adapter.today();
|
168
278
|
}
|
169
279
|
/**
|
170
280
|
* The date to display in this month view (everything other than the month and year is ignored).
|
@@ -173,10 +283,9 @@ class McMonthView {
|
|
173
283
|
return this._activeDate;
|
174
284
|
}
|
175
285
|
set activeDate(value) {
|
176
|
-
const
|
177
|
-
|
178
|
-
|
179
|
-
if (!this.hasSameMonthAndYear(oldActiveDate, this._activeDate)) {
|
286
|
+
const oldValue = this._activeDate;
|
287
|
+
this._activeDate = value;
|
288
|
+
if (!this.hasSameMonthAndYear(oldValue, value)) {
|
180
289
|
this.init();
|
181
290
|
}
|
182
291
|
}
|
@@ -185,165 +294,73 @@ class McMonthView {
|
|
185
294
|
return this._selected;
|
186
295
|
}
|
187
296
|
set selected(value) {
|
188
|
-
this._selected =
|
297
|
+
this._selected = value;
|
189
298
|
this.selectedDate = this.getDateInCurrentMonth(this._selected);
|
190
299
|
}
|
191
|
-
/** The minimum selectable date. */
|
192
|
-
get minDate() {
|
193
|
-
return this._minDate;
|
194
|
-
}
|
195
|
-
set minDate(value) {
|
196
|
-
this._minDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
197
|
-
}
|
198
|
-
/** The maximum selectable date. */
|
199
|
-
get maxDate() {
|
200
|
-
return this._maxDate;
|
201
|
-
}
|
202
|
-
set maxDate(value) {
|
203
|
-
this._maxDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
204
|
-
}
|
205
300
|
ngAfterContentInit() {
|
206
301
|
this.init();
|
207
302
|
}
|
208
303
|
/** Handles when a new date is selected. */
|
209
304
|
dateSelected(date) {
|
210
305
|
if (this.selectedDate !== date) {
|
211
|
-
const selectedYear = this.
|
212
|
-
const selectedMonth = this.
|
213
|
-
const selectedDate = this.
|
306
|
+
const selectedYear = this.adapter.getYear(this.activeDate);
|
307
|
+
const selectedMonth = this.adapter.getMonth(this.activeDate);
|
308
|
+
const selectedDate = this.adapter.createDate(selectedYear, selectedMonth, date);
|
214
309
|
this.selectedChange.emit(selectedDate);
|
215
310
|
}
|
216
311
|
this.userSelection.emit();
|
217
312
|
}
|
218
|
-
/** Handles keydown events on the calendar body when calendar is in month view. */
|
219
|
-
handleCalendarBodyKeydown(event) {
|
220
|
-
// TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
|
221
|
-
// disabled ones from being selected. This may not be ideal, we should look into whether
|
222
|
-
// navigation should skip over disabled dates, and if so, how to implement that efficiently.
|
223
|
-
const oldActiveDate = this._activeDate;
|
224
|
-
const isRtl = this.isRtl();
|
225
|
-
// tslint:disable-next-line:deprecation
|
226
|
-
switch (event.keyCode) {
|
227
|
-
case LEFT_ARROW:
|
228
|
-
this.activeDate = this.dateAdapter.addCalendarDays(this._activeDate, isRtl ? 1 : -1);
|
229
|
-
break;
|
230
|
-
case RIGHT_ARROW:
|
231
|
-
this.activeDate = this.dateAdapter.addCalendarDays(this._activeDate, isRtl ? -1 : 1);
|
232
|
-
break;
|
233
|
-
case UP_ARROW:
|
234
|
-
this.activeDate = this.dateAdapter.addCalendarDays(this._activeDate, -7);
|
235
|
-
break;
|
236
|
-
case DOWN_ARROW:
|
237
|
-
this.activeDate = this.dateAdapter.addCalendarDays(this._activeDate, 7);
|
238
|
-
break;
|
239
|
-
case HOME:
|
240
|
-
this.activeDate = this.dateAdapter.addCalendarDays(this._activeDate, 1 - this.dateAdapter.getDate(this._activeDate));
|
241
|
-
break;
|
242
|
-
case END:
|
243
|
-
this.activeDate = this.dateAdapter.addCalendarDays(this._activeDate, (this.dateAdapter.getNumDaysInMonth(this._activeDate) - this.dateAdapter.getDate(this._activeDate)));
|
244
|
-
break;
|
245
|
-
case PAGE_UP:
|
246
|
-
this.activeDate = event.altKey ?
|
247
|
-
this.dateAdapter.addCalendarYears(this._activeDate, -1) :
|
248
|
-
this.dateAdapter.addCalendarMonths(this._activeDate, -1);
|
249
|
-
break;
|
250
|
-
case PAGE_DOWN:
|
251
|
-
this.activeDate = event.altKey ?
|
252
|
-
this.dateAdapter.addCalendarYears(this._activeDate, 1) :
|
253
|
-
this.dateAdapter.addCalendarMonths(this._activeDate, 1);
|
254
|
-
break;
|
255
|
-
case ENTER:
|
256
|
-
case SPACE:
|
257
|
-
if (!this.dateFilter || this.dateFilter(this._activeDate)) {
|
258
|
-
this.dateSelected(this.dateAdapter.getDate(this._activeDate));
|
259
|
-
this.userSelection.emit();
|
260
|
-
// Prevent unexpected default actions such as form submission.
|
261
|
-
event.preventDefault();
|
262
|
-
}
|
263
|
-
return;
|
264
|
-
default:
|
265
|
-
// Don't prevent default or focus active cell on keys that we don't explicitly handle.
|
266
|
-
return;
|
267
|
-
}
|
268
|
-
if (this.dateAdapter.compareDate(oldActiveDate, this.activeDate)) {
|
269
|
-
this.activeDateChange.emit(this.activeDate);
|
270
|
-
}
|
271
|
-
this.focusActiveCell();
|
272
|
-
// Prevent unexpected default actions such as form submission.
|
273
|
-
event.preventDefault();
|
274
|
-
}
|
275
313
|
/** Initializes this month view. */
|
276
314
|
init() {
|
277
315
|
this.selectedDate = this.getDateInCurrentMonth(this.selected);
|
278
|
-
this.todayDate = this.getDateInCurrentMonth(this.
|
279
|
-
|
280
|
-
this.
|
281
|
-
const firstOfMonth = this.dateAdapter.createDate(this.dateAdapter.getYear(this.activeDate), this.dateAdapter.getMonth(this.activeDate));
|
282
|
-
this.firstWeekOffset =
|
283
|
-
(DAYS_PER_WEEK + this.dateAdapter.getDayOfWeek(firstOfMonth) -
|
284
|
-
this.dateAdapter.getFirstDayOfWeek()) % DAYS_PER_WEEK;
|
316
|
+
this.todayDate = this.getDateInCurrentMonth(this.adapter.today());
|
317
|
+
const firstOfMonth = this.adapter.createDate(this.adapter.getYear(this.activeDate), this.adapter.getMonth(this.activeDate));
|
318
|
+
this.firstWeekOffset = (DAYS_PER_WEEK + this.adapter.getDayOfWeek(firstOfMonth) - this.adapter.getFirstDayOfWeek()) % DAYS_PER_WEEK;
|
285
319
|
this.createWeekCells();
|
286
320
|
this.changeDetectorRef.markForCheck();
|
287
321
|
}
|
288
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
289
|
-
focusActiveCell() {
|
290
|
-
this.mcCalendarBody.focusActiveCell();
|
291
|
-
}
|
292
322
|
/** Creates McCalendarCells for the dates in this month. */
|
293
323
|
createWeekCells() {
|
294
|
-
const daysInMonth = this.
|
295
|
-
const dateNames = this.
|
324
|
+
const daysInMonth = this.adapter.getNumDaysInMonth(this.activeDate);
|
325
|
+
const dateNames = this.adapter.getDateNames();
|
296
326
|
this.weeks = [[]];
|
297
327
|
for (let i = 0, cell = this.firstWeekOffset; i < daysInMonth; i++, cell++) {
|
298
328
|
if (cell === DAYS_PER_WEEK) {
|
299
329
|
this.weeks.push([]);
|
300
330
|
cell = 0;
|
301
331
|
}
|
302
|
-
const date = this.
|
332
|
+
const date = this.adapter.createDate(this.adapter.getYear(this.activeDate), this.adapter.getMonth(this.activeDate), i + 1);
|
303
333
|
const enabled = this.shouldEnableDate(date);
|
304
|
-
const ariaLabel = this.dateAdapter.format(date, this.dateFormats.dateA11yLabel);
|
305
334
|
const cellClasses = this.dateClass ? this.dateClass(date) : undefined;
|
306
335
|
this.weeks[this.weeks.length - 1]
|
307
|
-
.push(new McCalendarCell(i + 1, dateNames[i],
|
336
|
+
.push(new McCalendarCell(i + 1, dateNames[i], enabled, cellClasses));
|
308
337
|
}
|
309
338
|
}
|
310
339
|
/** Date filter for the month */
|
311
340
|
shouldEnableDate(date) {
|
312
341
|
return !!date &&
|
313
342
|
(!this.dateFilter || this.dateFilter(date)) &&
|
314
|
-
(!this.minDate || this.
|
315
|
-
(!this.maxDate || this.
|
343
|
+
(!this.minDate || this.adapter.compareDate(date, this.minDate) >= 0) &&
|
344
|
+
(!this.maxDate || this.adapter.compareDate(date, this.maxDate) <= 0);
|
316
345
|
}
|
317
346
|
/**
|
318
347
|
* Gets the date in this month that the given Date falls on.
|
319
348
|
* Returns null if the given Date is in another month.
|
320
349
|
*/
|
321
350
|
getDateInCurrentMonth(date) {
|
322
|
-
return date && this.hasSameMonthAndYear(date, this.activeDate) ?
|
323
|
-
this.dateAdapter.getDate(date) : null;
|
351
|
+
return date && this.hasSameMonthAndYear(date, this.activeDate) ? this.adapter.getDate(date) : null;
|
324
352
|
}
|
325
353
|
/** Checks whether the 2 dates are non-null and fall within the same month of the same year. */
|
326
354
|
hasSameMonthAndYear(d1, d2) {
|
327
|
-
return !!(d1 && d2 && this.
|
328
|
-
this.
|
329
|
-
}
|
330
|
-
/**
|
331
|
-
* @param obj The object to check.
|
332
|
-
* @returns The given object if it is both a date instance and valid, otherwise null.
|
333
|
-
*/
|
334
|
-
getValidDateOrNull(obj) {
|
335
|
-
return (this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj)) ? obj : null;
|
336
|
-
}
|
337
|
-
/** Determines whether the user has the RTL layout direction. */
|
338
|
-
isRtl() {
|
339
|
-
return this.dir && this.dir.value === 'rtl';
|
355
|
+
return !!(d1 && d2 && this.adapter.getMonth(d1) === this.adapter.getMonth(d2) &&
|
356
|
+
this.adapter.getYear(d1) === this.adapter.getYear(d2));
|
340
357
|
}
|
341
358
|
}
|
342
|
-
/** @nocollapse */ McMonthView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McMonthView, deps: [{ token: i0.ChangeDetectorRef }, { token: MC_DATE_FORMATS, optional: true }, { token: i1$1.DateAdapter, optional: true }
|
343
|
-
/** @nocollapse */ McMonthView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McMonthView, selector: "mc-month-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass" }, outputs: { selectedChange: "selectedChange", userSelection: "userSelection", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "mcCalendarBody", first: true, predicate: McCalendarBody, descendants: true }], exportAs: ["mcMonthView"], ngImport: i0, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th *ngFor=\"let day of weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n </tr>\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"7\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [
|
359
|
+
/** @nocollapse */ McMonthView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McMonthView, deps: [{ token: i0.ChangeDetectorRef }, { token: MC_DATE_FORMATS, optional: true }, { token: i1$1.DateAdapter, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
360
|
+
/** @nocollapse */ McMonthView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McMonthView, selector: "mc-month-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass" }, outputs: { selectedChange: "selectedChange", userSelection: "userSelection", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "mcCalendarBody", first: true, predicate: McCalendarBody, descendants: true }], exportAs: ["mcMonthView"], ngImport: i0, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th *ngFor=\"let day of weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n </tr>\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"7\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [rows]=\"weeks\"\n [todayValue]=\"todayDate!\"\n [selectedValue]=\"selectedDate!\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"adapter.getDate(activeDate) - 1\"\n (selectedValueChange)=\"dateSelected($event)\">\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: McCalendarBody, selector: "[mc-calendar-body]", inputs: ["rows", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "activeCell", "cellAspectRatio"], outputs: ["selectedValueChange"], exportAs: ["mcCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
344
361
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McMonthView, decorators: [{
|
345
362
|
type: Component,
|
346
|
-
args: [{ selector: 'mc-month-view', exportAs: 'mcMonthView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th *ngFor=\"let day of weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n </tr>\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"7\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [
|
363
|
+
args: [{ selector: 'mc-month-view', exportAs: 'mcMonthView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th *ngFor=\"let day of weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n </tr>\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"7\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [rows]=\"weeks\"\n [todayValue]=\"todayDate!\"\n [selectedValue]=\"selectedDate!\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"adapter.getDate(activeDate) - 1\"\n (selectedValueChange)=\"dateSelected($event)\">\n </tbody>\n</table>\n" }]
|
347
364
|
}], ctorParameters: function () {
|
348
365
|
return [{ type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
349
366
|
type: Optional
|
@@ -352,8 +369,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
352
369
|
args: [MC_DATE_FORMATS]
|
353
370
|
}] }, { type: i1$1.DateAdapter, decorators: [{
|
354
371
|
type: Optional
|
355
|
-
}] }, { type: i2.Directionality, decorators: [{
|
356
|
-
type: Optional
|
357
372
|
}] }];
|
358
373
|
}, propDecorators: { activeDate: [{
|
359
374
|
type: Input
|
@@ -378,460 +393,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
378
393
|
args: [McCalendarBody, { static: false }]
|
379
394
|
}] } });
|
380
395
|
|
381
|
-
const yearsPerPage = 24;
|
382
|
-
const yearsPerRow = 4;
|
383
|
-
/**
|
384
|
-
* An internal component used to display a year selector in the datepicker.
|
385
|
-
* @docs-private
|
386
|
-
*/
|
387
|
-
class McMultiYearView {
|
388
|
-
constructor(changeDetectorRef, dateAdapter, dir) {
|
389
|
-
this.changeDetectorRef = changeDetectorRef;
|
390
|
-
this.dateAdapter = dateAdapter;
|
391
|
-
this.dir = dir;
|
392
|
-
/** Emits when a new year is selected. */
|
393
|
-
this.selectedChange = new EventEmitter();
|
394
|
-
/** Emits the selected year. This doesn't imply a change on the selected date */
|
395
|
-
this.yearSelected = new EventEmitter();
|
396
|
-
/** Emits when any date is activated. */
|
397
|
-
this.activeDateChange = new EventEmitter();
|
398
|
-
if (!this.dateAdapter) {
|
399
|
-
throw createMissingDateImplError('DateAdapter');
|
400
|
-
}
|
401
|
-
this._activeDate = this.dateAdapter.today();
|
402
|
-
}
|
403
|
-
/** The date to display in this multi-year view (everything other than the year is ignored). */
|
404
|
-
get activeDate() {
|
405
|
-
return this._activeDate;
|
406
|
-
}
|
407
|
-
set activeDate(value) {
|
408
|
-
const oldActiveDate = this._activeDate;
|
409
|
-
const validDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value)) || this.dateAdapter.today();
|
410
|
-
this._activeDate = this.dateAdapter.clampDate(validDate, this.minDate, this.maxDate);
|
411
|
-
if (Math.floor(this.dateAdapter.getYear(oldActiveDate) / yearsPerPage) !==
|
412
|
-
Math.floor(this.dateAdapter.getYear(this._activeDate) / yearsPerPage)) {
|
413
|
-
this.init();
|
414
|
-
}
|
415
|
-
}
|
416
|
-
/** The currently selected date. */
|
417
|
-
get selected() {
|
418
|
-
return this._selected;
|
419
|
-
}
|
420
|
-
set selected(value) {
|
421
|
-
this._selected = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
422
|
-
this.selectedYear = this._selected && this.dateAdapter.getYear(this._selected);
|
423
|
-
}
|
424
|
-
/** The minimum selectable date. */
|
425
|
-
get minDate() {
|
426
|
-
return this._minDate;
|
427
|
-
}
|
428
|
-
set minDate(value) {
|
429
|
-
this._minDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
430
|
-
}
|
431
|
-
/** The maximum selectable date. */
|
432
|
-
get maxDate() {
|
433
|
-
return this._maxDate;
|
434
|
-
}
|
435
|
-
set maxDate(value) {
|
436
|
-
this._maxDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
437
|
-
}
|
438
|
-
ngAfterContentInit() {
|
439
|
-
this.init();
|
440
|
-
}
|
441
|
-
/** Initializes this multi-year view. */
|
442
|
-
init() {
|
443
|
-
this.todayYear = this.dateAdapter.getYear(this.dateAdapter.today());
|
444
|
-
const activeYear = this.dateAdapter.getYear(this._activeDate);
|
445
|
-
const activeOffset = activeYear % yearsPerPage;
|
446
|
-
this.years = [];
|
447
|
-
for (let i = 0, row = []; i < yearsPerPage; i++) {
|
448
|
-
row.push(activeYear - activeOffset + i);
|
449
|
-
if (row.length === yearsPerRow) {
|
450
|
-
this.years.push(row.map((year) => this.createCellForYear(year)));
|
451
|
-
row = [];
|
452
|
-
}
|
453
|
-
}
|
454
|
-
this.changeDetectorRef.markForCheck();
|
455
|
-
}
|
456
|
-
/** Handles when a new year is selected. */
|
457
|
-
onYearSelected(year) {
|
458
|
-
this.yearSelected.emit(this.dateAdapter.createDate(year));
|
459
|
-
const month = this.dateAdapter.getMonth(this.activeDate);
|
460
|
-
const daysInMonth = this.dateAdapter.getNumDaysInMonth(this.dateAdapter.createDate(year, month));
|
461
|
-
this.selectedChange.emit(this.dateAdapter.createDate(year, month, Math.min(this.dateAdapter.getDate(this.activeDate), daysInMonth)));
|
462
|
-
}
|
463
|
-
/** Handles keydown events on the calendar body when calendar is in multi-year view. */
|
464
|
-
handleCalendarBodyKeydown(event) {
|
465
|
-
// TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
|
466
|
-
// disabled ones from being selected. This may not be ideal, we should look into whether
|
467
|
-
// navigation should skip over disabled dates, and if so, how to implement that efficiently.
|
468
|
-
const oldActiveDate = this._activeDate;
|
469
|
-
const isRtl = this.isRtl();
|
470
|
-
// tslint:disable-next-line:deprecation
|
471
|
-
switch (event.keyCode) {
|
472
|
-
case LEFT_ARROW:
|
473
|
-
this.activeDate = this.dateAdapter.addCalendarYears(this._activeDate, isRtl ? 1 : -1);
|
474
|
-
break;
|
475
|
-
case RIGHT_ARROW:
|
476
|
-
this.activeDate = this.dateAdapter.addCalendarYears(this._activeDate, isRtl ? -1 : 1);
|
477
|
-
break;
|
478
|
-
case UP_ARROW:
|
479
|
-
this.activeDate = this.dateAdapter.addCalendarYears(this._activeDate, -yearsPerRow);
|
480
|
-
break;
|
481
|
-
case DOWN_ARROW:
|
482
|
-
this.activeDate = this.dateAdapter.addCalendarYears(this._activeDate, yearsPerRow);
|
483
|
-
break;
|
484
|
-
case HOME:
|
485
|
-
this.activeDate = this.dateAdapter.addCalendarYears(this._activeDate, -this.dateAdapter.getYear(this._activeDate) % yearsPerPage);
|
486
|
-
break;
|
487
|
-
case END:
|
488
|
-
this.activeDate = this.dateAdapter.addCalendarYears(this._activeDate, yearsPerPage - this.dateAdapter.getYear(this._activeDate) % yearsPerPage - 1);
|
489
|
-
break;
|
490
|
-
case PAGE_UP:
|
491
|
-
this.activeDate =
|
492
|
-
this.dateAdapter.addCalendarYears(this._activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);
|
493
|
-
break;
|
494
|
-
case PAGE_DOWN:
|
495
|
-
this.activeDate =
|
496
|
-
this.dateAdapter.addCalendarYears(this._activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);
|
497
|
-
break;
|
498
|
-
case ENTER:
|
499
|
-
case SPACE:
|
500
|
-
this.onYearSelected(this.dateAdapter.getYear(this._activeDate));
|
501
|
-
break;
|
502
|
-
default:
|
503
|
-
// Don't prevent default or focus active cell on keys that we don't explicitly handle.
|
504
|
-
return;
|
505
|
-
}
|
506
|
-
if (this.dateAdapter.compareDate(oldActiveDate, this.activeDate)) {
|
507
|
-
this.activeDateChange.emit(this.activeDate);
|
508
|
-
}
|
509
|
-
this.focusActiveCell();
|
510
|
-
// Prevent unexpected default actions such as form submission.
|
511
|
-
event.preventDefault();
|
512
|
-
}
|
513
|
-
getActiveCell() {
|
514
|
-
return this.dateAdapter.getYear(this.activeDate) % yearsPerPage;
|
515
|
-
}
|
516
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
517
|
-
focusActiveCell() {
|
518
|
-
this.mcCalendarBody.focusActiveCell();
|
519
|
-
}
|
520
|
-
/** Creates an McCalendarCell for the given year. */
|
521
|
-
createCellForYear(year) {
|
522
|
-
const yearName = this.dateAdapter.getYearName(this.dateAdapter.createDate(year));
|
523
|
-
return new McCalendarCell(year, yearName, yearName, this.shouldEnableYear(year));
|
524
|
-
}
|
525
|
-
/** Whether the given year is enabled. */
|
526
|
-
shouldEnableYear(year) {
|
527
|
-
// disable if the year is greater than maxDate lower than minDate
|
528
|
-
if (year === undefined || year === null ||
|
529
|
-
(this.maxDate && year > this.dateAdapter.getYear(this.maxDate)) ||
|
530
|
-
(this.minDate && year < this.dateAdapter.getYear(this.minDate))) {
|
531
|
-
return false;
|
532
|
-
}
|
533
|
-
// enable if it reaches here and there's no filter defined
|
534
|
-
if (!this.dateFilter) {
|
535
|
-
return true;
|
536
|
-
}
|
537
|
-
const firstOfYear = this.dateAdapter.createDate(year);
|
538
|
-
// If any date in the year is enabled count the year as enabled.
|
539
|
-
for (let date = firstOfYear; this.dateAdapter.getYear(date) === year; date = this.dateAdapter.addCalendarDays(date, 1)) {
|
540
|
-
if (this.dateFilter(date)) {
|
541
|
-
return true;
|
542
|
-
}
|
543
|
-
}
|
544
|
-
return false;
|
545
|
-
}
|
546
|
-
/**
|
547
|
-
* @param obj The object to check.
|
548
|
-
* @returns The given object if it is both a date instance and valid, otherwise null.
|
549
|
-
*/
|
550
|
-
getValidDateOrNull(obj) {
|
551
|
-
return (this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj)) ? obj : null;
|
552
|
-
}
|
553
|
-
/** Determines whether the user has the RTL layout direction. */
|
554
|
-
isRtl() {
|
555
|
-
return this.dir && this.dir.value === 'rtl';
|
556
|
-
}
|
557
|
-
}
|
558
|
-
/** @nocollapse */ McMultiYearView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McMultiYearView, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
559
|
-
/** @nocollapse */ McMultiYearView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McMultiYearView, selector: "mc-multi-year-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter" }, outputs: { selectedChange: "selectedChange", yearSelected: "yearSelected", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "mcCalendarBody", first: true, predicate: McCalendarBody, descendants: true }], exportAs: ["mcMultiYearView"], ngImport: i0, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"4\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [rows]=\"years\"\n [todayValue]=\"todayYear\"\n [selectedValue]=\"selectedYear!\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"getActiveCell()\"\n (selectedValueChange)=\"onYearSelected($event)\"\n (keydown)=\"handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n", dependencies: [{ kind: "component", type: McCalendarBody, selector: "[mc-calendar-body]", inputs: ["label", "rows", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "activeCell", "cellAspectRatio"], outputs: ["selectedValueChange"], exportAs: ["mcCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
560
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McMultiYearView, decorators: [{
|
561
|
-
type: Component,
|
562
|
-
args: [{ selector: 'mc-multi-year-view', exportAs: 'mcMultiYearView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"4\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [rows]=\"years\"\n [todayValue]=\"todayYear\"\n [selectedValue]=\"selectedYear!\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"getActiveCell()\"\n (selectedValueChange)=\"onYearSelected($event)\"\n (keydown)=\"handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n" }]
|
563
|
-
}], ctorParameters: function () {
|
564
|
-
return [{ type: i0.ChangeDetectorRef }, { type: i1$1.DateAdapter, decorators: [{
|
565
|
-
type: Optional
|
566
|
-
}] }, { type: i2.Directionality, decorators: [{
|
567
|
-
type: Optional
|
568
|
-
}] }];
|
569
|
-
}, propDecorators: { activeDate: [{
|
570
|
-
type: Input
|
571
|
-
}], selected: [{
|
572
|
-
type: Input
|
573
|
-
}], minDate: [{
|
574
|
-
type: Input
|
575
|
-
}], maxDate: [{
|
576
|
-
type: Input
|
577
|
-
}], dateFilter: [{
|
578
|
-
type: Input
|
579
|
-
}], selectedChange: [{
|
580
|
-
type: Output
|
581
|
-
}], yearSelected: [{
|
582
|
-
type: Output
|
583
|
-
}], activeDateChange: [{
|
584
|
-
type: Output
|
585
|
-
}], mcCalendarBody: [{
|
586
|
-
type: ViewChild,
|
587
|
-
args: [McCalendarBody, { static: false }]
|
588
|
-
}] } });
|
589
|
-
|
590
|
-
/**
|
591
|
-
* An internal component used to display a single year in the datepicker.
|
592
|
-
* @docs-private
|
593
|
-
*/
|
594
|
-
class McYearView {
|
595
|
-
constructor(changeDetectorRef, dateFormats, dateAdapter, dir) {
|
596
|
-
this.changeDetectorRef = changeDetectorRef;
|
597
|
-
this.dateFormats = dateFormats;
|
598
|
-
this.dateAdapter = dateAdapter;
|
599
|
-
this.dir = dir;
|
600
|
-
/** Emits when a new month is selected. */
|
601
|
-
this.selectedChange = new EventEmitter();
|
602
|
-
/** Emits the selected month. This doesn't imply a change on the selected date */
|
603
|
-
this.monthSelected = new EventEmitter();
|
604
|
-
/** Emits when any date is activated. */
|
605
|
-
this.activeDateChange = new EventEmitter();
|
606
|
-
if (!this.dateAdapter) {
|
607
|
-
throw createMissingDateImplError('DateAdapter');
|
608
|
-
}
|
609
|
-
if (!this.dateFormats) {
|
610
|
-
throw createMissingDateImplError('MC_DATE_FORMATS');
|
611
|
-
}
|
612
|
-
this._activeDate = this.dateAdapter.today();
|
613
|
-
}
|
614
|
-
/** The date to display in this year view (everything other than the year is ignored). */
|
615
|
-
get activeDate() {
|
616
|
-
return this._activeDate;
|
617
|
-
}
|
618
|
-
set activeDate(value) {
|
619
|
-
const oldActiveDate = this._activeDate;
|
620
|
-
const validDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value)) || this.dateAdapter.today();
|
621
|
-
this._activeDate = this.dateAdapter.clampDate(validDate, this.minDate, this.maxDate);
|
622
|
-
if (this.dateAdapter.getYear(oldActiveDate) !== this.dateAdapter.getYear(this._activeDate)) {
|
623
|
-
this.init();
|
624
|
-
}
|
625
|
-
}
|
626
|
-
/** The currently selected date. */
|
627
|
-
get selected() {
|
628
|
-
return this._selected;
|
629
|
-
}
|
630
|
-
set selected(value) {
|
631
|
-
this._selected = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
632
|
-
this.selectedMonth = this.getMonthInCurrentYear(this._selected);
|
633
|
-
}
|
634
|
-
/** The minimum selectable date. */
|
635
|
-
get minDate() {
|
636
|
-
return this._minDate;
|
637
|
-
}
|
638
|
-
set minDate(value) {
|
639
|
-
this._minDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
640
|
-
}
|
641
|
-
/** The maximum selectable date. */
|
642
|
-
get maxDate() {
|
643
|
-
return this._maxDate;
|
644
|
-
}
|
645
|
-
set maxDate(value) {
|
646
|
-
this._maxDate = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
|
647
|
-
}
|
648
|
-
ngAfterContentInit() {
|
649
|
-
this.init();
|
650
|
-
}
|
651
|
-
/** Handles when a new month is selected. */
|
652
|
-
onMonthSelected(month) {
|
653
|
-
const year = this.dateAdapter.getYear(this.activeDate);
|
654
|
-
const normalizedDate = this.dateAdapter.createDate(year, month);
|
655
|
-
this.monthSelected.emit(normalizedDate);
|
656
|
-
const daysInMonth = this.dateAdapter.getNumDaysInMonth(normalizedDate);
|
657
|
-
this.selectedChange.emit(this.dateAdapter.createDate(year, month, Math.min(this.dateAdapter.getDate(this.activeDate), daysInMonth)));
|
658
|
-
}
|
659
|
-
/** Handles keydown events on the calendar body when calendar is in year view. */
|
660
|
-
handleCalendarBodyKeydown(event) {
|
661
|
-
// TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
|
662
|
-
// disabled ones from being selected. This may not be ideal, we should look into whether
|
663
|
-
// navigation should skip over disabled dates, and if so, how to implement that efficiently.
|
664
|
-
const oldActiveDate = this._activeDate;
|
665
|
-
const isRtl = this.isRtl();
|
666
|
-
const VERTICAL_SHIFT = 4;
|
667
|
-
const PAGE_SHIFT = 10;
|
668
|
-
const MAX_MONTH_INDEX = 11;
|
669
|
-
// tslint:disable-next-line:deprecation
|
670
|
-
switch (event.keyCode) {
|
671
|
-
case LEFT_ARROW:
|
672
|
-
this.activeDate = this.dateAdapter.addCalendarMonths(this._activeDate, isRtl ? 1 : -1);
|
673
|
-
break;
|
674
|
-
case RIGHT_ARROW:
|
675
|
-
this.activeDate = this.dateAdapter.addCalendarMonths(this._activeDate, isRtl ? -1 : 1);
|
676
|
-
break;
|
677
|
-
case UP_ARROW:
|
678
|
-
this.activeDate = this.dateAdapter.addCalendarMonths(this._activeDate, -VERTICAL_SHIFT);
|
679
|
-
break;
|
680
|
-
case DOWN_ARROW:
|
681
|
-
this.activeDate = this.dateAdapter.addCalendarMonths(this._activeDate, VERTICAL_SHIFT);
|
682
|
-
break;
|
683
|
-
case HOME:
|
684
|
-
this.activeDate = this.dateAdapter.addCalendarMonths(this._activeDate, -this.dateAdapter.getMonth(this._activeDate));
|
685
|
-
break;
|
686
|
-
case END:
|
687
|
-
this.activeDate = this.dateAdapter.addCalendarMonths(this._activeDate, MAX_MONTH_INDEX - this.dateAdapter.getMonth(this._activeDate));
|
688
|
-
break;
|
689
|
-
case PAGE_UP:
|
690
|
-
this.activeDate =
|
691
|
-
this.dateAdapter.addCalendarYears(this._activeDate, event.altKey ? -PAGE_SHIFT : -1);
|
692
|
-
break;
|
693
|
-
case PAGE_DOWN:
|
694
|
-
this.activeDate =
|
695
|
-
this.dateAdapter.addCalendarYears(this._activeDate, event.altKey ? PAGE_SHIFT : 1);
|
696
|
-
break;
|
697
|
-
case ENTER:
|
698
|
-
case SPACE:
|
699
|
-
this.onMonthSelected(this.dateAdapter.getMonth(this._activeDate));
|
700
|
-
break;
|
701
|
-
default:
|
702
|
-
// Don't prevent default or focus active cell on keys that we don't explicitly handle.
|
703
|
-
return;
|
704
|
-
}
|
705
|
-
if (this.dateAdapter.compareDate(oldActiveDate, this.activeDate)) {
|
706
|
-
this.activeDateChange.emit(this.activeDate);
|
707
|
-
}
|
708
|
-
this.focusActiveCell();
|
709
|
-
// Prevent unexpected default actions such as form submission.
|
710
|
-
event.preventDefault();
|
711
|
-
}
|
712
|
-
/** Initializes this year view. */
|
713
|
-
init() {
|
714
|
-
this.selectedMonth = this.getMonthInCurrentYear(this.selected);
|
715
|
-
this.todayMonth = this.getMonthInCurrentYear(this.dateAdapter.today());
|
716
|
-
this.yearLabel = this.dateAdapter.getYearName(this.activeDate);
|
717
|
-
const monthNames = this.dateAdapter.getMonthNames('short');
|
718
|
-
// First row of months only contains 5 elements so we can fit the year label on the same row.
|
719
|
-
// tslint:disable-next-line:no-magic-numbers
|
720
|
-
this.months = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
|
721
|
-
.map((row) => row.map((month) => this.createCellForMonth(month, monthNames[month])));
|
722
|
-
this.changeDetectorRef.markForCheck();
|
723
|
-
}
|
724
|
-
/** Focuses the active cell after the microtask queue is empty. */
|
725
|
-
focusActiveCell() {
|
726
|
-
this.mcCalendarBody.focusActiveCell();
|
727
|
-
}
|
728
|
-
/**
|
729
|
-
* Gets the month in this year that the given Date falls on.
|
730
|
-
* Returns null if the given Date is in another year.
|
731
|
-
*/
|
732
|
-
getMonthInCurrentYear(date) {
|
733
|
-
return date && this.dateAdapter.getYear(date) === this.dateAdapter.getYear(this.activeDate) ?
|
734
|
-
this.dateAdapter.getMonth(date) : null;
|
735
|
-
}
|
736
|
-
/** Creates an McCalendarCell for the given month. */
|
737
|
-
createCellForMonth(month, monthName) {
|
738
|
-
const ariaLabel = this.dateAdapter.format(this.dateAdapter.createDate(this.dateAdapter.getYear(this.activeDate), month), this.dateFormats.monthYearA11yLabel);
|
739
|
-
const newMonthName = monthName[0].toLocaleUpperCase() + monthName.substr(1);
|
740
|
-
return new McCalendarCell(month, newMonthName, ariaLabel, this.shouldEnableMonth(month));
|
741
|
-
}
|
742
|
-
/** Whether the given month is enabled. */
|
743
|
-
shouldEnableMonth(month) {
|
744
|
-
const activeYear = this.dateAdapter.getYear(this.activeDate);
|
745
|
-
if (month === undefined || month === null ||
|
746
|
-
this.isYearAndMonthAfterMaxDate(activeYear, month) ||
|
747
|
-
this.isYearAndMonthBeforeMinDate(activeYear, month)) {
|
748
|
-
return false;
|
749
|
-
}
|
750
|
-
if (!this.dateFilter) {
|
751
|
-
return true;
|
752
|
-
}
|
753
|
-
const firstOfMonth = this.dateAdapter.createDate(activeYear, month);
|
754
|
-
// If any date in the month is enabled count the month as enabled.
|
755
|
-
for (let date = firstOfMonth; this.dateAdapter.getMonth(date) === month; date = this.dateAdapter.addCalendarDays(date, 1)) {
|
756
|
-
if (this.dateFilter(date)) {
|
757
|
-
return true;
|
758
|
-
}
|
759
|
-
}
|
760
|
-
return false;
|
761
|
-
}
|
762
|
-
/**
|
763
|
-
* Tests whether the combination month/year is after this.maxDate, considering
|
764
|
-
* just the month and year of this.maxDate
|
765
|
-
*/
|
766
|
-
isYearAndMonthAfterMaxDate(year, month) {
|
767
|
-
if (this.maxDate) {
|
768
|
-
const maxYear = this.dateAdapter.getYear(this.maxDate);
|
769
|
-
const maxMonth = this.dateAdapter.getMonth(this.maxDate);
|
770
|
-
return year > maxYear || (year === maxYear && month > maxMonth);
|
771
|
-
}
|
772
|
-
return false;
|
773
|
-
}
|
774
|
-
/**
|
775
|
-
* Tests whether the combination month/year is before this.minDate, considering
|
776
|
-
* just the month and year of this.minDate
|
777
|
-
*/
|
778
|
-
isYearAndMonthBeforeMinDate(year, month) {
|
779
|
-
if (this.minDate) {
|
780
|
-
const minYear = this.dateAdapter.getYear(this.minDate);
|
781
|
-
const minMonth = this.dateAdapter.getMonth(this.minDate);
|
782
|
-
return year < minYear || (year === minYear && month < minMonth);
|
783
|
-
}
|
784
|
-
return false;
|
785
|
-
}
|
786
|
-
/**
|
787
|
-
* @param obj The object to check.
|
788
|
-
* @returns The given object if it is both a date instance and valid, otherwise null.
|
789
|
-
*/
|
790
|
-
getValidDateOrNull(obj) {
|
791
|
-
return (this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj)) ? obj : null;
|
792
|
-
}
|
793
|
-
/** Determines whether the user has the RTL layout direction. */
|
794
|
-
isRtl() {
|
795
|
-
return this.dir && this.dir.value === 'rtl';
|
796
|
-
}
|
797
|
-
}
|
798
|
-
/** @nocollapse */ McYearView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McYearView, deps: [{ token: i0.ChangeDetectorRef }, { token: MC_DATE_FORMATS, optional: true }, { token: i1$1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
799
|
-
/** @nocollapse */ McYearView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McYearView, selector: "mc-year-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter" }, outputs: { selectedChange: "selectedChange", monthSelected: "monthSelected", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "mcCalendarBody", first: true, predicate: McCalendarBody, descendants: true }], exportAs: ["mcYearView"], ngImport: i0, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"4\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [label]=\"yearLabel\"\n [rows]=\"months\"\n [todayValue]=\"todayMonth!\"\n [selectedValue]=\"selectedMonth!\"\n [labelMinRequiredCells]=\"2\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"dateAdapter.getMonth(activeDate)\"\n (selectedValueChange)=\"onMonthSelected($event)\"\n (keydown)=\"handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n", dependencies: [{ kind: "component", type: McCalendarBody, selector: "[mc-calendar-body]", inputs: ["label", "rows", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "activeCell", "cellAspectRatio"], outputs: ["selectedValueChange"], exportAs: ["mcCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
800
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McYearView, decorators: [{
|
801
|
-
type: Component,
|
802
|
-
args: [{ selector: 'mc-year-view', exportAs: 'mcYearView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"mc-calendar__table\">\n <thead class=\"mc-calendar__table-header\">\n <tr>\n <th class=\"mc-calendar__table-header-divider\" colspan=\"4\"></th>\n </tr>\n </thead>\n <tbody mc-calendar-body\n [label]=\"yearLabel\"\n [rows]=\"months\"\n [todayValue]=\"todayMonth!\"\n [selectedValue]=\"selectedMonth!\"\n [labelMinRequiredCells]=\"2\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"dateAdapter.getMonth(activeDate)\"\n (selectedValueChange)=\"onMonthSelected($event)\"\n (keydown)=\"handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n" }]
|
803
|
-
}], ctorParameters: function () {
|
804
|
-
return [{ type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
805
|
-
type: Optional
|
806
|
-
}, {
|
807
|
-
type: Inject,
|
808
|
-
args: [MC_DATE_FORMATS]
|
809
|
-
}] }, { type: i1$1.DateAdapter, decorators: [{
|
810
|
-
type: Optional
|
811
|
-
}] }, { type: i2.Directionality, decorators: [{
|
812
|
-
type: Optional
|
813
|
-
}] }];
|
814
|
-
}, propDecorators: { activeDate: [{
|
815
|
-
type: Input
|
816
|
-
}], selected: [{
|
817
|
-
type: Input
|
818
|
-
}], minDate: [{
|
819
|
-
type: Input
|
820
|
-
}], maxDate: [{
|
821
|
-
type: Input
|
822
|
-
}], dateFilter: [{
|
823
|
-
type: Input
|
824
|
-
}], selectedChange: [{
|
825
|
-
type: Output
|
826
|
-
}], monthSelected: [{
|
827
|
-
type: Output
|
828
|
-
}], activeDateChange: [{
|
829
|
-
type: Output
|
830
|
-
}], mcCalendarBody: [{
|
831
|
-
type: ViewChild,
|
832
|
-
args: [McCalendarBody, { static: false }]
|
833
|
-
}] } });
|
834
|
-
|
835
396
|
/** Datepicker data that requires internationalization. */
|
836
397
|
class McDatepickerIntl {
|
837
398
|
constructor() {
|
@@ -869,27 +430,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
869
430
|
args: [{ providedIn: 'root' }]
|
870
431
|
}] });
|
871
432
|
|
872
|
-
/**
|
873
|
-
* Possible views for the calendar.
|
874
|
-
* @docs-private
|
875
|
-
*/
|
876
|
-
var McCalendarView;
|
877
|
-
(function (McCalendarView) {
|
878
|
-
McCalendarView["Month"] = "month";
|
879
|
-
McCalendarView["Year"] = "year";
|
880
|
-
McCalendarView["MultiYear"] = "multi-year";
|
881
|
-
})(McCalendarView || (McCalendarView = {}));
|
882
433
|
/**
|
883
434
|
* A calendar that is used as part of the datepicker.
|
884
435
|
* @docs-private
|
885
436
|
*/
|
886
437
|
class McCalendar {
|
887
|
-
constructor(intl,
|
888
|
-
this.
|
438
|
+
constructor(intl, adapter, dateFormats, changeDetectorRef) {
|
439
|
+
this.adapter = adapter;
|
889
440
|
this.dateFormats = dateFormats;
|
890
441
|
this.changeDetectorRef = changeDetectorRef;
|
891
|
-
/** Whether the calendar should be started in month or year view. */
|
892
|
-
this.startView = McCalendarView.Month;
|
893
442
|
/** Emits when the currently selected date changes. */
|
894
443
|
this.selectedChange = new EventEmitter();
|
895
444
|
/**
|
@@ -908,13 +457,7 @@ class McCalendar {
|
|
908
457
|
* Emits whenever there is a state change that the header may need to respond to.
|
909
458
|
*/
|
910
459
|
this.stateChanges = new Subject();
|
911
|
-
|
912
|
-
* Used for scheduling that focus should be moved to the active cell on the next tick.
|
913
|
-
* We need to schedule it, rather than do it immediately, because we have to wait
|
914
|
-
* for Angular to re-evaluate the view children.
|
915
|
-
*/
|
916
|
-
this.moveFocusOnNextTick = false;
|
917
|
-
if (!this.dateAdapter) {
|
460
|
+
if (!this.adapter) {
|
918
461
|
throw createMissingDateImplError('DateAdapter');
|
919
462
|
}
|
920
463
|
if (!this.dateFormats) {
|
@@ -930,59 +473,46 @@ class McCalendar {
|
|
930
473
|
return this._startAt;
|
931
474
|
}
|
932
475
|
set startAt(value) {
|
933
|
-
|
476
|
+
const deserializedValue = this.getValidDateOrNull(this.adapter.deserialize(value));
|
477
|
+
this._startAt = deserializedValue !== null ?
|
478
|
+
this.adapter.clampDate(deserializedValue, this.minDate, this.maxDate) : null;
|
934
479
|
}
|
935
480
|
/** The currently selected date. */
|
936
481
|
get selected() {
|
937
482
|
return this._selected;
|
938
483
|
}
|
939
484
|
set selected(value) {
|
940
|
-
this._selected = this.
|
485
|
+
this._selected = this.adapter.deserialize(value);
|
941
486
|
}
|
942
487
|
/** The minimum selectable date. */
|
943
488
|
get minDate() {
|
944
489
|
return this._minDate;
|
945
490
|
}
|
946
491
|
set minDate(value) {
|
947
|
-
this._minDate = this.
|
492
|
+
this._minDate = this.adapter.deserialize(value);
|
493
|
+
this.startAt = this._startAt;
|
948
494
|
}
|
949
495
|
/** The maximum selectable date. */
|
950
496
|
get maxDate() {
|
951
497
|
return this._maxDate;
|
952
498
|
}
|
953
499
|
set maxDate(value) {
|
954
|
-
this._maxDate = this.
|
500
|
+
this._maxDate = this.adapter.deserialize(value);
|
501
|
+
this.startAt = this._startAt;
|
955
502
|
}
|
956
503
|
/**
|
957
504
|
* The current active date. This determines which time period is shown and which date is
|
958
505
|
* highlighted when using keyboard navigation.
|
959
506
|
*/
|
960
507
|
get activeDate() {
|
961
|
-
return this.
|
508
|
+
return this._activeDate;
|
962
509
|
}
|
963
510
|
set activeDate(value) {
|
964
|
-
this.
|
511
|
+
this._activeDate = this.adapter.clampDate(value, this.minDate, this.maxDate);
|
965
512
|
this.stateChanges.next();
|
966
513
|
}
|
967
|
-
/** Whether the calendar is in month view. */
|
968
|
-
get currentView() {
|
969
|
-
return this._currentView;
|
970
|
-
}
|
971
|
-
set currentView(value) {
|
972
|
-
this._currentView = value;
|
973
|
-
this.moveFocusOnNextTick = true;
|
974
|
-
}
|
975
514
|
ngAfterContentInit() {
|
976
|
-
this.
|
977
|
-
this.activeDate = this.startAt || this.dateAdapter.today();
|
978
|
-
// Assign to the private property since we don't want to move focus on init.
|
979
|
-
this._currentView = this.startView;
|
980
|
-
}
|
981
|
-
ngAfterViewChecked() {
|
982
|
-
if (this.moveFocusOnNextTick) {
|
983
|
-
this.moveFocusOnNextTick = false;
|
984
|
-
this.focusActiveCell();
|
985
|
-
}
|
515
|
+
this.activeDate = this.startAt || this.adapter.today();
|
986
516
|
}
|
987
517
|
ngOnDestroy() {
|
988
518
|
this.intlChanges.unsubscribe();
|
@@ -991,66 +521,44 @@ class McCalendar {
|
|
991
521
|
ngOnChanges(changes) {
|
992
522
|
const change = changes.minDate || changes.maxDate || changes.dateFilter;
|
993
523
|
if (change && !change.firstChange) {
|
994
|
-
|
995
|
-
if (view) {
|
524
|
+
if (this.monthView) {
|
996
525
|
// We need to `detectChanges` manually here, because the `minDate`, `maxDate` etc. are
|
997
526
|
// passed down to the view via data bindings which won't be up-to-date when we call `init`.
|
998
527
|
this.changeDetectorRef.detectChanges();
|
999
|
-
|
528
|
+
this.monthView.init();
|
1000
529
|
}
|
1001
530
|
}
|
1002
531
|
this.stateChanges.next();
|
1003
532
|
}
|
1004
|
-
focusActiveCell() {
|
1005
|
-
this.getCurrentViewComponent().focusActiveCell();
|
1006
|
-
}
|
1007
533
|
/** Updates today's date after an update of the active date */
|
1008
534
|
updateTodaysDate() {
|
1009
|
-
|
1010
|
-
(this.currentView === McCalendarView.Year ? this.yearView : this.multiYearView);
|
1011
|
-
view.ngAfterContentInit();
|
535
|
+
this.monthView.ngAfterContentInit();
|
1012
536
|
}
|
1013
537
|
/** Handles date selection in the month view. */
|
1014
538
|
dateSelected(date) {
|
1015
|
-
if (!this.
|
539
|
+
if (!this.adapter.sameDate(date, this.selected)) {
|
1016
540
|
this.selectedChange.emit(date);
|
1017
541
|
}
|
1018
542
|
}
|
1019
|
-
/** Handles year selection in the multiyear view. */
|
1020
|
-
yearSelectedInMultiYearView(normalizedYear) {
|
1021
|
-
this.yearSelected.emit(normalizedYear);
|
1022
|
-
}
|
1023
|
-
/** Handles month selection in the year view. */
|
1024
|
-
monthSelectedInYearView(normalizedMonth) {
|
1025
|
-
this.monthSelected.emit(normalizedMonth);
|
1026
|
-
}
|
1027
543
|
userSelected() {
|
1028
544
|
this.userSelection.emit();
|
1029
545
|
}
|
1030
|
-
/** Handles year/month selection in the multi-year/year views. */
|
1031
|
-
goToDateInView(date, view) {
|
1032
|
-
this.activeDate = date;
|
1033
|
-
this.currentView = view;
|
1034
|
-
}
|
1035
546
|
/**
|
1036
547
|
* @param obj The object to check.
|
1037
548
|
* @returns The given object if it is both a date instance and valid, otherwise null.
|
1038
549
|
*/
|
550
|
+
// todo выглядит как костыль от которого нужно избавиться
|
1039
551
|
getValidDateOrNull(obj) {
|
1040
|
-
return (this.
|
1041
|
-
}
|
1042
|
-
/** Returns the component instance that corresponds to the current calendar view. */
|
1043
|
-
getCurrentViewComponent() {
|
1044
|
-
return this.monthView || this.yearView || this.multiYearView;
|
552
|
+
return (this.adapter.isDateInstance(obj) && this.adapter.isValid(obj)) ? obj : null;
|
1045
553
|
}
|
1046
554
|
}
|
1047
555
|
/** @nocollapse */ McCalendar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendar, deps: [{ token: McDatepickerIntl }, { token: i1$1.DateAdapter, optional: true }, { token: MC_DATE_FORMATS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
1048
|
-
/** @nocollapse */ McCalendar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McCalendar, selector: "mc-calendar", inputs: { startAt: "startAt", selected: "selected", minDate: "minDate", maxDate: "maxDate",
|
556
|
+
/** @nocollapse */ McCalendar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McCalendar, selector: "mc-calendar", inputs: { startAt: "startAt", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass" }, outputs: { selectedChange: "selectedChange", yearSelected: "yearSelected", monthSelected: "monthSelected", userSelection: "userSelection" }, host: { classAttribute: "mc-calendar" }, viewQueries: [{ propertyName: "monthView", first: true, predicate: McMonthView, descendants: true }], exportAs: ["mcCalendar"], usesOnChanges: true, ngImport: i0, template: "<mc-calendar-header\n [(activeDate)]=\"activeDate\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (monthSelected)=\"monthSelected.emit(activeDate)\"\n (yearSelected)=\"yearSelected.emit(activeDate)\">\n</mc-calendar-header>\n\n<div class=\"mc-calendar__content\">\n <mc-month-view\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [dateClass]=\"dateClass\"\n (selectedChange)=\"dateSelected($event!)\"\n (userSelection)=\"userSelected()\">\n </mc-month-view>\n</div>\n", styles: [".mc-calendar{display:block}.mc-calendar__content{padding:0 8px 8px;padding:0 var(--mc-datepicker-calendar-size-padding-horizontal, 8px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px);outline:none}.mc-calendar__table{border-spacing:0;border-collapse:collapse;width:100%}.mc-calendar__table-header th{text-align:center;height:30px}.mc-calendar__table-header th.mc-calendar__table-header-divider{position:relative;height:10px;height:calc(var(--mc-datepicker-calendar-size-padding-blocks, 12px) - 2px)}.mc-calendar__table-header th.mc-calendar__table-header-divider:after{content:\"\";position:absolute;top:0;left:-8px;left:calc(-1 * var(--mc-datepicker-calendar-size-padding-horizontal, 8px));right:-8px;right:calc(-1 * var(--mc-datepicker-calendar-size-padding-horizontal, 8px));height:1px;height:var(--mc-datepicker-calendar-size-divider-width, 1px)}\n"], dependencies: [{ kind: "component", type: McMonthView, selector: "mc-month-view", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass"], outputs: ["selectedChange", "userSelection", "activeDateChange"], exportAs: ["mcMonthView"] }, { kind: "component", type: McCalendarHeader, selector: "mc-calendar-header", inputs: ["activeDate", "maxDate", "minDate"], outputs: ["activeDateChange", "monthSelected", "yearSelected"], exportAs: ["mcCalendarHeader"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
1049
557
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendar, decorators: [{
|
1050
558
|
type: Component,
|
1051
559
|
args: [{ selector: 'mc-calendar', exportAs: 'mcCalendar', host: {
|
1052
560
|
class: 'mc-calendar'
|
1053
|
-
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<
|
561
|
+
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mc-calendar-header\n [(activeDate)]=\"activeDate\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (monthSelected)=\"monthSelected.emit(activeDate)\"\n (yearSelected)=\"yearSelected.emit(activeDate)\">\n</mc-calendar-header>\n\n<div class=\"mc-calendar__content\">\n <mc-month-view\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [dateClass]=\"dateClass\"\n (selectedChange)=\"dateSelected($event!)\"\n (userSelection)=\"userSelected()\">\n </mc-month-view>\n</div>\n", styles: [".mc-calendar{display:block}.mc-calendar__content{padding:0 8px 8px;padding:0 var(--mc-datepicker-calendar-size-padding-horizontal, 8px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px) var(--mc-datepicker-calendar-size-padding-horizontal, 8px);outline:none}.mc-calendar__table{border-spacing:0;border-collapse:collapse;width:100%}.mc-calendar__table-header th{text-align:center;height:30px}.mc-calendar__table-header th.mc-calendar__table-header-divider{position:relative;height:10px;height:calc(var(--mc-datepicker-calendar-size-padding-blocks, 12px) - 2px)}.mc-calendar__table-header th.mc-calendar__table-header-divider:after{content:\"\";position:absolute;top:0;left:-8px;left:calc(-1 * var(--mc-datepicker-calendar-size-padding-horizontal, 8px));right:-8px;right:calc(-1 * var(--mc-datepicker-calendar-size-padding-horizontal, 8px));height:1px;height:var(--mc-datepicker-calendar-size-divider-width, 1px)}\n"] }]
|
1054
562
|
}], ctorParameters: function () {
|
1055
563
|
return [{ type: McDatepickerIntl }, { type: i1$1.DateAdapter, decorators: [{
|
1056
564
|
type: Optional
|
@@ -1068,10 +576,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
1068
576
|
type: Input
|
1069
577
|
}], maxDate: [{
|
1070
578
|
type: Input
|
1071
|
-
}], headerComponent: [{
|
1072
|
-
type: Input
|
1073
|
-
}], startView: [{
|
1074
|
-
type: Input
|
1075
579
|
}], dateFilter: [{
|
1076
580
|
type: Input
|
1077
581
|
}], dateClass: [{
|
@@ -1087,131 +591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
1087
591
|
}], monthView: [{
|
1088
592
|
type: ViewChild,
|
1089
593
|
args: [McMonthView, { static: false }]
|
1090
|
-
}], yearView: [{
|
1091
|
-
type: ViewChild,
|
1092
|
-
args: [McYearView, { static: false }]
|
1093
|
-
}], multiYearView: [{
|
1094
|
-
type: ViewChild,
|
1095
|
-
args: [McMultiYearView, { static: false }]
|
1096
594
|
}] } });
|
1097
|
-
/** Default header for McCalendar */
|
1098
|
-
class McCalendarHeader {
|
1099
|
-
constructor(intl, calendar, dateAdapter, dateFormats, changeDetectorRef) {
|
1100
|
-
this.intl = intl;
|
1101
|
-
this.calendar = calendar;
|
1102
|
-
this.dateAdapter = dateAdapter;
|
1103
|
-
this.dateFormats = dateFormats;
|
1104
|
-
this.calendar.stateChanges.subscribe(() => changeDetectorRef.markForCheck());
|
1105
|
-
}
|
1106
|
-
/** The label for the current calendar view. */
|
1107
|
-
get periodButtonText() {
|
1108
|
-
if (this.calendar.currentView === McCalendarView.Month) {
|
1109
|
-
const label = this.dateAdapter.format(this.calendar.activeDate, this.dateFormats.monthYearLabel);
|
1110
|
-
return (label[0].toLocaleUpperCase() + label.substr(1)).replace('.', '');
|
1111
|
-
}
|
1112
|
-
if (this.calendar.currentView === McCalendarView.Year) {
|
1113
|
-
return this.dateAdapter.getYearName(this.calendar.activeDate);
|
1114
|
-
}
|
1115
|
-
const activeYear = this.dateAdapter.getYear(this.calendar.activeDate);
|
1116
|
-
const firstYearInView = this.dateAdapter.getYearName(
|
1117
|
-
// tslint:disable-next-line:no-magic-numbers
|
1118
|
-
this.dateAdapter.createDate(activeYear - activeYear % 24));
|
1119
|
-
const lastYearInView = this.dateAdapter.getYearName(
|
1120
|
-
// tslint:disable-next-line:no-magic-numbers
|
1121
|
-
this.dateAdapter.createDate(activeYear + yearsPerPage - 1 - activeYear % 24));
|
1122
|
-
return `${firstYearInView} \u2013 ${lastYearInView}`;
|
1123
|
-
}
|
1124
|
-
get periodButtonLabel() {
|
1125
|
-
return this.calendar.currentView === McCalendarView.Month ?
|
1126
|
-
this.intl.switchToMultiYearViewLabel : this.intl.switchToMonthViewLabel;
|
1127
|
-
}
|
1128
|
-
/** The label for the previous button. */
|
1129
|
-
get prevButtonLabel() {
|
1130
|
-
return {
|
1131
|
-
[McCalendarView.Month]: this.intl.prevMonthLabel,
|
1132
|
-
[McCalendarView.Year]: this.intl.prevYearLabel,
|
1133
|
-
[McCalendarView.MultiYear]: this.intl.prevMultiYearLabel
|
1134
|
-
}[this.calendar.currentView];
|
1135
|
-
}
|
1136
|
-
/** The label for the next button. */
|
1137
|
-
get nextButtonLabel() {
|
1138
|
-
return {
|
1139
|
-
[McCalendarView.Month]: this.intl.nextMonthLabel,
|
1140
|
-
[McCalendarView.Year]: this.intl.nextYearLabel,
|
1141
|
-
[McCalendarView.MultiYear]: this.intl.nextMultiYearLabel
|
1142
|
-
}[this.calendar.currentView];
|
1143
|
-
}
|
1144
|
-
/** Handles user clicks on the period label. */
|
1145
|
-
currentPeriodClicked() {
|
1146
|
-
if ([McCalendarView.Month, McCalendarView.MultiYear].includes(this.calendar.currentView)) {
|
1147
|
-
this.calendar.currentView = McCalendarView.Year;
|
1148
|
-
}
|
1149
|
-
else if (this.calendar.currentView === McCalendarView.Year) {
|
1150
|
-
this.calendar.currentView = McCalendarView.Month;
|
1151
|
-
}
|
1152
|
-
}
|
1153
|
-
/** Handles user clicks on the previous button. */
|
1154
|
-
previousClicked() {
|
1155
|
-
if (this.calendar.currentView === McCalendarView.Month) {
|
1156
|
-
this.calendar.activeDate = this.dateAdapter.addCalendarMonths(this.calendar.activeDate, -1);
|
1157
|
-
}
|
1158
|
-
else {
|
1159
|
-
this.calendar.activeDate = this.dateAdapter.addCalendarYears(this.calendar.activeDate, this.calendar.currentView === McCalendarView.Year ? -1 : -yearsPerPage);
|
1160
|
-
}
|
1161
|
-
}
|
1162
|
-
/** Handles user clicks on the next button. */
|
1163
|
-
nextClicked() {
|
1164
|
-
if (this.calendar.currentView === McCalendarView.Month) {
|
1165
|
-
this.calendar.activeDate = this.dateAdapter.addCalendarMonths(this.calendar.activeDate, 1);
|
1166
|
-
}
|
1167
|
-
else {
|
1168
|
-
this.calendar.activeDate = this.dateAdapter.addCalendarYears(this.calendar.activeDate, this.calendar.currentView === McCalendarView.Year ? 1 : yearsPerPage);
|
1169
|
-
}
|
1170
|
-
}
|
1171
|
-
/** Whether the previous period button is enabled. */
|
1172
|
-
previousEnabled() {
|
1173
|
-
if (!this.calendar.minDate) {
|
1174
|
-
return true;
|
1175
|
-
}
|
1176
|
-
return !this.calendar.minDate || !this.isSameView(this.calendar.activeDate, this.calendar.minDate);
|
1177
|
-
}
|
1178
|
-
/** Whether the next period button is enabled. */
|
1179
|
-
nextEnabled() {
|
1180
|
-
return !this.calendar.maxDate || !this.isSameView(this.calendar.activeDate, this.calendar.maxDate);
|
1181
|
-
}
|
1182
|
-
/** Whether the two dates represent the same view in the current view mode (month or year). */
|
1183
|
-
isSameView(firstDate, secondDate) {
|
1184
|
-
const firstYear = this.dateAdapter.getYear(firstDate);
|
1185
|
-
const secondYear = this.dateAdapter.getYear(secondDate);
|
1186
|
-
const firstMonth = this.dateAdapter.getMonth(firstDate);
|
1187
|
-
const secondMonth = this.dateAdapter.getMonth(secondDate);
|
1188
|
-
if (this.calendar.currentView === McCalendarView.Month) {
|
1189
|
-
return firstYear === secondYear && firstMonth === secondMonth;
|
1190
|
-
}
|
1191
|
-
if (this.calendar.currentView === McCalendarView.Year) {
|
1192
|
-
return firstYear === secondYear;
|
1193
|
-
}
|
1194
|
-
// Otherwise we are in 'multi-year' view.
|
1195
|
-
return Math.floor(firstYear / yearsPerPage) === Math.floor(secondYear / yearsPerPage);
|
1196
|
-
}
|
1197
|
-
}
|
1198
|
-
/** @nocollapse */ McCalendarHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarHeader, deps: [{ token: McDatepickerIntl }, { token: McCalendar }, { token: i1$1.DateAdapter, optional: true }, { token: MC_DATE_FORMATS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
1199
|
-
/** @nocollapse */ McCalendarHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McCalendarHeader, selector: "mc-calendar-header", host: { classAttribute: "mc-calendar-header" }, exportAs: ["mcCalendarHeader"], ngImport: i0, template: "<button mc-button\n [tabindex]=\"'-1'\"\n class=\"mc-button_transparent mc-calendar__period-button\"\n (click)=\"currentPeriodClicked()\">\n {{ periodButtonText }}\n\n <i class=\"mc mc-icon\"\n [class.mc-angle-up-M_16]=\"calendar.currentView !== 'month'\"\n [class.mc-angle-down-M_16]=\"calendar.currentView === 'month'\">\n </i>\n</button>\n\n<div class=\"mc-calendar-spacer\"></div>\n\n<button mc-button\n [tabindex]=\"'-1'\"\n class=\"mc-button_transparent mc-calendar__previous-button\"\n [disabled]=\"!previousEnabled()\"\n (click)=\"previousClicked()\">\n\n <i mc-icon=\"mc-angle-left-L_16\"></i>\n</button>\n\n<button mc-button\n [tabindex]=\"'-1'\"\n class=\"mc-button_transparent mc-calendar__next-button\"\n [disabled]=\"!nextEnabled()\"\n (click)=\"nextClicked()\">\n\n <i mc-icon=\"mc-angle-right-L_16\"></i>\n</button>\n", dependencies: [{ kind: "component", type: i8.McButton, selector: "[mc-button]", inputs: ["color", "tabIndex", "disabled"] }, { kind: "directive", type: i8.McButtonCssStyler, selector: "[mc-button]" }, { kind: "component", type: i9.McIcon, selector: "[mc-icon]", inputs: ["color"] }, { kind: "directive", type: i9.McIconCSSStyler, selector: "[mc-icon]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
1200
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McCalendarHeader, decorators: [{
|
1201
|
-
type: Component,
|
1202
|
-
args: [{ selector: 'mc-calendar-header', exportAs: 'mcCalendarHeader', host: {
|
1203
|
-
class: 'mc-calendar-header'
|
1204
|
-
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button mc-button\n [tabindex]=\"'-1'\"\n class=\"mc-button_transparent mc-calendar__period-button\"\n (click)=\"currentPeriodClicked()\">\n {{ periodButtonText }}\n\n <i class=\"mc mc-icon\"\n [class.mc-angle-up-M_16]=\"calendar.currentView !== 'month'\"\n [class.mc-angle-down-M_16]=\"calendar.currentView === 'month'\">\n </i>\n</button>\n\n<div class=\"mc-calendar-spacer\"></div>\n\n<button mc-button\n [tabindex]=\"'-1'\"\n class=\"mc-button_transparent mc-calendar__previous-button\"\n [disabled]=\"!previousEnabled()\"\n (click)=\"previousClicked()\">\n\n <i mc-icon=\"mc-angle-left-L_16\"></i>\n</button>\n\n<button mc-button\n [tabindex]=\"'-1'\"\n class=\"mc-button_transparent mc-calendar__next-button\"\n [disabled]=\"!nextEnabled()\"\n (click)=\"nextClicked()\">\n\n <i mc-icon=\"mc-angle-right-L_16\"></i>\n</button>\n" }]
|
1205
|
-
}], ctorParameters: function () {
|
1206
|
-
return [{ type: McDatepickerIntl }, { type: McCalendar }, { type: i1$1.DateAdapter, decorators: [{
|
1207
|
-
type: Optional
|
1208
|
-
}] }, { type: undefined, decorators: [{
|
1209
|
-
type: Optional
|
1210
|
-
}, {
|
1211
|
-
type: Inject,
|
1212
|
-
args: [MC_DATE_FORMATS]
|
1213
|
-
}] }, { type: i0.ChangeDetectorRef }];
|
1214
|
-
} });
|
1215
595
|
|
1216
596
|
// tslint:disable:no-empty, deprecation
|
1217
597
|
// tslint:disable:naming-convention
|
@@ -1326,10 +706,10 @@ class McDatepickerInputEvent {
|
|
1326
706
|
let uniqueComponentIdSuffix = 0;
|
1327
707
|
/** Directive used to connect an input to a McDatepicker. */
|
1328
708
|
class McDatepickerInput {
|
1329
|
-
constructor(elementRef, renderer,
|
709
|
+
constructor(elementRef, renderer, adapter, dateFormats) {
|
1330
710
|
this.elementRef = elementRef;
|
1331
711
|
this.renderer = renderer;
|
1332
|
-
this.
|
712
|
+
this.adapter = adapter;
|
1333
713
|
this.dateFormats = dateFormats;
|
1334
714
|
this.stateChanges = new Subject();
|
1335
715
|
this.controlType = 'datepicker';
|
@@ -1349,6 +729,9 @@ class McDatepickerInput {
|
|
1349
729
|
this.localeSubscription = Subscription.EMPTY;
|
1350
730
|
/** Whether the last value set on the input was valid. */
|
1351
731
|
this.lastValueValid = false;
|
732
|
+
this.firstDigit = null;
|
733
|
+
this.secondDigit = null;
|
734
|
+
this.thirdDigit = null;
|
1352
735
|
// tslint:disable-next-line:no-empty
|
1353
736
|
this.onTouched = () => { };
|
1354
737
|
this.onInput = () => {
|
@@ -1371,7 +754,7 @@ class McDatepickerInput {
|
|
1371
754
|
this.updateValue(newTimeObj);
|
1372
755
|
};
|
1373
756
|
this.parseOnBlur = () => {
|
1374
|
-
if (!this.viewValue) {
|
757
|
+
if (!this.viewValue || !this.readyForParse) {
|
1375
758
|
return null;
|
1376
759
|
}
|
1377
760
|
const date = this.getDefaultValue();
|
@@ -1428,21 +811,21 @@ class McDatepickerInput {
|
|
1428
811
|
};
|
1429
812
|
/** The form control validator for the min date. */
|
1430
813
|
this.minValidator = (control) => {
|
1431
|
-
const controlValue = this.
|
1432
|
-
return !this.min || !controlValue || this.
|
814
|
+
const controlValue = this.adapter.deserialize(control.value);
|
815
|
+
return !this.min || !controlValue || this.adapter.compareDateTime(this.min, controlValue) <= 0 ?
|
1433
816
|
null :
|
1434
817
|
{ mcDatepickerMin: { min: this.min, actual: controlValue } };
|
1435
818
|
};
|
1436
819
|
/** The form control validator for the max date. */
|
1437
820
|
this.maxValidator = (control) => {
|
1438
|
-
const controlValue = this.
|
1439
|
-
return !this.max || !controlValue || this.
|
821
|
+
const controlValue = this.adapter.deserialize(control.value);
|
822
|
+
return !this.max || !controlValue || this.adapter.compareDateTime(this.max, controlValue) >= 0 ?
|
1440
823
|
null :
|
1441
824
|
{ mcDatepickerMax: { max: this.max, actual: controlValue } };
|
1442
825
|
};
|
1443
826
|
/** The form control validator for the date filter. */
|
1444
827
|
this.filterValidator = (control) => {
|
1445
|
-
const controlValue = this.
|
828
|
+
const controlValue = this.adapter.deserialize(control.value);
|
1446
829
|
return !this.dateFilter || !controlValue || this.dateFilter(controlValue) ?
|
1447
830
|
null : { mcDatepickerFilter: true };
|
1448
831
|
};
|
@@ -1452,14 +835,14 @@ class McDatepickerInput {
|
|
1452
835
|
this.maxValidator,
|
1453
836
|
this.filterValidator
|
1454
837
|
]);
|
1455
|
-
if (!this.
|
838
|
+
if (!this.adapter) {
|
1456
839
|
throw createMissingDateImplError('DateAdapter');
|
1457
840
|
}
|
1458
841
|
if (!this.dateFormats) {
|
1459
842
|
throw createMissingDateImplError('MC_DATE_FORMATS');
|
1460
843
|
}
|
1461
844
|
this.setFormat(dateFormats.dateInput);
|
1462
|
-
this.localeSubscription =
|
845
|
+
this.localeSubscription = adapter.localeChanges
|
1463
846
|
.subscribe(this.updateLocaleParams);
|
1464
847
|
}
|
1465
848
|
get required() {
|
@@ -1495,13 +878,13 @@ class McDatepickerInput {
|
|
1495
878
|
return this._value;
|
1496
879
|
}
|
1497
880
|
set value(value) {
|
1498
|
-
let newValue = this.
|
1499
|
-
this.lastValueValid = !newValue || this.
|
881
|
+
let newValue = this.adapter.deserialize(value);
|
882
|
+
this.lastValueValid = !newValue || this.adapter.isValid(newValue);
|
1500
883
|
newValue = this.getValidDateOrNull(newValue);
|
1501
884
|
const oldDate = this.value;
|
1502
885
|
this._value = newValue;
|
1503
886
|
this.formatValue(newValue);
|
1504
|
-
if (!this.
|
887
|
+
if (!this.adapter.sameDate(oldDate, newValue)) {
|
1505
888
|
this.valueChange.emit(newValue);
|
1506
889
|
}
|
1507
890
|
}
|
@@ -1510,7 +893,7 @@ class McDatepickerInput {
|
|
1510
893
|
return this._min;
|
1511
894
|
}
|
1512
895
|
set min(value) {
|
1513
|
-
this._min = this.
|
896
|
+
this._min = this.adapter.deserialize(value);
|
1514
897
|
this.validatorOnChange();
|
1515
898
|
}
|
1516
899
|
/** The maximum valid date. */
|
@@ -1518,7 +901,7 @@ class McDatepickerInput {
|
|
1518
901
|
return this._max;
|
1519
902
|
}
|
1520
903
|
set max(value) {
|
1521
|
-
this._max = this.
|
904
|
+
this._max = this.adapter.deserialize(value);
|
1522
905
|
this.validatorOnChange();
|
1523
906
|
}
|
1524
907
|
/** Whether the datepicker-input is disabled. */
|
@@ -1573,6 +956,9 @@ class McDatepickerInput {
|
|
1573
956
|
get isReadOnly() {
|
1574
957
|
return this.elementRef.nativeElement.readOnly;
|
1575
958
|
}
|
959
|
+
get readyForParse() {
|
960
|
+
return !!(this.firstDigit && this.secondDigit && this.thirdDigit);
|
961
|
+
}
|
1576
962
|
get selectionStart() {
|
1577
963
|
return this.elementRef.nativeElement.selectionStart;
|
1578
964
|
}
|
@@ -1716,20 +1102,20 @@ class McDatepickerInput {
|
|
1716
1102
|
this.updateValue(newTimeObj);
|
1717
1103
|
}
|
1718
1104
|
toISO8601(value) {
|
1719
|
-
return this.
|
1105
|
+
return this.adapter.toIso8601(value);
|
1720
1106
|
}
|
1721
1107
|
saveTimePart(selected) {
|
1722
1108
|
if (!this.value) {
|
1723
1109
|
return selected;
|
1724
1110
|
}
|
1725
|
-
const years = this.
|
1726
|
-
const month = this.
|
1727
|
-
const day = this.
|
1728
|
-
const hours = this.
|
1729
|
-
const minutes = this.
|
1730
|
-
const seconds = this.
|
1731
|
-
const milliseconds = this.
|
1732
|
-
return this.
|
1111
|
+
const years = this.adapter.getYear(selected);
|
1112
|
+
const month = this.adapter.getMonth(selected);
|
1113
|
+
const day = this.adapter.getDate(selected);
|
1114
|
+
const hours = this.adapter.getHours(this.value);
|
1115
|
+
const minutes = this.adapter.getMinutes(this.value);
|
1116
|
+
const seconds = this.adapter.getSeconds(this.value);
|
1117
|
+
const milliseconds = this.adapter.getMilliseconds(this.value);
|
1118
|
+
return this.adapter.createDateTime(years, month, day, hours, minutes, seconds, milliseconds);
|
1733
1119
|
}
|
1734
1120
|
setFormat(format) {
|
1735
1121
|
// @ts-ignore
|
@@ -1741,7 +1127,7 @@ class McDatepickerInput {
|
|
1741
1127
|
}
|
1742
1128
|
updateValue(newValue) {
|
1743
1129
|
var _a;
|
1744
|
-
if (!this.
|
1130
|
+
if (!this.adapter.sameDate(newValue, this.value)) {
|
1745
1131
|
this._value = newValue;
|
1746
1132
|
this.cvaOnChange(newValue);
|
1747
1133
|
this.valueChange.emit(newValue);
|
@@ -1809,7 +1195,9 @@ class McDatepickerInput {
|
|
1809
1195
|
return null;
|
1810
1196
|
}
|
1811
1197
|
date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
|
1812
|
-
|
1198
|
+
if (this.firstDigit.isDay) {
|
1199
|
+
date.month = 1;
|
1200
|
+
}
|
1813
1201
|
// tslint:disable-next-line:no-magic-numbers
|
1814
1202
|
}
|
1815
1203
|
else if (viewDigits.length === 2) {
|
@@ -1836,22 +1224,22 @@ class McDatepickerInput {
|
|
1836
1224
|
return this.createDateTime(date);
|
1837
1225
|
}
|
1838
1226
|
getDefaultValue() {
|
1839
|
-
const defaultValue = this.value || this.
|
1227
|
+
const defaultValue = this.value || this.adapter.today();
|
1840
1228
|
return {
|
1841
|
-
year: this.
|
1842
|
-
month: this.
|
1843
|
-
date: this.
|
1844
|
-
hours: this.
|
1845
|
-
minutes: this.
|
1846
|
-
seconds: this.
|
1847
|
-
milliseconds: this.
|
1229
|
+
year: this.adapter.getYear(defaultValue),
|
1230
|
+
month: this.adapter.getMonth(defaultValue),
|
1231
|
+
date: this.adapter.getDate(defaultValue),
|
1232
|
+
hours: this.adapter.getHours(defaultValue),
|
1233
|
+
minutes: this.adapter.getMinutes(defaultValue),
|
1234
|
+
seconds: this.adapter.getSeconds(defaultValue),
|
1235
|
+
milliseconds: this.adapter.getMilliseconds(defaultValue)
|
1848
1236
|
};
|
1849
1237
|
}
|
1850
1238
|
getTimeStringFromDate(value, timeFormat) {
|
1851
|
-
if (!value || !this.
|
1239
|
+
if (!value || !this.adapter.isValid(value)) {
|
1852
1240
|
return '';
|
1853
1241
|
}
|
1854
|
-
return this.
|
1242
|
+
return this.adapter.format(value, timeFormat);
|
1855
1243
|
}
|
1856
1244
|
getDateEditMetrics(cursorPosition) {
|
1857
1245
|
for (const digit of [this.firstDigit, this.secondDigit, this.thirdDigit]) {
|
@@ -1862,13 +1250,13 @@ class McDatepickerInput {
|
|
1862
1250
|
return [this.thirdDigit.value, this.thirdDigit.start, this.thirdDigit.end];
|
1863
1251
|
}
|
1864
1252
|
incrementDate(dateVal, whatToIncrement) {
|
1865
|
-
let year = this.
|
1866
|
-
let month = this.
|
1867
|
-
let day = this.
|
1253
|
+
let year = this.adapter.getYear(dateVal);
|
1254
|
+
let month = this.adapter.getMonth(dateVal);
|
1255
|
+
let day = this.adapter.getDate(dateVal);
|
1868
1256
|
switch (whatToIncrement) {
|
1869
1257
|
case DateParts.day:
|
1870
1258
|
day++;
|
1871
|
-
if (day > this.
|
1259
|
+
if (day > this.adapter.getNumDaysInMonth(dateVal)) {
|
1872
1260
|
day = 1;
|
1873
1261
|
}
|
1874
1262
|
break;
|
@@ -1894,17 +1282,17 @@ class McDatepickerInput {
|
|
1894
1282
|
return this.createDate(year, month, day);
|
1895
1283
|
}
|
1896
1284
|
getLastDayFor(year, month) {
|
1897
|
-
return this.
|
1285
|
+
return this.adapter.getNumDaysInMonth(this.createDate(year, month, 1));
|
1898
1286
|
}
|
1899
1287
|
decrementDate(dateVal, whatToDecrement) {
|
1900
|
-
let year = this.
|
1901
|
-
let month = this.
|
1902
|
-
let day = this.
|
1288
|
+
let year = this.adapter.getYear(dateVal);
|
1289
|
+
let month = this.adapter.getMonth(dateVal);
|
1290
|
+
let day = this.adapter.getDate(dateVal);
|
1903
1291
|
switch (whatToDecrement) {
|
1904
1292
|
case DateParts.day:
|
1905
1293
|
day--;
|
1906
1294
|
if (day < 1) {
|
1907
|
-
day = this.
|
1295
|
+
day = this.adapter.getNumDaysInMonth(dateVal);
|
1908
1296
|
}
|
1909
1297
|
break;
|
1910
1298
|
case DateParts.month:
|
@@ -1999,16 +1387,9 @@ class McDatepickerInput {
|
|
1999
1387
|
}
|
2000
1388
|
/** Formats a value and sets it on the input element. */
|
2001
1389
|
formatValue(value) {
|
2002
|
-
const formattedValue = value ? this.
|
1390
|
+
const formattedValue = value ? this.adapter.format(value, this.dateFormats.dateInput) : '';
|
2003
1391
|
this.setViewValue(formattedValue);
|
2004
1392
|
}
|
2005
|
-
/**
|
2006
|
-
* @param obj The object to check.
|
2007
|
-
* @returns The given object if it is both a date instance and valid, otherwise null.
|
2008
|
-
*/
|
2009
|
-
getValidDateOrNull(obj) {
|
2010
|
-
return (this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj)) ? obj : null;
|
2011
|
-
}
|
2012
1393
|
setControl(control) {
|
2013
1394
|
if (this.control) {
|
2014
1395
|
return;
|
@@ -2017,7 +1398,15 @@ class McDatepickerInput {
|
|
2017
1398
|
this.control.valueChanges
|
2018
1399
|
.subscribe((value) => this._value = value);
|
2019
1400
|
}
|
1401
|
+
/**
|
1402
|
+
* @param obj The object to check.
|
1403
|
+
* @returns The given object if it is both a date instance and valid, otherwise null.
|
1404
|
+
*/
|
1405
|
+
getValidDateOrNull(obj) {
|
1406
|
+
return (this.adapter.isDateInstance(obj) && this.adapter.isValid(obj)) ? obj : null;
|
1407
|
+
}
|
2020
1408
|
getDigitPositions(format) {
|
1409
|
+
this.firstDigit = this.secondDigit = this.thirdDigit = null;
|
2021
1410
|
const formatInLowerCase = format.toLowerCase();
|
2022
1411
|
formatInLowerCase
|
2023
1412
|
.split('')
|
@@ -2046,13 +1435,13 @@ class McDatepickerInput {
|
|
2046
1435
|
}
|
2047
1436
|
}
|
2048
1437
|
createDate(year, month, day) {
|
2049
|
-
return this.
|
1438
|
+
return this.adapter.createDateTime(year, month, day, this.adapter.getHours(this.value), this.adapter.getMinutes(this.value), this.adapter.getSeconds(this.value), this.adapter.getMilliseconds(this.value));
|
2050
1439
|
}
|
2051
1440
|
createDateTime(value) {
|
2052
1441
|
if (Object.values(value).some(isNaN)) {
|
2053
1442
|
return null;
|
2054
1443
|
}
|
2055
|
-
return this.
|
1444
|
+
return this.adapter.createDateTime(value.year, value.month - 1, value.date, value.hours, value.minutes, value.seconds, value.milliseconds);
|
2056
1445
|
}
|
2057
1446
|
correctCursorPosition() {
|
2058
1447
|
if (this.selectionStart && this.separatorPositions.includes(this.selectionStart)) {
|
@@ -2181,7 +1570,7 @@ class McDatepickerToggle {
|
|
2181
1570
|
}
|
2182
1571
|
}
|
2183
1572
|
/** @nocollapse */ McDatepickerToggle.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepickerToggle, deps: [{ token: McDatepickerIntl }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
2184
|
-
/** @nocollapse */ McDatepickerToggle.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McDatepickerToggle, selector: "mc-datepicker-toggle", inputs: { disabled: "disabled", datepicker: ["for", "datepicker"], tabIndex: "tabIndex" }, host: { properties: { "class.mc-active": "datepicker && datepicker.opened" }, classAttribute: "mc-datepicker-toggle" }, queries: [{ propertyName: "customIcon", first: true, predicate: McDatepickerToggleIcon, descendants: true }], viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true }], exportAs: ["mcDatepickerToggle"], usesOnChanges: true, ngImport: i0, template: "<!--todo need simplify this-->\n<button\n #button\n mc-button\n type=\"button\"\n class=\"mc-datepicker-toggle__button\"\n aria-haspopup=\"true\"\n [attr.aria-label]=\"intl.openCalendarLabel\"\n [tabIndex]=\"tabIndex\"\n [disabled]=\"disabled\"\n (click)=\"open($event)\">\n\n <i *ngIf=\"!customIcon\" mc-icon=\"mc-calendar_16\" class=\"mc-datepicker-toggle__default-icon\"></i>\n\n <ng-content select=\"[mcDatepickerToggleIcon]\"></ng-content>\n</button>\n", styles: [".mc-datepicker-toggle:focus{outline:0}.mc-datepicker-toggle__button.mc-icon-button{width:30px;width:var(--mc-datepicker-toggle-size-width, 30px);height:30px;height:var(--mc-datepicker-toggle-size-height, 30px);margin-left:2px}.mc-form-field-appearance-legacy .mc-form-field-prefix .mc-datepicker-toggle__default-icon,.mc-form-field-appearance-legacy .mc-form-field-suffix .mc-datepicker-toggle__default-icon{width:1em}.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-prefix .mc-datepicker-toggle__default-icon,.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-suffix .mc-datepicker-toggle__default-icon{display:block;width:1.5em;height:1.5em}.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-prefix .mc-icon-button .mc-datepicker-toggle__default-icon,.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-suffix .mc-icon-button .mc-datepicker-toggle__default-icon{margin:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type:
|
1573
|
+
/** @nocollapse */ McDatepickerToggle.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McDatepickerToggle, selector: "mc-datepicker-toggle", inputs: { disabled: "disabled", datepicker: ["for", "datepicker"], tabIndex: "tabIndex" }, host: { properties: { "class.mc-active": "datepicker && datepicker.opened" }, classAttribute: "mc-datepicker-toggle" }, queries: [{ propertyName: "customIcon", first: true, predicate: McDatepickerToggleIcon, descendants: true }], viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true }], exportAs: ["mcDatepickerToggle"], usesOnChanges: true, ngImport: i0, template: "<!--todo need simplify this-->\n<button\n #button\n mc-button\n type=\"button\"\n class=\"mc-datepicker-toggle__button\"\n aria-haspopup=\"true\"\n [attr.aria-label]=\"intl.openCalendarLabel\"\n [tabIndex]=\"tabIndex\"\n [disabled]=\"disabled\"\n (click)=\"open($event)\">\n\n <i *ngIf=\"!customIcon\" mc-icon=\"mc-calendar_16\" class=\"mc-datepicker-toggle__default-icon\"></i>\n\n <ng-content select=\"[mcDatepickerToggleIcon]\"></ng-content>\n</button>\n", styles: [".mc-datepicker-toggle:focus{outline:0}.mc-datepicker-toggle__button.mc-icon-button{width:30px;width:var(--mc-datepicker-toggle-size-width, 30px);height:30px;height:var(--mc-datepicker-toggle-size-height, 30px);margin-left:2px}.mc-form-field-appearance-legacy .mc-form-field-prefix .mc-datepicker-toggle__default-icon,.mc-form-field-appearance-legacy .mc-form-field-suffix .mc-datepicker-toggle__default-icon{width:1em}.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-prefix .mc-datepicker-toggle__default-icon,.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-suffix .mc-datepicker-toggle__default-icon{display:block;width:1.5em;height:1.5em}.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-prefix .mc-icon-button .mc-datepicker-toggle__default-icon,.mc-form-field:not(.mc-form-field-appearance-legacy) .mc-form-field-suffix .mc-icon-button .mc-datepicker-toggle__default-icon{margin:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.McButton, selector: "[mc-button]", inputs: ["color", "tabIndex", "disabled"] }, { kind: "directive", type: i3.McButtonCssStyler, selector: "[mc-button]" }, { kind: "component", type: i7.McIcon, selector: "[mc-icon]", inputs: ["color"] }, { kind: "directive", type: i7.McIconCSSStyler, selector: "[mc-icon]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
2185
1574
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepickerToggle, decorators: [{
|
2186
1575
|
type: Component,
|
2187
1576
|
args: [{ selector: 'mc-datepicker-toggle', host: {
|
@@ -2278,7 +1667,7 @@ class McDatepickerContent {
|
|
2278
1667
|
}
|
2279
1668
|
}
|
2280
1669
|
/** @nocollapse */ McDatepickerContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepickerContent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
2281
|
-
/** @nocollapse */ McDatepickerContent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McDatepickerContent, selector: "mc-datepicker__content", host: { listeners: { "@transformPanel.done": "animationDone.next()" }, properties: { "@transformPanel": "animationState" }, classAttribute: "mc-datepicker__content" }, viewQueries: [{ propertyName: "calendar", first: true, predicate: McCalendar, descendants: true }], exportAs: ["mcDatepickerContent"], ngImport: i0, template: "<mc-calendar [id]=\"datepicker.id\"\n [ngClass]=\"datepicker.panelClass\"\n [
|
1670
|
+
/** @nocollapse */ McDatepickerContent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McDatepickerContent, selector: "mc-datepicker__content", host: { listeners: { "@transformPanel.done": "animationDone.next()" }, properties: { "@transformPanel": "animationState" }, classAttribute: "mc-datepicker__content" }, viewQueries: [{ propertyName: "calendar", first: true, predicate: McCalendar, descendants: true }], exportAs: ["mcDatepickerContent"], ngImport: i0, template: "<mc-calendar [id]=\"datepicker.id\"\n [@fadeInCalendar]=\"'enter'\"\n [ngClass]=\"datepicker.panelClass\"\n [dateClass]=\"datepicker.dateClass\"\n\n [startAt]=\"datepicker.startAt\"\n [minDate]=\"datepicker.minDate\"\n [maxDate]=\"datepicker.maxDate\"\n [dateFilter]=\"datepicker.dateFilter\"\n\n [selected]=\"datepicker.selected\"\n\n (selectedChange)=\"datepicker.select($event)\"\n (yearSelected)=\"datepicker.selectYear($event)\"\n (monthSelected)=\"datepicker.selectMonth($event)\"\n (userSelection)=\"datepicker.close()\">\n</mc-calendar>\n", styles: [".mc-datepicker__content{display:block;border-width:1px;border-style:solid;border-radius:0;border-radius:var(--mc-datepicker-calendar-size-border-radius, 0)}.mc-datepicker__content .mc-calendar{width:296px;height:348px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: McCalendar, selector: "mc-calendar", inputs: ["startAt", "selected", "minDate", "maxDate", "dateFilter", "dateClass"], outputs: ["selectedChange", "yearSelected", "monthSelected", "userSelection"], exportAs: ["mcCalendar"] }], animations: [
|
2282
1671
|
mcDatepickerAnimations.transformPanel,
|
2283
1672
|
mcDatepickerAnimations.fadeInCalendar
|
2284
1673
|
], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
@@ -2291,7 +1680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2291
1680
|
}, animations: [
|
2292
1681
|
mcDatepickerAnimations.transformPanel,
|
2293
1682
|
mcDatepickerAnimations.fadeInCalendar
|
2294
|
-
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mc-calendar [id]=\"datepicker.id\"\n [ngClass]=\"datepicker.panelClass\"\n [
|
1683
|
+
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mc-calendar [id]=\"datepicker.id\"\n [@fadeInCalendar]=\"'enter'\"\n [ngClass]=\"datepicker.panelClass\"\n [dateClass]=\"datepicker.dateClass\"\n\n [startAt]=\"datepicker.startAt\"\n [minDate]=\"datepicker.minDate\"\n [maxDate]=\"datepicker.maxDate\"\n [dateFilter]=\"datepicker.dateFilter\"\n\n [selected]=\"datepicker.selected\"\n\n (selectedChange)=\"datepicker.select($event)\"\n (yearSelected)=\"datepicker.selectYear($event)\"\n (monthSelected)=\"datepicker.selectMonth($event)\"\n (userSelection)=\"datepicker.close()\">\n</mc-calendar>\n", styles: [".mc-datepicker__content{display:block;border-width:1px;border-style:solid;border-radius:0;border-radius:var(--mc-datepicker-calendar-size-border-radius, 0)}.mc-datepicker__content .mc-calendar{width:296px;height:348px}\n"] }]
|
2295
1684
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { calendar: [{
|
2296
1685
|
type: ViewChild,
|
2297
1686
|
args: [McCalendar]
|
@@ -2310,8 +1699,6 @@ class McDatepicker {
|
|
2310
1699
|
this.document = document;
|
2311
1700
|
this._hasBackdrop = false;
|
2312
1701
|
this._opened = false;
|
2313
|
-
/** The view that the calendar should start in. */
|
2314
|
-
this.startView = McCalendarView.Month;
|
2315
1702
|
/**
|
2316
1703
|
* Emits selected year in multiyear view.
|
2317
1704
|
* This doesn't imply a change on the selected date.
|
@@ -2353,12 +1740,15 @@ class McDatepicker {
|
|
2353
1740
|
}
|
2354
1741
|
/** The date to open the calendar to initially. */
|
2355
1742
|
get startAt() {
|
1743
|
+
var _a;
|
2356
1744
|
// If an explicit startAt is set we start there, otherwise we start at whatever the currently
|
2357
1745
|
// selected value is.
|
2358
|
-
return this._startAt || (this.datepickerInput ?
|
1746
|
+
return this._startAt || ((_a = this.datepickerInput) === null || _a === void 0 ? void 0 : _a.value);
|
2359
1747
|
}
|
2360
1748
|
set startAt(value) {
|
2361
|
-
|
1749
|
+
const deserializedValue = this.dateAdapter.deserialize(value);
|
1750
|
+
this._startAt = deserializedValue !== null ?
|
1751
|
+
this.dateAdapter.clampDate(deserializedValue, this.minDate, this.maxDate) : null;
|
2362
1752
|
}
|
2363
1753
|
/** Whether the datepicker pop-up should be disabled. */
|
2364
1754
|
get disabled() {
|
@@ -2494,7 +1884,7 @@ class McDatepicker {
|
|
2494
1884
|
// Update the position once the calendar has rendered.
|
2495
1885
|
this.ngZone.onStable.asObservable()
|
2496
1886
|
.pipe(take(1))
|
2497
|
-
.subscribe(() => this.popupRef.updatePosition());
|
1887
|
+
.subscribe(() => { var _a; return (_a = this.popupRef) === null || _a === void 0 ? void 0 : _a.updatePosition(); });
|
2498
1888
|
}
|
2499
1889
|
}
|
2500
1890
|
/** Create the popup. */
|
@@ -2552,16 +1942,9 @@ class McDatepicker {
|
|
2552
1942
|
}
|
2553
1943
|
]);
|
2554
1944
|
}
|
2555
|
-
/**
|
2556
|
-
* @param obj The object to check.
|
2557
|
-
* @returns The given object if it is both a date instance and valid, otherwise null.
|
2558
|
-
*/
|
2559
|
-
getValidDateOrNull(obj) {
|
2560
|
-
return (this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj)) ? obj : null;
|
2561
|
-
}
|
2562
1945
|
}
|
2563
|
-
/** @nocollapse */ McDatepicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepicker, deps: [{ token: i3.Overlay }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: MC_DATEPICKER_SCROLL_STRATEGY }, { token: i1$1.DateAdapter, optional: true }, { token:
|
2564
|
-
/** @nocollapse */ McDatepicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McDatepicker, selector: "mc-datepicker", inputs: { hasBackdrop: "hasBackdrop", startAt: "startAt", disabled: "disabled", opened: "opened", minDate: "minDate", maxDate: "maxDate",
|
1946
|
+
/** @nocollapse */ McDatepicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepicker, deps: [{ token: i3$1.Overlay }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: MC_DATEPICKER_SCROLL_STRATEGY }, { token: i1$1.DateAdapter, optional: true }, { token: i5$1.Directionality, optional: true }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
1947
|
+
/** @nocollapse */ McDatepicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: McDatepicker, selector: "mc-datepicker", inputs: { hasBackdrop: "hasBackdrop", startAt: "startAt", disabled: "disabled", opened: "opened", minDate: "minDate", maxDate: "maxDate", panelClass: "panelClass", dateClass: "dateClass", backdropClass: "backdropClass" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", openedStream: "opened", closedStream: "closed" }, providers: [{ provide: McFormFieldControl, useExisting: McDatepicker }], exportAs: ["mcDatepicker"], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
2565
1948
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepicker, decorators: [{
|
2566
1949
|
type: Component,
|
2567
1950
|
args: [{
|
@@ -2573,12 +1956,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2573
1956
|
providers: [{ provide: McFormFieldControl, useExisting: McDatepicker }]
|
2574
1957
|
}]
|
2575
1958
|
}], ctorParameters: function () {
|
2576
|
-
return [{ type: i3.Overlay }, { type: i0.NgZone }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
|
1959
|
+
return [{ type: i3$1.Overlay }, { type: i0.NgZone }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
|
2577
1960
|
type: Inject,
|
2578
1961
|
args: [MC_DATEPICKER_SCROLL_STRATEGY]
|
2579
1962
|
}] }, { type: i1$1.DateAdapter, decorators: [{
|
2580
1963
|
type: Optional
|
2581
|
-
}] }, { type:
|
1964
|
+
}] }, { type: i5$1.Directionality, decorators: [{
|
2582
1965
|
type: Optional
|
2583
1966
|
}] }, { type: undefined, decorators: [{
|
2584
1967
|
type: Optional
|
@@ -2598,10 +1981,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2598
1981
|
type: Input
|
2599
1982
|
}], maxDate: [{
|
2600
1983
|
type: Input
|
2601
|
-
}], calendarHeaderComponent: [{
|
2602
|
-
type: Input
|
2603
|
-
}], startView: [{
|
2604
|
-
type: Input
|
2605
1984
|
}], yearSelected: [{
|
2606
1985
|
type: Output
|
2607
1986
|
}], monthSelected: [{
|
@@ -2631,13 +2010,13 @@ class McDatepickerModule {
|
|
2631
2010
|
McDatepickerToggle,
|
2632
2011
|
McDatepickerToggleIcon,
|
2633
2012
|
McMonthView,
|
2634
|
-
McYearView,
|
2635
|
-
McMultiYearView,
|
2636
2013
|
McCalendarHeader], imports: [CommonModule,
|
2637
2014
|
McButtonModule,
|
2638
2015
|
OverlayModule,
|
2639
2016
|
A11yModule,
|
2640
2017
|
PortalModule,
|
2018
|
+
McButtonModule,
|
2019
|
+
McSelectModule,
|
2641
2020
|
McIconModule], exports: [McCalendar,
|
2642
2021
|
McCalendarBody,
|
2643
2022
|
McDatepicker,
|
@@ -2646,10 +2025,7 @@ class McDatepickerModule {
|
|
2646
2025
|
McDatepickerToggle,
|
2647
2026
|
McDatepickerToggleIcon,
|
2648
2027
|
McMonthView,
|
2649
|
-
|
2650
|
-
McMultiYearView,
|
2651
|
-
McCalendarHeader,
|
2652
|
-
McButtonModule] });
|
2028
|
+
McCalendarHeader] });
|
2653
2029
|
/** @nocollapse */ McDatepickerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepickerModule, providers: [
|
2654
2030
|
McDatepickerIntl,
|
2655
2031
|
MC_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER
|
@@ -2658,7 +2034,9 @@ class McDatepickerModule {
|
|
2658
2034
|
OverlayModule,
|
2659
2035
|
A11yModule,
|
2660
2036
|
PortalModule,
|
2661
|
-
|
2037
|
+
McButtonModule,
|
2038
|
+
McSelectModule,
|
2039
|
+
McIconModule] });
|
2662
2040
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: McDatepickerModule, decorators: [{
|
2663
2041
|
type: NgModule,
|
2664
2042
|
args: [{
|
@@ -2668,6 +2046,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2668
2046
|
OverlayModule,
|
2669
2047
|
A11yModule,
|
2670
2048
|
PortalModule,
|
2049
|
+
McButtonModule,
|
2050
|
+
McSelectModule,
|
2671
2051
|
McIconModule
|
2672
2052
|
],
|
2673
2053
|
exports: [
|
@@ -2679,10 +2059,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2679
2059
|
McDatepickerToggle,
|
2680
2060
|
McDatepickerToggleIcon,
|
2681
2061
|
McMonthView,
|
2682
|
-
|
2683
|
-
McMultiYearView,
|
2684
|
-
McCalendarHeader,
|
2685
|
-
McButtonModule
|
2062
|
+
McCalendarHeader
|
2686
2063
|
],
|
2687
2064
|
declarations: [
|
2688
2065
|
McCalendar,
|
@@ -2693,8 +2070,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2693
2070
|
McDatepickerToggle,
|
2694
2071
|
McDatepickerToggleIcon,
|
2695
2072
|
McMonthView,
|
2696
|
-
McYearView,
|
2697
|
-
McMultiYearView,
|
2698
2073
|
McCalendarHeader
|
2699
2074
|
],
|
2700
2075
|
providers: [
|
@@ -2708,5 +2083,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
2708
2083
|
* Generated bundle index. Do not edit.
|
2709
2084
|
*/
|
2710
2085
|
|
2711
|
-
export { MAX_YEAR, MC_DATEPICKER_SCROLL_STRATEGY, MC_DATEPICKER_SCROLL_STRATEGY_FACTORY, MC_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER, MC_DATEPICKER_VALIDATORS, MC_DATEPICKER_VALUE_ACCESSOR, McCalendar, McCalendarBody, McCalendarCell, McCalendarHeader,
|
2086
|
+
export { MAX_YEAR, MC_DATEPICKER_SCROLL_STRATEGY, MC_DATEPICKER_SCROLL_STRATEGY_FACTORY, MC_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER, MC_DATEPICKER_VALIDATORS, MC_DATEPICKER_VALUE_ACCESSOR, McCalendar, McCalendarBody, McCalendarCell, McCalendarHeader, McDatepicker, McDatepickerContent, McDatepickerInput, McDatepickerInputEvent, McDatepickerIntl, McDatepickerModule, McDatepickerToggle, McDatepickerToggleIcon, McMonthView, mcDatepickerAnimations };
|
2712
2087
|
//# sourceMappingURL=ptsecurity-mosaic-datepicker.mjs.map
|