diff --git a/packages/angular/common/src/index.ts b/packages/angular/common/src/index.ts index 74bc82f3c80..7229a93a0d1 100644 --- a/packages/angular/common/src/index.ts +++ b/packages/angular/common/src/index.ts @@ -30,3 +30,5 @@ export { } from './directives/navigation/router-link-delegate'; export { NavDelegate } from './directives/navigation/nav-delegate'; export { IonTabs } from './directives/navigation/tabs'; + +export { ProxyCmp } from './utils/proxy'; diff --git a/packages/angular/standalone/src/index.ts b/packages/angular/standalone/src/index.ts index a5a128b2514..f5fc4e8273d 100644 --- a/packages/angular/standalone/src/index.ts +++ b/packages/angular/standalone/src/index.ts @@ -1,3 +1 @@ -// This is required to get ng-packagr to build. -// Remove this when you actually have something to export -export const placeholder = true; +export { IonRouterOutlet } from './navigation/router-outlet'; diff --git a/packages/angular/standalone/src/navigation/router-outlet.ts b/packages/angular/standalone/src/navigation/router-outlet.ts new file mode 100644 index 00000000000..2b750736e06 --- /dev/null +++ b/packages/angular/standalone/src/navigation/router-outlet.ts @@ -0,0 +1,13 @@ +import { Directive } from '@angular/core'; +import { IonRouterOutlet as IonRouterOutletBase, ProxyCmp } from '@ionic/angular/common'; +import { defineCustomElement } from '@ionic/core/components/ion-router-outlet.js'; + +@ProxyCmp({ + defineCustomElementFn: defineCustomElement, +}) +@Directive({ + selector: 'ion-router-outlet', + standalone: true, +}) +// eslint-disable-next-line @angular-eslint/directive-class-suffix +export class IonRouterOutlet extends IonRouterOutletBase {} diff --git a/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts b/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts new file mode 100644 index 00000000000..37beac46fc8 --- /dev/null +++ b/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts @@ -0,0 +1,9 @@ +describe('Router Outlet', () => { + beforeEach(() => { + cy.visit('/standalone/router-outlet'); + }) + + it('should render a as a child page of the router outlet', () => { + cy.ionPageVisible('ion-router-outlet app-router-outlet'); + }); +}) diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html index 0680b43f9c6..15a92a22447 100644 --- a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html +++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html @@ -1 +1 @@ - + diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts index b8ba6d5caa7..280de0d8c76 100644 --- a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts +++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { RouterModule } from '@angular/router'; - +import { IonRouterOutlet } from '@ionic/angular/standalone'; /** * This temporary code initialized Ionic and ensures components are visible. * TODO FW-4766 Can be removed when ticket is implemented @@ -15,7 +15,7 @@ document.querySelector('html')!.classList.add('ion-ce') selector: 'app-root-standalone', templateUrl: './app.component.html', standalone: true, - imports: [RouterModule] + imports: [RouterModule, IonRouterOutlet] }) export class AppComponent { } diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts index 3182d3167a2..a453e1e46e3 100644 --- a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts +++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts @@ -7,6 +7,7 @@ export const routes: Routes = [ component: AppComponent, children: [ { path: 'test', loadComponent: () => import('../test/test.component').then(m => m.TestComponent) }, + { path: 'router-outlet', loadComponent: () => import('../router-outlet/router-outlet.component').then(m => m.RouterOutletComponent) }, ] }, ]; diff --git a/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.html b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.html new file mode 100644 index 00000000000..83a1ae37758 --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.html @@ -0,0 +1 @@ +This should be visible and rendered inside of an ion-router-outlet. diff --git a/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.ts b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.ts new file mode 100644 index 00000000000..c28ea0e309d --- /dev/null +++ b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-router-outlet', + templateUrl: './router-outlet.component.html', + standalone: true +}) +export class RouterOutletComponent {}