@progress/kendo-angular-layout 21.2.0-develop.1 → 21.2.0-develop.11

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.
@@ -28,27 +28,23 @@ var __importStar = (this && this.__importStar) || function (mod) {
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.default = default_1;
31
- const index_1 = require("../template-transformer/index");
32
- const utils_1 = require("../utils");
33
31
  const fs = __importStar(require("fs"));
32
+ const utils_1 = require("../utils");
34
33
  function default_1(fileInfo, api) {
35
34
  const filePath = fileInfo.path;
35
+ // Handle HTML files and inline templates
36
+ const htmlResult = (0, utils_1.htmlTransformer)(fileInfo, api, (templateContent) => (0, utils_1.attributeRemoval)(templateContent, 'kendo-tabstrip', 'scrollable', 'mouseScrollSpeed'));
36
37
  if (filePath.endsWith('.html')) {
37
- if ((0, utils_1.hasKendoInTemplate)(fileInfo.source)) {
38
- const filePath = fileInfo.path;
39
- let updatedContent = fileInfo.source;
40
- updatedContent = (0, utils_1.htmlAttributeRemoval)({ ...fileInfo, source: updatedContent }, 'kendo-tabstrip', 'scrollable', 'mouseScrollSpeed');
41
- // Only write to file once after all transformations
42
- fs.writeFileSync(filePath, updatedContent, 'utf-8');
38
+ if (htmlResult && htmlResult !== fileInfo.source) {
39
+ fs.writeFileSync(filePath, htmlResult, 'utf-8');
40
+ return htmlResult;
43
41
  }
44
- return;
42
+ return fileInfo.source; // Return original source if no changes
45
43
  }
44
+ // Handle TypeScript property transformations
46
45
  const j = api.jscodeshift;
47
- const rootSource = j(fileInfo.source);
48
- (0, index_1.templateTransformer)(rootSource, j, (root) => {
49
- (0, utils_1.templateAttributeRemoval)(root, 'kendo-tabstrip', 'scrollable', 'mouseScrollSpeed');
50
- });
51
- (0, utils_1.tsPropertyRemoval)(fileInfo.source, rootSource, j, 'TabStripScrollableSettings', 'mouseScrollSpeed');
52
- (0, utils_1.tsComponentPropertyRemoval)(fileInfo.source, rootSource, j, 'TabStripComponent', 'scrollable', 'mouseScrollSpeed');
46
+ const rootSource = j(htmlResult || fileInfo.source);
47
+ (0, utils_1.tsPropertyRemoval)(fileInfo.source, rootSource, j, '@progress/kendo-angular-layout', 'TabStripScrollableSettings', 'mouseScrollSpeed');
48
+ (0, utils_1.tsComponentPropertyRemoval)(fileInfo.source, rootSource, j, '@progress/kendo-angular-layout', 'TabStripComponent', 'scrollable', 'mouseScrollSpeed');
53
49
  return rootSource.toSource();
54
50
  }
@@ -7,7 +7,7 @@ import { Component, ElementRef, Input, NgZone, Renderer2, TemplateRef, Output, E
7
7
  import { closestItem, itemIndex } from '../common/dom-queries';
8
8
  import { DRAWER_ITEM_INDEX } from './models/constants';
9
9
  import { DrawerService } from './drawer.service';
10
- import { Keys, normalizeNumpadKeys } from '@progress/kendo-angular-common';
10
+ import { Keys, normalizeKeys } from '@progress/kendo-angular-common';
11
11
  import { ACTIVE_NESTED_LINK_SELECTOR, nestedLink } from './util';
12
12
  import { DrawerListSelectEvent } from './events/drawer-list-select.event';
13
13
  import { DrawerItemComponent } from './item.component';
@@ -52,7 +52,7 @@ export class DrawerListComponent {
52
52
  const nativeElement = this.element.nativeElement;
53
53
  this.subscriptions.add(this.renderer.listen(nativeElement, 'click', this.clickHandler.bind(this)));
54
54
  this.subscriptions.add(this.renderer.listen(nativeElement, 'keydown', (e) => {
55
- const code = normalizeNumpadKeys(e);
55
+ const code = normalizeKeys(e);
56
56
  const isEnterOrSpace = code === Keys.Enter || code === Keys.Space;
57
57
  const isArrowUpOrDown = code === Keys.ArrowUp || code === Keys.ArrowDown;
58
58
  if (isEnterOrSpace) {
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1763998234,
14
- version: '21.2.0-develop.1',
13
+ publishDate: 1764684962,
14
+ version: '21.2.0-develop.11',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
16
16
  };
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, QueryList, ViewChildren, isDevMode } from '@angular/core';
6
6
  import { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
7
- import { Keys, shouldShowValidationUI, getLicenseMessage, WatermarkOverlayComponent, normalizeNumpadKeys } from '@progress/kendo-angular-common';
7
+ import { Keys, shouldShowValidationUI, getLicenseMessage, WatermarkOverlayComponent, normalizeKeys } from '@progress/kendo-angular-common';
8
8
  import { validatePackage } from '@progress/kendo-licensing';
9
9
  import { packageMetadata } from '../package-metadata';
10
10
  import { PanelBarExpandMode } from './panelbar-expand-mode';
@@ -268,7 +268,7 @@ export class PanelBarComponent {
268
268
  onComponentKeyDown(event) {
269
269
  if (event.target === this.elementRef.nativeElement) {
270
270
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
271
- const code = normalizeNumpadKeys(event);
271
+ const code = normalizeKeys(event);
272
272
  if (code === Keys.Space || code === Keys.ArrowUp || code === Keys.ArrowDown ||
273
273
  code === Keys.ArrowLeft || code === Keys.ArrowRight || code === Keys.Home ||
274
274
  code === Keys.End || code === Keys.PageUp || code === Keys.PageDown) {
@@ -5,7 +5,7 @@
5
5
  /* eslint-disable @typescript-eslint/no-explicit-any */
6
6
  import { ChangeDetectorRef, Component, ElementRef, Host, HostBinding, Input, Renderer2 } from '@angular/core';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
- import { DraggableDirective, Keys, isObjectPresent, normalizeNumpadKeys, parseAttributes, removeHTMLAttributes, setHTMLAttributes } from '@progress/kendo-angular-common';
8
+ import { DraggableDirective, Keys, isObjectPresent, normalizeKeys, parseAttributes, removeHTMLAttributes, setHTMLAttributes } from '@progress/kendo-angular-common';
9
9
  import { SplitterService } from './splitter.service';
10
10
  import { Subscription, of } from 'rxjs';
11
11
  import { delay, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';
@@ -225,7 +225,7 @@ export class SplitterBarComponent {
225
225
  return panes.length === 2 && panes[1].collapsed;
226
226
  }
227
227
  onKeyDown(event) {
228
- const keyCode = normalizeNumpadKeys(event);
228
+ const keyCode = normalizeKeys(event);
229
229
  const shouldToggle = event.ctrlKey || event.metaKey;
230
230
  if (keyCode === Keys.Enter || keyCode === Keys.NumpadEnter) {
231
231
  event.preventDefault();
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Injectable, NgZone, ChangeDetectorRef, EventEmitter } from '@angular/core';
6
- import { hasObservers, Keys, normalizeNumpadKeys, PreventableEvent } from '@progress/kendo-angular-common';
6
+ import { hasObservers, Keys, normalizeKeys, PreventableEvent } from '@progress/kendo-angular-common';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
8
  import { isPresent } from '../common/util';
9
9
  import * as i0 from "@angular/core";
@@ -100,7 +100,7 @@ export class StepperService {
100
100
  keydown(e) {
101
101
  const current = this.focusedStep || this.currentStep;
102
102
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
103
- const code = normalizeNumpadKeys(e);
103
+ const code = normalizeKeys(e);
104
104
  const handler = this.handlers[code];
105
105
  if (!isPresent(current)) {
106
106
  return;
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Injectable, NgZone } from '@angular/core';
6
6
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
- import { Keys, normalizeNumpadKeys } from '@progress/kendo-angular-common';
7
+ import { Keys, normalizeKeys } from '@progress/kendo-angular-common';
8
8
  import { isArrowKey, isHorizontalArrowKey, isNavigationKey, isVerticalArrowKey } from '../common/util';
9
9
  import { SelectEvent } from './events';
10
10
  import { isTabClosable, getActiveTab, isTabElement, isTablistHorizontal, getTabByIndex, getTabHeaderByIndex, resetTabSelection } from './util';
@@ -26,7 +26,7 @@ export class TabStripService {
26
26
  return;
27
27
  }
28
28
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
29
- const code = normalizeNumpadKeys(event);
29
+ const code = normalizeKeys(event);
30
30
  if (this.shouldHandleKey(code)) {
31
31
  event.preventDefault();
32
32
  }
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  /* eslint-disable no-unused-expressions */
6
6
  import { Injectable, NgZone, Renderer2 } from '@angular/core';
7
- import { Keys, normalizeNumpadKeys } from '@progress/kendo-angular-common';
7
+ import { Keys, normalizeKeys } from '@progress/kendo-angular-common';
8
8
  import { LocalizationService } from '@progress/kendo-angular-l10n';
9
9
  import { BehaviorSubject } from 'rxjs';
10
10
  import { focusableSelector } from '@progress/kendo-angular-common';
@@ -36,7 +36,7 @@ export class TileLayoutKeyboardNavigationService {
36
36
  this.localizationSubscription.unsubscribe();
37
37
  }
38
38
  onKeyDown(event, elem, focusableItems, settings) {
39
- const keyCode = normalizeNumpadKeys(event);
39
+ const keyCode = normalizeKeys(event);
40
40
  const isTileFocused = document.activeElement === elem;
41
41
  const focusedTile = settings.items.find(item => item.elem.nativeElement === elem);
42
42
  const col = getCurrentCol(focusedTile, settings, this.rtl);
@@ -0,0 +1,5 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ export {};
@@ -6,7 +6,7 @@ import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, QueryList, Ren
6
6
  import { caretAltLeftIcon, caretAltRightIcon } from '@progress/kendo-svg-icons';
7
7
  import { Subscription } from 'rxjs';
8
8
  import { TimelineCardComponent } from './timeline-card.component';
9
- import { Keys, ResizeSensorComponent, guid, isChanged, isDocumentAvailable, isPresent, normalizeNumpadKeys } from '@progress/kendo-angular-common';
9
+ import { Keys, ResizeSensorComponent, guid, isChanged, isDocumentAvailable, isPresent, normalizeKeys } from '@progress/kendo-angular-common';
10
10
  import { animate, state, style, transition, trigger } from '@angular/animations';
11
11
  import { TimelineService } from './timeline.service';
12
12
  import { LocalizationService } from '@progress/kendo-angular-l10n';
@@ -140,13 +140,7 @@ export class TimelineHorizontalComponent {
140
140
  }
141
141
  this.trackItems.push(event);
142
142
  });
143
- this.visibleEvents = this.trackItems
144
- .slice(this.firstCircleInView, this.firstCircleInView + this.visibleTabsCount)
145
- .filter(event => !event.isFlag);
146
- this.selectedEvent = this.events[0];
147
- this.cdr.detectChanges();
148
- this.calloutStyle = this.calloutOffset;
149
- this.focusTrackItem(0);
143
+ this.navigateToFirstInterval();
150
144
  }
151
145
  }
152
146
  }
@@ -306,7 +300,7 @@ export class TimelineHorizontalComponent {
306
300
  if (!this.navigable) {
307
301
  return;
308
302
  }
309
- const code = normalizeNumpadKeys(event);
303
+ const code = normalizeKeys(event);
310
304
  event.preventDefault();
311
305
  if (code === Keys.Home) {
312
306
  this.onHomeKey();
@@ -39,18 +39,7 @@ export class TimelineComponent {
39
39
  }
40
40
  this.originalData = events;
41
41
  this._events = processItems(this.originalData, this.modelFields);
42
- this._events.sort((a, b) => {
43
- return a.date.getTime() - b.date.getTime();
44
- });
45
- if (this._events.length > 0) {
46
- let flag = this._events[0].date.getFullYear() - 1;
47
- this._events.forEach((event) => {
48
- if (event.date.getFullYear() !== flag) {
49
- flag = event.date.getFullYear();
50
- event.flag = flag;
51
- }
52
- });
53
- }
42
+ this.updateEvents();
54
43
  }
55
44
  get events() {
56
45
  return this._events;
@@ -105,6 +94,23 @@ export class TimelineComponent {
105
94
  * @default true
106
95
  */
107
96
  animation;
97
+ /**
98
+ * Specifies the order of the Timeline events.
99
+ * `asc` - chronological order
100
+ * `desc` - reverse-chronological order
101
+ *
102
+ * @default 'asc'
103
+ */
104
+ set eventsOrder(order) {
105
+ if (order === this._eventsOrder) {
106
+ return;
107
+ }
108
+ this._eventsOrder = order;
109
+ this.updateEvents();
110
+ }
111
+ get eventsOrder() {
112
+ return this._eventsOrder;
113
+ }
108
114
  /**
109
115
  * Sets a specific width for the event.
110
116
  * This setting is supported only in `vertical` mode.
@@ -232,6 +238,7 @@ export class TimelineComponent {
232
238
  _eventHeight = DEFAULT_EVENT_HEIGHT;
233
239
  _dateFormat = DEFAULT_DATE_FORMAT;
234
240
  originalData = [];
241
+ _eventsOrder = 'asc';
235
242
  subscriptions = new Subscription();
236
243
  constructor(timelineService) {
237
244
  this.timelineService = timelineService;
@@ -278,6 +285,24 @@ export class TimelineComponent {
278
285
  collapse(index) {
279
286
  this.timelineVertical?.collapse(index);
280
287
  }
288
+ updateEvents() {
289
+ const sortOrder = this._eventsOrder === 'asc' ? 1 : -1;
290
+ this._events = [...this._events].sort((a, b) => {
291
+ return sortOrder * (a.date.getTime() - b.date.getTime());
292
+ });
293
+ if (this._events.length > 0) {
294
+ let flag = this._events[0].date.getFullYear() - sortOrder;
295
+ this._events.forEach((event) => {
296
+ if (event.date.getFullYear() === flag) {
297
+ event.flag = null;
298
+ }
299
+ else {
300
+ flag = event.date.getFullYear();
301
+ event.flag = flag;
302
+ }
303
+ });
304
+ }
305
+ }
281
306
  initTemplates() {
282
307
  this.headerTemplate = this.cardHeaderTemplate?.first;
283
308
  this.bodyTemplate = this.cardBodyTemplate?.first;
@@ -293,7 +318,7 @@ export class TimelineComponent {
293
318
  }));
294
319
  }
295
320
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimelineComponent, deps: [{ token: i1.TimelineService }], target: i0.ɵɵFactoryTarget.Component });
296
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimelineComponent, isStandalone: true, selector: "kendo-timeline", inputs: { events: "events", modelFields: "modelFields", orientation: "orientation", alterMode: "alterMode", collapsibleEvents: "collapsibleEvents", navigable: "navigable", showDateLabels: "showDateLabels", animation: "animation", eventWidth: "eventWidth", eventHeight: "eventHeight", dateFormat: "dateFormat" }, outputs: { onToggle: "onToggle", onActionClick: "onActionClick", onNavigate: "onNavigate" }, host: { properties: { "class.k-timeline": "this.hostClass", "class.k-timeline-vertical": "this.verticalClass", "class.k-timeline-horizontal": "this.horizontalClass", "class.k-timeline-alternating": "this.alternatingClass", "class.k-timeline-collapsible": "this.collapsibleClass" } }, providers: [
321
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimelineComponent, isStandalone: true, selector: "kendo-timeline", inputs: { events: "events", modelFields: "modelFields", orientation: "orientation", alterMode: "alterMode", collapsibleEvents: "collapsibleEvents", navigable: "navigable", showDateLabels: "showDateLabels", animation: "animation", eventsOrder: "eventsOrder", eventWidth: "eventWidth", eventHeight: "eventHeight", dateFormat: "dateFormat" }, outputs: { onToggle: "onToggle", onActionClick: "onActionClick", onNavigate: "onNavigate" }, host: { properties: { "class.k-timeline": "this.hostClass", "class.k-timeline-vertical": "this.verticalClass", "class.k-timeline-horizontal": "this.horizontalClass", "class.k-timeline-alternating": "this.alternatingClass", "class.k-timeline-collapsible": "this.collapsibleClass" } }, providers: [
297
322
  TimelineService,
298
323
  LocalizationService,
299
324
  {
@@ -419,6 +444,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
419
444
  type: Input
420
445
  }], animation: [{
421
446
  type: Input
447
+ }], eventsOrder: [{
448
+ type: Input
422
449
  }], eventWidth: [{
423
450
  type: Input
424
451
  }], eventHeight: [{
@@ -7,7 +7,7 @@ import { Injectable, Directive, Optional, isDevMode, Component, SkipSelf, Host,
7
7
  import * as i1 from '@progress/kendo-angular-l10n';
8
8
  import { LocalizationService, L10N_PREFIX, ComponentMessages } from '@progress/kendo-angular-l10n';
9
9
  import * as i1$1 from '@progress/kendo-angular-common';
10
- import { Keys, getLicenseMessage, shouldShowValidationUI, normalizeNumpadKeys, WatermarkOverlayComponent, isDocumentAvailable, anyChanged, isObjectPresent, removeHTMLAttributes, parseAttributes, setHTMLAttributes, DraggableDirective, PreventableEvent as PreventableEvent$1, guid, ResizeSensorComponent, hasObservers, isPresent as isPresent$1, focusableSelector, isChanged } from '@progress/kendo-angular-common';
10
+ import { Keys, getLicenseMessage, shouldShowValidationUI, normalizeKeys, WatermarkOverlayComponent, isDocumentAvailable, anyChanged, isObjectPresent, removeHTMLAttributes, parseAttributes, setHTMLAttributes, DraggableDirective, PreventableEvent as PreventableEvent$1, guid, ResizeSensorComponent, hasObservers, isPresent as isPresent$1, focusableSelector, isChanged } from '@progress/kendo-angular-common';
11
11
  import { validatePackage } from '@progress/kendo-licensing';
12
12
  import * as i1$2 from '@angular/animations';
13
13
  import { trigger, state, style, transition, animate, AUTO_STYLE } from '@angular/animations';
@@ -29,8 +29,8 @@ const packageMetadata = {
29
29
  productName: 'Kendo UI for Angular',
30
30
  productCode: 'KENDOUIANGULAR',
31
31
  productCodes: ['KENDOUIANGULAR'],
32
- publishDate: 1763998234,
33
- version: '21.2.0-develop.1',
32
+ publishDate: 1764684962,
33
+ version: '21.2.0-develop.11',
34
34
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
35
35
  };
36
36
 
@@ -1363,7 +1363,7 @@ class PanelBarComponent {
1363
1363
  onComponentKeyDown(event) {
1364
1364
  if (event.target === this.elementRef.nativeElement) {
1365
1365
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
1366
- const code = normalizeNumpadKeys(event);
1366
+ const code = normalizeKeys(event);
1367
1367
  if (code === Keys.Space || code === Keys.ArrowUp || code === Keys.ArrowDown ||
1368
1368
  code === Keys.ArrowLeft || code === Keys.ArrowRight || code === Keys.Home ||
1369
1369
  code === Keys.End || code === Keys.PageUp || code === Keys.PageDown) {
@@ -2546,7 +2546,7 @@ class SplitterBarComponent {
2546
2546
  return panes.length === 2 && panes[1].collapsed;
2547
2547
  }
2548
2548
  onKeyDown(event) {
2549
- const keyCode = normalizeNumpadKeys(event);
2549
+ const keyCode = normalizeKeys(event);
2550
2550
  const shouldToggle = event.ctrlKey || event.metaKey;
2551
2551
  if (keyCode === Keys.Enter || keyCode === Keys.NumpadEnter) {
2552
2552
  event.preventDefault();
@@ -3340,7 +3340,7 @@ class TabStripService {
3340
3340
  return;
3341
3341
  }
3342
3342
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
3343
- const code = normalizeNumpadKeys(event);
3343
+ const code = normalizeKeys(event);
3344
3344
  if (this.shouldHandleKey(code)) {
3345
3345
  event.preventDefault();
3346
3346
  }
@@ -5703,7 +5703,7 @@ class DrawerListComponent {
5703
5703
  const nativeElement = this.element.nativeElement;
5704
5704
  this.subscriptions.add(this.renderer.listen(nativeElement, 'click', this.clickHandler.bind(this)));
5705
5705
  this.subscriptions.add(this.renderer.listen(nativeElement, 'keydown', (e) => {
5706
- const code = normalizeNumpadKeys(e);
5706
+ const code = normalizeKeys(e);
5707
5707
  const isEnterOrSpace = code === Keys.Enter || code === Keys.Space;
5708
5708
  const isArrowUpOrDown = code === Keys.ArrowUp || code === Keys.ArrowDown;
5709
5709
  if (isEnterOrSpace) {
@@ -6645,7 +6645,7 @@ class StepperService {
6645
6645
  keydown(e) {
6646
6646
  const current = this.focusedStep || this.currentStep;
6647
6647
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
6648
- const code = normalizeNumpadKeys(e);
6648
+ const code = normalizeKeys(e);
6649
6649
  const handler = this.handlers[code];
6650
6650
  if (!isPresent(current)) {
6651
6651
  return;
@@ -10110,7 +10110,7 @@ class TileLayoutKeyboardNavigationService {
10110
10110
  this.localizationSubscription.unsubscribe();
10111
10111
  }
10112
10112
  onKeyDown(event, elem, focusableItems, settings) {
10113
- const keyCode = normalizeNumpadKeys(event);
10113
+ const keyCode = normalizeKeys(event);
10114
10114
  const isTileFocused = document.activeElement === elem;
10115
10115
  const focusedTile = settings.items.find(item => item.elem.nativeElement === elem);
10116
10116
  const col = getCurrentCol(focusedTile, settings, this.rtl);
@@ -12342,13 +12342,7 @@ class TimelineHorizontalComponent {
12342
12342
  }
12343
12343
  this.trackItems.push(event);
12344
12344
  });
12345
- this.visibleEvents = this.trackItems
12346
- .slice(this.firstCircleInView, this.firstCircleInView + this.visibleTabsCount)
12347
- .filter(event => !event.isFlag);
12348
- this.selectedEvent = this.events[0];
12349
- this.cdr.detectChanges();
12350
- this.calloutStyle = this.calloutOffset;
12351
- this.focusTrackItem(0);
12345
+ this.navigateToFirstInterval();
12352
12346
  }
12353
12347
  }
12354
12348
  }
@@ -12508,7 +12502,7 @@ class TimelineHorizontalComponent {
12508
12502
  if (!this.navigable) {
12509
12503
  return;
12510
12504
  }
12511
- const code = normalizeNumpadKeys(event);
12505
+ const code = normalizeKeys(event);
12512
12506
  event.preventDefault();
12513
12507
  if (code === Keys.Home) {
12514
12508
  this.onHomeKey();
@@ -13231,18 +13225,7 @@ class TimelineComponent {
13231
13225
  }
13232
13226
  this.originalData = events;
13233
13227
  this._events = processItems(this.originalData, this.modelFields);
13234
- this._events.sort((a, b) => {
13235
- return a.date.getTime() - b.date.getTime();
13236
- });
13237
- if (this._events.length > 0) {
13238
- let flag = this._events[0].date.getFullYear() - 1;
13239
- this._events.forEach((event) => {
13240
- if (event.date.getFullYear() !== flag) {
13241
- flag = event.date.getFullYear();
13242
- event.flag = flag;
13243
- }
13244
- });
13245
- }
13228
+ this.updateEvents();
13246
13229
  }
13247
13230
  get events() {
13248
13231
  return this._events;
@@ -13297,6 +13280,23 @@ class TimelineComponent {
13297
13280
  * @default true
13298
13281
  */
13299
13282
  animation;
13283
+ /**
13284
+ * Specifies the order of the Timeline events.
13285
+ * `asc` - chronological order
13286
+ * `desc` - reverse-chronological order
13287
+ *
13288
+ * @default 'asc'
13289
+ */
13290
+ set eventsOrder(order) {
13291
+ if (order === this._eventsOrder) {
13292
+ return;
13293
+ }
13294
+ this._eventsOrder = order;
13295
+ this.updateEvents();
13296
+ }
13297
+ get eventsOrder() {
13298
+ return this._eventsOrder;
13299
+ }
13300
13300
  /**
13301
13301
  * Sets a specific width for the event.
13302
13302
  * This setting is supported only in `vertical` mode.
@@ -13424,6 +13424,7 @@ class TimelineComponent {
13424
13424
  _eventHeight = DEFAULT_EVENT_HEIGHT;
13425
13425
  _dateFormat = DEFAULT_DATE_FORMAT;
13426
13426
  originalData = [];
13427
+ _eventsOrder = 'asc';
13427
13428
  subscriptions = new Subscription();
13428
13429
  constructor(timelineService) {
13429
13430
  this.timelineService = timelineService;
@@ -13470,6 +13471,24 @@ class TimelineComponent {
13470
13471
  collapse(index) {
13471
13472
  this.timelineVertical?.collapse(index);
13472
13473
  }
13474
+ updateEvents() {
13475
+ const sortOrder = this._eventsOrder === 'asc' ? 1 : -1;
13476
+ this._events = [...this._events].sort((a, b) => {
13477
+ return sortOrder * (a.date.getTime() - b.date.getTime());
13478
+ });
13479
+ if (this._events.length > 0) {
13480
+ let flag = this._events[0].date.getFullYear() - sortOrder;
13481
+ this._events.forEach((event) => {
13482
+ if (event.date.getFullYear() === flag) {
13483
+ event.flag = null;
13484
+ }
13485
+ else {
13486
+ flag = event.date.getFullYear();
13487
+ event.flag = flag;
13488
+ }
13489
+ });
13490
+ }
13491
+ }
13473
13492
  initTemplates() {
13474
13493
  this.headerTemplate = this.cardHeaderTemplate?.first;
13475
13494
  this.bodyTemplate = this.cardBodyTemplate?.first;
@@ -13485,7 +13504,7 @@ class TimelineComponent {
13485
13504
  }));
13486
13505
  }
13487
13506
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimelineComponent, deps: [{ token: TimelineService }], target: i0.ɵɵFactoryTarget.Component });
13488
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimelineComponent, isStandalone: true, selector: "kendo-timeline", inputs: { events: "events", modelFields: "modelFields", orientation: "orientation", alterMode: "alterMode", collapsibleEvents: "collapsibleEvents", navigable: "navigable", showDateLabels: "showDateLabels", animation: "animation", eventWidth: "eventWidth", eventHeight: "eventHeight", dateFormat: "dateFormat" }, outputs: { onToggle: "onToggle", onActionClick: "onActionClick", onNavigate: "onNavigate" }, host: { properties: { "class.k-timeline": "this.hostClass", "class.k-timeline-vertical": "this.verticalClass", "class.k-timeline-horizontal": "this.horizontalClass", "class.k-timeline-alternating": "this.alternatingClass", "class.k-timeline-collapsible": "this.collapsibleClass" } }, providers: [
13507
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimelineComponent, isStandalone: true, selector: "kendo-timeline", inputs: { events: "events", modelFields: "modelFields", orientation: "orientation", alterMode: "alterMode", collapsibleEvents: "collapsibleEvents", navigable: "navigable", showDateLabels: "showDateLabels", animation: "animation", eventsOrder: "eventsOrder", eventWidth: "eventWidth", eventHeight: "eventHeight", dateFormat: "dateFormat" }, outputs: { onToggle: "onToggle", onActionClick: "onActionClick", onNavigate: "onNavigate" }, host: { properties: { "class.k-timeline": "this.hostClass", "class.k-timeline-vertical": "this.verticalClass", "class.k-timeline-horizontal": "this.horizontalClass", "class.k-timeline-alternating": "this.alternatingClass", "class.k-timeline-collapsible": "this.collapsibleClass" } }, providers: [
13489
13508
  TimelineService,
13490
13509
  LocalizationService,
13491
13510
  {
@@ -13611,6 +13630,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13611
13630
  type: Input
13612
13631
  }], animation: [{
13613
13632
  type: Input
13633
+ }], eventsOrder: [{
13634
+ type: Input
13614
13635
  }], eventWidth: [{
13615
13636
  type: Input
13616
13637
  }], eventHeight: [{
package/index.d.ts CHANGED
@@ -92,6 +92,7 @@ export { TimelineModelFields } from './timeline/models/model-fields';
92
92
  export { TimelineEvent } from './timeline/models/timeline-event';
93
93
  export { AnchorTarget } from './timeline/models/anchor-target';
94
94
  export { NavigationDirection } from './timeline/events/navigation-direction';
95
+ export { TimelineEventsOrder } from './timeline/models/events-order';
95
96
  export { TimelineCardHeaderTemplateDirective } from "./timeline/templates/timeline-card-header.directive";
96
97
  export { TimelineCardBodyTemplateDirective } from "./timeline/templates/timeline-card-body.directive";
97
98
  export { TimelineCardActionsTemplateDirective } from "./timeline/templates/timeline-card-actions.directive";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-layout",
3
- "version": "21.2.0-develop.1",
3
+ "version": "21.2.0-develop.11",
4
4
  "description": "Kendo UI for Angular Layout Package - a collection of components to create professional application layoyts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -50,7 +50,7 @@
50
50
  "package": {
51
51
  "productName": "Kendo UI for Angular",
52
52
  "productCode": "KENDOUIANGULAR",
53
- "publishDate": 1763998234,
53
+ "publishDate": 1764684962,
54
54
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning"
55
55
  }
56
56
  },
@@ -60,19 +60,18 @@
60
60
  "@angular/core": "18 - 21",
61
61
  "@angular/platform-browser": "18 - 21",
62
62
  "@progress/kendo-licensing": "^1.7.0",
63
- "@progress/kendo-angular-common": "21.2.0-develop.1",
64
- "@progress/kendo-angular-l10n": "21.2.0-develop.1",
65
- "@progress/kendo-angular-progressbar": "21.2.0-develop.1",
66
- "@progress/kendo-angular-icons": "21.2.0-develop.1",
67
- "@progress/kendo-angular-buttons": "21.2.0-develop.1",
68
- "@progress/kendo-angular-intl": "21.2.0-develop.1",
63
+ "@progress/kendo-angular-common": "21.2.0-develop.11",
64
+ "@progress/kendo-angular-l10n": "21.2.0-develop.11",
65
+ "@progress/kendo-angular-progressbar": "21.2.0-develop.11",
66
+ "@progress/kendo-angular-icons": "21.2.0-develop.11",
67
+ "@progress/kendo-angular-buttons": "21.2.0-develop.11",
68
+ "@progress/kendo-angular-intl": "21.2.0-develop.11",
69
69
  "rxjs": "^6.5.3 || ^7.0.0"
70
70
  },
71
71
  "dependencies": {
72
72
  "tslib": "^2.3.1",
73
- "@progress/kendo-angular-schematics": "21.2.0-develop.1",
74
- "@progress/kendo-draggable": "^3.0.2",
75
- "node-html-parser": "^7.0.1"
73
+ "@progress/kendo-angular-schematics": "21.2.0-develop.11",
74
+ "@progress/kendo-draggable": "^3.0.2"
76
75
  },
77
76
  "schematics": "./schematics/collection.json",
78
77
  "module": "fesm2022/progress-kendo-angular-layout.mjs",
@@ -0,0 +1,10 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ /**
6
+ * Specifies the order of the Timeline events.
7
+ * `asc` - chronological order
8
+ * `desc` - reverse-chronological order
9
+ */
10
+ export type TimelineEventsOrder = 'asc' | 'desc';
@@ -12,6 +12,7 @@ import { NavigationDirection } from './events/navigation-direction';
12
12
  import { TimelineCardBodyTemplateDirective } from './templates/timeline-card-body.directive';
13
13
  import { TimelineCardHeaderTemplateDirective } from './templates/timeline-card-header.directive';
14
14
  import { TimelineCardActionsTemplateDirective } from './templates/timeline-card-actions.directive';
15
+ import { TimelineEventsOrder } from './models/events-order';
15
16
  import * as i0 from "@angular/core";
16
17
  /**
17
18
  * Represents the [Kendo UI Timeline component for Angular]({% slug overview_timeline %}).
@@ -69,6 +70,15 @@ export declare class TimelineComponent implements AfterContentInit, OnDestroy {
69
70
  * @default true
70
71
  */
71
72
  animation: boolean | number;
73
+ /**
74
+ * Specifies the order of the Timeline events.
75
+ * `asc` - chronological order
76
+ * `desc` - reverse-chronological order
77
+ *
78
+ * @default 'asc'
79
+ */
80
+ set eventsOrder(order: TimelineEventsOrder);
81
+ get eventsOrder(): TimelineEventsOrder;
72
82
  /**
73
83
  * Sets a specific width for the event.
74
84
  * This setting is supported only in `vertical` mode.
@@ -153,6 +163,7 @@ export declare class TimelineComponent implements AfterContentInit, OnDestroy {
153
163
  private _eventHeight;
154
164
  private _dateFormat;
155
165
  private originalData;
166
+ private _eventsOrder;
156
167
  private subscriptions;
157
168
  constructor(timelineService: TimelineService);
158
169
  ngAfterContentInit(): void;
@@ -182,7 +193,8 @@ export declare class TimelineComponent implements AfterContentInit, OnDestroy {
182
193
  * This method is supported only in `vertical` mode.
183
194
  */
184
195
  collapse(index: number): void;
196
+ private updateEvents;
185
197
  private initTemplates;
186
198
  static ɵfac: i0.ɵɵFactoryDeclaration<TimelineComponent, never>;
187
- static ɵcmp: i0.ɵɵComponentDeclaration<TimelineComponent, "kendo-timeline", ["kendoTimeline"], { "events": { "alias": "events"; "required": false; }; "modelFields": { "alias": "modelFields"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "alterMode": { "alias": "alterMode"; "required": false; }; "collapsibleEvents": { "alias": "collapsibleEvents"; "required": false; }; "navigable": { "alias": "navigable"; "required": false; }; "showDateLabels": { "alias": "showDateLabels"; "required": false; }; "animation": { "alias": "animation"; "required": false; }; "eventWidth": { "alias": "eventWidth"; "required": false; }; "eventHeight": { "alias": "eventHeight"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; }, { "onToggle": "onToggle"; "onActionClick": "onActionClick"; "onNavigate": "onNavigate"; }, ["cardHeaderTemplate", "cardBodyTemplate", "cardActionsTemplate"], never, true, never>;
199
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimelineComponent, "kendo-timeline", ["kendoTimeline"], { "events": { "alias": "events"; "required": false; }; "modelFields": { "alias": "modelFields"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "alterMode": { "alias": "alterMode"; "required": false; }; "collapsibleEvents": { "alias": "collapsibleEvents"; "required": false; }; "navigable": { "alias": "navigable"; "required": false; }; "showDateLabels": { "alias": "showDateLabels"; "required": false; }; "animation": { "alias": "animation"; "required": false; }; "eventsOrder": { "alias": "eventsOrder"; "required": false; }; "eventWidth": { "alias": "eventWidth"; "required": false; }; "eventHeight": { "alias": "eventHeight"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; }, { "onToggle": "onToggle"; "onActionClick": "onActionClick"; "onNavigate": "onNavigate"; }, ["cardHeaderTemplate", "cardBodyTemplate", "cardActionsTemplate"], never, true, never>;
188
200
  }