Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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));
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActionType, BroadcastIconsChangeMessage, IgxIconBroadcastService, SvgIcon, } from './icon.broadcast.service';
import { Component, SecurityContext } from '@angular/core';
import { ActionType, BroadcastIconsChangeMessage, IgxIconBroadcastService, SvgIcon, } from './icon.broadcast.service';
import { Component, inject } from '@angular/core';
import { IconMeta, IgxIconService } from 'igniteui-angular';
import { wait } from 'igniteui-angular/test-utils/ui-interactions.spec';

Expand All @@ -9,107 +9,107 @@ describe('Icon broadcast service', () => {
let broadcastChannel: BroadcastChannel;
let events: BroadcastIconsChangeMessage[] = [];
const buildIcon =
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4z"/></svg>';
'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4z"/></svg>';

beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [],
providers: [IgxIconBroadcastService]
imports: [],
providers: [IgxIconBroadcastService]
})
.compileComponents();
});
.compileComponents();
});

beforeEach(() => {
beforeEach(() => {
broadcastChannel = new BroadcastChannel("ignite-ui-icon-channel");
broadcastChannel.onmessage = (e: MessageEvent<BroadcastIconsChangeMessage>) => {
events.push(e.data);
}
fixture = TestBed.createComponent(BroadcastServiceComponent);
});
});

afterEach(() => {
afterEach(() => {
events = [];
broadcastChannel.close();
});
});

describe('Broadcast Events', () => {
it('should correctly process event of icons registering on channel.', async() => {
// simulate a new icon being registered on channel
const icons: Map<string, Map<string, SvgIcon>> = new Map();
const icon: Map<string, SvgIcon> = new Map()
icon.set("customIcon", { svg: buildIcon });
icons.set("customCollection", icon);
const message: BroadcastIconsChangeMessage = {
actionType: ActionType.RegisterIcon,
collections: icons
};
broadcastChannel.postMessage(message);
fixture.detectChanges();
await wait(50);
fixture.detectChanges();
const iconService = fixture.componentInstance.iconService;
const svg = iconService.getSvgIcon("customIcon", "customCollection");
expect(svg).not.toBeUndefined();
});
it('should correctly process event of icons registering on channel.', async () => {
// simulate a new icon being registered on channel
const icons: Map<string, Map<string, SvgIcon>> = new Map();
const icon: Map<string, SvgIcon> = new Map();
icon.set("customIcon", { svg: buildIcon });
icons.set("customCollection", icon);
const message: BroadcastIconsChangeMessage = {
actionType: ActionType.RegisterIcon,
collections: icons
};
broadcastChannel.postMessage(message);
fixture.detectChanges();
await wait(50);
fixture.detectChanges();
const iconService = fixture.componentInstance.iconService;
const svg = iconService.getSvgIcon("customIcon", "customCollection");
expect(svg).not.toBeUndefined();
});

it('should correctly process event of setting an icon reference on channel.', async() => {
const refs: Map<string, Map<string, IconMeta>> = new Map();
const ref: Map<string, IconMeta> = new Map()
ref.set("customIcon", {name: "customNameOfIcon", collection: "customCollection" } as any);
refs.set("customCollection", ref);
const message: BroadcastIconsChangeMessage = {
actionType: ActionType.UpdateIconReference,
references: refs
};
broadcastChannel.postMessage(message);
fixture.detectChanges();
await wait(50);
fixture.detectChanges();
it('should correctly process event of setting an icon reference on channel.', async () => {
const refs: Map<string, Map<string, IconMeta>> = new Map();
const ref: Map<string, IconMeta> = new Map();
ref.set("customIcon", { name: "customNameOfIcon", collection: "customCollection" } as any);
refs.set("customCollection", ref);
const message: BroadcastIconsChangeMessage = {
actionType: ActionType.UpdateIconReference,
references: refs
};
broadcastChannel.postMessage(message);
fixture.detectChanges();
await wait(50);
fixture.detectChanges();

const iconService = fixture.componentInstance.iconService;
const serviceRef = iconService.getIconRef("customIcon", "default");
expect(serviceRef.family).toBe("customCollection");
expect(serviceRef.name).toBe("customNameOfIcon");
});
const iconService = fixture.componentInstance.iconService;
const serviceRef = iconService.getIconRef("customIcon", "default");
expect(serviceRef.family).toBe("customCollection");
expect(serviceRef.name).toBe("customNameOfIcon");
});

it('should send a request to sync state from any peer already on the channel on init.', async() => {
await wait(50);
expect(events.length).toBe(1);
expect(events[0].actionType).toBe(ActionType.SyncState);
});
it('should send a request to sync state from any peer already on the channel on init.', async () => {
await wait(50);
expect(events.length).toBe(1);
expect(events[0].actionType).toBe(ActionType.SyncState);
});

it('should correctly process event of synching full state of icons on channel.', async() => {
const icons: Map<string, Map<string, SvgIcon>> = new Map();
const icon: Map<string, SvgIcon> = new Map()
icon.set("customIcon", { svg: buildIcon });
icons.set("customCollection", icon);
const refs: Map<string, Map<string, IconMeta>> = new Map();
const ref: Map<string, IconMeta> = new Map()
ref.set("customIcon", {name: "customIcon", family: "customCollection" });
refs.set("customCollection", ref);
const message: BroadcastIconsChangeMessage = {
actionType: ActionType.SyncState,
collections: icons,
references: refs
};
broadcastChannel.postMessage(message);
await wait(50);
const iconService = fixture.componentInstance.iconService;
const svg = iconService.getSvgIcon("customIcon", "customCollection");
expect(svg).not.toBeUndefined();
const serviceRef = iconService.getIconRef("customIcon", "customCollection");
expect(serviceRef.family).toBe("customCollection");
expect(serviceRef.name).toBe("customIcon");
});
it('should correctly process event of synching full state of icons on channel.', async () => {
const icons: Map<string, Map<string, SvgIcon>> = new Map();
const icon: Map<string, SvgIcon> = new Map()
icon.set("customIcon", { svg: buildIcon });
icons.set("customCollection", icon);
const refs: Map<string, Map<string, IconMeta>> = new Map();
const ref: Map<string, IconMeta> = new Map()
ref.set("customIcon", { name: "customIcon", family: "customCollection" });
refs.set("customCollection", ref);
const message: BroadcastIconsChangeMessage = {
actionType: ActionType.SyncState,
collections: icons,
references: refs
};
broadcastChannel.postMessage(message);
await wait(50);
const iconService = fixture.componentInstance.iconService;
const svg = iconService.getSvgIcon("customIcon", "customCollection");
expect(svg).not.toBeUndefined();
const serviceRef = iconService.getIconRef("customIcon", "customCollection");
expect(serviceRef.family).toBe("customCollection");
expect(serviceRef.name).toBe("customIcon");
});
})
});

@Component({
template: `
`,
template: ``,
standalone: true,
providers: [IgxIconBroadcastService, IgxIconService]
})
export class BroadcastServiceComponent {
constructor(public iconBroadcast: IgxIconBroadcastService, public iconService: IgxIconService) {}
public iconBroadcast = inject(IgxIconBroadcastService);
public iconService = inject(IgxIconService);
}
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';
Loading
Loading