@progress/kendo-angular-layout 7.0.0-next.202204060717 → 7.0.1-dev.202205020614

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.
@@ -13,6 +13,7 @@ import { PanelBarService } from "./panelbar.service";
13
13
  import { PanelBarItemTemplateDirective } from "./panelbar-item-template.directive";
14
14
  import { parsePanelBarItems } from "../common/util";
15
15
  import { isFocusable } from './../common/dom-queries';
16
+ import { PanelBarSelectEvent, PanelBarExpandEvent, PanelBarCollapseEvent, PanelBarStateChangeEvent } from './events';
16
17
  import * as i0 from "@angular/core";
17
18
  import * as i1 from "./panelbar.service";
18
19
  import * as i2 from "@progress/kendo-angular-l10n";
@@ -48,17 +49,35 @@ export class PanelBarComponent {
48
49
  * Sets the height of the component when the `"full"` expand mode is used.
49
50
  * This option is ignored in the `"multiple"` and `"single"` expand modes.
50
51
  */
51
- this.height = "400px";
52
+ this.height = '400px';
52
53
  /**
53
54
  * Fires each time the user interacts with a PanelBar item
54
55
  * ([see example]({% slug routing_panelbar %}#toc-getting-the-selected-item)).
55
- * The event data contains all items that are modified.
56
+ * The event data contains a collection of all items that are modified.
56
57
  */
57
58
  this.stateChange = new EventEmitter();
59
+ /**
60
+ * Fires when an item is about to be selected.
61
+ * ([see example]({% slug events_panelbar %}))
62
+ * This event is preventable. If you cancel it, the item will not be selected.
63
+ */
64
+ this.select = new EventEmitter();
65
+ /**
66
+ * Fires when an item is about to be expanded.
67
+ * ([see example]({% slug events_panelbar %}))
68
+ * This event is preventable. If you cancel it, the item will remain collapsed.
69
+ */
70
+ this.expand = new EventEmitter();
71
+ /**
72
+ * Fires when an item is about to be collapsed.
73
+ * ([see example]({% slug events_panelbar %}))
74
+ * This event is preventable. If you cancel it, the item will remain expanded.
75
+ */
76
+ this.collapse = new EventEmitter();
58
77
  this.tabIndex = 0;
59
- this.role = "tree";
78
+ this.role = 'tree';
60
79
  this.hostClass = true;
61
- this.activeDescendant = "";
80
+ this.activeDescendant = '';
62
81
  this.isViewInit = true;
63
82
  this.focused = false;
64
83
  this._keepItemContent = false;
@@ -70,7 +89,7 @@ export class PanelBarComponent {
70
89
  childrenHeight += item.headerHeight();
71
90
  });
72
91
  this.childrenItems.forEach(item => {
73
- item.contentHeight = PanelBarExpandMode.Full === this.expandMode ? (panelbarHeight - childrenHeight) + "px" : 'auto';
92
+ item.contentHeight = PanelBarExpandMode.Full === this.expandMode ? (panelbarHeight - childrenHeight) + 'px' : 'auto';
74
93
  item.contentOverflow = contentOverflow;
75
94
  });
76
95
  };
@@ -109,7 +128,7 @@ export class PanelBarComponent {
109
128
  return this.expandMode === PanelBarExpandMode.Full ? this.height : 'auto';
110
129
  }
111
130
  get overflow() {
112
- return this.expandMode === PanelBarExpandMode.Full ? "hidden" : "visible";
131
+ return this.expandMode === PanelBarExpandMode.Full ? 'hidden' : 'visible';
113
132
  }
114
133
  get dir() {
115
134
  return this.localization.rtl ? 'rtl' : 'ltr';
@@ -159,7 +178,7 @@ export class PanelBarComponent {
159
178
  this.validateConfiguration();
160
179
  }
161
180
  ngOnChanges(changes) {
162
- if (changes['height'] || changes['expandMode'] || changes["items"]) { // eslint-disable-line
181
+ if (changes['height'] || changes['expandMode'] || changes['items']) { // eslint-disable-line
163
182
  if (this.childrenItems) {
164
183
  setTimeout(this.updateChildrenHeight);
165
184
  }
@@ -206,7 +225,7 @@ export class PanelBarComponent {
206
225
  onComponentBlur() {
207
226
  this.eventService.onBlur();
208
227
  this.focused = false;
209
- this.activeDescendant = "";
228
+ this.activeDescendant = '';
210
229
  }
211
230
  /**
212
231
  * @hidden
@@ -225,6 +244,26 @@ export class PanelBarComponent {
225
244
  }
226
245
  }
227
246
  }
247
+ /**
248
+ * @hidden
249
+ */
250
+ emitEvent(event, item) {
251
+ let eventArgs;
252
+ switch (event) {
253
+ case 'select':
254
+ eventArgs = new PanelBarSelectEvent();
255
+ break;
256
+ case 'collapse':
257
+ eventArgs = new PanelBarCollapseEvent();
258
+ break;
259
+ default:
260
+ eventArgs = new PanelBarExpandEvent();
261
+ break;
262
+ }
263
+ eventArgs.item = item.serialize();
264
+ this[event].emit(eventArgs);
265
+ return eventArgs;
266
+ }
228
267
  get viewItems() {
229
268
  let treeItems = [];
230
269
  this.viewChildItems.toArray().forEach(item => {
@@ -236,7 +275,7 @@ export class PanelBarComponent {
236
275
  validateConfiguration() {
237
276
  if (isDevMode()) {
238
277
  if (this.items && (this.contentItems && this.contentItems.length > 0)) {
239
- throw new Error("Invalid configuration: mixed template components and items property.");
278
+ throw new Error('Invalid configuration: mixed template components and items property.');
240
279
  }
241
280
  }
242
281
  }
@@ -251,37 +290,80 @@ export class PanelBarComponent {
251
290
  let focusedState = selectedState;
252
291
  selectedState = this.selectable ? selectedState : currentItem.selected;
253
292
  if (currentItem.selected !== selectedState || currentItem.focused !== focusedState) {
254
- currentItem.selected = selectedState;
255
- currentItem.focused = focusedState;
256
- this.activeDescendant = focusedState ? currentItem.itemId : "";
257
- modifiedItems.push(currentItem);
293
+ const isSelectPrevented = selectedState ? this.emitEvent('select', currentItem).isDefaultPrevented() : false;
294
+ if (!isSelectPrevented) {
295
+ currentItem.selected = selectedState;
296
+ currentItem.focused = focusedState;
297
+ this.activeDescendant = focusedState ? currentItem.itemId : '';
298
+ modifiedItems.push(currentItem);
299
+ }
258
300
  }
259
301
  });
260
302
  if (this.expandMode === PanelBarExpandMode.Multiple) {
261
- if (item.hasChildItems || item.hasContent) {
262
- item.expanded = !item.expanded;
263
- }
264
- if (modifiedItems.indexOf(item) < 0) {
265
- modifiedItems.push(item);
303
+ if ((item.hasChildItems || item.hasContent) && item.selected) {
304
+ const isEventPrevented = item.expanded ?
305
+ this.emitEvent('collapse', item).isDefaultPrevented() :
306
+ this.emitEvent('expand', item).isDefaultPrevented();
307
+ if (!isEventPrevented) {
308
+ item.expanded = !item.expanded;
309
+ if (modifiedItems.indexOf(item) < 0) {
310
+ modifiedItems.push(item);
311
+ }
312
+ }
266
313
  }
267
314
  }
268
315
  else {
269
316
  let siblings = item.parent ? item.parent.childrenItems : this.childrenItems;
270
- if (item.hasChildItems || item.hasContent) {
317
+ let preventedCollapseItem;
318
+ let expandedItems = [];
319
+ if ((item.hasChildItems || item.hasContent) && item.selected) {
271
320
  siblings
272
321
  .forEach((currentItem) => {
273
322
  let expandedState = currentItem === item;
274
323
  if (currentItem.expanded !== expandedState) {
275
- currentItem.expanded = expandedState;
276
- if (modifiedItems.indexOf(currentItem) < 0) {
277
- modifiedItems.push(currentItem);
324
+ const isEventPrevented = currentItem.expanded ?
325
+ this.emitEvent('collapse', currentItem).isDefaultPrevented() :
326
+ this.emitEvent('expand', currentItem).isDefaultPrevented();
327
+ if (!isEventPrevented) {
328
+ currentItem.expanded = expandedState;
329
+ if (currentItem.expanded) {
330
+ expandedItems.push(currentItem);
331
+ }
332
+ if (modifiedItems.indexOf(currentItem) < 0) {
333
+ modifiedItems.push(currentItem);
334
+ }
335
+ }
336
+ else if (isEventPrevented && currentItem.expanded) {
337
+ preventedCollapseItem = currentItem;
338
+ }
339
+ }
340
+ else if (currentItem.expanded === expandedState && expandedState) {
341
+ const isCollapsePrevented = this.emitEvent('collapse', currentItem).isDefaultPrevented();
342
+ if (!isCollapsePrevented) {
343
+ currentItem.expanded = !currentItem.expanded;
344
+ if (modifiedItems.indexOf(currentItem) < 0) {
345
+ modifiedItems.push(currentItem);
346
+ }
347
+ }
348
+ }
349
+ });
350
+ expandedItems.forEach(item => {
351
+ if (preventedCollapseItem && item.id !== preventedCollapseItem.id) {
352
+ item.expanded = false;
353
+ if (isDevMode()) {
354
+ const expandMode = PanelBarExpandMode[this.expandMode].toLowerCase();
355
+ console.warn(`
356
+ The ${expandMode} expandMode allows the expansion of only one item at a time.
357
+ See https://www.telerik.com/kendo-angular-ui-develop/components/layout/panelbar/expand-modes/`);
278
358
  }
279
359
  }
280
360
  });
281
361
  }
282
362
  }
283
363
  if (modifiedItems.length > 0) {
284
- this.stateChange.emit(modifiedItems.map(currentItem => currentItem.serialize()));
364
+ let eventArgs = new PanelBarStateChangeEvent();
365
+ eventArgs.items = modifiedItems.map(currentItem => currentItem.serialize());
366
+ this.stateChange.emit(eventArgs);
285
367
  }
286
368
  }
287
369
  isVisible(item) {
@@ -307,16 +389,16 @@ export class PanelBarComponent {
307
389
  currentIndex = visibleItems.findIndex(item => item === currentItem);
308
390
  }
309
391
  switch (action) {
310
- case "lastItem":
392
+ case 'lastItem':
311
393
  nextItem = visibleItems[visibleItems.length - 1];
312
394
  break;
313
- case "firstItem":
395
+ case 'firstItem':
314
396
  nextItem = visibleItems[0];
315
397
  break;
316
- case "nextItem":
398
+ case 'nextItem':
317
399
  nextItem = visibleItems[currentIndex < visibleItems.length - 1 ? currentIndex + 1 : 0];
318
400
  break;
319
- case "previousItem":
401
+ case 'previousItem':
320
402
  nextItem = visibleItems[currentIndex > 0 ? currentIndex - 1 : visibleItems.length - 1];
321
403
  break;
322
404
  default:
@@ -330,19 +412,21 @@ export class PanelBarComponent {
330
412
  to.focused = true;
331
413
  this.activeDescendant = to.itemId;
332
414
  const modifiedItems = new Array(from.serialize(), to.serialize());
333
- this.stateChange.emit(modifiedItems);
415
+ let eventArgs = new PanelBarStateChangeEvent();
416
+ eventArgs.items = modifiedItems;
417
+ this.stateChange.emit(eventArgs);
334
418
  }
335
419
  focusLastItem() {
336
- this.focusItem("lastItem");
420
+ this.focusItem('lastItem');
337
421
  }
338
422
  focusFirstItem() {
339
- this.focusItem("firstItem");
423
+ this.focusItem('firstItem');
340
424
  }
341
425
  focusNextItem() {
342
- this.focusItem("nextItem");
426
+ this.focusItem('nextItem');
343
427
  }
344
428
  focusPreviousItem() {
345
- this.focusItem("previousItem");
429
+ this.focusItem('previousItem');
346
430
  }
347
431
  expandItem() {
348
432
  let currentItem = this.allItems.filter(item => item.focused)[0];
@@ -395,7 +479,7 @@ export class PanelBarComponent {
395
479
  }
396
480
  }
397
481
  PanelBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PanelBarComponent, deps: [{ token: i0.ElementRef }, { token: i1.PanelBarService }, { token: i2.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
398
- PanelBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PanelBarComponent, selector: "kendo-panelbar", inputs: { expandMode: "expandMode", selectable: "selectable", animate: "animate", height: "height", keepItemContent: "keepItemContent", items: "items" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "click": "onComponentClick($event)", "focus": "onComponentFocus()", "blur": "onComponentBlur()", "keydown": "onComponentKeyDown($event)" }, properties: { "attr.tabIndex": "this.tabIndex", "attr.role": "this.role", "class.k-panelbar": "this.hostClass", "attr.aria-activedescendant": "this.activeDescendant", "style.height": "this.hostHeight", "style.overflow": "this.overflow", "attr.dir": "this.dir" } }, providers: [
482
+ PanelBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PanelBarComponent, selector: "kendo-panelbar", inputs: { expandMode: "expandMode", selectable: "selectable", animate: "animate", height: "height", keepItemContent: "keepItemContent", items: "items" }, outputs: { stateChange: "stateChange", select: "select", expand: "expand", collapse: "collapse" }, host: { listeners: { "click": "onComponentClick($event)", "focus": "onComponentFocus()", "blur": "onComponentBlur()", "keydown": "onComponentKeyDown($event)" }, properties: { "attr.tabIndex": "this.tabIndex", "attr.role": "this.role", "class.k-panelbar": "this.hostClass", "attr.aria-activedescendant": "this.activeDescendant", "style.height": "this.hostHeight", "style.overflow": "this.overflow", "attr.dir": "this.dir" } }, providers: [
399
483
  PanelBarService,
400
484
  LocalizationService,
401
485
  {
@@ -407,17 +491,17 @@ PanelBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
407
491
  <ng-template [ngIf]="items?.length">
408
492
  <ng-container *ngFor="let item of items">
409
493
  <kendo-panelbar-item *ngIf="!item.hidden"
410
- [title]="item.title"
411
- [id]="item.id"
412
- [icon]="item.icon"
413
- [iconClass]="item.iconClass"
414
- [imageUrl]="item.imageUrl"
415
- [selected]="!!item.selected"
416
- [expanded]="!!item.expanded"
417
- [disabled]="!!item.disabled"
418
- [template]="templateRef"
419
- [items]="item.children"
420
- [content]="item.content"
494
+ [title]="item.title"
495
+ [id]="item.id"
496
+ [icon]="item.icon"
497
+ [iconClass]="item.iconClass"
498
+ [imageUrl]="item.imageUrl"
499
+ [selected]="!!item.selected"
500
+ [expanded]="!!item.expanded"
501
+ [disabled]="!!item.disabled"
502
+ [template]="templateRef"
503
+ [items]="item.children"
504
+ [content]="item.content"
421
505
  >
422
506
  </kendo-panelbar-item>
423
507
  </ng-container>
@@ -441,17 +525,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
441
525
  <ng-template [ngIf]="items?.length">
442
526
  <ng-container *ngFor="let item of items">
443
527
  <kendo-panelbar-item *ngIf="!item.hidden"
444
- [title]="item.title"
445
- [id]="item.id"
446
- [icon]="item.icon"
447
- [iconClass]="item.iconClass"
448
- [imageUrl]="item.imageUrl"
449
- [selected]="!!item.selected"
450
- [expanded]="!!item.expanded"
451
- [disabled]="!!item.disabled"
452
- [template]="templateRef"
453
- [items]="item.children"
454
- [content]="item.content"
528
+ [title]="item.title"
529
+ [id]="item.id"
530
+ [icon]="item.icon"
531
+ [iconClass]="item.iconClass"
532
+ [imageUrl]="item.imageUrl"
533
+ [selected]="!!item.selected"
534
+ [expanded]="!!item.expanded"
535
+ [disabled]="!!item.disabled"
536
+ [template]="templateRef"
537
+ [items]="item.children"
538
+ [content]="item.content"
455
539
  >
456
540
  </kendo-panelbar-item>
457
541
  </ng-container>
@@ -472,6 +556,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
472
556
  type: Input
473
557
  }], stateChange: [{
474
558
  type: Output
559
+ }], select: [{
560
+ type: Output
561
+ }], expand: [{
562
+ type: Output
563
+ }], collapse: [{
564
+ type: Output
475
565
  }], tabIndex: [{
476
566
  type: HostBinding,
477
567
  args: ['attr.tabIndex']