Pending Review
Last Updated: 19 Oct 2026 12:12 by Tom

Product: Kendo UI for jQuery — TreeList (also related Grid issues below)
Version: 2026.2.520 (2026 Q2), jQuery 3.5.1
Browser / AT: Google Chrome 155 (Windows 11) with NVDA (latest)
Severity: Accessibility (WCAG 2.2 SC 1.3.1 Info and Relationships)

Summary
In a TreeList that has a locked column, NVDA announces the locked column's header instead of the current column's header when keyboard focus moves to a cell in the scrollable part.

A Grid with the same layout (locked column + scrollable columns + hidden columns) is announced correctly, so the problem seems specific to how the TreeList builds its accessible table (`role="treegrid"` with rows assembled through `aria-owns`).

Here is a Dojo showing the issue: https://dojo.telerik.com/QYJCWJUj

Steps to reproduce
1. Create a TreeList with `navigatable: true`, one or more locked columns (including a hidden locked column) and several unlocked columns (sample here).
2. Open it in Chrome with NVDA running.
3. Click a cell in the first unlocked column ("April"), or Tab into the TreeList and use the arrow keys to reach it.

Expected
NVDA announces the cell, its row and its own column header, e.g.:
`0 / 8, row 2, April, column 2`

Actual
NVDA announces the locked column's header and wrong column number:
`0 / 8  April  row 2  Hierarchy  column 4`

Sample
<div id="treelist"></div>
<script>
  $("#treelist").kendoTreeList({
    navigatable: true,
    height: 300,
    dataSource: {
      data: [
        { id: 1, parentId: null, name: "Region A", apr: "0 / 8", may: "1 / 8", jun: "2 / 8", jul: "3 / 8" },
        { id: 2, parentId: 1, name: "Store 1", apr: "0 / 2", may: "1 / 2", jun: "2 / 2", jul: "2 / 2" }
      ],
      schema: { model: { id: "id", parentId: "parentId", expanded: true } }
    },
    columns: [
      { field: "id", title: "Id", hidden: true, locked: true, width: 80 },
      { field: "name", title: "Hierarchy", locked: true, width: 220 },
      { field: "mar", title: "March", hidden: true, width: 120 },
      { field: "apr", title: "April", width: 120 },
      { field: "may", title: "May", width: 120 },
      { field: "jun", title: "June", width: 120 },
      { field: "jul", title: "July", width: 120 }
    ]
  });
</script>

Moving right through the unlocked columns keeps announcing "Hierarchy" as the column header. The correct header is only heard because each cell's `aria-describedby` points to its header cell.

What we checked in the DOM
- The `role="treegrid"` table owns the `thead` and `tbody` row groups (`aria-owns`).
- The header row and every data row each own the same number of cells (locked cells first, then scrollable cells) in the same order. No element is owned twice.


Pending Review
Last Updated: 16 Oct 2026 09:10 by Alex

Kendo grid in version  2026.3.811 moves scroll to start when navigatable: true in RTL. It makes impossible to edit. 
Same setting in version 2025.3.812 works well.

Same grid configuration with different kendo version dojo:

dojo with scroll jump 2026.3.811

dojo normal work 2025.3.812


<!DOCTYPE html>
<html>
<head>
    <base href="https://demos.telerik.com/kendo-ui/grid/right-to-left-support">
    <style>html { font-size: 14px; font-family: Arial, Helvetica, sans-serif; }</style>
    <title></title>
    <link href="https://kendo.cdn.telerik.com/themes/14.6.1/meridian/meridian-main.css" rel="stylesheet" />
    <script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
    
    
    
    <script src="https://kendo.cdn.telerik.com/2026.3.1015/js/kendo.all.min.js"></script>
    
    
</head>
<body>
    <script src="../content/shared/js/products.js"></script>

<div id="example">
    <div class="k-rtl">
        <div id="grid"></div>
    </div>

    <script>
      	const columns = [
    {
        "title": " ",
        "field": "IS_CHECKED",
        "type": "string",
        "width": 45
    },
    {
        "title": " ",
        "field": "IS_PERIOD_LOCKED",
        "type": "string",
        "width": 100
    },
    {
        "title": " ",
        "field": "HAS_COPY_ROW",
        "type": "number",
        "width": 45
    },
    {
        "title": "STATUS_VAL",
        "field": "STATUS_VAL",
        "type": "string",
        "width": 45
    },
    {
        "title": "קוד עובד",
        "field": "CHANNEL_CODE",
        "type": "string",
        "width": "155px"
    },
    {
        "title": "שם העובד",
        "field": "CHANNEL_NAME",
        "type": "string",
        "width": "155px"
    },
    {
        "title": "Sales Type",
        "field": "FLEX1",
        "type": "string",
        "width": "135px"
    },
    {
        "title": "Amount",
        "field": "QUANTITY",
        "type": "number",
        "width": "120px"
    },
    {
        "title": "Amount Type",
        "field": "FLEX4",
        "type": "string",
        "width": "145px"
    },
    {
        "title": "FOP",
        "field": "FLEX5",
        "type": "string",
        "width": "120px"
    },
    {
        "title": "Product",
        "field": "FLEX6",
        "type": "string",
        "width": "120px"
    },
    {
        "title": "Customer Type",
        "field": "FLEX7",
        "type": "string",
        "width": "165px"
    },
    {
        "title": "Customer",
        "field": "FLEX8",
        "type": "string",
        "width": "115px"
    },
    {
        "title": "Order Date",
        "field": "FLEX9",
        "type": "string",
        "width": "135px"
    },
    {
        "title": "file row",
        "field": "FILE_ROW_NUMBER",
        "type": "string",
        "width": "115px"
    },
    {
        "title": "file name",
        "field": "FILE_NAME",
        "type": "string",
        "width": "125px"
    },
    {
        "title": "דשגשדג",
        "field": "FLEX135",
        "type": "string",
        "width": "120px"
    },
    {
        "title": "lov search",
        "field": "FLEX2",
        "type": "string",
        "width": "135px"
    },
    {
        "title": "Date field",
        "field": "FLEX10",
        "type": "date",
        "width": "135px"
    },
    {
        "title": "steve",
        "field": "FLEX55",
        "type": "string",
        "width": "120px"
    },
    {
        "title": "My file",
        "field": "FLEX15",
        "type": "string",
        "width": "120px"
    },
    {
        "title": "Approval Description",
        "field": "APPROVAL_DESC",
        "type": "string",
        "width": "235px"
    },
    {
        "title": "Approval Status",
        "field": "APPROVAL_STATUS",
        "type": "string",
        "width": "185px"
    },
    {
        "title": "CheckCFLEX",
        "field": "CFLEX116",
        "type": "boolean",
        "width": "135px"
    },
    {
        "title": "BBBBBBBB123",
        "field": "CFLEX117",
        "type": "string",
        "width": "145px"
    },
    {
        "title": "aaa",
        "field": "CFLEX54",
        "type": "string",
        "width": "120px"
    },
    {
        "title": "AAAAAAA123",
        "field": "CFLEX3",
        "type": "string",
        "width": "135px"
    },
    {
        "title": "Creation date -CF",
        "field": "CFLEX26",
        "type": "date",
        "width": "205px"
    }
];
      	const data = [
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 7,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS100",
        "CHANNEL_NAME": "GS100",
        "FLEX1": "",
        "QUANTITY": 542.8,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "AAAA",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "245",
        "APPROVAL_DESC": "The text for REJECTION 2",
        "APPROVAL_STATUS": "N",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 2,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS105",
        "CHANNEL_NAME": "GS105",
        "FLEX1": "",
        "QUANTITY": 542.8,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "AAAA",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "240",
        "APPROVAL_DESC": "The text for approval",
        "APPROVAL_STATUS": "Y",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 6,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS106",
        "CHANNEL_NAME": "GS106",
        "FLEX1": "",
        "QUANTITY": 142.8,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "BBBB",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "242",
        "APPROVAL_DESC": "The text for approval",
        "APPROVAL_STATUS": "Y",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 3,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS107",
        "CHANNEL_NAME": "GS107",
        "FLEX1": "",
        "QUANTITY": 542.8,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "AAAA",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "241",
        "APPROVAL_DESC": "The text for approval",
        "APPROVAL_STATUS": "Y",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 5,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS100",
        "CHANNEL_NAME": "GS100",
        "FLEX1": "",
        "QUANTITY": 600,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "BBBB",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "240",
        "APPROVAL_DESC": "The text for approval 2",
        "APPROVAL_STATUS": "Y",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 2,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS105",
        "CHANNEL_NAME": "GS105",
        "FLEX1": "",
        "QUANTITY": 234,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "AAAA",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "240",
        "APPROVAL_DESC": "",
        "APPROVAL_STATUS": "",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 2,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS106",
        "CHANNEL_NAME": "GS106",
        "FLEX1": "",
        "QUANTITY": 255,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "AAAA",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "240",
        "APPROVAL_DESC": "",
        "APPROVAL_STATUS": "",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    },
    {
        "IS_PERIOD_LOCKED": "N",
        "HAS_COPY_ROW": 2,
        "STATUS_VAL": "",
        "CHANNEL_CODE": "GS107",
        "CHANNEL_NAME": "GS107",
        "FLEX1": "",
        "QUANTITY": 12,
        "FLEX4": "454646",
        "FLEX5": "",
        "FLEX6": "AAAA",
        "FLEX7": "",
        "FLEX8": "reerwe",
        "FLEX9": "g",
        "FILE_ROW_NUMBER": "",
        "FILE_NAME": "",
        "FLEX135": "",
        "FLEX2": "",
        "FLEX10": null,
        "FLEX55": "",
        "FLEX15": "240",
        "APPROVAL_DESC": "",
        "APPROVAL_STATUS": "",
        "CFLEX116": false,
        "CFLEX117": "",
        "CFLEX54": "",
        "CFLEX3": "",
        "CFLEX26": null
    }
]; 
      const fields = {
    "IS_CHECKED": {
        "type": "",
        "hidden": false,
        "filterable": false,
        "sortable": false
    },
    "CHANNEL_ID": {
        "editable": false,
        "type": "number",
        "hidden": true,
        "defaultValue": -1
    },
    "ITEM_ID": {
        "editable": false,
        "type": "number",
        "hidden": true,
        "defaultValue": -1
    },
    "IS_PERIOD_LOCKED": {
        "editable": false,
        "type": "string",
        "hidden": false,
        "defaultValue": "N",
        "sortable": false
    },
    "HAS_COPY_ROW": {
        "editable": false,
        "type": "number",
        "hidden": false,
        "defaultValue": 0,
        "sortable": false
    },
    "ROWID": {
        "editable": false,
        "type": "string",
        "hidden": true,
        "defaultValue": "-1"
    },
    "CHANNEL_CODE": {
        "hidden": false,
        "type": "string"
    },
    "CHANNEL_NAME": {
        "hidden": false,
        "type": "string"
    },
    "MANUALLY_CHANGED": {
        "editable": false,
        "type": "string",
        "hidden": true,
        "defaultValue": "N"
    },
    "FLEX1": {
        "type": "string",
        "hidden": false
    },
    "QUANTITY": {
        "type": "number",
        "hidden": false
    },
    "FLEX4": {
        "type": "string",
        "hidden": false
    },
    "FLEX5": {
        "type": "string",
        "hidden": false
    },
    "FLEX6": {
        "type": "string",
        "hidden": false
    },
    "FLEX7": {
        "type": "string",
        "hidden": false
    },
    "FLEX8": {
        "type": "string",
        "hidden": false
    },
    "FLEX9": {
        "type": "string",
        "hidden": false
    },
    "FILE_ROW_NUMBER": {
        "type": "string",
        "hidden": false
    },
    "FILE_NAME": {
        "type": "string",
        "hidden": false
    },
    "FLEX135": {
        "type": "string",
        "hidden": false
    },
    "FLEX2": {
        "type": "string",
        "hidden": false
    },
    "FLEX10": {
        "type": "date",
        "hidden": false
    },
    "FLEX55": {
        "type": "string",
        "hidden": false
    },
    "FLEX15": {
        "type": "string",
        "hidden": false
    },
    "APPROVAL_DESC": {
        "type": "string",
        "hidden": false
    },
    "APPROVAL_STATUS": {
        "type": "string",
        "hidden": false
    },
    "CFLEX116": {
        "type": "boolean",
        "hidden": false
    },
    "CFLEX117": {
        "type": "string",
        "hidden": false
    },
    "CFLEX54": {
        "type": "string",
        "hidden": false
    },
    "CFLEX3": {
        "type": "string",
        "hidden": false
    },
    "CFLEX26": {
        "type": "date",
        "hidden": false
    }
};
        $(document).ready(function() {
            $("#grid").kendoGrid({
                dataSource: {
                    data: data,
                    schema: {
                        model: {
                            fields: fields
                        }
                    },
                    pageSize: 20
                },
              	columns: columns,
                height: 550,
              	navigatable: true,
                sortable: true,
                groupable: true,
                resizable: true,
                pageable: true,
                
            });
        });
    </script>
</div>



</body>
</html>

Pending Review
Last Updated: 22 Jun 2026 12:38 by Software
Created by: Software
Comments: 0
Category: Kendo UI for jQuery
Type: Feature Request
2

Hi,

I've followed your AI integration example but I noticied that when I use the updateMessage method for some reason the chat scroll move toward the start of the message. Maybe I'm wrong but looking at the source code I think that the problem is the chat-widget.js inside this method


_refreshStandardSync(message, isOwnMessage, wasNearBottom) {
        if (!message) {
            return;
        }
        this.renderMessage(message);
        if (isOwnMessage) {
            this.scrollToBottom();
        }
        else if (wasNearBottom && message.uid) {
            this.view.scrollIncomingMessage(message.uid);
        }
    }
I think that if the message is mine is correct that the chat scrolls to the bottom, but maybe the code in the other users branch can lead into this effect. The desired behaviour is giving a Chat-GPT UX, so if the user isn't scrolling the chat must scroll to the bottom, if the user scrolls the chat must keep user position. Actually in my opinion the chat is not fully designed to support streaming token AI, but maybe my code has some problems.


This is my code to manage streaming token AI and kendo chat initialization



$("#copilotChat").kendoChat({
	authorId: "user",
	height: "100%",
	messageBox: {
		mode: "auto"
	},
	fileAttachment: false,
	speechToText: false,
	messageWidthMode: "full",
	skipSanitization: true,
	sendMessage: function (e) {
		if (e.generating) {
			//cancelling request, code omitted
		}
		else {
			//new request, code omitted
		   
		}
	}
});

//receive message via SSE (code omitted)

const chat = $("#copilotChat").data("kendoChat");
let messageObject = chat.dataSource.get(params.runId);

dashboardProposal.currentCopilotChatText += params.content;
if (messageObject) {
	const markdown = markdownInstance.parse(dashboardProposal.currentCopilotChatText);
	chat.updateMessage(messageObject, { text: markdown });
}
else {
	chat.postMessage({
		authorId: "assistant",
		authorName: app.i18n("advice_dashboardProposal_authorNameCopilot"),
		text: params.content,
		id: params.runId
	});
}

I believe this feature would greatly facilitate the integration of AI token streaming into web applications.
Thanks in advance
Pending Review
Last Updated: 09 Sep 2022 06:29 by ADMIN

Add a hidden input to store the current value in it at all times, and a visible display input that has the month/day/year or current value displayed in it; it solved all of the issues and is currently implemented on numerous other Kendo form input controls.

This will make the DateInput compatible with JQuery Unobtrusive Validation.