Unplanned
Last Updated: 11 Nov 2026 11:30 by ADMIN

On the kendo editor for angular, when the toolbar controls for both background color and foreground color are present and I select a background color, the color chosen for background is shown in the swatch for both the back ground and foreground buttons even though nothing has been selected in the foreground

Unplanned
Last Updated: 09 Nov 2026 14:44 by ADMIN

Hello Kendo UI for Angular team,
We found a memory leak in the Kendo UI for Angular DateTimePicker and would like to ask you to fix it. Every time the popup is opened and closed, the complete popup DOM (about 2,000 nodes) and one keydown listener stay in memory until the DateTimePicker itself is destroyed. We could not find an existing report on GitHub, the feedback portal or the forums.

ENVIRONMENT
- @progress/kendo-angular-dateinputs 23.4.0 (our version). The same code is in 24.2.2, in 25.3.0 and in the bundle of your online demo.
- Angular 21.2, RxJS 7.8, Chrome 153, production build.
- Default calendarType ('infinite').

STEPS TO REPRODUCE (on your online demo)
1. Open https://demos.telerik.com/kendo-angular-ui/demos/dateinputs/datetimepicker/basic_usage in Chrome.
2. Open DevTools > Performance monitor (DOM Nodes, JS event listeners), or the Memory tab.
3. Open the popup with the calendar button and close it with Escape. Repeat 8 times.
4. Collect garbage (Memory tab > "Collect garbage") and take a heap snapshot. Filter by "Detached".

ACTUAL RESULT
After forced garbage collection following each cycle:
- DOM nodes: 122 → 2,452 → 4,497 → 6,542 → 8,587 → 10,632 → 12,677 → 14,722 → 16,767 (about +2,045 per open).
- JS event listeners: 63 → 71 (+1 per open).
- The heap snapshot contains 8 detached table.k-calendar-table elements, each with its whole popup subtree, retained by an RxJS subscription teardown.
Closing with Cancel, Set or the toggle button behaves the same. In the same setup, the DatePicker and TimePicker do not grow.

EXPECTED RESULT
After the popup closes and garbage is collected, the DOM node and listener counts return to their previous level.

ROOT CAUSE
For the infinite calendar, DateTimePickerComponent.openPopup() adds a keydown subscription on the month list to the component-lifetime `subscriptions`:
    if (this.calendar.type === 'infinite') {
        this.subscriptions.add(fromEvent(this.calendar.monthView.list.nativeElement, 'keydown').subscribe((event) => {
            ...
        }));
    }
(fesm2022/progress-kendo-angular-dateinputs.mjs: line 16741 in 23.4.0, line 18024 in 25.3.0.)
closePopup() unsubscribes ariaActiveDescendantSubscription, but not this subscription, and `subscriptions` is only unsubscribed in ngOnDestroy(). Every open therefore adds another listener on the new calendar table, and that listener keeps the closed popup alive.

SUGGESTED FIX
Keep the subscription per popup and release it when the popup closes, for example:
    private calendarKeydownSubscription: Subscription | null = null;
    // openPopup()
    if (this.calendar.type === 'infinite') {
        this.calendarKeydownSubscription = fromEvent(this.calendar.monthView.list.nativeElement, 'keydown').subscribe((event) => {
            ...
        });
    }
    // closePopup() and ngOnDestroy()
    this.calendarKeydownSubscription?.unsubscribe();
    this.calendarKeydownSubscription = null;

IMPACT
We use the DateTimePicker in form fields and in the filter row of a data grid, where the picker lives as long as the grid is shown. Each open adds about 2,000 detached DOM nodes, so memory keeps growing on long-lived screens (100 opens leave about 200,000 detached nodes) until the user leaves the page. Because `subscriptions` is private, we cannot release the subscription cleanly from application code. The subscription is only created for the infinite calendar, but switching to calendarType 'classic' is not an option for us because it changes the calendar experience.

REQUEST
- Please confirm the issue and fix it in an upcoming release, and let us know which version will include the fix.
- If you track it publicly (feedback portal or GitHub), please send us the link so we can follow it.
- Please let us know whether there is a supported workaround until the fix is released.
We are happy to share heap snapshots and our automated Playwright reproduction script.

Kind regards,
Kamil

Unplanned
Last Updated: 09 Nov 2026 09:45 by ADMIN

Hello,

Please repeat the following steps to reproduce this issue:

  1. Go to https://www.telerik.com/kendo-angular-ui/components/editor#angular-editor-example
  2. In the Angular Editor Example click on the first line of the first paragraph (let's say on the word Kendo)
  3. Navigate to toolbar via Shift+Tab key
  4. Use the arrow key to navigate to Format dropdownlist 
  5. Use Enter to open the dropdownlist with the available formats (Paragraph, Heading 1, Heading 2, etc)
  6. Choose e.g. "Heading 1" with Enter
  7. Press Tab to focus the editor content (You can type some letters to ensure that the editor content is focused)
  8. Press Shift+Tab to go back to toolbar
  9. Press an arrow key (Left or Right) to try to navigate through the toolbar => Bug

Expected behaviour: It's possible to navigate through the toolbar items like in step 4
Experienced behaviour: You can not navigate through the toolbar items with arrow left or arrow right.

Important: After choosing an item from the dropdown, the kendo-dropdownlist has still an tabindex="0", what is also wrong. 

I observed this bug in our application but it's possible to reproduce it with your example, too.

Kind regards,

Roman

    In Development
    Last Updated: 05 Nov 2026 08:13 by ADMIN

    Please repeat the following steps to reproduce this critical accessibility issue:

    1. Go to https://www.telerik.com/kendo-angular-ui/components/editor#angular-editor-example
    2. In the Angular Editor Example. click in the editor and type one letter to enable the "Undo" toolbar button
    3. Navigate to toolbar via Shift+Tab key
    4. Use the left or right arrow key to navigate to "Undo" button 
    5. Use Enter to trigger the "Undo" button which should then re-focus the editor and disable the "Undo" button
    6. Immediately press Shift+Tab key to navigate back to the toolbar with the "Undo" button disabled

    Expected behaviour: The disabled "Undo" button is focused so that toolbar navigation with left or right arrow keys is enabled.
    Experienced behaviour: The toolbar is permanently unfocusable with keyboard navigation and the element (theme selector) before the toolbar is focused. It is no longer possible to navigate to any buttons in the toolbar with Tab or Shift+Tab at this point. This happens with any toolbar button that becomes disabled after triggering such as the "outdent" button.

    NOTE: The expected behaviour actually works in the jQuery Editor (https://demos.telerik.com/kendo-ui/editor/all-tools), so the Angular Editor should be fixed to match.

    Completed
    Last Updated: 29 Oct 2026 17:18 by ADMIN

    Hi,

    in a Treeview bound to flat data (probably does not matter), if I have 3 items, and I drop the first 2 in the last, the loading indicator is stuck.

    Stackblitz repro: https://stackblitz.com/edit/angular-xiwrcwsx?file=src%2Fapp%2Fapp.component.ts

    Can you please take a look at it?

    Best regards,
    Michael

    Unplanned
    Last Updated: 29 Oct 2026 11:50 by ADMIN

    `ZonedDate.fromLocalDate(new Date('2025-10-26T00:00:00.000Z'), TIME_ZONE_ID_EUROPE_BERLIN)`returns hour **1**, although the correct local hour is **2** (CEST, UTC+2). Berlin switches back at **2025-10-26T01:00:00Z**, not at midnight UTC. The two consecutive UTC instants `00:00Z` and `01:00Z` must both display `02:00`, with different offsets.

    I tested the behavior with time zones 'Europe/Berlin' and 'Australia/Hobart'.

    I tried to attach a Markdown file here, but upload failed for whatever reason. You wiil find the detailed description in the Markdown below:

    # ZonedDate.fromLocalDate returns the wrong Berlin hour before the autumn DST transition
    ## Affected package and environment
    - `@progress/kendo-date-math`: **1.5.17**.
    - Reproduced with Node.js **24.18.0** on Linux.
    - Reproduced with host timezones **UTC** and **Europe/Berlin**.
    - The required Berlin timezone data is loaded explicitly in the reproduction.
    - Angular is not required to reproduce this issue.
    ## Summary
    `ZonedDate.fromLocalDate(new Date('2025-10-26T00:00:00.000Z'), TIME_ZONE_ID_EUROPE_BERLIN)`
    returns hour **1**, although the correct local hour is **2** (CEST, UTC+2).
    Berlin switches back at **2025-10-26T01:00:00Z**, not at midnight UTC.
    The two consecutive UTC instants `00:00Z` and `01:00Z` must both display
    `02:00`, with different offsets.
    ## Minimal reproduction
    In an empty directory, install the affected version:
    ```sh
    npm init -y
    npm install @progress/kendo-date-math@1.5.17
    ```
    Run the following as `repro.cjs` using `node repro.cjs`:
    ```javascript
    const assert = require('node:assert/strict');
    const { ZonedDate } = require('@progress/kendo-date-math');
    require('@progress/kendo-date-math/tz/Europe/Berlin');
    const inputs = [
        '2025-10-25T22:00:00.000Z',
        '2025-10-25T23:00:00.000Z',
        '2025-10-26T00:00:00.000Z',
        '2025-10-26T01:00:00.000Z',
        '2025-10-26T02:00:00.000Z',
    ];
    const hours = inputs.map((iso) =>
        ZonedDate.fromLocalDate(new Date(iso), 'Europe/Berlin').getHours());
    console.log('Actual Berlin hours:', hours);
    assert.deepEqual(hours, [0, 1, 2, 2, 3]);
    ```
    Actual output: `[0, 1, 1, 2, 3]`, followed by an assertion failure.
    Expected output: `[0, 1, 2, 2, 3]`.
    On Linux, both `TZ=UTC node repro.cjs` and
    `TZ=Europe/Berlin node repro.cjs` reproduce the failure.
    | Input UTC instant | Expected Berlin time | Actual hour |
    | --- | --- | --- |
    | 2025-10-25 22:00 | 2025-10-26 00:00 CEST | 0 |
    | 2025-10-25 23:00 | 2025-10-26 01:00 CEST | 1 |
    | 2025-10-26 00:00 | 2025-10-26 02:00 CEST | **1** |
    | 2025-10-26 01:00 | 2025-10-26 02:00 CET | 2 |
    | 2025-10-26 02:00 | 2025-10-26 03:00 CET | 3 |
    ## Diagnosis
    In the installed `dist/npm/tz/zoned-date.js`, `fromLocalDate()` calls
    `convertTimezoneUTC(date, 'Etc/UTC', timezone)`.
    For `2025-10-26T00:00:00Z`, that function:
    1. Calculates a base shift of +120 minutes.
    2. Creates an intermediate date of `2025-10-26T02:00:00Z`.
    3. Looks up the target offset again at that intermediate date.
    4. Finds a different offset and applies a -60-minute correction.
    The intermediate date encodes wall-clock fields; it is not the original
    instant. Looking up its offset as another instant causes the wrong hour.
    Simply deleting the second lookup is not a verified general fix. Additional
    probes show that Kendo's internal `offset()` lookup itself disagrees with
    `Intl` at some transition instants: for Berlin it returns -60 at
    `2025-03-30T01:00:00Z` (expected -120), and -120 at
    `2025-10-26T01:00:00Z` (expected -60). Existing corrections compensate for
    some of these cases. The UTC-instant-to-wall-clock operation should not
    depend on resolving an ambiguous wall-clock time back into an instant.
    ## Proposed upstream changes
    The following is a source-level proposal, not a released Telerik patch.
    It uses the runtime's IANA timezone implementation through `Intl`.
    Please adapt it to the package's source layout and supported-browser policy.
    ### 1. Preserve a known instant in the constructor
    Add an optional third parameter to the existing constructor. Insert this
    branch before its existing `timezone === ''` branch; leave the existing
    floating-date and wall-clock-input branches unchanged:
    ```diff
    -constructor(utcDate: Date, timezone: string) {
    +constructor(utcDate: Date, timezone: string, instant?: Date) {
         this._utcDate = cloneDate(utcDate);
         this.timezone = timezone;
    -    if (timezone === '') {
    +    if (instant && timezone !== '') {
    +        this.timezoneOffset = (instant.getTime() - utcDate.getTime()) / MS_PER_MINUTE;
    +        this._localDate = cloneDate(instant);
    +    } else if (timezone === '') {
    ```
    This also preserves the distinct instants behind the two occurrences of
    `02:00`, instead of attempting to infer the instant from ambiguous fields.
    `MS_PER_MINUTE` and `cloneDate` already exist in the implementation.
    ### 2. Replace the explicit-timezone path in fromLocalDate
    Retain the existing `timezone === ''` path. Replace the remainder of
    `fromLocalDate()` with the following code:
    ```typescript
    const formatter: Intl.DateTimeFormat = new Intl.DateTimeFormat('en-GB', {
        timeZone: timezone,
        calendar: 'gregory',
        numberingSystem: 'latn',
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        hourCycle: 'h23',
    });
    const parts: Array<Intl.DateTimeFormatPart> = formatter.formatToParts(date);
    const getPart: (type: Intl.DateTimeFormatPartTypes) => number =
        (type: Intl.DateTimeFormatPartTypes): number =>
            Number(parts.find((part: Intl.DateTimeFormatPart): boolean => part.type === type)?.value);
    const utcDate: Date = new Date(0);
    utcDate.setUTCFullYear(getPart('year'), getPart('month') - 1, getPart('day'));
    utcDate.setUTCHours(getPart('hour'), getPart('minute'), getPart('second'), date.getUTCMilliseconds());
    return new ZonedDate(utcDate, timezone, date);
    ```
    Here, `utcDate` is deliberately a carrier of wall-clock fields in its UTC
    components, matching Kendo's existing internal representation. It is not
    the original UTC instant. No browser-local `Date` setters are used.
    The use of `hourCycle: 'h23'` prevents midnight from being encoded as hour 24.
    Milliseconds are preserved directly from the original instant.
    ## Regression coverage and review scope
    Please verify:
    - The five expected hours in the reproduction, under UTC and Berlin hosts.
    - Full calendar fields and milliseconds around both spring and autumn transitions.
    - `toLocalDate().getTime()` and `getTime()` still equal the input instant.
    - `getTimezoneOffset()` distinguishes the two occurrences of Berlin `02:00`:
      -120 for `00:00Z`, and -60 for `01:00Z`.
    - Zones with negative offsets and southern-hemisphere DST.
    - Existing behavior when the timezone argument is omitted or empty.
    The constructor/factory proposal addresses conversion from a known instant.
    It is not a complete redesign of ambiguous/nonexistent wall-clock input.
    Please also audit `clone()` and `toTimezone()`: the current implementation
    reconstructs values from wall-clock fields and can lose repeated-hour identity.
    Other arithmetic and `fromUTCDate()` paths require the vendor's full regression
    suite before release. Formatter caching may be appropriate after correctness
    and browser-support requirements are established.
    ### Validation performed
    The reproduction above fails on the installed package with exactly the
    documented hours and passes with the proposed changes applied in memory.
    The proposal also passed 11,580 conversion checks: five target zones
    (`Europe/Berlin`, `Europe/Athens`, `America/New_York`, `Australia/Hobart`,
    `Etc/UTC`), two host timezones (UTC and Berlin), and 15-minute samples within
    24 hours either side of six 2025 spring/autumn transition instants.
    These checks compared full calendar fields against `Intl`, verified
    milliseconds and instant round trips, and checked offset consistency.
    Separate checks verified the two Berlin repeated-hour offsets and unchanged
    floating-date conversion for the sampled instant. Installed dependency files
    were not modified. This is focused validation, not Telerik's full test suite.
    ## Application workaround
    Our application bypasses `ZonedDate.fromLocalDate()` for its display-date
    conversion and obtains calendar fields through `Intl.formatToParts()` instead.
    All active timestamp tests pass with UTC and Berlin host timezones.
    The original epoch value remains authoritative. A browser-local `Date` used
    as a display carrier cannot itself retain an arbitrary timezone or distinguish
    both occurrences of a repeated hour, and can normalize nonexistent host-local
    times during spring-forward transitions.

    Declined
    Last Updated: 22 Oct 2026 06:50 by ADMIN
    With the built-in chooser’s default `allowHideAll: false`, the last visible unlocked column’s checkbox is disabled.
    But when columns are added after the Grid has initialized, the chooser can leave that checkbox enabled. Reopening the chooser and unchecking it allows all data columns to be hidden.

    Proposed fix: Recalculate the chooser’s checked/disabled state after the column list and checkbox views are updated, and when that list changes - not only once during component initialization. In Kendo 25.3, `ColumnListComponent` runs `updateDisabled()` from a `ngZone.onStable.pipe(take(1))` subscription, which isn't sufficient when columns render lazily/asynchronously.

    Unplanned
    Last Updated: 19 Oct 2026 14:46 by ADMIN

    In firefox, open the Kendo Radio Button documentation and slowly resize the window (https://www.telerik.com/kendo-angular-ui/components/inputs/radiobutton)

    The radio button will kind of jiggle around and occasionally the white dot in the radio button will become off-center.

    image-2026-01-15-14-27-31-711.png

    This also seems to happen in response to some material bouncy (cubic-bezier) animation transitions.

    Unplanned
    Last Updated: 25 Sep 2026 06:56 by ADMIN
    Hi,

    I'm experiencing an issue with the Kendo Grid when using virtual scrolling.

    If I lock any column, scroll down, and then navigate to another page, the locked column disappears. It only reappears after I scroll the grid again.

    I've attached the relevant code and a video demonstrating the issue.

    A ticket regarding this specific issue has already been opened on GitHub (https://github.com/telerik/kendo-angular/issues/4962) , but I wanted to bring it to your attention here as well. We would appreciate your support in resolving this matter as soon as possible.
    Completed
    Last Updated: 21 Sep 2026 16:35 by ADMIN
    Created by: Michael
    Comments: 5
    Category: Kendo UI for Angular
    Type: Bug Report
    0

    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

    Unplanned
    Last Updated: 15 Sep 2026 07:05 by ADMIN
    Hi,

    If we format kendo-datepicker to (MMMM/dd/yyyy) and if we enter number of month in input then it is not reflecting and shows month in input field.

    As you can see in screenshot, I called (valueChange) event to see the changed value, I have enter 10 in month input field so it shows two value in console, first one is when 1 is press and second is when 0 is pressed after 1 so it gives null and in input field it shows month instead of October.

    It is working if we enter first letter of month but it should work if we enter month in number.

    Please fix this issue asap.

    Thanks.

    Completed
    Last Updated: 07 Aug 2026 12:26 by ADMIN

    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).

    Unplanned
    Last Updated: 03 Aug 2026 09:43 by ADMIN
    Created by: Svitlana
    Comments: 1
    Category: Kendo UI for Angular
    Type: Bug Report
    0

    `@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.

    Environment

    - `@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`.

    Reproduction

    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'));

    Actual Result

    Mon Jan 01 1900 16:00:00 GMT+0124
    -84
    1900-01-01T16:00:00+01:04

    Expected Result

    1900-01-01T16:00:00+01:24

    Date#getTimezoneOffset() returns -84, meaning the local timezone is 84 minutes ahead of UTC:

    84 minutes = 1 hour 24 minutes

    Other Examples

    The issue is not limited to positive offsets:

    getTimezoneOffset()ExpectedActual
    -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:

    OffsetExpected ISO representationZZZZZ result
    0+00:00 or ZZ

    Tested Format Specifiers

    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:04

    Changing from ZZZZZ to XXXXX or XXX therefore does not resolve the problem.

    Suspected Root Cause

    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.4

    The 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 minutes

    Likewise, for 210 minutes:

    210 / 60 = 3.5

    The formatter produces 03:05, although 0.5 hours is 30 minutes.

    Suggested Fix

    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.

    Suggested Regression Tests

    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

    Impact

    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:04

    These values represent instants 20 minutes apart.

    The issue affects:

    • Historical dates from regions that previously used local mean time.
    • Current timezones with half-hour or quarter-hour offsets.
    • Any test or custom 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.

    Additional Context

    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.

    StackBlitz

     

    Unplanned
    Last Updated: 27 Jul 2026 07:26 by ADMIN

    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

    Duplicated
    Last Updated: 16 Jul 2026 08:38 by ADMIN

    When dateinput format is "d/M/y" and "allowCaretMode" is enabled, users are unable to enter valid dates. Tested with dateinput and datepicker components.

    Steps to reproduce

    1. Setup a kendo-dateinput component with "allowCaretMode" set to "true" and the "format" set to "d/M/y" (see stackblitz below).
    2. Enter a valid single-digit day and valid single-digit month into the input.
    3. Try typing a year.
    4. Observe that only one character of the year can be entered and the input locks up, preventing the user from completing a valid date.
    5. Try typing a double digit month.
    6. Observe that only one character of the month can be entered and the input locks up.
    7. Try typing a double digit day.
    8. Observe that only one character of the day can be entered and the input locks up.

    Stackblitz example - angular v22 + kendo v24

    https://stackblitz.com/edit/angular-kendo-dateinput-bug-rdocwtvr

    Expected Behaviour:

    The user should be able to enter a full year, month, and day after typing a valid single-digit day and month.

    Observed Behaviour:

    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

    Completed
    Last Updated: 01 Jul 2026 14:30 by ADMIN
    Created by: Chris
    Comments: 4
    Category: Kendo UI for Angular
    Type: Bug Report
    0

    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" ... />



    Unplanned
    Last Updated: 15 Jun 2026 10:31 by ADMIN

    Hi,

    We're heavily using the Scheduler component, but we've hit a problem with `slotClick` in scenarios involving multiple scheduler instances on the same page.

    With two schedulers on one page, slot detection for the second scheduler (used in context-menu flows via slotByPosition) can be wrong.

    Detaild repro: Stackblitz

    Repro steps:
    - Right-click any slot in Scheduler #2.
    - slotClick gives expected slot, but slotByPosition(...) can resolve incorrectly/undefined, which can cause error in the app when code depends on slotByPosition.

    The issue:
    - BaseSlotService.calculateScaleX() uses document.querySelector(".k-scheduler"), which always picks the first scheduler in DOM.
    - With two schedulers on one page, slot detection for the second scheduler (used in context-menu flows via slotByPosition) can be wrong.
    - Relevant code:
    const h = document.querySelector(".k-scheduler");
    return h.getBoundingClientRect().width / h.offsetWidth;
    - Expected: the instance of scheduler used in the calculation should be the one that fired event, not the first one from DOM.

     

    Completed
    Last Updated: 10 Jun 2026 08:41 by ADMIN

    Hi,

    When the first day of the week is changed dynamically through a custom IntlService, the Calendar weekday headers are updated, but the date cells are not repositioned. (The first day is changed as described in your guide: https://www.telerik.com/kendo-angular-ui/components/knowledge-base/calendar-first-day )

    Reproduction (forked from your example): https://stackblitz.com/edit/angular-tqvypgwg
    Click on "Set first day to Monday ": the weekday headers are updated to start with Monday, but the date cells remain in their previous positions.

    Best regards,
    Michael

    Completed
    Last Updated: 08 Jun 2026 11:43 by ADMIN
    We found a bug in our application on tablet portrait mode when we want to select a date from the filter menu inbuilt feature of Kendo grid. 
    When the user wants to select a date, the filter closes up and the user is not able to select any date from the calendar.

    The issue is happening on tablet device in portrait mode and we found out that it's happening on your documentation too. To reproduce the issue, please go to the "Angular Grid Filter Menu" in your documentation:
    https://www.telerik.com/kendo-angular-ui/components/grid/filtering/filter-menu/

    Please open the dev tools and set the browser on any tablet portrait size or use Galaxy Tab S4.
    In your first example (Angular Grid Filter Menu), please click on the "Date" filter in the grid. When the popup opens up, please click on the calendar icon 
    of the date input field. 
    When the calendar shows up, try to select any date. You'll see that the filter closes up and the user is not able to select any date. Demo video attached for reference.
    Please fix this bug as we support Samsung Galaxy tablet devices and we're using this feature in our project.  
    Completed
    Last Updated: 05 Jun 2026 13:36 by ADMIN

    When enabling the showSelectAll option in a checkbox column on the TreeList component, a checkbox is rendered with the TreeListSelectAllCheckboxDirective. In its constructor, this directive includes some logic that causes the TreeList to instantiate a new ViewCollection every time a selection change occurs. However, the call to ViewCollection.loadView() does not pass the service responsible for determining expanded nodes, so the default fallback (which returns true for all nodes) is used.

    Problem

    As a result, every checkbox interaction triggers fetchChildren() for all nodes, even those that were never expanded or loaded. This leads to:

    • Unnecessary and potentially expensive backend calls

    • Performance degradation, especially with large datasets

    • Inefficient "select all" logic that does not respect the current loaded/visible state

    This behavior appears to ignore the fact that TreeList is configured for remote data binding with lazy-loaded children.

    Expected Behavior

    • showSelectAll should only evaluate the currently loaded and visible items

    • fetchChildren() should not be called for every node

    • Integration with remote/lazy-loaded data should be respected

    Suggested Solutions

    1. Update TreeListSelectAllCheckboxDirective to properly integrate with the expanded node detection logic or allow injection of a custom service.

    2. Provide an override or callback to control the behavior of the "select all" checkbox manually in remote scenarios.

    Steps to Reproduce

    1. Configure a TreeList with hasChildren and children to fetch child nodes lazily.

    2. Enable selection with checkbox column and showSelectAll: true.

    3. Click any checkbox inside the TreeList.

    4. Observe that fetchChildren() is triggered for all nodes, not just expanded ones.

    StackBlitz repro:

    Open console and click on the first cell. 

    https://stackblitz.com/edit/angular-e2ai4pjx?file=src%2Fapp%2Fapp.component.ts,angular.json

     

    1 2 3 4 5 6