Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. import { Directive, HostListener, ElementRef } from '@angular/core';
  2.  
  3. @Directive({
  4. selector: '[appNavDropdown]'
  5. })
  6. export class NavDropdownDirective {
  7.  
  8. constructor(private el: ElementRef) { }
  9.  
  10. toggle() {
  11. this.el.nativeElement.classList.toggle('open');
  12. }
  13. }
  14.  
  15. /**
  16. * Allows the dropdown to be toggled via click.
  17. */
  18. @Directive({
  19. selector: '[appNavDropdownToggle]'
  20. })
  21. export class NavDropdownToggleDirective {
  22. constructor(private dropdown: NavDropdownDirective) {}
  23.  
  24. @HostListener('click', ['$event'])
  25. toggleOpen($event: any) {
  26. $event.preventDefault();
  27. this.dropdown.toggle();
  28. }
  29. }
  30.  
  31. export const NAV_DROPDOWN_DIRECTIVES = [NavDropdownDirective, NavDropdownToggleDirective];
  32.  
  33. import { Component, ElementRef, Input, OnInit, Renderer2 } from '@angular/core';
  34.  
  35. // Import navigation elements
  36. import { navigation } from './../../_nav';
  37.  
  38. @Component({
  39. selector: 'app-sidebar-nav',
  40. template: `
  41. <nav class="sidebar-nav">
  42. <ul class="nav">
  43. <ng-template ngFor let-navitem [ngForOf]="navigation">
  44. <li *ngIf="isDivider(navitem)" class="nav-divider"></li>
  45. <ng-template [ngIf]="isTitle(navitem)">
  46. <app-sidebar-nav-title [title]='navitem'></app-sidebar-nav-title>
  47. </ng-template>
  48. <ng-template [ngIf]="!isDivider(navitem)&&!isTitle(navitem)">
  49. <app-sidebar-nav-item [item]='navitem'></app-sidebar-nav-item>
  50. </ng-template>
  51. </ng-template>
  52. </ul>
  53. </nav>`
  54. })
  55. export class AppSidebarNavComponent {
  56.  
  57. public navigation = navigation;
  58.  
  59. public isDivider(item) {
  60. return item.divider ? true : false
  61. }
  62.  
  63. public isTitle(item) {
  64. return item.title ? true : false
  65. }
  66.  
  67. constructor() { }
  68. }
  69.  
  70. import { Router } from '@angular/router';
  71.  
  72. @Component({
  73. selector: 'app-sidebar-nav-item',
  74. template: `
  75. <li *ngIf="!isDropdown(); else dropdown" [ngClass]="hasClass() ? 'nav-item ' + item.class : 'nav-item'">
  76. <app-sidebar-nav-link [link]='item'></app-sidebar-nav-link>
  77. </li>
  78. <ng-template #dropdown>
  79. <li [ngClass]="hasClass() ? 'nav-item nav-dropdown ' + item.class : 'nav-item nav-dropdown'"
  80. [class.closed]="isActive()"
  81. routerLinkActive="closed"
  82. appNavDropdown>
  83. <app-sidebar-nav-dropdown [link]='item'></app-sidebar-nav-dropdown>
  84. </li>
  85. </ng-template>
  86. `
  87. })
  88. export class AppSidebarNavItemComponent {
  89. @Input() item: any;
  90.  
  91. public hasClass() {
  92. return this.item.class ? true : false
  93. }
  94.  
  95. public isDropdown() {
  96. return this.item.children ? true : false
  97. }
  98.  
  99. public thisUrl() {
  100. return this.item.url
  101. }
  102.  
  103. public isActive() {
  104. return this.router.isActive(this.thisUrl(), false)
  105. }
  106.  
  107. constructor( private router: Router ) { }
  108.  
  109. }
  110.  
  111. @Component({
  112. selector: 'app-sidebar-nav-link',
  113. template: `
  114. <a *ngIf="!isExternalLink(); else external"
  115. [ngClass]="hasVariant() ? 'nav-link nav-link-' + link.variant : 'nav-link'"
  116. routerLinkActive="active"
  117. [routerLink]="[link.url]"
  118. (click)="hideMobile()">
  119. <i *ngIf="isIcon()" class="{{ link.icon }}"></i>
  120. {{ link.name }}
  121. <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span>
  122. </a>
  123. <ng-template #external>
  124. <a [ngClass]="hasVariant() ? 'nav-link nav-link-' + link.variant : 'nav-link'" href="{{link.url}}">
  125. <i *ngIf="isIcon()" class="{{ link.icon }}"></i>
  126. {{ link.name }}
  127. <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span>
  128. </a>
  129. </ng-template>
  130. `
  131. })
  132. export class AppSidebarNavLinkComponent {
  133. @Input() link: any;
  134.  
  135. public hasVariant() {
  136. return this.link.variant ? true : false
  137. }
  138.  
  139. public isBadge() {
  140. return this.link.badge ? true : false
  141. }
  142.  
  143. public isExternalLink() {
  144. return this.link.url.substring(0, 4) === 'http' ? true : false
  145. }
  146.  
  147. public isIcon() {
  148. return this.link.icon ? true : false
  149. }
  150.  
  151. public hideMobile() {
  152. if (document.body.classList.contains('sidebar-mobile-show')) {
  153. document.body.classList.toggle('sidebar-mobile-show')
  154. }
  155. }
  156.  
  157. constructor() { }
  158. }
  159.  
  160. @Component({
  161. selector: 'app-sidebar-nav-dropdown',
  162. template: `
  163. <a class="nav-link nav-dropdown-toggle" appNavDropdownToggle>
  164. <i *ngIf="isIcon()" class="{{ link.icon }}"></i>
  165. {{ link.name }}
  166. <span *ngIf="isBadge()" [ngClass]="'badge badge-' + link.badge.variant">{{ link.badge.text }}</span>
  167. </a>
  168. <ul class="nav-dropdown-items">
  169. <ng-template ngFor let-child [ngForOf]="link.children">
  170. <app-sidebar-nav-item [item]='child'></app-sidebar-nav-item>
  171. </ng-template>
  172. </ul>
  173. `
  174. })
  175. export class AppSidebarNavDropdownComponent {
  176. @Input() link: any;
  177.  
  178. public isBadge() {
  179. return this.link.badge ? true : false
  180. }
  181.  
  182. public isIcon() {
  183. return this.link.icon ? true : false
  184. }
  185.  
  186. constructor() { }
  187. }
  188.  
  189. @Component({
  190. selector: 'app-sidebar-nav-title',
  191. template: ''
  192. })
  193. export class AppSidebarNavTitleComponent implements OnInit {
  194. @Input() title: any;
  195.  
  196. constructor(private el: ElementRef, private renderer: Renderer2) { }
  197.  
  198. ngOnInit() {
  199. const nativeElement: HTMLElement = this.el.nativeElement;
  200. const li = this.renderer.createElement('li');
  201. const name = this.renderer.createText(this.title.name);
  202.  
  203. this.renderer.addClass(li, 'nav-title');
  204.  
  205. if ( this.title.class ) {
  206. const classes = this.title.class;
  207. this.renderer.addClass(li, classes);
  208. }
  209.  
  210. if ( this.title.wrapper ) {
  211. const wrapper = this.renderer.createElement(this.title.wrapper.element);
  212.  
  213. this.renderer.appendChild(wrapper, name);
  214. this.renderer.appendChild(li, wrapper);
  215. } else {
  216. this.renderer.appendChild(li, name);
  217. }
  218. this.renderer.appendChild(nativeElement, li)
  219. }
  220. }
  221.  
  222. export const APP_SIDEBAR_NAV = [
  223. AppSidebarNavComponent,
  224. AppSidebarNavDropdownComponent,
  225. AppSidebarNavItemComponent,
  226. AppSidebarNavLinkComponent,
  227. AppSidebarNavTitleComponent
  228. ];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement