@progress/kendo-angular-dropdowns 18.1.0-develop.5 → 18.1.0-develop.7

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.
@@ -22,8 +22,8 @@ export declare abstract class BaseCheckDirective {
22
22
  /**
23
23
  * @hidden
24
24
  * The flag is needed in order to determine how to construct the items map keys.
25
- * If `true`, then the key consists of the item's value and 0 (no leveling required),
26
- * else the key consists of the item's value and level (depth)
25
+ * If `true`, then the key consists of the item's value and level (depth),
26
+ * else the key consists of the item's value and 0 (no leveling required)
27
27
  */
28
28
  isHeterogeneous: boolean;
29
29
  /**
@@ -489,8 +489,8 @@ export declare class MultiSelectTreeComponent implements OnInit, OnDestroy, OnCh
489
489
  /**
490
490
  * @hidden
491
491
  * The flag is needed in order to determine how to construct the items map keys.
492
- * If `true`, then the key consists of the item's value and 0 (no leveling required),
493
- * else the key consists of the item's value and level (depth)
492
+ * If `true`, then the key consists of the item's value and level (depth),
493
+ * else the key consists of the item's value and 0 (no leveling required)
494
494
  */
495
495
  isHeterogeneous: boolean;
496
496
  /**
@@ -1003,7 +1003,6 @@ export class DropDownListComponent {
1003
1003
  });
1004
1004
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
1005
1005
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-controls', this.listBoxId);
1006
- this.setAriaactivedescendant();
1007
1006
  const popupWrapper = this.popupRef.popupElement;
1008
1007
  const { min, max } = this.width;
1009
1008
  popupWrapper.addEventListener('mousedown', this.popupMouseDownHandler);
@@ -1023,6 +1022,7 @@ export class DropDownListComponent {
1023
1022
  this.subs.add(this.popupRef.popupOpen.subscribe(() => {
1024
1023
  this.cdr.detectChanges();
1025
1024
  setListBoxAriaLabelledBy(this.optionsList, this.wrapper, this.renderer);
1025
+ this.setAriaactivedescendant();
1026
1026
  this.optionsList.scrollToItem(this.selectionService.focused);
1027
1027
  this.selectionService.focus(this.selectionService.focused);
1028
1028
  this.opened.emit();
@@ -1126,7 +1126,7 @@ export class DropDownListComponent {
1126
1126
  setAriaactivedescendant() {
1127
1127
  if (this.ariaActivedescendant) {
1128
1128
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-activedescendant', this.ariaActivedescendant);
1129
- const searchInput = this.popupRef.popupElement.querySelector('input[role="searchbox"]');
1129
+ const searchInput = this.popupRef?.popupElement.querySelector('input[role="searchbox"]') || this.actionSheetSearchBar?.input.nativeElement;
1130
1130
  if (searchInput) {
1131
1131
  this.renderer.setAttribute(searchInput, 'aria-activedescendant', this.ariaActivedescendant);
1132
1132
  }
@@ -1455,6 +1455,8 @@ export class DropDownListComponent {
1455
1455
  }
1456
1456
  closeActionSheet() {
1457
1457
  this.actionSheet.toggle(false);
1458
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'false');
1459
+ this.renderer.removeAttribute(this.wrapper.nativeElement, 'aria-controls');
1458
1460
  if (this.filterable) {
1459
1461
  this.actionSheetSearchBar.value = '';
1460
1462
  this.filterChange.emit('');
@@ -1465,7 +1467,10 @@ export class DropDownListComponent {
1465
1467
  this.windowSize = this.adaptiveService.size;
1466
1468
  this.actionSheet.toggle(true);
1467
1469
  this.cdr.detectChanges();
1470
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
1471
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-controls', this.listBoxId);
1468
1472
  setListBoxAriaLabelledBy(this.optionsList, this.wrapper, this.renderer);
1473
+ this.setAriaactivedescendant();
1469
1474
  this.title = setActionSheetTitle(this.wrapper, this.title);
1470
1475
  updateActionSheetAdaptiveAppearance(this.actionSheet, this.windowSize, this.renderer);
1471
1476
  this.cdr.detectChanges();
@@ -14,8 +14,8 @@ export class BaseCheckDirective {
14
14
  /**
15
15
  * @hidden
16
16
  * The flag is needed in order to determine how to construct the items map keys.
17
- * If `true`, then the key consists of the item's value and 0 (no leveling required),
18
- * else the key consists of the item's value and level (depth)
17
+ * If `true`, then the key consists of the item's value and level (depth),
18
+ * else the key consists of the item's value and 0 (no leveling required)
19
19
  */
20
20
  isHeterogeneous;
21
21
  addItem(item) {
@@ -36,7 +36,11 @@ export class BaseCheckDirective {
36
36
  const key = this.getKey(item, level);
37
37
  const candidate = { ...item, level, key };
38
38
  this.checkedItems = this.checkedItems
39
- .filter(item => valueFrom(item, this.valueField) !== valueFrom(candidate, this.valueField));
39
+ .filter(item => {
40
+ const valueMatch = valueFrom(item, this.valueField) === valueFrom(candidate, this.valueField);
41
+ const levelMatch = item.level === candidate.level;
42
+ return this.isHeterogeneous ? !(valueMatch && levelMatch) : !valueMatch;
43
+ });
40
44
  this.checkedKeys.delete(key);
41
45
  }
42
46
  isItemChecked(item) {
@@ -768,8 +768,8 @@ export class MultiSelectTreeComponent {
768
768
  /**
769
769
  * @hidden
770
770
  * The flag is needed in order to determine how to construct the items map keys.
771
- * If `true`, then the key consists of the item's value and 0 (no leveling required),
772
- * else the key consists of the item's value and level (depth)
771
+ * If `true`, then the key consists of the item's value and level (depth),
772
+ * else the key consists of the item's value and 0 (no leveling required)
773
773
  */
774
774
  isHeterogeneous;
775
775
  /**
@@ -1116,7 +1116,7 @@ export class MultiSelectTreeComponent {
1116
1116
  }
1117
1117
  else {
1118
1118
  // Remove single tag when the child items are pre-fetched
1119
- const dataItem = this.dataItems[index];
1119
+ const dataItem = this.dataItems.find(item => item.tagPositionIndex === index);
1120
1120
  const itemKey = dataItem.key;
1121
1121
  const lookup = this.lookup.itemLookup(itemKey);
1122
1122
  const pendingCheck = [lookup.item];
@@ -1126,10 +1126,20 @@ export class MultiSelectTreeComponent {
1126
1126
  pendingCheck.push(...this.removeParents(lookup.parent));
1127
1127
  }
1128
1128
  const keysToRemove = pendingCheck.map(item => item.key);
1129
+ // Holds the position indexes of the items to be removed
1130
+ const valueDepthIndices = [];
1129
1131
  this.dataItems = this.dataItems.filter((_item, i) => {
1130
- return !keysToRemove.includes(_item.key) || this.disabledIndices.has(i);
1132
+ const shouldStay = !keysToRemove.includes(_item.key) || this.disabledIndices.has(i);
1133
+ if (!shouldStay) {
1134
+ // We need to know the index position of the data item to be able to update the valueDepth array accordignly
1135
+ // as each data item's position is corresponding to the same position in valueDepth
1136
+ valueDepthIndices.push(i);
1137
+ }
1138
+ return shouldStay;
1139
+ });
1140
+ this.valueDepth = this.valueDepth.filter((_item, i) => {
1141
+ return !valueDepthIndices.includes(i) || this.disabledIndices.has(i);
1131
1142
  });
1132
- this.valueDepth = this.dataItems.map(i => i.level);
1133
1143
  }
1134
1144
  this.updateValue(this.dataItems);
1135
1145
  if (!this.isFocused) {
@@ -1538,7 +1548,15 @@ export class MultiSelectTreeComponent {
1538
1548
  const source = this.dataItems.map(item => item.dataItem);
1539
1549
  this.tags = this.tagMapper(source);
1540
1550
  this.disabledIndices = this.disabledItemsMapper();
1541
- this.dataItems.sort((a, b) => this.tags.indexOf(a.dataItem) - this.tags.indexOf(b.dataItem));
1551
+ // Create a mapping of tags to position indices
1552
+ const tagIndexMap = new Map(this.tags.map((tag, index) => [JSON.stringify(tag), index]));
1553
+ // Modify dataItems by adding a property to hold the item's position as displayed in the tags
1554
+ this.dataItems.forEach(item => {
1555
+ const serializedDataItem = JSON.stringify(item.dataItem);
1556
+ item.tagPositionIndex = tagIndexMap.has(serializedDataItem)
1557
+ ? tagIndexMap.get(serializedDataItem) // Use the index from tags if it exists
1558
+ : null; // Assign a null value if the dataItem is not visible in the tags
1559
+ });
1542
1560
  }
1543
1561
  updateValue(value) {
1544
1562
  const newValue = this.valuePrimitive ?
@@ -1630,6 +1648,8 @@ export class MultiSelectTreeComponent {
1630
1648
  closeActionSheet() {
1631
1649
  this.wrapper.nativeElement.focus();
1632
1650
  this.actionSheet.toggle(false);
1651
+ this.renderer.removeAttribute(this.wrapper.nativeElement, 'aria-controls');
1652
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'false');
1633
1653
  if (this.filterable) {
1634
1654
  this.actionSheetSearchBar.value = '';
1635
1655
  this.filterChange.emit('');
@@ -1641,6 +1661,8 @@ export class MultiSelectTreeComponent {
1641
1661
  this.actionSheet.toggle(true);
1642
1662
  this.title = setActionSheetTitle(this.wrapper, this.title);
1643
1663
  this.cdr.detectChanges();
1664
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-controls', this.treeViewId);
1665
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
1644
1666
  updateActionSheetAdaptiveAppearance(this.actionSheet, this.windowSize, this.renderer);
1645
1667
  this.cdr.detectChanges();
1646
1668
  this.opened.emit();
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1738324914,
14
- version: '18.1.0-develop.5',
13
+ publishDate: 1738336350,
14
+ version: '18.1.0-develop.7',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
16
16
  };
@@ -37,8 +37,8 @@ const packageMetadata = {
37
37
  productName: 'Kendo UI for Angular',
38
38
  productCode: 'KENDOUIANGULAR',
39
39
  productCodes: ['KENDOUIANGULAR'],
40
- publishDate: 1738324914,
41
- version: '18.1.0-develop.5',
40
+ publishDate: 1738336350,
41
+ version: '18.1.0-develop.7',
42
42
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
43
43
  };
44
44
 
@@ -7895,7 +7895,6 @@ class DropDownListComponent {
7895
7895
  });
7896
7896
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
7897
7897
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-controls', this.listBoxId);
7898
- this.setAriaactivedescendant();
7899
7898
  const popupWrapper = this.popupRef.popupElement;
7900
7899
  const { min, max } = this.width;
7901
7900
  popupWrapper.addEventListener('mousedown', this.popupMouseDownHandler);
@@ -7915,6 +7914,7 @@ class DropDownListComponent {
7915
7914
  this.subs.add(this.popupRef.popupOpen.subscribe(() => {
7916
7915
  this.cdr.detectChanges();
7917
7916
  setListBoxAriaLabelledBy(this.optionsList, this.wrapper, this.renderer);
7917
+ this.setAriaactivedescendant();
7918
7918
  this.optionsList.scrollToItem(this.selectionService.focused);
7919
7919
  this.selectionService.focus(this.selectionService.focused);
7920
7920
  this.opened.emit();
@@ -8018,7 +8018,7 @@ class DropDownListComponent {
8018
8018
  setAriaactivedescendant() {
8019
8019
  if (this.ariaActivedescendant) {
8020
8020
  this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-activedescendant', this.ariaActivedescendant);
8021
- const searchInput = this.popupRef.popupElement.querySelector('input[role="searchbox"]');
8021
+ const searchInput = this.popupRef?.popupElement.querySelector('input[role="searchbox"]') || this.actionSheetSearchBar?.input.nativeElement;
8022
8022
  if (searchInput) {
8023
8023
  this.renderer.setAttribute(searchInput, 'aria-activedescendant', this.ariaActivedescendant);
8024
8024
  }
@@ -8347,6 +8347,8 @@ class DropDownListComponent {
8347
8347
  }
8348
8348
  closeActionSheet() {
8349
8349
  this.actionSheet.toggle(false);
8350
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'false');
8351
+ this.renderer.removeAttribute(this.wrapper.nativeElement, 'aria-controls');
8350
8352
  if (this.filterable) {
8351
8353
  this.actionSheetSearchBar.value = '';
8352
8354
  this.filterChange.emit('');
@@ -8357,7 +8359,10 @@ class DropDownListComponent {
8357
8359
  this.windowSize = this.adaptiveService.size;
8358
8360
  this.actionSheet.toggle(true);
8359
8361
  this.cdr.detectChanges();
8362
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
8363
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-controls', this.listBoxId);
8360
8364
  setListBoxAriaLabelledBy(this.optionsList, this.wrapper, this.renderer);
8365
+ this.setAriaactivedescendant();
8361
8366
  this.title = setActionSheetTitle(this.wrapper, this.title);
8362
8367
  updateActionSheetAdaptiveAppearance(this.actionSheet, this.windowSize, this.renderer);
8363
8368
  this.cdr.detectChanges();
@@ -14682,8 +14687,8 @@ class BaseCheckDirective {
14682
14687
  /**
14683
14688
  * @hidden
14684
14689
  * The flag is needed in order to determine how to construct the items map keys.
14685
- * If `true`, then the key consists of the item's value and 0 (no leveling required),
14686
- * else the key consists of the item's value and level (depth)
14690
+ * If `true`, then the key consists of the item's value and level (depth),
14691
+ * else the key consists of the item's value and 0 (no leveling required)
14687
14692
  */
14688
14693
  isHeterogeneous;
14689
14694
  addItem(item) {
@@ -14704,7 +14709,11 @@ class BaseCheckDirective {
14704
14709
  const key = this.getKey(item, level);
14705
14710
  const candidate = { ...item, level, key };
14706
14711
  this.checkedItems = this.checkedItems
14707
- .filter(item => valueFrom(item, this.valueField) !== valueFrom(candidate, this.valueField));
14712
+ .filter(item => {
14713
+ const valueMatch = valueFrom(item, this.valueField) === valueFrom(candidate, this.valueField);
14714
+ const levelMatch = item.level === candidate.level;
14715
+ return this.isHeterogeneous ? !(valueMatch && levelMatch) : !valueMatch;
14716
+ });
14708
14717
  this.checkedKeys.delete(key);
14709
14718
  }
14710
14719
  isItemChecked(item) {
@@ -15790,8 +15799,8 @@ class MultiSelectTreeComponent {
15790
15799
  /**
15791
15800
  * @hidden
15792
15801
  * The flag is needed in order to determine how to construct the items map keys.
15793
- * If `true`, then the key consists of the item's value and 0 (no leveling required),
15794
- * else the key consists of the item's value and level (depth)
15802
+ * If `true`, then the key consists of the item's value and level (depth),
15803
+ * else the key consists of the item's value and 0 (no leveling required)
15795
15804
  */
15796
15805
  isHeterogeneous;
15797
15806
  /**
@@ -16138,7 +16147,7 @@ class MultiSelectTreeComponent {
16138
16147
  }
16139
16148
  else {
16140
16149
  // Remove single tag when the child items are pre-fetched
16141
- const dataItem = this.dataItems[index];
16150
+ const dataItem = this.dataItems.find(item => item.tagPositionIndex === index);
16142
16151
  const itemKey = dataItem.key;
16143
16152
  const lookup = this.lookup.itemLookup(itemKey);
16144
16153
  const pendingCheck = [lookup.item];
@@ -16148,10 +16157,20 @@ class MultiSelectTreeComponent {
16148
16157
  pendingCheck.push(...this.removeParents(lookup.parent));
16149
16158
  }
16150
16159
  const keysToRemove = pendingCheck.map(item => item.key);
16160
+ // Holds the position indexes of the items to be removed
16161
+ const valueDepthIndices = [];
16151
16162
  this.dataItems = this.dataItems.filter((_item, i) => {
16152
- return !keysToRemove.includes(_item.key) || this.disabledIndices.has(i);
16163
+ const shouldStay = !keysToRemove.includes(_item.key) || this.disabledIndices.has(i);
16164
+ if (!shouldStay) {
16165
+ // We need to know the index position of the data item to be able to update the valueDepth array accordignly
16166
+ // as each data item's position is corresponding to the same position in valueDepth
16167
+ valueDepthIndices.push(i);
16168
+ }
16169
+ return shouldStay;
16170
+ });
16171
+ this.valueDepth = this.valueDepth.filter((_item, i) => {
16172
+ return !valueDepthIndices.includes(i) || this.disabledIndices.has(i);
16153
16173
  });
16154
- this.valueDepth = this.dataItems.map(i => i.level);
16155
16174
  }
16156
16175
  this.updateValue(this.dataItems);
16157
16176
  if (!this.isFocused) {
@@ -16560,7 +16579,15 @@ class MultiSelectTreeComponent {
16560
16579
  const source = this.dataItems.map(item => item.dataItem);
16561
16580
  this.tags = this.tagMapper(source);
16562
16581
  this.disabledIndices = this.disabledItemsMapper();
16563
- this.dataItems.sort((a, b) => this.tags.indexOf(a.dataItem) - this.tags.indexOf(b.dataItem));
16582
+ // Create a mapping of tags to position indices
16583
+ const tagIndexMap = new Map(this.tags.map((tag, index) => [JSON.stringify(tag), index]));
16584
+ // Modify dataItems by adding a property to hold the item's position as displayed in the tags
16585
+ this.dataItems.forEach(item => {
16586
+ const serializedDataItem = JSON.stringify(item.dataItem);
16587
+ item.tagPositionIndex = tagIndexMap.has(serializedDataItem)
16588
+ ? tagIndexMap.get(serializedDataItem) // Use the index from tags if it exists
16589
+ : null; // Assign a null value if the dataItem is not visible in the tags
16590
+ });
16564
16591
  }
16565
16592
  updateValue(value) {
16566
16593
  const newValue = this.valuePrimitive ?
@@ -16652,6 +16679,8 @@ class MultiSelectTreeComponent {
16652
16679
  closeActionSheet() {
16653
16680
  this.wrapper.nativeElement.focus();
16654
16681
  this.actionSheet.toggle(false);
16682
+ this.renderer.removeAttribute(this.wrapper.nativeElement, 'aria-controls');
16683
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'false');
16655
16684
  if (this.filterable) {
16656
16685
  this.actionSheetSearchBar.value = '';
16657
16686
  this.filterChange.emit('');
@@ -16663,6 +16692,8 @@ class MultiSelectTreeComponent {
16663
16692
  this.actionSheet.toggle(true);
16664
16693
  this.title = setActionSheetTitle(this.wrapper, this.title);
16665
16694
  this.cdr.detectChanges();
16695
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-controls', this.treeViewId);
16696
+ this.renderer.setAttribute(this.wrapper.nativeElement, 'aria-expanded', 'true');
16666
16697
  updateActionSheetAdaptiveAppearance(this.actionSheet, this.windowSize, this.renderer);
16667
16698
  this.cdr.detectChanges();
16668
16699
  this.opened.emit();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-dropdowns",
3
- "version": "18.1.0-develop.5",
3
+ "version": "18.1.0-develop.7",
4
4
  "description": "A wide variety of native Angular dropdown components including AutoComplete, ComboBox, DropDownList, DropDownTree, MultiColumnComboBox, MultiSelect, and MultiSelectTree ",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -20,7 +20,7 @@
20
20
  "package": {
21
21
  "productName": "Kendo UI for Angular",
22
22
  "productCode": "KENDOUIANGULAR",
23
- "publishDate": 1738324914,
23
+ "publishDate": 1738336350,
24
24
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
25
25
  }
26
26
  },
@@ -31,18 +31,18 @@
31
31
  "@angular/forms": "16 - 19",
32
32
  "@angular/platform-browser": "16 - 19",
33
33
  "@progress/kendo-licensing": "^1.0.2",
34
- "@progress/kendo-angular-common": "18.1.0-develop.5",
35
- "@progress/kendo-angular-utils": "18.1.0-develop.5",
36
- "@progress/kendo-angular-l10n": "18.1.0-develop.5",
37
- "@progress/kendo-angular-navigation": "18.1.0-develop.5",
38
- "@progress/kendo-angular-popup": "18.1.0-develop.5",
39
- "@progress/kendo-angular-icons": "18.1.0-develop.5",
40
- "@progress/kendo-angular-treeview": "18.1.0-develop.5",
34
+ "@progress/kendo-angular-common": "18.1.0-develop.7",
35
+ "@progress/kendo-angular-utils": "18.1.0-develop.7",
36
+ "@progress/kendo-angular-l10n": "18.1.0-develop.7",
37
+ "@progress/kendo-angular-navigation": "18.1.0-develop.7",
38
+ "@progress/kendo-angular-popup": "18.1.0-develop.7",
39
+ "@progress/kendo-angular-icons": "18.1.0-develop.7",
40
+ "@progress/kendo-angular-treeview": "18.1.0-develop.7",
41
41
  "rxjs": "^6.5.3 || ^7.0.0"
42
42
  },
43
43
  "dependencies": {
44
44
  "tslib": "^2.3.1",
45
- "@progress/kendo-angular-schematics": "18.1.0-develop.5",
45
+ "@progress/kendo-angular-schematics": "18.1.0-develop.7",
46
46
  "@progress/kendo-common": "^1.0.1"
47
47
  },
48
48
  "schematics": "./schematics/collection.json",
@@ -4,9 +4,9 @@ const schematics_1 = require("@angular-devkit/schematics");
4
4
  function default_1(options) {
5
5
  const finalOptions = Object.assign(Object.assign({}, options), { mainNgModule: 'DropDownsModule', package: 'dropdowns', peerDependencies: {
6
6
  // peers of the treeview
7
- '@progress/kendo-angular-inputs': '18.1.0-develop.5',
7
+ '@progress/kendo-angular-inputs': '18.1.0-develop.7',
8
8
  // peers of inputs
9
- '@progress/kendo-angular-intl': '18.1.0-develop.5',
9
+ '@progress/kendo-angular-intl': '18.1.0-develop.7',
10
10
  '@progress/kendo-drawing': '^1.17.2',
11
11
  // Peer dependency of icons
12
12
  '@progress/kendo-svg-icons': '^4.0.0'