| 223 | _trackRow = (row: MatCalendarCell[]) => row; |
| 224 | |
| 225 | constructor() { |
| 226 | const renderer = inject(Renderer2); |
| 227 | const idGenerator = inject(_IdGenerator); |
| 228 | this._startDateLabelId = idGenerator.getId('mat-calendar-body-start-'); |
| 229 | this._endDateLabelId = idGenerator.getId('mat-calendar-body-end-'); |
| 230 | this._comparisonStartDateLabelId = idGenerator.getId('mat-calendar-body-comparison-start-'); |
| 231 | this._comparisonEndDateLabelId = idGenerator.getId('mat-calendar-body-comparison-end-'); |
| 232 | |
| 233 | inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader); |
| 234 | |
| 235 | this._ngZone.runOutsideAngular(() => { |
| 236 | const element = this._elementRef.nativeElement; |
| 237 | const cleanups = [ |
| 238 | // `touchmove` is active since we need to call `preventDefault`. |
| 239 | renderer.listen(element, 'touchmove', this._touchmoveHandler, activeCapturingEventOptions), |
| 240 | renderer.listen(element, 'mouseenter', this._enterHandler, passiveCapturingEventOptions), |
| 241 | renderer.listen(element, 'focus', this._enterHandler, passiveCapturingEventOptions), |
| 242 | renderer.listen(element, 'mouseleave', this._leaveHandler, passiveCapturingEventOptions), |
| 243 | renderer.listen(element, 'blur', this._leaveHandler, passiveCapturingEventOptions), |
| 244 | renderer.listen(element, 'mousedown', this._mousedownHandler, passiveEventOptions), |
| 245 | renderer.listen(element, 'touchstart', this._mousedownHandler, passiveEventOptions), |
| 246 | ]; |
| 247 | |
| 248 | if (this._platform.isBrowser) { |
| 249 | cleanups.push( |
| 250 | renderer.listen('window', 'mouseup', this._mouseupHandler), |
| 251 | renderer.listen('window', 'touchend', this._touchendHandler), |
| 252 | ); |
| 253 | } |
| 254 | |
| 255 | this._eventCleanups = cleanups; |
| 256 | }); |
| 257 | } |
| 258 | |
| 259 | /** Called when a cell is clicked. */ |
| 260 | _cellClicked(cell: MatCalendarCell, event: MouseEvent): void { |