@progress/kendo-angular-toolbar 18.1.0-develop.9 → 18.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1738339351,
14
- version: '18.1.0-develop.9',
13
+ publishDate: 1739287067,
14
+ version: '18.1.0',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
16
16
  };
@@ -68,6 +68,9 @@ export class ScrollService {
68
68
  }
69
69
  this.toggleScrollButtonsState();
70
70
  }
71
+ updateScrollPosition(element) {
72
+ this.position = element.scrollLeft;
73
+ }
71
74
  calculateListPosition(direction, scrollSpeed) {
72
75
  if (direction === 'prev') {
73
76
  if (!this.localization.rtl) {
@@ -79,7 +82,12 @@ export class ScrollService {
79
82
  }
80
83
  else if (direction === 'next' && this.position < this.scrollContainerOverflowSize) {
81
84
  if (this.position + scrollSpeed > this.scrollContainerOverflowSize) {
82
- this.position = this.scrollContainerOverflowSize;
85
+ if (this.localization.rtl) {
86
+ this.position = -this.scrollContainerOverflowSize;
87
+ }
88
+ else {
89
+ this.position = this.scrollContainerOverflowSize;
90
+ }
83
91
  return;
84
92
  }
85
93
  if (this.localization.rtl) {
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, ElementRef, HostBinding, Input, Renderer2, NgZone, Output, EventEmitter, HostListener } from '@angular/core';
5
+ import { Component, ElementRef, HostBinding, Input, Renderer2, NgZone, Output, EventEmitter } from '@angular/core';
6
6
  import { Subscription } from 'rxjs';
7
7
  import { caretAltLeftIcon, caretAltRightIcon } from '@progress/kendo-svg-icons';
8
8
  import { LocalizationService } from '@progress/kendo-angular-l10n';
@@ -27,13 +27,6 @@ export class ToolbarScrollableButtonComponent {
27
27
  get nextClass() {
28
28
  return !this.prev;
29
29
  }
30
- /**
31
- * @hidden
32
- */
33
- onMouseDown(ev) {
34
- ev.preventDefault();
35
- ev.stopImmediatePropagation();
36
- }
37
30
  role = 'button';
38
31
  prev = false;
39
32
  overflow;
@@ -114,7 +107,7 @@ export class ToolbarScrollableButtonComponent {
114
107
  }
115
108
  }
116
109
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ToolbarScrollableButtonComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
117
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToolbarScrollableButtonComponent, isStandalone: true, selector: "[kendoToolbarScrollableButton]", inputs: { prev: "prev", overflow: "overflow" }, outputs: { onClick: "onClick" }, host: { listeners: { "mousedown": "onMouseDown($event)" }, properties: { "class.k-toolbar-prev": "this.prevClass", "class.k-toolbar-next": "this.nextClass", "attr.role": "this.role" } }, ngImport: i0, template: `
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToolbarScrollableButtonComponent, isStandalone: true, selector: "[kendoToolbarScrollableButton]", inputs: { prev: "prev", overflow: "overflow" }, outputs: { onClick: "onClick" }, host: { properties: { "class.k-toolbar-prev": "this.prevClass", "class.k-toolbar-next": "this.nextClass", "attr.role": "this.role" } }, ngImport: i0, template: `
118
111
  <kendo-icon-wrapper
119
112
  [name]="iconClass"
120
113
  [customFontClass]="customIconClass"
@@ -147,9 +140,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
147
140
  }], nextClass: [{
148
141
  type: HostBinding,
149
142
  args: ['class.k-toolbar-next']
150
- }], onMouseDown: [{
151
- type: HostListener,
152
- args: ['mousedown', ['$event']]
153
143
  }], role: [{
154
144
  type: HostBinding,
155
145
  args: ['attr.role']
@@ -64,13 +64,20 @@ export class ToolBarComponent {
64
64
  * @default false
65
65
  */
66
66
  set overflow(overflow) {
67
+ if (this.isScrollMode) {
68
+ this.removeSubscriptions(['scrollButtonStateChangeSub', 'scrollContainerScrollSub']);
69
+ }
67
70
  this._overflow = overflow;
71
+ if (this.isScrollMode) {
72
+ this.handleScrollModeUpdates();
73
+ }
74
+ this.setScrollableOverlayClasses();
68
75
  this.zone.onStable.pipe(take(1)).subscribe(() => this.onResize());
69
76
  }
70
77
  get overflow() {
71
78
  return this._overflow;
72
79
  }
73
- get show() {
80
+ get showScrollButtons() {
74
81
  const buttonsVisibility = this.normalizedOverflow.scrollButtons;
75
82
  const showAuto = buttonsVisibility === 'auto' && this.showAutoButtons;
76
83
  const showAlways = buttonsVisibility === 'visible';
@@ -247,6 +254,8 @@ export class ToolBarComponent {
247
254
  _fillMode = DEFAULT_FILL_MODE;
248
255
  overflowButtonClickedTime = null;
249
256
  showAutoButtons = false;
257
+ scrollButtonStateChangeSub;
258
+ scrollContainerScrollSub;
250
259
  /**
251
260
  * @hidden
252
261
  */
@@ -255,10 +264,15 @@ export class ToolBarComponent {
255
264
  }
256
265
  subscriptions = new Subscription();
257
266
  popupSubs = new Subscription();
267
+ focusedByPointer = false;
258
268
  /**
259
269
  * @hidden
260
270
  */
261
271
  onFocus(ev) {
272
+ if (this.focusedByPointer) {
273
+ this.focusedByPointer = false;
274
+ return;
275
+ }
262
276
  this.navigationService.resetNavigation();
263
277
  this.navigationService.focusFirst(ev);
264
278
  // prevents ExpressionChangedAfterItHasBeenCheckedError when tools with popup are opened/closed asynchronously
@@ -379,37 +393,13 @@ export class ToolBarComponent {
379
393
  });
380
394
  }
381
395
  if (this.isScrollMode) {
382
- if (this.show) {
383
- if (this.normalizedOverflow.scrollButtons === 'visible' && !this.scrollService.toolsOverflow) {
384
- this.renderer.addClass(this.nextScrollButton.nativeElement, 'k-disabled');
385
- this.renderer.addClass(this.prevScrollButton.nativeElement, 'k-disabled');
386
- }
387
- else {
388
- const buttonToDisable = this.direction === 'rtl' ? this.nextScrollButton : this.prevScrollButton;
389
- this.renderer.addClass(buttonToDisable.nativeElement, 'k-disabled');
390
- }
391
- }
392
- if (this.hasScrollButtons.visible) {
393
- this.subscriptions.add(this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
394
- if (this.show) {
395
- const action = activeButtonSettings.active ? 'remove' : 'add';
396
- const scrollButton = this[`${activeButtonSettings.buttonType}ScrollButton`].nativeElement;
397
- this.renderer[`${action}Class`](scrollButton, 'k-disabled');
398
- action === 'add' && this[`${activeButtonSettings.buttonType}ScrollButton`].nativeElement.blur();
399
- }
400
- }));
401
- }
402
- this.zone.runOutsideAngular(() => {
403
- this.subscriptions.add(this.renderer.listen(this.scrollContainer.nativeElement, 'scroll', (e) => {
404
- if (!this.hasScrollButtons.visible) {
405
- this.setScrollableOverlayClasses();
406
- }
407
- else {
408
- this.scrollService.onScroll(e);
409
- }
410
- }));
411
- });
396
+ this.handleScrollModeUpdates();
412
397
  }
398
+ this.subscriptions.add(this.renderer.listen(this.element.nativeElement, 'pointerdown', (ev) => {
399
+ if (!ev.target.closest('.k-toolbar-items')) {
400
+ this.focusedByPointer = true;
401
+ }
402
+ }));
413
403
  this.navigationService.setRenderedTools(this.toolsService.renderedTools);
414
404
  const stylingOptions = ['size', 'fillMode'];
415
405
  stylingOptions.forEach(option => {
@@ -897,7 +887,7 @@ export class ToolBarComponent {
897
887
  }
898
888
  const scrollOffset = container.scrollLeft;
899
889
  const defaultOffset = 1;
900
- if (this.scrollService.toolsOverflow) {
890
+ if (this.scrollService.toolsOverflow && !this.hasScrollButtons.visible) {
901
891
  this.renderer.addClass(wrapper, 'k-toolbar-scrollable-overlay');
902
892
  if (scrollOffset === 0) {
903
893
  this.renderer.removeClass(wrapper, 'k-toolbar-scrollable-end');
@@ -918,6 +908,51 @@ export class ToolBarComponent {
918
908
  this.renderer.removeClass(wrapper, 'k-toolbar-scrollable-start');
919
909
  }
920
910
  }
911
+ handleScrollModeUpdates() {
912
+ if (isPresent(this.scrollContainer)) {
913
+ this.scrollService.updateScrollPosition(this.scrollContainer.nativeElement);
914
+ this.zone.runOutsideAngular(() => {
915
+ this.scrollContainerScrollSub = this.renderer.listen(this.scrollContainer.nativeElement, 'scroll', (e) => {
916
+ if (!this.hasScrollButtons.visible) {
917
+ this.setScrollableOverlayClasses();
918
+ }
919
+ else {
920
+ this.scrollService.onScroll(e);
921
+ }
922
+ });
923
+ this.subscriptions.add(this.scrollContainerScrollSub);
924
+ });
925
+ }
926
+ if (this.showScrollButtons && this.nextScrollButton && this.prevScrollButton) {
927
+ if (this.normalizedOverflow.scrollButtons === 'visible' && !this.scrollService.toolsOverflow) {
928
+ this.renderer.addClass(this.nextScrollButton.nativeElement, 'k-disabled');
929
+ this.renderer.addClass(this.prevScrollButton.nativeElement, 'k-disabled');
930
+ }
931
+ else {
932
+ const buttonToDisable = this.direction === 'rtl' ? this.nextScrollButton : this.prevScrollButton;
933
+ this.renderer.addClass(buttonToDisable.nativeElement, 'k-disabled');
934
+ }
935
+ }
936
+ if (this.hasScrollButtons.visible) {
937
+ this.scrollButtonStateChangeSub = this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
938
+ if (this.showScrollButtons) {
939
+ const action = activeButtonSettings.active ? 'remove' : 'add';
940
+ const scrollButton = this[`${activeButtonSettings.buttonType}ScrollButton`]?.nativeElement;
941
+ scrollButton && this.renderer[`${action}Class`](scrollButton, 'k-disabled');
942
+ }
943
+ });
944
+ this.subscriptions.add(this.scrollButtonStateChangeSub);
945
+ this.scrollService.toggleScrollButtonsState();
946
+ }
947
+ }
948
+ removeSubscriptions(subsToRemove) {
949
+ subsToRemove.forEach((sub) => {
950
+ if (this[sub]) {
951
+ this.subscriptions.remove(this[sub]);
952
+ this[sub] = null;
953
+ }
954
+ });
955
+ }
921
956
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ToolBarComponent, deps: [{ token: i1.LocalizationService }, { token: i2.PopupService }, { token: i3.RefreshService }, { token: i4.NavigationService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i5.ToolbarToolsService }, { token: i6.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
922
957
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToolBarComponent, isStandalone: true, selector: "kendo-toolbar", inputs: { overflow: "overflow", resizable: "resizable", popupSettings: "popupSettings", fillMode: "fillMode", tabindex: "tabindex", size: "size", tabIndex: "tabIndex" }, outputs: { open: "open", close: "close" }, host: { listeners: { "focus": "onFocus($event)", "focusout": "onFocusOut($event)" }, properties: { "class.k-toolbar": "this.hostClass", "class.k-toolbar-scrollable": "this.scrollableClass", "class.k-toolbar-section": "this.sectionClass", "attr.role": "this.role", "attr.dir": "this.getDir", "class.k-toolbar-resizable": "this.resizableClass" } }, providers: [
923
958
  RefreshService,
@@ -941,7 +976,7 @@ export class ToolBarComponent {
941
976
  nextToolButton="Scroll right"
942
977
  >
943
978
  </ng-container>
944
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
979
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
945
980
  <span *ngIf="hasScrollButtons.position === 'split'" #prevScrollButton
946
981
  kendoToolbarScrollableButton
947
982
  [prev]="true"
@@ -985,7 +1020,7 @@ export class ToolBarComponent {
985
1020
  </div>
986
1021
  <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
987
1022
  </ng-container>
988
- <div class="k-toolbar-items k-toolbar-items-scroll" *ngIf="isScrollMode; else noScroll" #scrollContainer>
1023
+ <div class="k-toolbar-items k-toolbar-items-scroll" tabindex="-1" *ngIf="isScrollMode; else noScroll" #scrollContainer>
989
1024
  <ng-container *ngFor="let tool of allTools; let index = index"
990
1025
  kendoToolbarRenderer
991
1026
  [tool]="tool"
@@ -1037,8 +1072,8 @@ export class ToolBarComponent {
1037
1072
  (click)="showPopup()"
1038
1073
  >
1039
1074
  </button>
1040
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
1041
- <div class="k-toolbar-separator k-toolbar-button-separator k-separator"></div>
1075
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
1076
+ <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
1042
1077
  <span *ngIf="hasScrollButtons.position === 'split'" #nextScrollButton
1043
1078
  kendoToolbarScrollableButton
1044
1079
  [prev]="false"
@@ -1157,7 +1192,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1157
1192
  nextToolButton="Scroll right"
1158
1193
  >
1159
1194
  </ng-container>
1160
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
1195
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
1161
1196
  <span *ngIf="hasScrollButtons.position === 'split'" #prevScrollButton
1162
1197
  kendoToolbarScrollableButton
1163
1198
  [prev]="true"
@@ -1201,7 +1236,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1201
1236
  </div>
1202
1237
  <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
1203
1238
  </ng-container>
1204
- <div class="k-toolbar-items k-toolbar-items-scroll" *ngIf="isScrollMode; else noScroll" #scrollContainer>
1239
+ <div class="k-toolbar-items k-toolbar-items-scroll" tabindex="-1" *ngIf="isScrollMode; else noScroll" #scrollContainer>
1205
1240
  <ng-container *ngFor="let tool of allTools; let index = index"
1206
1241
  kendoToolbarRenderer
1207
1242
  [tool]="tool"
@@ -1253,8 +1288,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1253
1288
  (click)="showPopup()"
1254
1289
  >
1255
1290
  </button>
1256
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
1257
- <div class="k-toolbar-separator k-toolbar-button-separator k-separator"></div>
1291
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
1292
+ <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
1258
1293
  <span *ngIf="hasScrollButtons.position === 'split'" #nextScrollButton
1259
1294
  kendoToolbarScrollableButton
1260
1295
  [prev]="false"
@@ -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 * as i0 from '@angular/core';
6
- import { EventEmitter, Injectable, inject, ElementRef, Directive, ViewChild, Input, Output, forwardRef, Component, HostBinding, HostListener, ViewContainerRef, ContentChildren, isDevMode, ViewChildren, NgModule } from '@angular/core';
6
+ import { EventEmitter, Injectable, inject, ElementRef, Directive, ViewChild, Input, Output, forwardRef, Component, HostBinding, ViewContainerRef, ContentChildren, HostListener, isDevMode, ViewChildren, NgModule } from '@angular/core';
7
7
  import * as i2 from '@progress/kendo-angular-popup';
8
8
  import { PopupService } from '@progress/kendo-angular-popup';
9
9
  import { Keys, isDocumentAvailable, guid, ResizeSensorComponent, ResizeBatchService } from '@progress/kendo-angular-common';
@@ -25,8 +25,8 @@ const packageMetadata = {
25
25
  productName: 'Kendo UI for Angular',
26
26
  productCode: 'KENDOUIANGULAR',
27
27
  productCodes: ['KENDOUIANGULAR'],
28
- publishDate: 1738339351,
29
- version: '18.1.0-develop.9',
28
+ publishDate: 1739287067,
29
+ version: '18.1.0',
30
30
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
31
31
  };
32
32
 
@@ -868,6 +868,9 @@ class ScrollService {
868
868
  }
869
869
  this.toggleScrollButtonsState();
870
870
  }
871
+ updateScrollPosition(element) {
872
+ this.position = element.scrollLeft;
873
+ }
871
874
  calculateListPosition(direction, scrollSpeed) {
872
875
  if (direction === 'prev') {
873
876
  if (!this.localization.rtl) {
@@ -879,7 +882,12 @@ class ScrollService {
879
882
  }
880
883
  else if (direction === 'next' && this.position < this.scrollContainerOverflowSize) {
881
884
  if (this.position + scrollSpeed > this.scrollContainerOverflowSize) {
882
- this.position = this.scrollContainerOverflowSize;
885
+ if (this.localization.rtl) {
886
+ this.position = -this.scrollContainerOverflowSize;
887
+ }
888
+ else {
889
+ this.position = this.scrollContainerOverflowSize;
890
+ }
883
891
  return;
884
892
  }
885
893
  if (this.localization.rtl) {
@@ -919,13 +927,6 @@ class ToolbarScrollableButtonComponent {
919
927
  get nextClass() {
920
928
  return !this.prev;
921
929
  }
922
- /**
923
- * @hidden
924
- */
925
- onMouseDown(ev) {
926
- ev.preventDefault();
927
- ev.stopImmediatePropagation();
928
- }
929
930
  role = 'button';
930
931
  prev = false;
931
932
  overflow;
@@ -1006,7 +1007,7 @@ class ToolbarScrollableButtonComponent {
1006
1007
  }
1007
1008
  }
1008
1009
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ToolbarScrollableButtonComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
1009
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToolbarScrollableButtonComponent, isStandalone: true, selector: "[kendoToolbarScrollableButton]", inputs: { prev: "prev", overflow: "overflow" }, outputs: { onClick: "onClick" }, host: { listeners: { "mousedown": "onMouseDown($event)" }, properties: { "class.k-toolbar-prev": "this.prevClass", "class.k-toolbar-next": "this.nextClass", "attr.role": "this.role" } }, ngImport: i0, template: `
1010
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToolbarScrollableButtonComponent, isStandalone: true, selector: "[kendoToolbarScrollableButton]", inputs: { prev: "prev", overflow: "overflow" }, outputs: { onClick: "onClick" }, host: { properties: { "class.k-toolbar-prev": "this.prevClass", "class.k-toolbar-next": "this.nextClass", "attr.role": "this.role" } }, ngImport: i0, template: `
1010
1011
  <kendo-icon-wrapper
1011
1012
  [name]="iconClass"
1012
1013
  [customFontClass]="customIconClass"
@@ -1039,9 +1040,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1039
1040
  }], nextClass: [{
1040
1041
  type: HostBinding,
1041
1042
  args: ['class.k-toolbar-next']
1042
- }], onMouseDown: [{
1043
- type: HostListener,
1044
- args: ['mousedown', ['$event']]
1045
1043
  }], role: [{
1046
1044
  type: HostBinding,
1047
1045
  args: ['attr.role']
@@ -1084,13 +1082,20 @@ class ToolBarComponent {
1084
1082
  * @default false
1085
1083
  */
1086
1084
  set overflow(overflow) {
1085
+ if (this.isScrollMode) {
1086
+ this.removeSubscriptions(['scrollButtonStateChangeSub', 'scrollContainerScrollSub']);
1087
+ }
1087
1088
  this._overflow = overflow;
1089
+ if (this.isScrollMode) {
1090
+ this.handleScrollModeUpdates();
1091
+ }
1092
+ this.setScrollableOverlayClasses();
1088
1093
  this.zone.onStable.pipe(take(1)).subscribe(() => this.onResize());
1089
1094
  }
1090
1095
  get overflow() {
1091
1096
  return this._overflow;
1092
1097
  }
1093
- get show() {
1098
+ get showScrollButtons() {
1094
1099
  const buttonsVisibility = this.normalizedOverflow.scrollButtons;
1095
1100
  const showAuto = buttonsVisibility === 'auto' && this.showAutoButtons;
1096
1101
  const showAlways = buttonsVisibility === 'visible';
@@ -1267,6 +1272,8 @@ class ToolBarComponent {
1267
1272
  _fillMode = DEFAULT_FILL_MODE;
1268
1273
  overflowButtonClickedTime = null;
1269
1274
  showAutoButtons = false;
1275
+ scrollButtonStateChangeSub;
1276
+ scrollContainerScrollSub;
1270
1277
  /**
1271
1278
  * @hidden
1272
1279
  */
@@ -1275,10 +1282,15 @@ class ToolBarComponent {
1275
1282
  }
1276
1283
  subscriptions = new Subscription();
1277
1284
  popupSubs = new Subscription();
1285
+ focusedByPointer = false;
1278
1286
  /**
1279
1287
  * @hidden
1280
1288
  */
1281
1289
  onFocus(ev) {
1290
+ if (this.focusedByPointer) {
1291
+ this.focusedByPointer = false;
1292
+ return;
1293
+ }
1282
1294
  this.navigationService.resetNavigation();
1283
1295
  this.navigationService.focusFirst(ev);
1284
1296
  // prevents ExpressionChangedAfterItHasBeenCheckedError when tools with popup are opened/closed asynchronously
@@ -1399,37 +1411,13 @@ class ToolBarComponent {
1399
1411
  });
1400
1412
  }
1401
1413
  if (this.isScrollMode) {
1402
- if (this.show) {
1403
- if (this.normalizedOverflow.scrollButtons === 'visible' && !this.scrollService.toolsOverflow) {
1404
- this.renderer.addClass(this.nextScrollButton.nativeElement, 'k-disabled');
1405
- this.renderer.addClass(this.prevScrollButton.nativeElement, 'k-disabled');
1406
- }
1407
- else {
1408
- const buttonToDisable = this.direction === 'rtl' ? this.nextScrollButton : this.prevScrollButton;
1409
- this.renderer.addClass(buttonToDisable.nativeElement, 'k-disabled');
1410
- }
1411
- }
1412
- if (this.hasScrollButtons.visible) {
1413
- this.subscriptions.add(this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
1414
- if (this.show) {
1415
- const action = activeButtonSettings.active ? 'remove' : 'add';
1416
- const scrollButton = this[`${activeButtonSettings.buttonType}ScrollButton`].nativeElement;
1417
- this.renderer[`${action}Class`](scrollButton, 'k-disabled');
1418
- action === 'add' && this[`${activeButtonSettings.buttonType}ScrollButton`].nativeElement.blur();
1419
- }
1420
- }));
1421
- }
1422
- this.zone.runOutsideAngular(() => {
1423
- this.subscriptions.add(this.renderer.listen(this.scrollContainer.nativeElement, 'scroll', (e) => {
1424
- if (!this.hasScrollButtons.visible) {
1425
- this.setScrollableOverlayClasses();
1426
- }
1427
- else {
1428
- this.scrollService.onScroll(e);
1429
- }
1430
- }));
1431
- });
1414
+ this.handleScrollModeUpdates();
1432
1415
  }
1416
+ this.subscriptions.add(this.renderer.listen(this.element.nativeElement, 'pointerdown', (ev) => {
1417
+ if (!ev.target.closest('.k-toolbar-items')) {
1418
+ this.focusedByPointer = true;
1419
+ }
1420
+ }));
1433
1421
  this.navigationService.setRenderedTools(this.toolsService.renderedTools);
1434
1422
  const stylingOptions = ['size', 'fillMode'];
1435
1423
  stylingOptions.forEach(option => {
@@ -1917,7 +1905,7 @@ class ToolBarComponent {
1917
1905
  }
1918
1906
  const scrollOffset = container.scrollLeft;
1919
1907
  const defaultOffset = 1;
1920
- if (this.scrollService.toolsOverflow) {
1908
+ if (this.scrollService.toolsOverflow && !this.hasScrollButtons.visible) {
1921
1909
  this.renderer.addClass(wrapper, 'k-toolbar-scrollable-overlay');
1922
1910
  if (scrollOffset === 0) {
1923
1911
  this.renderer.removeClass(wrapper, 'k-toolbar-scrollable-end');
@@ -1938,6 +1926,51 @@ class ToolBarComponent {
1938
1926
  this.renderer.removeClass(wrapper, 'k-toolbar-scrollable-start');
1939
1927
  }
1940
1928
  }
1929
+ handleScrollModeUpdates() {
1930
+ if (isPresent(this.scrollContainer)) {
1931
+ this.scrollService.updateScrollPosition(this.scrollContainer.nativeElement);
1932
+ this.zone.runOutsideAngular(() => {
1933
+ this.scrollContainerScrollSub = this.renderer.listen(this.scrollContainer.nativeElement, 'scroll', (e) => {
1934
+ if (!this.hasScrollButtons.visible) {
1935
+ this.setScrollableOverlayClasses();
1936
+ }
1937
+ else {
1938
+ this.scrollService.onScroll(e);
1939
+ }
1940
+ });
1941
+ this.subscriptions.add(this.scrollContainerScrollSub);
1942
+ });
1943
+ }
1944
+ if (this.showScrollButtons && this.nextScrollButton && this.prevScrollButton) {
1945
+ if (this.normalizedOverflow.scrollButtons === 'visible' && !this.scrollService.toolsOverflow) {
1946
+ this.renderer.addClass(this.nextScrollButton.nativeElement, 'k-disabled');
1947
+ this.renderer.addClass(this.prevScrollButton.nativeElement, 'k-disabled');
1948
+ }
1949
+ else {
1950
+ const buttonToDisable = this.direction === 'rtl' ? this.nextScrollButton : this.prevScrollButton;
1951
+ this.renderer.addClass(buttonToDisable.nativeElement, 'k-disabled');
1952
+ }
1953
+ }
1954
+ if (this.hasScrollButtons.visible) {
1955
+ this.scrollButtonStateChangeSub = this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
1956
+ if (this.showScrollButtons) {
1957
+ const action = activeButtonSettings.active ? 'remove' : 'add';
1958
+ const scrollButton = this[`${activeButtonSettings.buttonType}ScrollButton`]?.nativeElement;
1959
+ scrollButton && this.renderer[`${action}Class`](scrollButton, 'k-disabled');
1960
+ }
1961
+ });
1962
+ this.subscriptions.add(this.scrollButtonStateChangeSub);
1963
+ this.scrollService.toggleScrollButtonsState();
1964
+ }
1965
+ }
1966
+ removeSubscriptions(subsToRemove) {
1967
+ subsToRemove.forEach((sub) => {
1968
+ if (this[sub]) {
1969
+ this.subscriptions.remove(this[sub]);
1970
+ this[sub] = null;
1971
+ }
1972
+ });
1973
+ }
1941
1974
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ToolBarComponent, deps: [{ token: i1.LocalizationService }, { token: i2.PopupService }, { token: RefreshService }, { token: NavigationService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: ToolbarToolsService }, { token: ScrollService }], target: i0.ɵɵFactoryTarget.Component });
1942
1975
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToolBarComponent, isStandalone: true, selector: "kendo-toolbar", inputs: { overflow: "overflow", resizable: "resizable", popupSettings: "popupSettings", fillMode: "fillMode", tabindex: "tabindex", size: "size", tabIndex: "tabIndex" }, outputs: { open: "open", close: "close" }, host: { listeners: { "focus": "onFocus($event)", "focusout": "onFocusOut($event)" }, properties: { "class.k-toolbar": "this.hostClass", "class.k-toolbar-scrollable": "this.scrollableClass", "class.k-toolbar-section": "this.sectionClass", "attr.role": "this.role", "attr.dir": "this.getDir", "class.k-toolbar-resizable": "this.resizableClass" } }, providers: [
1943
1976
  RefreshService,
@@ -1961,7 +1994,7 @@ class ToolBarComponent {
1961
1994
  nextToolButton="Scroll right"
1962
1995
  >
1963
1996
  </ng-container>
1964
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
1997
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
1965
1998
  <span *ngIf="hasScrollButtons.position === 'split'" #prevScrollButton
1966
1999
  kendoToolbarScrollableButton
1967
2000
  [prev]="true"
@@ -2005,7 +2038,7 @@ class ToolBarComponent {
2005
2038
  </div>
2006
2039
  <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
2007
2040
  </ng-container>
2008
- <div class="k-toolbar-items k-toolbar-items-scroll" *ngIf="isScrollMode; else noScroll" #scrollContainer>
2041
+ <div class="k-toolbar-items k-toolbar-items-scroll" tabindex="-1" *ngIf="isScrollMode; else noScroll" #scrollContainer>
2009
2042
  <ng-container *ngFor="let tool of allTools; let index = index"
2010
2043
  kendoToolbarRenderer
2011
2044
  [tool]="tool"
@@ -2057,8 +2090,8 @@ class ToolBarComponent {
2057
2090
  (click)="showPopup()"
2058
2091
  >
2059
2092
  </button>
2060
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
2061
- <div class="k-toolbar-separator k-toolbar-button-separator k-separator"></div>
2093
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
2094
+ <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
2062
2095
  <span *ngIf="hasScrollButtons.position === 'split'" #nextScrollButton
2063
2096
  kendoToolbarScrollableButton
2064
2097
  [prev]="false"
@@ -2177,7 +2210,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2177
2210
  nextToolButton="Scroll right"
2178
2211
  >
2179
2212
  </ng-container>
2180
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
2213
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'start')">
2181
2214
  <span *ngIf="hasScrollButtons.position === 'split'" #prevScrollButton
2182
2215
  kendoToolbarScrollableButton
2183
2216
  [prev]="true"
@@ -2221,7 +2254,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2221
2254
  </div>
2222
2255
  <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
2223
2256
  </ng-container>
2224
- <div class="k-toolbar-items k-toolbar-items-scroll" *ngIf="isScrollMode; else noScroll" #scrollContainer>
2257
+ <div class="k-toolbar-items k-toolbar-items-scroll" tabindex="-1" *ngIf="isScrollMode; else noScroll" #scrollContainer>
2225
2258
  <ng-container *ngFor="let tool of allTools; let index = index"
2226
2259
  kendoToolbarRenderer
2227
2260
  [tool]="tool"
@@ -2273,8 +2306,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2273
2306
  (click)="showPopup()"
2274
2307
  >
2275
2308
  </button>
2276
- <ng-container *ngIf="show && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
2277
- <div class="k-toolbar-separator k-toolbar-button-separator k-separator"></div>
2309
+ <ng-container *ngIf="showScrollButtons && (hasScrollButtons.position === 'split' || hasScrollButtons.position === 'end')">
2310
+ <div class="k-toolbar-separator k-toolbar-button-separator k-separator" #scrollSeparator></div>
2278
2311
  <span *ngIf="hasScrollButtons.position === 'split'" #nextScrollButton
2279
2312
  kendoToolbarScrollableButton
2280
2313
  [prev]="false"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-toolbar",
3
- "version": "18.1.0-develop.9",
3
+ "version": "18.1.0",
4
4
  "description": "Kendo UI Angular Toolbar component - a single UI element that organizes buttons and other navigation elements",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -25,7 +25,7 @@
25
25
  "package": {
26
26
  "productName": "Kendo UI for Angular",
27
27
  "productCode": "KENDOUIANGULAR",
28
- "publishDate": 1738339351,
28
+ "publishDate": 1739287067,
29
29
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
30
30
  }
31
31
  },
@@ -34,17 +34,17 @@
34
34
  "@angular/common": "16 - 19",
35
35
  "@angular/core": "16 - 19",
36
36
  "@angular/platform-browser": "16 - 19",
37
- "@progress/kendo-licensing": "^1.0.2",
38
- "@progress/kendo-angular-buttons": "18.1.0-develop.9",
39
- "@progress/kendo-angular-common": "18.1.0-develop.9",
40
- "@progress/kendo-angular-l10n": "18.1.0-develop.9",
41
- "@progress/kendo-angular-icons": "18.1.0-develop.9",
42
- "@progress/kendo-angular-popup": "18.1.0-develop.9",
37
+ "@progress/kendo-licensing": "^1.4.0",
38
+ "@progress/kendo-angular-buttons": "18.1.0",
39
+ "@progress/kendo-angular-common": "18.1.0",
40
+ "@progress/kendo-angular-l10n": "18.1.0",
41
+ "@progress/kendo-angular-icons": "18.1.0",
42
+ "@progress/kendo-angular-popup": "18.1.0",
43
43
  "rxjs": "^6.5.3 || ^7.0.0"
44
44
  },
45
45
  "dependencies": {
46
46
  "tslib": "^2.3.1",
47
- "@progress/kendo-angular-schematics": "18.1.0-develop.9"
47
+ "@progress/kendo-angular-schematics": "18.1.0"
48
48
  },
49
49
  "schematics": "./schematics/collection.json",
50
50
  "module": "fesm2022/progress-kendo-angular-toolbar.mjs",
@@ -34,6 +34,7 @@ export declare class ScrollService {
34
34
  toggleScrollButtonsState(): void;
35
35
  onScroll(e: Event): void;
36
36
  scrollTools(direction: string): void;
37
+ updateScrollPosition(element: HTMLElement): void;
37
38
  calculateListPosition(direction: string, scrollSpeed: number): void;
38
39
  private toggleButtonActiveState;
39
40
  private isDisabled;
@@ -18,10 +18,6 @@ export declare class ToolbarScrollableButtonComponent implements AfterViewInit,
18
18
  private localization;
19
19
  get prevClass(): boolean;
20
20
  get nextClass(): boolean;
21
- /**
22
- * @hidden
23
- */
24
- onMouseDown(ev: any): void;
25
21
  role: string;
26
22
  prev: boolean;
27
23
  overflow: ToolbarOverflowSettings;
@@ -43,7 +43,7 @@ export declare class ToolBarComponent {
43
43
  */
44
44
  set overflow(overflow: boolean | OverflowMode | ToolbarOverflowSettings);
45
45
  get overflow(): boolean | OverflowMode | ToolbarOverflowSettings;
46
- get show(): boolean;
46
+ get showScrollButtons(): boolean;
47
47
  /**
48
48
  * @hidden
49
49
  */
@@ -154,12 +154,15 @@ export declare class ToolBarComponent {
154
154
  private _fillMode;
155
155
  private overflowButtonClickedTime;
156
156
  private showAutoButtons;
157
+ private scrollButtonStateChangeSub;
158
+ private scrollContainerScrollSub;
157
159
  /**
158
160
  * @hidden
159
161
  */
160
162
  get normalizedOverflow(): ToolbarOverflowSettings;
161
163
  private subscriptions;
162
164
  private popupSubs;
165
+ private focusedByPointer;
163
166
  /**
164
167
  * @hidden
165
168
  */
@@ -254,6 +257,8 @@ export declare class ToolBarComponent {
254
257
  private handleClasses;
255
258
  private normalizePopupClasses;
256
259
  private setScrollableOverlayClasses;
260
+ private handleScrollModeUpdates;
261
+ private removeSubscriptions;
257
262
  static ɵfac: i0.ɵɵFactoryDeclaration<ToolBarComponent, never>;
258
263
  static ɵcmp: i0.ɵɵComponentDeclaration<ToolBarComponent, "kendo-toolbar", ["kendoToolBar"], { "overflow": { "alias": "overflow"; "required": false; }; "resizable": { "alias": "resizable"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; "fillMode": { "alias": "fillMode"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "size": { "alias": "size"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; }, { "open": "open"; "close": "close"; }, ["allTools"], never, true, never>;
259
264
  }