@progress/kendo-angular-gantt 24.2.2-develop.8 → 24.2.2-develop.9

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.
@@ -44,8 +44,8 @@ const packageMetadata = {
44
44
  productName: 'Kendo UI for Angular',
45
45
  productCode: 'KENDOUIANGULAR',
46
46
  productCodes: ['KENDOUIANGULAR'],
47
- publishDate: 1783409430,
48
- version: '24.2.2-develop.8',
47
+ publishDate: 1783411233,
48
+ version: '24.2.2-develop.9',
49
49
  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'
50
50
  };
51
51
 
@@ -1075,6 +1075,7 @@ class NavigationService {
1075
1075
  */
1076
1076
  timelineLastActive = false;
1077
1077
  metadata;
1078
+ bar;
1078
1079
  _enabled = false;
1079
1080
  _activeTimelineIndex = 0;
1080
1081
  _activeTreeListCell = { rowIndex: 0, colIndex: 0 };
@@ -1088,19 +1089,23 @@ class NavigationService {
1088
1089
  // no private property setters in TypeScript, so use a getter and a poorly named private prop for this value
1089
1090
  this._enabled = true;
1090
1091
  this.metadata = metadata;
1091
- // TODO: fix in the splitter package and remove
1092
- // move the splitbar HTML element between the two panes to keep the visial tabbing order in tact
1093
- const splitbar = this.metadata.host.querySelector('.k-splitbar');
1094
- if (isPresent(splitbar) && isPresent(splitbar.previousElementSibling) && isPresent(splitbar.after)) {
1095
- splitbar.after(splitbar.previousElementSibling);
1092
+ this.bar = this.metadata.host.querySelector('.k-splitbar');
1093
+ // Demote first TreeList cell so bar is the natural tab target
1094
+ // Cell will get tabindex="0" when it's actually focused
1095
+ const firstCell = this.metadata.treeListElement.querySelector('[tabindex="0"]');
1096
+ if (isPresent(firstCell)) {
1097
+ this.renderer.setAttribute(firstCell, 'tabindex', '-1');
1096
1098
  }
1097
1099
  this.zone.runOutsideAngular(() => {
1098
1100
  this.eventListenerDisposers = [
1099
1101
  this.renderer.listen(this.metadata.treeListElement, 'mousedown', this.focusTreeList.bind(this)),
1100
1102
  this.renderer.listen(this.metadata.treeListElement, 'focusin', this.handleTreeListFocusIn.bind(this)),
1103
+ this.renderer.listen(this.metadata.treeListElement, 'focusout', this.handleTreeListFocusOut.bind(this)),
1101
1104
  this.renderer.listen(this.metadata.timelineElement, 'mousedown', this.handleTimelineMousedown.bind(this)),
1102
1105
  this.renderer.listen(this.metadata.timelineElement, 'focusin', this.handleTimelineFocusIn.bind(this)),
1103
- this.renderer.listen(this.metadata.timelineElement, 'focusout', this.handleTimelineFocusOut.bind(this))
1106
+ this.renderer.listen(this.metadata.timelineElement, 'focusout', this.handleTimelineFocusOut.bind(this)),
1107
+ // Intercept Tab from splitter bar to manually focus TreeList
1108
+ this.renderer.listen(this.bar, 'keydown', this.handleSplitterBarKeydown.bind(this))
1104
1109
  ];
1105
1110
  });
1106
1111
  }
@@ -1162,9 +1167,17 @@ class NavigationService {
1162
1167
  }
1163
1168
  /**
1164
1169
  * Updates the timeline focus state flag and notifies the active task to update its focused state.
1170
+ * Restore bar to tab order when focus leaves Timeline.
1165
1171
  */
1166
1172
  handleTimelineFocusOut({ relatedTarget }) {
1167
1173
  this.isTimelineFocused = this.metadata.timelineElement.contains(relatedTarget);
1174
+ // Restore bar to tab order when focus leaves Timeline to areas outside the Gantt
1175
+ if (!this.metadata.timelineElement.contains(relatedTarget) &&
1176
+ !this.metadata.treeListElement.contains(relatedTarget)) {
1177
+ if (this.bar) {
1178
+ this.renderer.setAttribute(this.bar, 'tabindex', '0');
1179
+ }
1180
+ }
1168
1181
  // update the task element only if the new focus target is not in the Timeline - focus change between tasks is handled in the focusin handler
1169
1182
  if (!isTask(relatedTarget, this.metadata.timelineElement)) {
1170
1183
  this.notifyTaskStatusChange();
@@ -1179,6 +1192,10 @@ class NavigationService {
1179
1192
  handleTreeListFocusIn(event) {
1180
1193
  this.treeListLastActive = true;
1181
1194
  this.timelineLastActive = false;
1195
+ // Hide bar from tab order while TreeList is focused, so Tab goes to Timeline
1196
+ if (this.bar) {
1197
+ this.renderer.setAttribute(this.bar, 'tabindex', '-1');
1198
+ }
1182
1199
  // if the previous focus target was in the TreeList, rely on its component navigation and just record the focused item index
1183
1200
  if (this.metadata.treeListElement.contains(event.relatedTarget)) {
1184
1201
  const { colIndex, rowIndex } = this.metadata.treeList.activeCell;
@@ -1196,6 +1213,24 @@ class NavigationService {
1196
1213
  this.scrollSyncService.syncScrollTop('treelist', 'timeline');
1197
1214
  }
1198
1215
  }
1216
+ /**
1217
+ * Handle focus leaving TreeList.
1218
+ * Restore bar to tab order and demote the cell when focus leaves TreeList.
1219
+ */
1220
+ handleTreeListFocusOut(event) {
1221
+ // Demote the active TreeList cell when focus leaves
1222
+ const activeCell = this.metadata.treeListElement.querySelector('[tabindex="0"]');
1223
+ if (activeCell) {
1224
+ this.renderer.setAttribute(activeCell, 'tabindex', '-1');
1225
+ }
1226
+ // Restore bar to tab order when focus leaves TreeList to areas outside (not to Timeline)
1227
+ if (!this.metadata.timelineElement.contains(event.relatedTarget) &&
1228
+ !this.metadata.treeListElement.contains(event.relatedTarget)) {
1229
+ if (this.bar) {
1230
+ this.renderer.setAttribute(this.bar, 'tabindex', '0');
1231
+ }
1232
+ }
1233
+ }
1199
1234
  updateActiveTimeLineIndex(index) {
1200
1235
  this.activeTimelineIndex = index;
1201
1236
  }
@@ -1246,6 +1281,19 @@ class NavigationService {
1246
1281
  focusTreeList() {
1247
1282
  this.metadata.treeList.focus();
1248
1283
  }
1284
+ /**
1285
+ * Intercept Tab key on splitter bar to focus the TreeList.
1286
+ * Since TreeList first cell has tabindex="-1", Tab from bar won't naturally focus it.
1287
+ * This handler manually focuses the cell and prevents default Tab to avoid jumping to Timeline.
1288
+ */
1289
+ handleSplitterBarKeydown(event) {
1290
+ if (event.key === 'Tab' && !event.shiftKey) {
1291
+ event.preventDefault();
1292
+ // Call focusCell to update tracking and focus the DOM
1293
+ // The TreeList handles setting proper tabindex on the focused cell
1294
+ this.focusCell(this.activeTreeListCell.rowIndex, this.activeTreeListCell.colIndex);
1295
+ }
1296
+ }
1249
1297
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: NavigationService, deps: [{ token: i0.NgZone }, { token: i0.Renderer2 }, { token: ScrollSyncService }], target: i0.ɵɵFactoryTarget.Injectable });
1250
1298
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: NavigationService });
1251
1299
  }
@@ -67,6 +67,7 @@ export declare class NavigationService implements OnDestroy {
67
67
  */
68
68
  private timelineLastActive;
69
69
  private metadata;
70
+ private bar;
70
71
  private _enabled;
71
72
  private _activeTimelineIndex;
72
73
  private _activeTreeListCell;
@@ -95,6 +96,7 @@ export declare class NavigationService implements OnDestroy {
95
96
  handleTimelineFocusIn({ target }: FocusEvent): void;
96
97
  /**
97
98
  * Updates the timeline focus state flag and notifies the active task to update its focused state.
99
+ * Restore bar to tab order when focus leaves Timeline.
98
100
  */
99
101
  handleTimelineFocusOut({ relatedTarget }: FocusEvent): void;
100
102
  /**
@@ -104,6 +106,11 @@ export declare class NavigationService implements OnDestroy {
104
106
  * when navigating in the Timeline has updated the expected TreeList focus target.
105
107
  */
106
108
  handleTreeListFocusIn(event: FocusEvent): void;
109
+ /**
110
+ * Handle focus leaving TreeList.
111
+ * Restore bar to tab order and demote the cell when focus leaves TreeList.
112
+ */
113
+ handleTreeListFocusOut(event: FocusEvent): void;
107
114
  updateActiveTimeLineIndex(index: number): void;
108
115
  updateActiveTreeListCell(): void;
109
116
  /**
@@ -125,6 +132,12 @@ export declare class NavigationService implements OnDestroy {
125
132
  * Otherwise cell clicks are wrongly overwritten in `handleTreeListFocusIn` and the click focus target is not respected.
126
133
  */
127
134
  private focusTreeList;
135
+ /**
136
+ * Intercept Tab key on splitter bar to focus the TreeList.
137
+ * Since TreeList first cell has tabindex="-1", Tab from bar won't naturally focus it.
138
+ * This handler manually focuses the cell and prevents default Tab to avoid jumping to Timeline.
139
+ */
140
+ private handleSplitterBarKeydown;
128
141
  static ɵfac: i0.ɵɵFactoryDeclaration<NavigationService, never>;
129
142
  static ɵprov: i0.ɵɵInjectableDeclaration<NavigationService>;
130
143
  }
@@ -7,7 +7,7 @@ export const packageMetadata = {
7
7
  "productCodes": [
8
8
  "KENDOUIANGULAR"
9
9
  ],
10
- "publishDate": 1783409430,
11
- "version": "24.2.2-develop.8",
10
+ "publishDate": 1783411233,
11
+ "version": "24.2.2-develop.9",
12
12
  "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"
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-gantt",
3
- "version": "24.2.2-develop.8",
3
+ "version": "24.2.2-develop.9",
4
4
  "description": "Kendo UI Angular Gantt",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -41,7 +41,7 @@
41
41
  "package": {
42
42
  "productName": "Kendo UI for Angular",
43
43
  "productCode": "KENDOUIANGULAR",
44
- "publishDate": 1783409430,
44
+ "publishDate": 1783411233,
45
45
  "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"
46
46
  }
47
47
  },
@@ -53,25 +53,25 @@
53
53
  "@angular/platform-browser": "19 - 22",
54
54
  "@progress/kendo-data-query": "^1.7.3",
55
55
  "@progress/kendo-licensing": "^1.11.0",
56
- "@progress/kendo-angular-buttons": "24.2.2-develop.8",
57
- "@progress/kendo-angular-common": "24.2.2-develop.8",
58
- "@progress/kendo-angular-dialog": "24.2.2-develop.8",
59
- "@progress/kendo-angular-dropdowns": "24.2.2-develop.8",
60
- "@progress/kendo-angular-grid": "24.2.2-develop.8",
61
- "@progress/kendo-angular-icons": "24.2.2-develop.8",
62
- "@progress/kendo-angular-inputs": "24.2.2-develop.8",
63
- "@progress/kendo-angular-intl": "24.2.2-develop.8",
64
- "@progress/kendo-angular-l10n": "24.2.2-develop.8",
65
- "@progress/kendo-angular-label": "24.2.2-develop.8",
66
- "@progress/kendo-angular-layout": "24.2.2-develop.8",
67
- "@progress/kendo-angular-popup": "24.2.2-develop.8",
68
- "@progress/kendo-angular-tooltip": "24.2.2-develop.8",
69
- "@progress/kendo-angular-treelist": "24.2.2-develop.8",
56
+ "@progress/kendo-angular-buttons": "24.2.2-develop.9",
57
+ "@progress/kendo-angular-common": "24.2.2-develop.9",
58
+ "@progress/kendo-angular-dialog": "24.2.2-develop.9",
59
+ "@progress/kendo-angular-dropdowns": "24.2.2-develop.9",
60
+ "@progress/kendo-angular-grid": "24.2.2-develop.9",
61
+ "@progress/kendo-angular-icons": "24.2.2-develop.9",
62
+ "@progress/kendo-angular-inputs": "24.2.2-develop.9",
63
+ "@progress/kendo-angular-intl": "24.2.2-develop.9",
64
+ "@progress/kendo-angular-l10n": "24.2.2-develop.9",
65
+ "@progress/kendo-angular-label": "24.2.2-develop.9",
66
+ "@progress/kendo-angular-layout": "24.2.2-develop.9",
67
+ "@progress/kendo-angular-popup": "24.2.2-develop.9",
68
+ "@progress/kendo-angular-tooltip": "24.2.2-develop.9",
69
+ "@progress/kendo-angular-treelist": "24.2.2-develop.9",
70
70
  "rxjs": "^6.5.3 || ^7.0.0"
71
71
  },
72
72
  "dependencies": {
73
73
  "tslib": "^2.3.1",
74
- "@progress/kendo-angular-schematics": "24.2.2-develop.8",
74
+ "@progress/kendo-angular-schematics": "24.2.2-develop.9",
75
75
  "@progress/kendo-common": "^1.0.1",
76
76
  "@progress/kendo-date-math": "^1.5.2",
77
77
  "@progress/kendo-draggable": "^3.0.0"
@@ -12,16 +12,16 @@ function default_1(options) {
12
12
  // See https://github.com/telerik/kendo-schematics/issues/28
13
13
  peerDependencies: {
14
14
  // peer deps of the treelist
15
- '@progress/kendo-angular-dateinputs': '24.2.2-develop.8',
16
- '@progress/kendo-angular-excel-export': '24.2.2-develop.8',
17
- '@progress/kendo-angular-pdf-export': '24.2.2-develop.8',
18
- '@progress/kendo-angular-utils': '24.2.2-develop.8',
15
+ '@progress/kendo-angular-dateinputs': '24.2.2-develop.9',
16
+ '@progress/kendo-angular-excel-export': '24.2.2-develop.9',
17
+ '@progress/kendo-angular-pdf-export': '24.2.2-develop.9',
18
+ '@progress/kendo-angular-utils': '24.2.2-develop.9',
19
19
  '@progress/kendo-drawing': '^1.0.0',
20
20
  // peer deps of the dropdowns
21
- '@progress/kendo-angular-treeview': '24.2.2-develop.8',
22
- '@progress/kendo-angular-navigation': '24.2.2-develop.8',
21
+ '@progress/kendo-angular-treeview': '24.2.2-develop.9',
22
+ '@progress/kendo-angular-navigation': '24.2.2-develop.9',
23
23
  // peer dep of the layout
24
- '@progress/kendo-angular-progressbar': '24.2.2-develop.8',
24
+ '@progress/kendo-angular-progressbar': '24.2.2-develop.9',
25
25
  // peer dep of the icons
26
26
  '@progress/kendo-svg-icons': '^4.0.0'
27
27
  } });