@progress/kendo-angular-gantt 0.2.0-dev.202111231320 → 0.2.1-dev.202112081924

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.
Files changed (68) hide show
  1. package/dist/cdn/js/kendo-angular-gantt.js +2 -2
  2. package/dist/cdn/main.js +2 -2
  3. package/dist/es/common/default-callbacks.js +4 -0
  4. package/dist/es/expanded-state/expandable.directive.js +6 -4
  5. package/dist/es/gantt.component.js +187 -32
  6. package/dist/es/gantt.module.js +3 -1
  7. package/dist/es/main.js +1 -0
  8. package/dist/es/package-metadata.js +1 -1
  9. package/dist/es/rendering/gantt-milestone-task.component.js +1 -1
  10. package/dist/es/rendering/gantt-summary-task.component.js +1 -1
  11. package/dist/es/rendering/gantt-task-base.js +8 -4
  12. package/dist/es/rendering/gantt-task.component.js +1 -1
  13. package/dist/es/rendering/gantt-tasks-table-body.component.js +3 -3
  14. package/dist/es/selection/selectable.directive.js +141 -0
  15. package/dist/es/selection/selection-change-event.js +4 -0
  16. package/dist/es/timeline/gantt-timeline.component.js +5 -1
  17. package/dist/es/toolbar/view-selector.component.js +1 -1
  18. package/dist/es/utils.js +5 -1
  19. package/dist/es2015/common/default-callbacks.d.ts +4 -0
  20. package/dist/es2015/common/default-callbacks.js +4 -0
  21. package/dist/es2015/expanded-state/expandable.directive.d.ts +2 -1
  22. package/dist/es2015/expanded-state/expandable.directive.js +7 -2
  23. package/dist/es2015/gantt.component.d.ts +66 -18
  24. package/dist/es2015/gantt.component.js +191 -34
  25. package/dist/es2015/gantt.module.js +3 -1
  26. package/dist/es2015/index.metadata.json +1 -1
  27. package/dist/es2015/main.d.ts +2 -0
  28. package/dist/es2015/main.js +1 -0
  29. package/dist/es2015/models/events/cell-click-event.interface.d.ts +31 -8
  30. package/dist/es2015/models/events/task-click-event.interface.d.ts +13 -5
  31. package/dist/es2015/models/models.d.ts +2 -0
  32. package/dist/es2015/package-metadata.js +1 -1
  33. package/dist/es2015/rendering/gantt-milestone-task.component.js +1 -0
  34. package/dist/es2015/rendering/gantt-summary-task.component.js +1 -0
  35. package/dist/es2015/rendering/gantt-task-base.d.ts +2 -1
  36. package/dist/es2015/rendering/gantt-task-base.js +8 -4
  37. package/dist/es2015/rendering/gantt-task.component.js +1 -0
  38. package/dist/es2015/rendering/gantt-tasks-table-body.component.d.ts +1 -1
  39. package/dist/es2015/rendering/gantt-tasks-table-body.component.js +5 -2
  40. package/dist/es2015/selection/selectable.directive.d.ts +42 -0
  41. package/dist/es2015/selection/selectable.directive.js +122 -0
  42. package/dist/es2015/selection/selection-change-event.d.ts +25 -0
  43. package/dist/es2015/selection/selection-change-event.js +4 -0
  44. package/dist/es2015/timeline/gantt-timeline.component.d.ts +1 -0
  45. package/dist/es2015/timeline/gantt-timeline.component.js +5 -0
  46. package/dist/es2015/toolbar/view-selector.component.js +1 -0
  47. package/dist/es2015/utils.d.ts +5 -0
  48. package/dist/es2015/utils.js +5 -1
  49. package/dist/fesm2015/index.js +341 -40
  50. package/dist/fesm5/index.js +353 -46
  51. package/dist/npm/common/default-callbacks.js +4 -0
  52. package/dist/npm/expanded-state/expandable.directive.js +5 -3
  53. package/dist/npm/gantt.component.js +187 -32
  54. package/dist/npm/gantt.module.js +3 -1
  55. package/dist/npm/main.js +2 -0
  56. package/dist/npm/package-metadata.js +1 -1
  57. package/dist/npm/rendering/gantt-milestone-task.component.js +1 -1
  58. package/dist/npm/rendering/gantt-summary-task.component.js +1 -1
  59. package/dist/npm/rendering/gantt-task-base.js +8 -4
  60. package/dist/npm/rendering/gantt-task.component.js +1 -1
  61. package/dist/npm/rendering/gantt-tasks-table-body.component.js +3 -3
  62. package/dist/npm/selection/selectable.directive.js +143 -0
  63. package/dist/npm/selection/selection-change-event.js +6 -0
  64. package/dist/npm/timeline/gantt-timeline.component.js +5 -1
  65. package/dist/npm/toolbar/view-selector.component.js +1 -1
  66. package/dist/npm/utils.js +4 -0
  67. package/dist/systemjs/kendo-angular-gantt.js +1 -1
  68. package/package.json +1 -1
@@ -5,12 +5,12 @@
5
5
  import { __decorate, __metadata, __param } from 'tslib';
6
6
  import { Input, EventEmitter, Injectable, Directive, Optional, TemplateRef, QueryList, ContentChildren, ContentChild, Component, forwardRef, SkipSelf, Host, Injector, NgZone, isDevMode, ViewChild, HostBinding, Output, Renderer2, ElementRef, ChangeDetectorRef, NgModule } from '@angular/core';
7
7
  import { ColumnBase, ColumnComponent, ColumnGroupComponent, SpanColumnComponent, TreeListComponent, DataBoundTreeComponent, ExpandableTreeComponent, FlatBindingDirective, HierarchyBindingDirective, ExpandableDirective, TreeListModule } from '@progress/kendo-angular-treelist';
8
+ import { cloneDate, addWeeks, firstDayInWeek, addDays, getDate, lastDayOfMonth, firstDayOfMonth, addMonths, isEqualDate, MS_PER_HOUR, MS_PER_DAY } from '@progress/kendo-date-math';
8
9
  import { of, Subject, Subscription, fromEvent } from 'rxjs';
9
10
  import { validatePackage } from '@progress/kendo-licensing';
10
11
  import { isDocumentAvailable, closestInScope, matchesClasses, anyChanged, hasObservers, EventsModule } from '@progress/kendo-angular-common';
11
12
  import { IntlService } from '@progress/kendo-angular-intl';
12
13
  import { orderBy } from '@progress/kendo-data-query';
13
- import { cloneDate, addWeeks, firstDayInWeek, addDays, getDate, lastDayOfMonth, firstDayOfMonth, addMonths, isEqualDate, MS_PER_HOUR, MS_PER_DAY } from '@progress/kendo-date-math';
14
14
  import { getter } from '@progress/kendo-common';
15
15
  import { map, distinctUntilChanged, take, filter, switchMap } from 'rxjs/operators';
16
16
  import { LocalizationService, ComponentMessages, L10N_PREFIX } from '@progress/kendo-angular-l10n';
@@ -30,7 +30,7 @@ const packageMetadata = {
30
30
  name: '@progress/kendo-angular-gantt',
31
31
  productName: 'Kendo UI for Angular',
32
32
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
33
- publishDate: 1637673280,
33
+ publishDate: 1638991092,
34
34
  version: '',
35
35
  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'
36
36
  };
@@ -627,6 +627,10 @@ const rowClassCallback = () => null;
627
627
  * @hidden
628
628
  */
629
629
  const taskClassCallback = () => null;
630
+ /**
631
+ * @hidden
632
+ */
633
+ const isSelected = () => false;
630
634
 
631
635
  /**
632
636
  * @hidden
@@ -723,6 +727,10 @@ const isColumnGroup = (column) => column.isColumnGroup;
723
727
  * @hidden
724
728
  */
725
729
  const isNumber = (contender) => typeof contender === 'number' && !isNaN(contender);
730
+ /**
731
+ * @hidden
732
+ */
733
+ const isString = (contender) => typeof contender === 'string';
726
734
  /**
727
735
  * @hidden
728
736
  *
@@ -1721,6 +1729,27 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
1721
1729
  this.hostElement = hostElement;
1722
1730
  this.zone = zone;
1723
1731
  this.hostClasses = true;
1732
+ /**
1733
+ * Provides a callback that determines if the given task is selected ([see example]({% slug selection_gantt %}#toc-custom-selection))
1734
+ *
1735
+ * > The [`selectable`]({% slug gantt_api_ganttcomponent %}#toc-selectable) prop has to be set to `true` in order for this callback to be executed.
1736
+ */
1737
+ this.isSelected = isSelected;
1738
+ /**
1739
+ * Fires when the Gantt selection is changed through user interaction.
1740
+ *
1741
+ * Holds data about the affected [`items`]({% slug api_gantt_selectionchangeevent %}#toc-items) and the attempted [`action`]({% slug api_gantt_selectionchangeevent %}#toc-action):
1742
+ * - `select` - Triggered on `click` or `ctrl + click` on deselected items.
1743
+ * - `remove` - Triggered on `ctrl + click` on selected items.
1744
+ */
1745
+ this.selectionChange = new EventEmitter();
1746
+ /**
1747
+ * Enables or disables the Gantt selection mechanism ([see example]({% slug selection_gantt %}#toc-custom-selection)).
1748
+ *
1749
+ * > When set to `true`, the [`isSelected`]({% slug gantt_api_ganttcomponent %}#toc-isselected) callback has to be provided.
1750
+ * > When applied, the [`SelectableDirective`]({% slug api_gantt_selectabledirective %}) sets `selectable` to `true` internally.
1751
+ */
1752
+ this.selectable = false;
1724
1753
  /**
1725
1754
  * The position of the toolbar.
1726
1755
  *
@@ -1889,6 +1918,14 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
1889
1918
  * Fires when the user changes the locked state of the columns from the column menu or by reordering the columns.
1890
1919
  */
1891
1920
  this.columnLockedChange = new EventEmitter();
1921
+ /**
1922
+ * Fires when a cell is clicked.
1923
+ */
1924
+ this.cellClick = new EventEmitter();
1925
+ /**
1926
+ * Fires when a task is clicked.
1927
+ */
1928
+ this.taskClick = new EventEmitter();
1892
1929
  /**
1893
1930
  * @hidden
1894
1931
  *
@@ -1914,9 +1951,6 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
1914
1951
  this.optionChangesSubscriptions = new Subscription();
1915
1952
  this.editServiceSubscription = new Subscription();
1916
1953
  validatePackage(packageMetadata);
1917
- this.handleTimelineDblClick = this.handleTimelineDblClick.bind(this);
1918
- this.handleTimelineMouseDown = this.handleTimelineMouseDown.bind(this);
1919
- this.handleDoubleClick = this.handleDoubleClick.bind(this);
1920
1954
  this.optionChangesSubscriptions.add(this.optionChangesService.viewChanges.subscribe(() => {
1921
1955
  this.loadTimelineData();
1922
1956
  }));
@@ -2089,6 +2123,15 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2089
2123
  // TODO: review if this is a performance concern?
2090
2124
  return this.timelineViewService.service(this.activeView);
2091
2125
  }
2126
+ /**
2127
+ * @hidden
2128
+ *
2129
+ * Retrieves the `isSelected` callback if `selectable` is set to `true`
2130
+ * Otherwise returns the default callback, which always returns `false`.
2131
+ */
2132
+ get isTaskSelected() {
2133
+ return this.selectable ? this.isSelected : isSelected;
2134
+ }
2092
2135
  /**
2093
2136
  * @hidden
2094
2137
  *
@@ -2183,6 +2226,14 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2183
2226
  this.treeList.reorderColumn(source, destIndex, options);
2184
2227
  }
2185
2228
  }
2229
+ /**
2230
+ * Updates the data of the Gantt and forces row-related callbacks to be called anew.
2231
+ */
2232
+ updateView() {
2233
+ if (isPresent(this.treeList)) {
2234
+ this.treeList.updateView();
2235
+ }
2236
+ }
2186
2237
  /**
2187
2238
  * Opens the task editing dialog.
2188
2239
  */
@@ -2243,16 +2294,6 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2243
2294
  this.dependencyDomService.notifyChanges();
2244
2295
  }
2245
2296
  }
2246
- /**
2247
- * @hidden
2248
- *
2249
- * Used by the GanttExpandableDirective.
2250
- */
2251
- updateView() {
2252
- if (isPresent(this.treeList)) {
2253
- this.treeList.updateView();
2254
- }
2255
- }
2256
2297
  /**
2257
2298
  * @hidden
2258
2299
  */
@@ -2290,24 +2331,89 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2290
2331
  /**
2291
2332
  * @hidden
2292
2333
  */
2293
- handleCellClick(event) {
2294
- this._cellClickEvent = event;
2334
+ handleTimelineRightClick(event) {
2335
+ const target = event.target;
2336
+ const gantt = this.hostElement.nativeElement;
2337
+ if (!isTask(target, gantt) || isClearButton(target, gantt)) {
2338
+ return;
2339
+ }
2340
+ if (hasObservers(this.taskClick)) {
2341
+ const taskIndex = getClosestTaskIndex(target, gantt);
2342
+ const task = this.renderedTreeListItems[taskIndex];
2343
+ this.zone.run(() => this.emitTaskClick(event, task, taskIndex));
2344
+ }
2345
+ }
2346
+ /**
2347
+ * @hidden
2348
+ */
2349
+ handleTimelineClick(event) {
2350
+ const target = event.target;
2351
+ const gantt = this.hostElement.nativeElement;
2352
+ if (!isTask(target, gantt) || isClearButton(target, gantt)) {
2353
+ return;
2354
+ }
2355
+ const taskIndex = getClosestTaskIndex(target, gantt);
2356
+ const task = this.renderedTreeListItems[taskIndex];
2357
+ const selectionAction = this.getSelectionAction(event, task);
2358
+ if ((hasObservers(this.selectionChange) && !this.isSameSelection(selectionAction, task)) ||
2359
+ hasObservers(this.taskClick)) {
2360
+ this.zone.run(() => {
2361
+ this.emitSelectionChange(task, selectionAction);
2362
+ this.emitTaskClick(event, task, taskIndex);
2363
+ });
2364
+ }
2295
2365
  }
2296
2366
  /**
2297
2367
  * @hidden
2298
2368
  */
2299
- handleDoubleClick(event) {
2300
- const cell = this._cellClickEvent.originalEvent.target;
2301
- if (event.target !== cell) {
2369
+ handleTreeListDoubleClick(event) {
2370
+ if (!isPresent(this.lastTreeListCellClick) || event.target !== this.lastTreeListCellClick.originalEvent.target) {
2302
2371
  return;
2303
2372
  }
2304
- this.editItem = getEditItem(this._cellClickEvent.dataItem, this.treeList.view.data, this.mapper);
2373
+ this.editItem = getEditItem(this.lastTreeListCellClick.dataItem, this.treeList.view.data, this.mapper);
2305
2374
  if (hasObservers(this.cellDblClick)) {
2306
2375
  this.zone.run(() => {
2307
- this.cellDblClick.emit(Object.assign({}, this._cellClickEvent, { sender: this }));
2376
+ this.cellDblClick.emit({
2377
+ column: this.lastTreeListCellClick.column,
2378
+ columnIndex: this.lastTreeListCellClick.columnIndex,
2379
+ dataItem: this.lastTreeListCellClick.dataItem,
2380
+ isEdited: this.lastTreeListCellClick.isEdited,
2381
+ originalEvent: this.lastTreeListCellClick.originalEvent,
2382
+ rowIndex: this.lastTreeListCellClick.rowIndex,
2383
+ type: 'dblclick',
2384
+ sender: this
2385
+ });
2308
2386
  });
2309
2387
  }
2310
2388
  }
2389
+ /**
2390
+ * @hidden
2391
+ */
2392
+ handleTreeListSelectionChange(event) {
2393
+ // prevent selection change from right-click
2394
+ if (isPresent(this.lastTreeListCellClick) && this.lastTreeListCellClick.type === 'contextmenu') {
2395
+ return;
2396
+ }
2397
+ const task = event.items.map(item => item.dataItem)[0]; // single selection only currently available
2398
+ const action = event.action;
2399
+ this.emitSelectionChange(task, action);
2400
+ }
2401
+ /**
2402
+ * @hidden
2403
+ */
2404
+ handleTreeListCellClick(event) {
2405
+ this.lastTreeListCellClick = event;
2406
+ this.cellClick.emit({
2407
+ column: event.column,
2408
+ columnIndex: event.columnIndex,
2409
+ dataItem: event.dataItem,
2410
+ isEdited: event.isEdited,
2411
+ originalEvent: event.originalEvent,
2412
+ rowIndex: event.rowIndex,
2413
+ type: event.type,
2414
+ sender: this
2415
+ });
2416
+ }
2311
2417
  /**
2312
2418
  * @hidden
2313
2419
  */
@@ -2334,13 +2440,17 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2334
2440
  if (!isTask(target, gantt) || isClearButton(target, gantt)) {
2335
2441
  return;
2336
2442
  }
2337
- const taskIndex = getClosestTaskIndex(target, gantt);
2338
- const task = this.renderedTreeListItems[taskIndex];
2339
- this.zone.run(() => this.taskDblClick.emit({
2340
- dataItem: task,
2341
- originalEvent: event,
2342
- sender: this
2343
- }));
2443
+ if (hasObservers(this.taskDblClick)) {
2444
+ const taskIndex = getClosestTaskIndex(target, gantt);
2445
+ const task = this.renderedTreeListItems[taskIndex];
2446
+ this.zone.run(() => this.taskDblClick.emit({
2447
+ dataItem: task,
2448
+ originalEvent: event,
2449
+ sender: this,
2450
+ rowIndex: taskIndex,
2451
+ type: 'dblclick'
2452
+ }));
2453
+ }
2344
2454
  }
2345
2455
  /**
2346
2456
  * @hidden
@@ -2348,6 +2458,26 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2348
2458
  getText(token) {
2349
2459
  return this.localizationService.get(token);
2350
2460
  }
2461
+ emitTaskClick(event, dataItem, itemIndex) {
2462
+ this.taskClick.emit({
2463
+ originalEvent: event,
2464
+ dataItem: dataItem,
2465
+ rowIndex: itemIndex,
2466
+ type: event.type,
2467
+ sender: this
2468
+ });
2469
+ }
2470
+ emitSelectionChange(dataItem, action) {
2471
+ if (this.isSameSelection(action, dataItem)) {
2472
+ return;
2473
+ }
2474
+ this.selectionChange.emit({
2475
+ action: action,
2476
+ items: [dataItem],
2477
+ sender: this
2478
+ });
2479
+ this.updateView();
2480
+ }
2351
2481
  updateTreeListGroupClass(columns = this.columns) {
2352
2482
  if (!isPresent(this.treeList)) {
2353
2483
  return;
@@ -2374,6 +2504,13 @@ let GanttComponent = GanttComponent_1 = class GanttComponent {
2374
2504
  }
2375
2505
  return this.views.find(view => view.type === this.activeView);
2376
2506
  }
2507
+ isSameSelection(action, dataItem) {
2508
+ return action === 'select' && this.isSelected(dataItem);
2509
+ }
2510
+ getSelectionAction({ ctrlKey, metaKey }, dataItem) {
2511
+ const shouldToggleSelection = ctrlKey || metaKey;
2512
+ return (shouldToggleSelection && this.isSelected(dataItem)) ? 'remove' : 'select';
2513
+ }
2377
2514
  };
2378
2515
  __decorate([
2379
2516
  ViewChild(TreeListComponent, { static: true }),
@@ -2433,6 +2570,18 @@ __decorate([
2433
2570
  __metadata("design:type", Array),
2434
2571
  __metadata("design:paramtypes", [Array])
2435
2572
  ], GanttComponent.prototype, "data", null);
2573
+ __decorate([
2574
+ Input(),
2575
+ __metadata("design:type", Function)
2576
+ ], GanttComponent.prototype, "isSelected", void 0);
2577
+ __decorate([
2578
+ Output(),
2579
+ __metadata("design:type", EventEmitter)
2580
+ ], GanttComponent.prototype, "selectionChange", void 0);
2581
+ __decorate([
2582
+ Input(),
2583
+ __metadata("design:type", Boolean)
2584
+ ], GanttComponent.prototype, "selectable", void 0);
2436
2585
  __decorate([
2437
2586
  Input(),
2438
2587
  __metadata("design:type", String)
@@ -2601,6 +2750,14 @@ __decorate([
2601
2750
  Output(),
2602
2751
  __metadata("design:type", EventEmitter)
2603
2752
  ], GanttComponent.prototype, "columnLockedChange", void 0);
2753
+ __decorate([
2754
+ Output(),
2755
+ __metadata("design:type", EventEmitter)
2756
+ ], GanttComponent.prototype, "cellClick", void 0);
2757
+ __decorate([
2758
+ Output(),
2759
+ __metadata("design:type", EventEmitter)
2760
+ ], GanttComponent.prototype, "taskClick", void 0);
2604
2761
  GanttComponent = GanttComponent_1 = __decorate([
2605
2762
  Component({
2606
2763
  selector: 'kendo-gantt',
@@ -2821,6 +2978,8 @@ GanttComponent = GanttComponent_1 = __decorate([
2821
2978
  [reorderable]="columnsReorderable"
2822
2979
  [resizable]="columnsResizable"
2823
2980
  [rowClass]="rowClass"
2981
+ [isSelected]="isSelected"
2982
+ [selectable]="selectable"
2824
2983
  [sortable]="sortable"
2825
2984
  [sort]="sort"
2826
2985
  [filterable]="filterMenu"
@@ -2838,11 +2997,14 @@ GanttComponent = GanttComponent_1 = __decorate([
2838
2997
  (columnResize)="columnResize.emit($event)"
2839
2998
  (columnVisibilityChange)="handleColumnVisibilityChange($event)"
2840
2999
  (columnLockedChange)="columnLockedChange.emit($event)"
2841
- (cellClick)="handleCellClick($event)"
3000
+ (selectionChange)="handleTreeListSelectionChange($event)"
3001
+ (cellClick)="handleTreeListCellClick($event)"
2842
3002
  (cellClose)="handleCellClose($event)"
2843
3003
  [kendoEventsOutsideAngular]="{
2844
- dblclick: handleDoubleClick
2845
- }">
3004
+ dblclick: handleTreeListDoubleClick
3005
+ }"
3006
+ [scope]="this"
3007
+ >
2846
3008
  <kendo-treelist-messages [kendoGanttTreeListMessages]="localizationService"></kendo-treelist-messages>
2847
3009
  </kendo-treelist>
2848
3010
  </kendo-splitter-pane>
@@ -2869,10 +3031,14 @@ GanttComponent = GanttComponent_1 = __decorate([
2869
3031
  [taskClass]="taskClass"
2870
3032
  [dependencies]="dependencies"
2871
3033
  [hasChildren]="hasChildren"
3034
+ [isTaskSelected]="isTaskSelected"
2872
3035
  [kendoEventsOutsideAngular]="{
3036
+ click: handleTimelineClick,
3037
+ contextmenu: handleTimelineRightClick,
2873
3038
  dblclick: handleTimelineDblClick,
2874
3039
  mousedown: handleTimelineMouseDown
2875
3040
  }"
3041
+ [scope]="this"
2876
3042
  ></kendo-gantt-timeline>
2877
3043
  </kendo-splitter-pane>
2878
3044
  </kendo-splitter>
@@ -3001,6 +3167,10 @@ __decorate([
3001
3167
  Input(),
3002
3168
  __metadata("design:type", Function)
3003
3169
  ], GanttTimelineComponent.prototype, "taskClass", void 0);
3170
+ __decorate([
3171
+ Input(),
3172
+ __metadata("design:type", Function)
3173
+ ], GanttTimelineComponent.prototype, "isTaskSelected", void 0);
3004
3174
  __decorate([
3005
3175
  Input(),
3006
3176
  __metadata("design:type", Function)
@@ -3080,6 +3250,7 @@ GanttTimelineComponent = __decorate([
3080
3250
  [summaryTaskTemplate]="summaryTaskTemplate"
3081
3251
  [taskClass]="taskClass"
3082
3252
  [hasChildren]="hasChildren"
3253
+ [isTaskSelected]="isTaskSelected"
3083
3254
  >
3084
3255
  </tbody>
3085
3256
  </table>
@@ -3155,8 +3326,8 @@ __decorate([
3155
3326
  ], GanttTasksTableBodyComponent.prototype, "hasChildren", void 0);
3156
3327
  __decorate([
3157
3328
  Input(),
3158
- __metadata("design:type", Number)
3159
- ], GanttTasksTableBodyComponent.prototype, "index", void 0);
3329
+ __metadata("design:type", Function)
3330
+ ], GanttTasksTableBodyComponent.prototype, "isTaskSelected", void 0);
3160
3331
  GanttTasksTableBodyComponent = __decorate([
3161
3332
  Component({
3162
3333
  selector: '[kendoGanttTasksTableBody]',
@@ -3168,6 +3339,7 @@ GanttTasksTableBodyComponent = __decorate([
3168
3339
  [dataItem]="item"
3169
3340
  [activeView]="activeView"
3170
3341
  [taskClass]="taskClass"
3342
+ [isSelected]="isTaskSelected"
3171
3343
  [index]="index"
3172
3344
  >
3173
3345
  </kendo-gantt-milestone-task>
@@ -3178,6 +3350,7 @@ GanttTasksTableBodyComponent = __decorate([
3178
3350
  [template]="summaryTaskTemplate"
3179
3351
  [activeView]="activeView"
3180
3352
  [taskClass]="taskClass"
3353
+ [isSelected]="isTaskSelected"
3181
3354
  [index]="index"
3182
3355
  >
3183
3356
  </kendo-gantt-summary-task>
@@ -3188,6 +3361,7 @@ GanttTasksTableBodyComponent = __decorate([
3188
3361
  [taskTemplate]="taskTemplate"
3189
3362
  [activeView]="activeView"
3190
3363
  [taskClass]="taskClass"
3364
+ [isSelected]="isTaskSelected"
3191
3365
  [index]="index"
3192
3366
  >
3193
3367
  </kendo-gantt-task>
@@ -3306,6 +3480,14 @@ __decorate([
3306
3480
  Input(),
3307
3481
  __metadata("design:type", Object)
3308
3482
  ], GanttTaskBase.prototype, "dataItem", void 0);
3483
+ __decorate([
3484
+ Input(),
3485
+ __metadata("design:type", Number)
3486
+ ], GanttTaskBase.prototype, "index", void 0);
3487
+ __decorate([
3488
+ Input(),
3489
+ __metadata("design:type", Function)
3490
+ ], GanttTaskBase.prototype, "isSelected", void 0);
3309
3491
  __decorate([
3310
3492
  Input(),
3311
3493
  __metadata("design:type", String)
@@ -3314,10 +3496,6 @@ __decorate([
3314
3496
  Input(),
3315
3497
  __metadata("design:type", Function)
3316
3498
  ], GanttTaskBase.prototype, "taskClass", void 0);
3317
- __decorate([
3318
- Input(),
3319
- __metadata("design:type", Number)
3320
- ], GanttTaskBase.prototype, "index", void 0);
3321
3499
 
3322
3500
  var GanttTaskComponent_1;
3323
3501
  /**
@@ -3359,6 +3537,7 @@ GanttTaskComponent = GanttTaskComponent_1 = __decorate([
3359
3537
  [style.left.px]="taskOffset"
3360
3538
  [attr.title]="mapper.extractFromTask(dataItem, 'title')"
3361
3539
  [attr.data-task-index]="index"
3540
+ [class.k-state-selected]="isSelected(dataItem)"
3362
3541
  >
3363
3542
  <ng-container *ngIf="!taskTemplate">
3364
3543
  <div
@@ -3443,6 +3622,7 @@ GanttSummaryTaskComponent = GanttSummaryTaskComponent_1 = __decorate([
3443
3622
  [style.left.px]="taskOffset"
3444
3623
  [attr.title]="mapper.extractFromTask(dataItem, 'title')"
3445
3624
  [attr.data-task-index]="index"
3625
+ [class.k-state-selected]="isSelected(dataItem)"
3446
3626
  >
3447
3627
  <div *ngIf="!template; else summaryTemplate"
3448
3628
  class="k-task-summary-progress"
@@ -3502,6 +3682,7 @@ GanttMilestoneTaskComponent = GanttMilestoneTaskComponent_1 = __decorate([
3502
3682
  [ngClass]="taskClass(dataItem)"
3503
3683
  [style.left.px]="taskOffset"
3504
3684
  [attr.title]="mapper.extractFromTask(dataItem, 'title')"
3685
+ [class.k-state-selected]="isSelected(dataItem)"
3505
3686
  [attr.data-task-index]="index"
3506
3687
  >
3507
3688
  </div>
@@ -3578,6 +3759,10 @@ GanttHierarchyBindingDirective = __decorate([
3578
3759
  * A directive which controls the expanded state of the items.
3579
3760
  */
3580
3761
  let GanttExpandableDirective = class GanttExpandableDirective extends ExpandableDirective {
3762
+ // fixes an injection error in some builds/ng-versions (e.g. StackBlitz)
3763
+ constructor(gantt) {
3764
+ super(gantt);
3765
+ }
3581
3766
  };
3582
3767
  __decorate([
3583
3768
  Input(),
@@ -3587,9 +3772,123 @@ GanttExpandableDirective = __decorate([
3587
3772
  Directive({
3588
3773
  exportAs: 'kendoGanttExpandable',
3589
3774
  selector: '[kendoGanttExpandable]'
3590
- })
3775
+ }),
3776
+ __metadata("design:paramtypes", [ExpandableTreeComponent])
3591
3777
  ], GanttExpandableDirective);
3592
3778
 
3779
+ /**
3780
+ * A directive which handles the [`selectionChange`]({% slug api_gantt_ganttcomponent %}#toc-selectionchange) event of the Gantt
3781
+ * ([see example]({% slug selection_gantt %}#toc-built-in-directive))
3782
+ */
3783
+ let SelectableDirective = class SelectableDirective {
3784
+ constructor(gantt) {
3785
+ this.gantt = gantt;
3786
+ /**
3787
+ * Fires when the selected keys are changed.
3788
+ */
3789
+ this.selectedKeysChange = new EventEmitter();
3790
+ this.state = new Set();
3791
+ this.isSelected = this.isSelected.bind(this);
3792
+ this.selectionChange = this.selectionChange.bind(this);
3793
+ this.selectable = true;
3794
+ }
3795
+ /**
3796
+ * @hidden
3797
+ */
3798
+ set selectable(value) {
3799
+ if (value) {
3800
+ this.gantt.isSelected = this.isSelected;
3801
+ this.subscribeSelection();
3802
+ }
3803
+ else {
3804
+ this.gantt.isSelected = () => false;
3805
+ this.unsubscribeSelection();
3806
+ }
3807
+ this.gantt.selectable = value;
3808
+ this.gantt.updateView();
3809
+ }
3810
+ /**
3811
+ * Sets the selected keys.
3812
+ */
3813
+ set selectedKeys(value) {
3814
+ if (isPresent(value) && value === this.lastChange) {
3815
+ return;
3816
+ }
3817
+ // prevent multiple items displayed as selected as multiple selection still not supported fully
3818
+ const keys = (value || []).slice(0, 1);
3819
+ this.state = new Set(keys);
3820
+ this.gantt.updateView();
3821
+ }
3822
+ /**
3823
+ * The field name or a function that specifies the data item unique key identifier.
3824
+ * By default, the string field `id` is used.
3825
+ */
3826
+ set itemKey(value) {
3827
+ if (isString(value)) {
3828
+ this._keyGetter = getter(value);
3829
+ }
3830
+ else {
3831
+ this._keyGetter = value;
3832
+ }
3833
+ }
3834
+ get keyGetter() {
3835
+ return this._keyGetter || this.gantt.idGetter;
3836
+ }
3837
+ ngOnDestroy() {
3838
+ this.unsubscribeSelection();
3839
+ }
3840
+ isSelected(dataItem) {
3841
+ return this.state.has(this.keyGetter(dataItem));
3842
+ }
3843
+ selectionChange({ action, items }) {
3844
+ this.state.clear();
3845
+ if (action === 'select') {
3846
+ items.forEach(item => this.state.add(this.keyGetter(item)));
3847
+ }
3848
+ this.emitSelectedItemsChange();
3849
+ }
3850
+ emitSelectedItemsChange() {
3851
+ this.lastChange = Array.from(this.state);
3852
+ this.selectedKeysChange.emit(this.lastChange);
3853
+ }
3854
+ subscribeSelection() {
3855
+ this.unsubscribeSelection();
3856
+ this.selectionSubscription = this.gantt.selectionChange.subscribe(this.selectionChange);
3857
+ }
3858
+ unsubscribeSelection() {
3859
+ if (this.selectionSubscription) {
3860
+ this.selectionSubscription.unsubscribe();
3861
+ this.selectionSubscription = null;
3862
+ }
3863
+ }
3864
+ };
3865
+ __decorate([
3866
+ Input(),
3867
+ __metadata("design:type", Boolean),
3868
+ __metadata("design:paramtypes", [Boolean])
3869
+ ], SelectableDirective.prototype, "selectable", null);
3870
+ __decorate([
3871
+ Input(),
3872
+ __metadata("design:type", Array),
3873
+ __metadata("design:paramtypes", [Array])
3874
+ ], SelectableDirective.prototype, "selectedKeys", null);
3875
+ __decorate([
3876
+ Output(),
3877
+ __metadata("design:type", EventEmitter)
3878
+ ], SelectableDirective.prototype, "selectedKeysChange", void 0);
3879
+ __decorate([
3880
+ Input(),
3881
+ __metadata("design:type", Object),
3882
+ __metadata("design:paramtypes", [Object])
3883
+ ], SelectableDirective.prototype, "itemKey", null);
3884
+ SelectableDirective = __decorate([
3885
+ Directive({
3886
+ exportAs: 'kendoGanttSelectable',
3887
+ selector: '[kendoGanttSelectable]'
3888
+ }),
3889
+ __metadata("design:paramtypes", [GanttComponent])
3890
+ ], SelectableDirective);
3891
+
3593
3892
  /**
3594
3893
  * @hidden
3595
3894
  */
@@ -3708,6 +4007,7 @@ ViewSelectorComponent = __decorate([
3708
4007
  <kendo-buttongroup class="k-gantt-views" selection="single">
3709
4008
  <button *ngFor="let view of views"
3710
4009
  kendoButton
4010
+ type="button"
3711
4011
  [selected]="view === activeView"
3712
4012
  (click)="onClick(view)">{{getViewTypeText(view)}}</button>
3713
4013
  </kendo-buttongroup>
@@ -4446,6 +4746,7 @@ const DECLARATIONS = [
4446
4746
  TimelineDayViewComponent,
4447
4747
  TimelineWeekViewComponent,
4448
4748
  TimelineMonthViewComponent,
4749
+ SelectableDirective,
4449
4750
  EditDialogComponent,
4450
4751
  CustomMessagesComponent,
4451
4752
  LocalizedMessagesDirective,
@@ -4500,4 +4801,4 @@ GanttModule = __decorate([
4500
4801
  * Generated bundle index. Do not edit.
4501
4802
  */
4502
4803
 
4503
- export { MappingService, OptionChangesService, DependencyDomService, GanttDependencyDirective, EditDialogComponent, EditService, CustomMessagesComponent, LocalizedMessagesDirective, Messages, GanttTreeListMessagesDirective, GanttHeaderTableBodyComponent, GanttMilestoneTaskComponent, GanttSummaryTaskComponent, GanttTaskBase, GanttTaskComponent, GanttTasksTableBodyComponent, ScrollSyncService, GanttTimelineComponent, TimelineBaseViewService, TimelineDayViewComponent, TimelineDayViewService, TimelineMonthViewComponent, TimelineMonthViewService, TimelineViewService, TimelineWeekViewComponent, TimelineWeekViewService, ViewBase, ToolbarComponent, ViewSelectorComponent, GanttComponent, GanttModule, GanttHierarchyBindingDirective, GanttFlatBindingDirective, GanttExpandableDirective, GanttTaskTemplateDirective, GanttTaskContentTemplateDirective, GanttSummaryTaskTemplateDirective, ToolbarTemplateDirective, GanttColumnBase, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, CellTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, ColumnMenuTemplateDirective, FilterCellTemplateDirective, FilterMenuTemplateDirective, EditTemplateDirective };
4804
+ export { MappingService, OptionChangesService, DependencyDomService, GanttDependencyDirective, EditDialogComponent, EditService, CustomMessagesComponent, LocalizedMessagesDirective, Messages, GanttTreeListMessagesDirective, GanttHeaderTableBodyComponent, GanttMilestoneTaskComponent, GanttSummaryTaskComponent, GanttTaskBase, GanttTaskComponent, GanttTasksTableBodyComponent, ScrollSyncService, GanttTimelineComponent, TimelineBaseViewService, TimelineDayViewComponent, TimelineDayViewService, TimelineMonthViewComponent, TimelineMonthViewService, TimelineViewService, TimelineWeekViewComponent, TimelineWeekViewService, ViewBase, ToolbarComponent, ViewSelectorComponent, GanttComponent, GanttModule, GanttHierarchyBindingDirective, GanttFlatBindingDirective, GanttExpandableDirective, GanttTaskTemplateDirective, GanttTaskContentTemplateDirective, GanttSummaryTaskTemplateDirective, ToolbarTemplateDirective, SelectableDirective, GanttColumnBase, GanttColumnComponent, GanttColumnGroupComponent, GanttSpanColumnComponent, CellTemplateDirective, HeaderTemplateDirective, FooterTemplateDirective, ColumnMenuTemplateDirective, FilterCellTemplateDirective, FilterMenuTemplateDirective, EditTemplateDirective };