Skip to content

Commit 789ef8d

Browse files
committed
Sync with Kendo UI Professional
1 parent 96fe9df commit 789ef8d

File tree

12 files changed

+150
-37
lines changed

12 files changed

+150
-37
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ "year": 2025, "release": 2, "smallRelease": false }
1+
{ "year": 2025, "release": 2, "smallRelease": true }

docs-aspnet/_config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -786,13 +786,13 @@ navigation:
786786
baseurl: /aspnet-core
787787

788788
## The Kendo UI version used
789-
cdnVersion: "2025.2.520"
789+
cdnVersion: "2025.2.702"
790790

791791
## The themes CDN used
792792
themesCdnVersion: "11.0.2"
793793

794794
## The MVC Core version used
795-
mvcCoreVersion: "2025.2.520"
795+
mvcCoreVersion: "2025.2.702"
796796

797797
productCode: UIASPCORE
798798

docs/_config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ navigation:
615615
baseurl: /kendo-ui
616616

617617
## The Kendo UI version used
618-
cdnVersion: "2025.2.520"
618+
cdnVersion: "2025.2.702"
619619

620620
## The themes CDN used
621621
themesCdnVersion: "11.0.2"
@@ -624,7 +624,7 @@ themesCdnVersion: "11.0.2"
624624
pdfjsCdnVersion: "4.6.82"
625625

626626
## The MVC Core version used
627-
mvcCoreVersion: "2025.2.520"
627+
mvcCoreVersion: "2025.2.702"
628628

629629
## Progress NPM Registry
630630
registry_url: 'https://registry.npm.telerik.com/'

src/kendo.menu.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,13 @@ export const __meta__ = {
398398
result.push(popup);
399399
}
400400
opener = popup.find(popupOpenerSelector());
401-
popupId = opener.data(POPUP_OPENER_ATTR);
401+
402+
if (opener && opener.length && opener.length > 1) {
403+
result.push(...getChildPopups(popup, overflowWrapper));
404+
popupId = null;
405+
} else {
406+
popupId = opener.data(POPUP_OPENER_ATTR);
407+
}
402408
}
403409
});
404410

@@ -2832,7 +2838,6 @@ export const __meta__ = {
28322838

28332839
close: function() {
28342840
var that = this;
2835-
28362841
if (contains(that.element[0], $(arguments[0])[0]) || that._itemHasChildren(arguments[0])) {
28372842
Menu.fn.close.call(that, arguments[0]);
28382843
} else {

src/kendo.popup.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,7 @@ export const __meta__ = {
272272
overflow: HIDDEN,
273273
display: "block",
274274
position: ABSOLUTE
275-
})
276-
.attr("aria-hidden", false);
275+
});
277276

278277
parent = element.parent();
279278

@@ -308,8 +307,8 @@ export const __meta__ = {
308307
.kendoStop(true)
309308
.kendoAnimate(animation);
310309

311-
312310
element.attr("aria-hidden", false);
311+
313312
}
314313
},
315314

@@ -417,6 +416,10 @@ export const __meta__ = {
417416
if (that.visible()) {
418417
wrap = (that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide());
419418

419+
if ($(document.activeElement).parents(".k-list-filter").length) {
420+
$(document.activeElement).blur();
421+
}
422+
420423
that._toggleResize(false);
421424

422425
if (that._closing || that._trigger(CLOSE)) {
@@ -454,15 +457,16 @@ export const __meta__ = {
454457
}
455458

456459
parent.kendoStop(true);
457-
that.element.attr("aria-hidden", true);
458460
wrap
459-
.css({ overflow: HIDDEN }) // stop callback will remove hidden overflow
460-
.attr("aria-hidden", true);
461+
.css({ overflow: HIDDEN }); // stop callback will remove hidden overflow
462+
461463
parent.kendoAnimate(animation);
462464

463465
if (skipEffects) {
464466
that._animationClose();
465467
}
468+
469+
that.element.attr("aria-hidden", true);
466470
}
467471
},
468472

src/kendo.sortable.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -429,21 +429,13 @@ export const __meta__ = {
429429

430430
this._originalCursorType = body.css("cursor");
431431
body.css({ "cursor": cursor });
432-
433-
if (!this._cursorStylesheet) {
434-
this._cursorStylesheet = $("<style>* { cursor: " + cursor + " !important; }</style>");
435-
}
436-
437-
this._cursorStylesheet.appendTo(body);
438432
}
439433
},
440434

441435
_resetCursor: function() {
442436
if (this._originalCursorType) {
443437
$(document.body).css("cursor", this._originalCursorType);
444438
this._originalCursorType = null;
445-
446-
this._cursorStylesheet.remove();
447439
}
448440
},
449441

src/kendo.validator.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -674,9 +674,12 @@ export const __meta__ = {
674674

675675
customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;
676676

677-
return kendo.format(input.attr(kendo.attr(ruleKey + "-msg")) || input.attr("validationMessage") || nonDefaultMessage || customMessage || input.attr("title") || "",
677+
const closestParentWithFieldName = input.parent().closest("[name='" + fieldName + "']");
678+
const target = closestParentWithFieldName.length ? closestParentWithFieldName : input;
679+
680+
return kendo.format(target.attr(kendo.attr(ruleKey + "-msg")) || target.attr("validationMessage") || nonDefaultMessage || customMessage || target.attr("title") || "",
678681
fieldName,
679-
input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));
682+
target.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));
680683
},
681684

682685
_checkValidity: function(input) {

tests/unit/actionsheet/aria.js

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import '@progress/kendo-ui/src/kendo.actionsheet.js';
2+
import { TimerUtils } from '../../helpers/unit/timer-utils.js';
3+
import { asyncTest } from '../../helpers/unit/async-utils.js';
4+
25

36
let ActionSheet = kendo.ui.ActionSheet,
47
div,
@@ -21,20 +24,21 @@ describe("kendo.ui.ActionSheet accessibility with AXE", function() {
2124
}, options));
2225
}
2326
beforeEach(function() {
27+
TimerUtils.initTimer();
2428
div = $("<div style='color:green'></div>").appendTo(Mocha.fixture);
2529

2630
});
2731
afterEach(function() {
32+
TimerUtils.destroyTimer();
2833
instance.destroy();
2934
kendo.destroy(Mocha.fixture);
3035
});
3136

32-
it("ActionSheet is accessible", async function() {
37+
asyncTest("ActionSheet is accessible", function(done) {
3338
createInstance({
3439
open: function(e) {
35-
setTimeout(async function() {
36-
await axeRunFixture();
37-
});
40+
TimerUtils.advanceTimer(1);
41+
done(() => axeRunFixture());
3842
},
3943
});
4044

@@ -58,48 +62,77 @@ describe("kendo.ui.ActionSheet WAI-ARIA", function() {
5862
}, options));
5963
}
6064
beforeEach(function() {
65+
TimerUtils.initTimer();
6166
div = $("<div style='color:green'></div>").appendTo(Mocha.fixture);
6267

6368
});
6469
afterEach(function() {
70+
TimerUtils.destroyTimer();
6571
instance.destroy();
6672
kendo.destroy(Mocha.fixture);
6773
});
6874

69-
it("ActionSheet items collection has role='group'", async function() {
75+
asyncTest("ActionSheet items collection has role='group'", function(done) {
76+
createInstance({
77+
open: function() {
78+
TimerUtils.advanceTimer(1);
79+
done(() => assert.equal(instance.wrapper.find(".k-list-ul").attr("role"), "group"));
80+
},
81+
});
82+
83+
instance.open();
84+
});
85+
86+
asyncTest("ActionSheet li elements have role='none'", function(done) {
7087
createInstance({
7188
open: function() {
72-
assert.equal(instance.wrapper.find(".k-list-ul").attr("role"), "group");
89+
TimerUtils.advanceTimer(1);
90+
done(() => assert.equal(instance.wrapper.find(".k-actionsheet-item").attr("role"), "button"));
7391
},
7492
});
7593

7694
instance.open();
7795
});
7896

79-
it("ActionSheet li elements have role='none'", async function() {
97+
asyncTest("ActionSheet has role='dialog'", function(done) {
8098
createInstance({
8199
open: function() {
82-
assert.equal(instance.wrapper.find(".k-actionsheet-item").attr("role"), "button");
100+
TimerUtils.advanceTimer(1);
101+
done(() => assert.equal(instance.wrapper.find(".k-actionsheet").attr("role"), "dialog"));
83102
},
84103
});
85104

86105
instance.open();
87106
});
88107

89-
it("ActionSheet has role='dialog'", async function() {
108+
asyncTest("ActionSheet has aria-modal='true'", function(done) {
90109
createInstance({
91110
open: function() {
92-
assert.equal(instance.wrapper.find(".k-actionsheet").attr("role"), "dialog");
111+
TimerUtils.advanceTimer(1);
112+
done(() => assert.equal(instance.wrapper.find(".k-actionsheet").attr("aria-modal"), "true"));
113+
},
114+
});
115+
116+
instance.open();
117+
});
118+
119+
asyncTest("ActionSheet has aria-hidden='true'", function(done) {
120+
createInstance({
121+
close: function() {
122+
TimerUtils.advanceTimer(1);
123+
done(() => assert.equal(instance.wrapper.find(".k-actionsheet").attr("aria-hidden"), "true"));
93124
},
94125
});
95126

96127
instance.open();
128+
instance.close();
97129
});
98130

99-
it("ActionSheet has aria-modal='true'", async function() {
131+
asyncTest("ActionSheet has aria-hidden='false'", function(done) {
100132
createInstance({
101133
open: function() {
102-
assert.equal(instance.wrapper.find(".k-actionsheet").attr("aria-modal"), "true");
134+
TimerUtils.advanceTimer(1);
135+
done(() => assert.equal(instance.wrapper.find(".k-actionsheet").attr("aria-hidden"), "false"));
103136
},
104137
});
105138

tests/unit/notification/aria.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,30 @@ describe("Notification WAI-ARIA", function() {
6666
assert.equal(element.attr("aria-hidden"), "true");
6767
});
6868

69+
it("Notification popup has aria-hidden set to 'true'", function() {
70+
notification = createNotification({
71+
button: true
72+
});
73+
74+
notification.show("foo");
75+
76+
let element = $(".k-notification");
77+
notification.hide();
78+
79+
assert.equal(element.attr("aria-hidden"), "true");
80+
});
81+
82+
it("Notification popup has aria-hidden set to 'false'", function() {
83+
notification = createNotification({
84+
button: true
85+
});
86+
87+
notification.show("foo");
88+
89+
let element = $(".k-notification");
90+
assert.equal(element.attr("aria-hidden"), "false");
91+
});
92+
6993
it("Notification does not violate AXE", async function() {
7094
notification = createNotification({
7195
button: true

tests/unit/toolbar/no-csp-tests.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ describe("Toolbar: no-csp: ", function() {
66
beforeEach(function() {
77

88
container = $("<div id='toolbar' />").appendTo(Mocha.fixture);
9+
10+
Mocha.fixture.append(
11+
`<script id="myTemplate" type="text/x-kendo-template">
12+
<button id="btn1">fooo</button>
13+
<script>$("\\#btn1").kendoButton({themeColor:"warning"})<\\/script>
14+
</script>`
15+
);
916
});
1017

1118
afterEach(function() {
@@ -25,4 +32,15 @@ describe("Toolbar: no-csp: ", function() {
2532
assert.equal(toolbar.element.find("#foo").text(), "test");
2633
});
2734

35+
it("external template is evaluated when wrapper components are used in template", function() {
36+
let toolbar = container.kendoToolBar({
37+
items: [
38+
{ template: kendo.template($("#myTemplate").html()) }
39+
]
40+
}).data("kendoToolBar");
41+
42+
let btn = kendo.widgetInstance($("#btn1"));
43+
assert.isOk(btn instanceof kendo.ui.Button);
44+
});
45+
2846
});

0 commit comments

Comments
 (0)