Skip to content

Instantly share code, notes, and snippets.

@twmulloy
Last active June 23, 2017 04:36
Show Gist options
  • Save twmulloy/09633dbb659f2b557e00545b7a31de1c to your computer and use it in GitHub Desktop.
Save twmulloy/09633dbb659f2b557e00545b7a31de1c to your computer and use it in GitHub Desktop.
Angular 4 + Alchemy CMS recursive <nav /> from `/api/pages/nested` response
import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'
import { ActivatedRoute } from '@angular/router'
import { Site } from './site'
import { PageService } from './page.service'
import { Page } from './page'
@Component({
selector: 'page',
template: `
<header>
<ng-container *ngFor="let root of site?.pages">
<ng-container *ngIf="root.root && root.public && root.visible">
<h1><a routerLink="/{{root.urlname === 'index' ? '' : root.urlname}}">{{root.name}}</a></h1>
<nav>
<ng-template #nav let-pages>
<ol>
<ng-container *ngFor="let page of pages">
<ng-container *ngIf="page.public && page.visible">
<li>
<a routerLink="/{{page.urlname}}">{{page.name}}</a>
<ng-container *ngTemplateOutlet="nav; context:{ $implicit: page.children }"></ng-container>
</li>
</ng-container>
</ng-container>
</ol>
</ng-template>
<ng-container *ngTemplateOutlet="nav; context:{ $implicit: root.children }"></ng-container>
</nav>
</ng-container>
</ng-container>
</header>
<main *ngFor="let element of page?.elements">
<element [element]="element"></element>
</main>
<footer></footer>
`,
providers: [ PageService ]
})
export class PageComponent implements OnChanges {
@Input() site: Site
page: Page
constructor(
private pageService: PageService,
private route: ActivatedRoute
) {}
ngOnChanges(changes: SimpleChanges) {
if (changes.site.currentValue) {
this.route.url.subscribe(segments => {
this.getPage(segments)
})
}
}
getPage(segments: Array<any>) {
const isRoot: boolean = segments.length === 0
let root: Page
if (isRoot) {
root = this.site.pages.find(page => page.root)
}
this.pageService.getPage(segments, root).subscribe(page => this.page = page)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment