Provide a built-in option to paste Excel data inside the Editor formatted as a table (like the KendoReact Editor):
Currently, the row pinning functionality of the Grid duplicates the pinned rows in both the pinned section and the normal row section.
Provide a way to avoid this duplication and have the pinned rows displayed only in the pinned section.
Currently, all events are set min-height of 25px. That causes the visually improper display of events:
Removing the applied min-height style will make sure that the events are visually positioned as expected, but the events' titles will be partly or fully hidden:
A workaround based on custom CSS is demonstrated in the following example:
https://stackblitz.com/edit/angular-bvh7fq-1s3ub7
Hi,
Currently, the 'More Events' button is not accessible through keyboard navigation, and it would be helpful if it could be made accessible.
Hi,
This works with Angular 20, must be a change related to that.
If I assign data to the TreeView synchronously, it works, but e.g. in a setTimeout, it doesn't any more. (I assign the full array, change detection is set to eager.)
Reproduction can be found here: https://codesandbox.io/p/devbox/mutable-glade-39twhs?workspaceId=ws_P4gPDf6RC2r5W8xExWQehV
Best regards,
Michael
Further Environment Informations
Component: @progress/kendo-angular-treeview
Severity: regression (worked in v23, broken in v24)
rxjs: 7.8.2
zone.js 0.15.1 (zone-based, not zoneless)
typescript 6.0.3
Summary
When a flat [nodes] array is bound to kendo-treeview and the array reference is replaced after the first change-detection pass, the TreeView keeps rendering the initial nodes and never reflects the new data. In v23.x the same binding updated correctly.
Minimal reproduction (standalone, drop into a blank Angular 22 app / StackBlitz)
import { Component, signal } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { TreeViewModule } from '@progress/kendo-angular-treeview';
interface Node { name: string; }
@Component({
selector: 'app-root',
standalone: true,
imports: [TreeViewModule],
template: `
<button (click)="replaceNodes()">Replace nodes</button>
<p>Plain list (control — reflects the current data):</p>
<ul>
@for (n of nodes(); track n.name) { <li>{{ n.name }}</li> }
</ul>
<p>Kendo TreeView (bug — stays on the initial data):</p>
<kendo-treeview
[nodes]="nodes()"
textField="name"
[kendoTreeViewSelectable]="{ enabled: false }"
>
<ng-template kendoTreeViewNodeTemplate let-dataItem>
{{ dataItem.name }}
</ng-template>
</kendo-treeview>
`,
})
export class AppComponent {
protected readonly nodes = signal<Node[]>([{ name: 'A' }, { name: 'B' }]);
protected replaceNodes(): void {
this.nodes.set([{ name: 'X' }, { name: 'Y' }, { name: 'Z' }]);
}
}
bootstrapApplication(AppComponent).catch(err => console.error(err));
Steps to reproduce
1. Load the component — TreeView renders A, B.
2. Click Replace nodes (assigns a brand-new array [X, Y, Z]).
Expected
The TreeView re-renders and shows X, Y, Z (like the plain <ul> control right above it, which updates correctly — proving the data really changed and change detection ran).
Actual (v24.2.2)
The TreeView still shows A, B. The new [nodes] reference is ignored.
Regression
Identical code updated correctly on @progress/kendo-angular-treeview 23.x. It broke on the upgrade to 24.x. Bisecting across 24.0.0 → 24.2.2 would pinpoint the exact patch.
Current workaround
Force the TreeView to be destroyed and recreated whenever the data reference changes:
@for (nodes of [data()]; track nodes) {
<kendo-treeview [nodes]="nodes" textField="name" ...>...</kendo-treeview>
}
This works but is obviously undesirable (full teardown/rebuild on every data change, loss of internal state).
`@progress/kendo-intl` incorrectly formats timezone offsets whose minute component is non-zero.
For example, a JavaScript `Date` with the historical Warsaw offset `UTC+01:24` is formatted as `+01:04` instead of `+01:24`.
This affects all tested `Z`, `X`, and `x` timezone format variants.
- `@progress/kendo-angular-intl`: `24.2.0`
- `@progress/kendo-intl`: `3.2.1`
- Browser/Node timezone: `Europe/Warsaw`
- Operating system: Windows
- Format: `yyyy-MM-ddTHH:mm:ssZZZZZ`
The same formatting implementation appears in `@progress/kendo-intl` versions `3.1.2` and `3.2.1`.
const { formatDate } = require('@progress/kendo-intl');
process.env.TZ = 'Europe/Warsaw';
const date = new Date(1900, 0, 1, 16, 0, 0);
console.log(date.toString());
console.log(date.getTimezoneOffset());
console.log(formatDate(date, 'yyyy-MM-ddTHH:mm:ssZZZZZ'));Mon Jan 01 1900 16:00:00 GMT+0124
-84
1900-01-01T16:00:00+01:041900-01-01T16:00:00+01:24Date#getTimezoneOffset() returns -84, meaning the local timezone is 84 minutes ahead of UTC:
84 minutes = 1 hour 24 minutesThe issue is not limited to positive offsets:
getTimezoneOffset() | Expected | Actual |
|---|---|---|
-84 | +01:24 | +01:04 |
210 | -03:30 | -03:05 |
UTC is also formatted differently depending on the token, but that behavior may be intentional:
| Offset | Expected ISO representation | ZZZZZ result |
|---|---|---|
0 | +00:00 or Z | Z |
All applicable format variants use the same incorrect minute calculation:
Z -> +0104
ZZ -> +0104
ZZZ -> +0104
ZZZZ -> GMT+01:04
ZZZZZ -> +01:04
X -> +0104
XX -> +0104
XXX -> +01:04
XXXX -> +0104
XXXXX -> +01:04
x -> +0104
xxx -> +01:04
xxxxx -> +01:04Changing from ZZZZZ to XXXXX or XXX therefore does not resolve the problem.
The current formatter appears to perform approximately this calculation:
const offset = date.getTimezoneOffset() / 60;
const hoursMinutes = Math.abs(offset).toString().split('.');
const minutes = hoursMinutes[1] || 0;For an 84-minute offset:
84 / 60 = 1.4The decimal portion "4" is then treated as four minutes and padded to "04".
However, the fractional part represents a fraction of an hour:
0.4 hours * 60 = 24 minutesLikewise, for 210 minutes:
210 / 60 = 3.5The formatter produces 03:05, although 0.5 hours is 30 minutes.
Timezone offsets should remain integer minute values throughout formatting:
function formatTimeZone(date, info, options) {
const totalMinutes = date.getTimezoneOffset();
const absoluteMinutes = Math.abs(totalMinutes);
const hours = Math.floor(absoluteMinutes / 60);
const minutes = absoluteMinutes % 60;
const sign = totalMinutes <= 0 ? '+' : '-';
// Continue applying shortHours, separator, optionalMinutes,
// localizedName and zZeroOffset options using hours and minutes.
}The important calculations are:
const hours = Math.floor(Math.abs(offsetMinutes) / 60);
const minutes = Math.abs(offsetMinutes) % 60;Converting the offset to a decimal hour and splitting its string representation is not reliable.
it('formats a positive timezone offset with minutes', () => {
const date = new Date(2024, 5, 25, 12, 7, 5);
vi.spyOn(date, 'getTimezoneOffset').mockReturnValue(-84);
expect(formatDate(date, 'yyyy-MM-ddTHH:mm:ssZZZZZ'))
.toBe('2024-06-25T12:07:05+01:24');
});
it('formats a negative timezone offset with minutes', () => {
const date = new Date(2024, 5, 25, 12, 7, 5);
vi.spyOn(date, 'getTimezoneOffset').mockReturnValue(210);
expect(formatDate(date, 'yyyy-MM-ddTHH:mm:ssZZZZZ'))
.toBe('2024-06-25T12:07:05-03:30');
});Other useful cases include:
-345 -> +05:45
-330 -> +05:30
210 -> -03:30
0 -> Z or +00:00, depending on the selected token
This can corrupt serialized date-time values when they are passed to systems that honor the emitted offset, including .NET DateTimeOffset.
Example:
Intended: 1900-01-01T16:00:00+01:24
Emitted: 1900-01-01T16:00:00+01:04These values represent instants 20 minutes apart.
The issue affects:
Date implementation returning a non-whole-hour offset.Examples of modern fractional offsets include UTC+05:30, UTC+05:45, UTC+09:30, and UTC-03:30.
We initially encountered this with Europe/Warsaw and 1900-01-01. The JavaScript runtime correctly reports Warsaw's historical offset as UTC+01:24. The incorrect UTC+01:04 value is introduced only during Kendo formatting.
We have implemented a temporary application-level workaround that formats the date portion with Kendo and calculates the timezone offset directly from integer minutes.
Hello,
I have prepared an example, here's how you reproduce the bug (https://stackblitz.com/edit/angular-2nwrn7db?file=src%2Fapp%2Fapp.component.ts):
1. Move the Product Name column between the Category and Unit Price columns
2. Save the Grid state using the Save State button
3. Reload the page
4. Restore the saved state using the Load State button
5. The multi-column Test (k-grid0-col4) has the wrong OrderIndex (0 instead of 4)
Best regards,
Igor
Currently, there is no public API to customize the visible month window. The built-in header buttons move the months window by a two-month span.
Provide a way in the MultiViewCalendar to programmatically shift the displayed months by one month backward or forward. For example:
Due to the internal mechanism by which the Scheduler displays events per day, some events are shrunk without reason, because others are shrunk due to overlap.
In the following screenshot, the Scheduler Event 1 has enough space to occupy the entire column, but is shrunk the same as Event 2 (which is shrunk due to the overlap with Event 3). Internally, each day use column separation logic to distribute the events. Since all three events fall into the same slot, the entire column is divided by 3 and events are distributed among them. Since Event 1 is the first event, it has been shown in the first 1/3. This isn't optimal, as this case proves it.
Here is how Kendo Scheduler behaves compared to Google Calendar in this case
Google Calendar
When dateinput format is "d/M/y" and "allowCaretMode" is enabled, users are unable to enter valid dates. Tested with dateinput and datepicker components.
https://stackblitz.com/edit/angular-kendo-dateinput-bug-rdocwtvr
The user should be able to enter a full year, month, and day after typing a valid single-digit day and month.
After entering a single-digit day and month, the input locks up, preventing the user from typing more than one character for the year or month. This prevents users from entering valid dates, making the input unusable in this scenario.
Thanks
Currently, the Diagram component allows setting the zoom level through the zoom property, but it does not provide a way to specify the zoom location or point. As a result, zooming always centers on the (0,0) coordinate.
Add built-in support for programmatically zooming into a specific point through the DiagramComponent API. This can be a method similar to the one available in the Kendo UI for jQuery Diagram widget:
Signal Forms are now stable with Angular@22.
It would be nice to have an ability to use all kendo widgets with new form API.
It would be great if you would allow loading single sheets instead of all the sheets every time. I receive data per sheet from my server.
Also the Spreadsheet fails to trigger events for:
The built-in kendoDropDownFilter directive normalizes text using String.prototype.toLowerCase() when caseSensitive: false. This is locale-insensitive and produces incorrect results for languages with non-standard case-folding rules, most notably Turkish.
The correct fix is to use String.prototype.toLocaleLowerCase(locale), which respects locale-specific case rules. The DropDownFilterSettings interface should expose a locale option for this:
filterSettings = {
caseSensitive: false,
operator: 'startsWith',
locale: 'tr-TR' // ← proposed new option
};Affected components: kendoDropDownFilter directive (used with AutoCompleteComponent, ComboBoxComponent, MultiColumnComboBoxComponent, DropDownListComponent, MultiSelectComponent).
For the Kendo DatePicker, if you try to set the size on a kendo-datepicker with plain text, it will not render and give a console error of "ERROR TypeError: Cannot read properties of undefined (reading 'nativeElement')".
Errors:
// HTML
<kendo-datepicker size="small" ... />
---
But on the other hand, it does work if you create a field of type "DateInputSize" and pass that variable to the size.
Works:// TS
protected size: DateInputSize = 'small';
// HTML
<kendo-datepicker [size]="size" ... />