Skip to content
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
de60276
feat(deps): updating typedoc to match new ts requirements
ChronosSF Oct 22, 2025
d42c973
feat(deps): updating to cli next 8
ChronosSF Oct 22, 2025
d10955b
feat(deps): updating to next9
ChronosSF Oct 31, 2025
184fb09
feat(deps): updating cli to rc0
ChronosSF Oct 31, 2025
b0a93af
feat(deps): upgrading to angular rc0
ChronosSF Oct 31, 2025
1f525c5
feat(deps): updating to cli rc1
ChronosSF Nov 6, 2025
ed913d1
feat(deps): updating to @angular/core 21
ChronosSF Nov 6, 2025
494d147
fix(*): fixing build errors from new strict event arg type check
ChronosSF Nov 6, 2025
a598e02
Merge remote-tracking branch 'origin/master' into sstoychev/update-to-21
ChronosSF Nov 6, 2025
b8dd705
chore(dte): trying to fix issue in date pipe with normalize
ChronosSF Nov 6, 2025
212c693
fix(tests): adding normalize to certain date formatting tests
ChronosSF Nov 10, 2025
5c1976a
test(*): fixing more issues with tests
ChronosSF Nov 10, 2025
db27552
Merge branch 'master' into sstoychev/update-to-21
ChronosSF Nov 11, 2025
2dcb09a
fix(build): moving to bundler resolution for i18n
ChronosSF Nov 11, 2025
9deae36
fix(elements): createEnvironmentInjector build error
rkaraivanov Nov 11, 2025
21ebdd2
chore(*): updating to rc.2
ChronosSF Nov 13, 2025
73e99f1
chore(*): updating angular core and fixing demo app issue
ChronosSF Nov 13, 2025
3256f0f
Merge branch 'master' into sstoychev/update-to-21
ChronosSF Nov 13, 2025
5cd167b
Merge remote-tracking branch 'origin/master' into sstoychev/update-to-21
rkaraivanov Nov 20, 2025
352ff23
chore: update public_api.ts to export global-types
rkaraivanov Nov 20, 2025
96f2b4d
chore: Updated to Angular 21
rkaraivanov Nov 20, 2025
89227f8
chore: Unused imports cleanup and injection context
rkaraivanov Nov 20, 2025
17fb8a4
Merge remote-tracking branch 'origin/master' into sstoychev/update-to-21
rkaraivanov Nov 20, 2025
84a3133
chore: Formatting issues
rkaraivanov Nov 20, 2025
e2d53ed
Merge remote-tracking branch 'origin/master' into sstoychev/update-to-21
rkaraivanov Nov 20, 2025
3edbc1c
Merge branch 'master' into sstoychev/update-to-21
rkaraivanov Nov 20, 2025
e4652ff
Merge branch 'master' into sstoychev/update-to-21
rkaraivanov Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28,505 changes: 15,242 additions & 13,263 deletions package-lock.json

Large diffs are not rendered by default.

46 changes: 23 additions & 23 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,17 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^20.3.6",
"@angular/common": "^20.3.6",
"@angular/compiler": "^20.3.6",
"@angular/core": "^20.3.6",
"@angular/elements": "^20.3.6",
"@angular/forms": "^20.3.6",
"@angular/platform-browser": "^20.3.6",
"@angular/platform-browser-dynamic": "^20.3.6",
"@angular/platform-server": "^20.3.6",
"@angular/router": "^20.3.6",
"@angular/ssr": "^20.3.6",
"@angular/animations": "^21.0.0",
"@angular/common": "^21.0.0",
"@angular/compiler": "^21.0.0",
"@angular/core": "^21.0.0",
"@angular/elements": "^21.0.0",
"@angular/forms": "^21.0.0",
"@angular/platform-browser": "^21.0.0",
"@angular/platform-browser-dynamic": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/router": "^21.0.0",
"@angular/ssr": "^21.0.0",
"@igniteui/material-icons-extended": "^3.1.0",
"@lit-labs/ssr-dom-shim": "^1.3.0",
"@types/source-map": "0.5.2",
Expand All @@ -83,16 +83,16 @@
"zone.js": "~0.15.0"
},
"devDependencies": {
"@angular-devkit/schematics": "^20.3.6",
"@angular-eslint/builder": "^20.4.0",
"@angular-eslint/eslint-plugin": "^20.4.0",
"@angular-eslint/eslint-plugin-template": "^20.4.0",
"@angular-eslint/schematics": "^20.4.0",
"@angular-eslint/template-parser": "^20.4.0",
"@angular/build": "^20.3.6",
"@angular/cli": "^20.3.9",
"@angular/compiler-cli": "^20.3.6",
"@angular/language-service": "^20.3.6",
"@angular-devkit/schematics": "^21.0.0",
"@angular-eslint/builder": "^20.6.0",
"@angular-eslint/eslint-plugin": "^20.6.0",
"@angular-eslint/eslint-plugin-template": "^20.6.0",
"@angular-eslint/schematics": "^20.6.0",
"@angular-eslint/template-parser": "^20.6.0",
"@angular/build": "^21.0.0",
"@angular/cli": "^21.0.0",
"@angular/compiler-cli": "^21.0.0",
"@angular/language-service": "^21.0.0",
"@angularclass/hmr": "^3.0.0",
"@microsoft/signalr": "^7.0.12",
"@types/estree": "^1.0.0",
Expand Down Expand Up @@ -132,7 +132,7 @@
"karma-parallel": "^0.3.1",
"karma-spec-reporter": "^0.0.36",
"lit-html": "^3.2.1",
"ng-packagr": "^20.0.0",
"ng-packagr": "^21.0.0",
"postcss": "^8.5.1",
"postcss-scss": "^4.0.6",
"prettier": "^3.3.3",
Expand All @@ -148,6 +148,6 @@
"ts-node": "^10.8.1",
"typedoc": "^0.28.14",
"typedoc-plugin-localization": "^3.1.0",
"typescript": "5.8.3"
"typescript": "5.9.3"
}
}
3 changes: 2 additions & 1 deletion projects/bundle-test/src/main.server.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { provideZoneChangeDetection } from "@angular/core";
import { bootstrapApplication, BootstrapContext } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { config } from './app/app.config.server';

const bootstrap = (context: BootstrapContext) => bootstrapApplication(AppComponent, config, context);
const bootstrap = (context: BootstrapContext) => bootstrapApplication(AppComponent, {...config, providers: [provideZoneChangeDetection(), ...config.providers]}, context);

export default bootstrap;
3 changes: 2 additions & 1 deletion projects/bundle-test/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { provideZoneChangeDetection } from "@angular/core";
import { AppComponent } from './app/app.component';
import { bootstrapApplication } from '@angular/platform-browser';
import { appConfig } from './app/app.config';


bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));
bootstrapApplication(AppComponent, {...appConfig, providers: [provideZoneChangeDetection(), ...appConfig.providers]}).catch(err => console.error(err));
9 changes: 6 additions & 3 deletions projects/igniteui-angular-elements/src/utils/injector-ref.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createEnvironmentInjector, EnvironmentInjector, getPlatform, importProvidersFrom, provideZoneChangeDetection, ɵChangeDetectionScheduler, ɵChangeDetectionSchedulerImpl } from '@angular/core';
import { ClassProvider, createEnvironmentInjector, EnvironmentInjector, getPlatform, importProvidersFrom, provideZoneChangeDetection, ɵChangeDetectionScheduler, ɵprovideZonelessChangeDetectionInternal, } from '@angular/core';
import { BrowserModule, platformBrowser } from '@angular/platform-browser';
import { provideAnimations } from '@angular/platform-browser/animations';
import { IgxIconBroadcastService } from '../lib/icon.broadcast.service';
Expand All @@ -24,11 +24,14 @@ const platformInjector = getPlatform()?.injector ?? platformBrowser().injector;
// createEnvironmentInjector is a public wrapper around EnvironmentNgModuleRefAdapter
// https://github.com/angular/angular/blob/969dadc8e2fad8ca9d892858bdadbe3abb13de95/packages/core/src/application/create_application.ts#L56C25-L56C54
const injector = createEnvironmentInjector([
// TODO: -> provideExperimentalZonelessChangeDetection
// TODO: -> provideExperimentalZonelessChangeDetection
provideZoneChangeDetection({ eventCoalescing: true }),
// Required, but only provided internally by `provideExperimentalZonelessChangeDetection`, `bootstrapModuleFactory`
// & `internalCreateApplication` (`bootstrapApplication`/`createApplication`), so no public API alternative:
{ provide: ɵChangeDetectionScheduler, useExisting: ɵChangeDetectionSchedulerImpl },

// Still no "direct" public API but at least `ɵprovideZonelessChangeDetectionInternal` exports it somewhat:
// https://github.com/angular/angular/commit/45fed3d2011bf6feffa8ee1365a5c88d603f826c#diff-10544e5a7c018dbc5dc5a1d4192919bb839c5d1b7cbcc1b20f57aa74c2ae7febR391-R397
ɵprovideZonelessChangeDetectionInternal().find((entity) => (entity as ClassProvider).provide === ɵChangeDetectionScheduler),
importProvidersFrom(BrowserModule),
// Elements specific:
provideAnimations(),
Expand Down
2 changes: 1 addition & 1 deletion projects/igniteui-angular-i18n/tsconfig.build.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"rootDir": "./src",
"target": "es2015",
"module": "esnext",
"moduleResolution": "node",
"moduleResolution": "bundler",
"declaration": true,
"outDir": "../../dist/igniteui-angular-i18n",
"stripInternal": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ export class IgxDaysViewComponent extends IgxCalendarBaseDirective {
/**
* @hidden
*/
@HostListener('keydown.Space', ['$event'])
@HostListener('keydown.space', ['$event'])
@HostListener('keydown.enter', ['$event'])
protected onKeydownEnter(event: KeyboardEvent) {
event.stopPropagation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ export class IgxChipsAreaComponent implements DoCheck, AfterViewInit, OnDestroy
protected destroy$ = new Subject<boolean>();

@HostBinding('class')
private hostClass = 'igx-chip-area';
protected hostClass = 'igx-chip-area';

private modifiedChipsArray: IgxChipComponent[];
private _differ: IterableDiffer<IgxChipComponent> | null = null;
Expand Down
27 changes: 27 additions & 0 deletions projects/igniteui-angular/core/src/core/global-types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* Global type augmentations for IgniteUI Angular
*/

declare global {
interface GlobalEventHandlersEventMap {
'keydown.enter': KeyboardEvent;
'keydown.escape': KeyboardEvent;
'keydown.tab': KeyboardEvent;
'keydown.arrowup': KeyboardEvent;
'keydown.arrowdown': KeyboardEvent;
'keydown.arrowleft': KeyboardEvent;
'keydown.arrowright': KeyboardEvent;
'keydown.shift.tab': KeyboardEvent;
'keydown.alt.arrowup': KeyboardEvent;
'keydown.alt.arrowdown': KeyboardEvent;
'keydown.pageup': KeyboardEvent;
'keydown.pagedown': KeyboardEvent;
'keydown.home': KeyboardEvent;
'keydown.end': KeyboardEvent;
'keydown.space': KeyboardEvent;
'igcChange': CustomEvent;
}
}

// This export is needed to make this file a module
export {};
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ export abstract class DateTimeUtil {
public static formatDate(value: number | Date, format: string, locale: string, timezone?: string): string {
let formattedDate: string;
try {
formattedDate = formatDate(value, format, locale, timezone);
formattedDate = formatDate(value, format, locale, timezone).normalize("NFKD");
} catch {
DateTimeUtil.logMissingLocaleSettings(locale);
const formatter = new Intl.DateTimeFormat(locale);
Expand Down
3 changes: 3 additions & 0 deletions projects/igniteui-angular/core/src/public_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,6 @@ export * from './core/i18n/query-builder-resources';
export * from './core/i18n/resources';
export * from './core/i18n/time-picker-resources';
export * from './core/i18n/tree-resources';

// Types
export * from './core/global-types';
Original file line number Diff line number Diff line change
@@ -1,71 +1,70 @@
import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IgxChipComponent } from 'igniteui-angular/chips';
import { CalendarDay, CustomDateRange, DateRange, DateRangePickerResourceStringsEN, IDateRangePickerResourceStrings } from 'igniteui-angular/core';


type PredefinedRangeKey = 'last7Days' | 'currentMonth' | 'last30Days' | 'yearToDate';

@Component({
selector: 'igx-predefined-ranges-area',
standalone: true,
imports: [CommonModule, IgxChipComponent],
templateUrl: './predefined-ranges-area-component.html',
styles: [`
selector: 'igx-predefined-ranges-area',
standalone: true,
imports: [IgxChipComponent],
templateUrl: './predefined-ranges-area-component.html',
styles: [`
:host { display:block; }
.igx-predefined-ranges {
display:flex; flex-wrap:wrap; gap:.5rem; padding:.5rem .75rem;
}
`],
changeDetection: ChangeDetectionStrategy.OnPush
changeDetection: ChangeDetectionStrategy.OnPush
})
export class IgxPredefinedRangesAreaComponent {
@Input() public usePredefinedRanges = false;
@Input() public customRanges: CustomDateRange[] = [];
@Input() public resourceStrings: IDateRangePickerResourceStrings = DateRangePickerResourceStringsEN as any;
@Input() public usePredefinedRanges = false;
@Input() public customRanges: CustomDateRange[] = [];
@Input() public resourceStrings: IDateRangePickerResourceStrings = DateRangePickerResourceStringsEN as any;

@Output() public rangeSelect = new EventEmitter<DateRange>();
@Output() public rangeSelect = new EventEmitter<DateRange>();

public get ranges(): CustomDateRange[] {
const base = this.usePredefinedRanges ? this.getPredefinedRanges() : [];
return [...base, ...(this.customRanges ?? [])];
}
public get ranges(): CustomDateRange[] {
const base = this.usePredefinedRanges ? this.getPredefinedRanges() : [];
return [...base, ...(this.customRanges ?? [])];
}

public trackByLabel = (i: number, r: CustomDateRange) => r.label;
public trackByLabel = (i: number, r: CustomDateRange) => r.label;

public onSelect(range: DateRange) {
this.rangeSelect.emit(range);
}
public onSelect(range: DateRange) {
this.rangeSelect.emit(range);
}

private getLabel(rs: any, shortKey: string, prefixedKey: string, fallback: string): string {
return rs?.[shortKey] ?? rs?.[prefixedKey] ?? fallback;
private getLabel(rs: any, shortKey: string, prefixedKey: string, fallback: string): string {
return rs?.[shortKey] ?? rs?.[prefixedKey] ?? fallback;
}

private getPredefinedRanges(): CustomDateRange[] {
const today = CalendarDay.today;
const rs: any = this.resourceStrings ?? {};
private getPredefinedRanges(): CustomDateRange[] {
const today = CalendarDay.today;
const rs: any = this.resourceStrings ?? {};

const labels = {
last7Days: this.getLabel(rs, 'last7Days', 'igx_date_range_picker_last7Days', 'Last 7 Days'),
currentMonth: this.getLabel(rs, 'currentMonth', 'igx_date_range_picker_currentMonth', 'Current Month'),
last30Days: this.getLabel(rs, 'last30Days', 'igx_date_range_picker_last30Days', 'Last 30 Days'),
yearToDate: this.getLabel(rs, 'yearToDate', 'igx_date_range_picker_yearToDate', 'Year to Date')
};
const labels = {
last7Days: this.getLabel(rs, 'last7Days', 'igx_date_range_picker_last7Days', 'Last 7 Days'),
currentMonth: this.getLabel(rs, 'currentMonth', 'igx_date_range_picker_currentMonth', 'Current Month'),
last30Days: this.getLabel(rs, 'last30Days', 'igx_date_range_picker_last30Days', 'Last 30 Days'),
yearToDate: this.getLabel(rs, 'yearToDate', 'igx_date_range_picker_yearToDate', 'Year to Date')
};

const startOfMonth = new Date(today.native.getFullYear(), today.native.getMonth(), 1);
const endOfMonth = new Date(today.native.getFullYear(), today.native.getMonth() + 1, 0);
const startOfYear = new Date(today.native.getFullYear(), 0, 1);
const startOfMonth = new Date(today.native.getFullYear(), today.native.getMonth(), 1);
const endOfMonth = new Date(today.native.getFullYear(), today.native.getMonth() + 1, 0);
const startOfYear = new Date(today.native.getFullYear(), 0, 1);

const predefinedRanges: { key: PredefinedRangeKey; get: () => { start: Date; end: Date } }[] = [
{ key: 'last7Days', get: () => ({ start: today.add('day', -7).native, end: today.native }) },
{ key: 'currentMonth', get: () => ({ start: startOfMonth, end: endOfMonth }) },
{ key: 'last30Days', get: () => ({ start: today.add('day', -29).native, end: today.native }) },
{ key: 'yearToDate', get: () => ({ start: startOfYear, end: today.native }) },
];
const predefinedRanges: { key: PredefinedRangeKey; get: () => { start: Date; end: Date } }[] = [
{ key: 'last7Days', get: () => ({ start: today.add('day', -7).native, end: today.native }) },
{ key: 'currentMonth', get: () => ({ start: startOfMonth, end: endOfMonth }) },
{ key: 'last30Days', get: () => ({ start: today.add('day', -29).native, end: today.native }) },
{ key: 'yearToDate', get: () => ({ start: startOfYear, end: today.native }) },
];

return predefinedRanges.map(range => ({
label: labels[range.key],
dateRange: range.get()
}));
}
return predefinedRanges.map(range => ({
label: labels[range.key],
dateRange: range.get()
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class IgxIconButtonDirective extends IgxButtonBaseDirective {
* @internal
*/
@HostBinding('class.igx-icon-button')
private _cssClass = 'igx-icon-button';
protected _cssClass = 'igx-icon-button';

/**
* @hidden
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -795,7 +795,7 @@ describe('IgxDateTimeEditor', () => {
inputElement.triggerEventHandler('blur', { target: inputElement.nativeElement });
fixture.detectChanges();
date = new Date(2000, 0, 1, 2, 0, 0);
result = formatDate(date, 'longTime', 'en-US');
result = formatDate(date, 'longTime', 'en-US').normalize("NFKD");
expect(inputElement.nativeElement.value).toEqual(result);
});
it('should be able to apply custom display format.', fakeAsync(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ export class IgxDateTimeEditorDirective extends IgxMaskDirective implements OnCh
}

/** @hidden @internal */
public override onBlur(value: string): void {
public override onBlur(event: FocusEvent): void {
this._focused = false;
if (!this.inputIsComplete() && this.inputValue !== this.emptyMask) {
this.updateValue(this.parseDate(this.inputValue));
Expand All @@ -516,7 +516,7 @@ export class IgxDateTimeEditorDirective extends IgxMaskDirective implements OnCh
return;
}

super.onBlur(value);
super.onBlur(event);
}

// the date editor sets its own inputFormat as its placeholder if none is provided
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Replaced } from './mask-parsing.service';
import { By } from '@angular/platform-browser';
import { IgxInputGroupComponent } from '../../../../input-group/src/input-group/input-group.component';
import { IgxInputDirective } from 'igniteui-angular/input-group';
import { mock } from 'node:test';
Comment thread
github-code-quality[bot] marked this conversation as resolved.
Fixed

describe('igxMask', () => {
// TODO: Refactor tests to reuse components
Expand Down Expand Up @@ -638,7 +639,8 @@ describe('igxMaskDirective ControlValueAccessor Unit', () => {
// OnTouched callback
mask.onFocus();
expect(mockNgControl.registerOnTouchedCb).not.toHaveBeenCalled();
mask.onBlur('');
const mockBlur = { target: { value: '' } };
mask.onBlur(mockBlur as unknown as FocusEvent);
expect(mockNgControl.registerOnTouchedCb).toHaveBeenCalledTimes(1);
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,8 +273,9 @@ export class IgxMaskDirective implements OnInit, AfterViewChecked, ControlValueA
}

/** @hidden */
@HostListener('blur', ['$event.target.value'])
public onBlur(value: string): void {
@HostListener('blur', ['$event'])
public onBlur(event: FocusEvent): void {
const value = event.target['value'];
this._focused = false;
this.showDisplayValue(value);
this._onTouchedCallback();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@ import { CommonModule } from '@angular/common';
@Component({
selector: 'igx-tooltip-close-button',
template: `
<ng-container *ngIf="customTemplate; else defaultTemplate">
<ng-container *ngTemplateOutlet="customTemplate"></ng-container>
</ng-container>
<ng-template #defaultTemplate>
<igx-icon aria-hidden="true" family="default" name="close"></igx-icon>
</ng-template>
`,
@if (customTemplate) {
<ng-container *ngTemplateOutlet="customTemplate"></ng-container>
} @else {
<igx-icon aria-hidden="true" family="default" name="close"></igx-icon>
}
`,
imports: [IgxIconComponent, CommonModule],
})
export class IgxTooltipCloseButtonComponent {
Expand Down
Loading
Loading