Jumpstart

+

Elements

+

Agenda

  • JumpStart Overview
  • WK-Elements Overview
  • Integration with Angular
  • AngularJS to Angular migration strategies
  • Current status

The basics

We need to start with the required polyfills wk-elements depends upon.

/************************************************************
 * BROWSER POLYFILLS
 */

import 'wk-elements/bundles/polyfills';

Module configuration

CUSTOM_ELEMENTS_SCHEMA needs to be included inside the @NgModule to tell Angular we will be using custom html tags inside the template.

import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { HomeComponent } from './home.component';

@NgModule({
  declarations: [ HomeComponent ],
  exports: [ HomeComponent ],
  schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
})
export class HomeModule { }

Usage inside an NG component

Now you are able to import the elements you wish and use them inside your HTML template.

import { Component } from '@angular/core';
// Import the wk-element you want to use
import 'wk-elements/wkTooltip';

@Component({
  selector: 'app-home',
  template: './home.component.html',
  styleUrls: ['./home.component.scss']
})
export class HomeComponent {}

// Now you are able to consume wk-tooltip inside your html template
<div class="app-home">
    <h1 class="haz-a-tooltip">Home Component</h1>
    <wk-tooltip target=".haz-a-tooltip" title="This heading has a tooltip, hooray!"></wk-tooltip>
</div>

That

WAS

EASY!

A more complex integration example

Sometimes you will want to wrap a wk-element inside an angular component to take full advantage of it and provide customized & already configured versions of a particular element.

 

Let's see an example with the wk-modal element.

import 'wk-elements/wkModal';
import { ChangeDetectionStrategy, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';

export type ModalSize = 'large' | 'medium' | 'small';

export interface IModalWrapperOptions {
  title: string;
  size: ModalSize;
  buttonText: string;
  icon: string;
}

@Component({
  selector: 'wk-modal-wrapper',
  templateUrl: './modalWrapper.component.html',
  styleUrls: ['./modalWrapper.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ModalWrapperComponent implements OnInit {

  modalBody: HTMLElement;
  @Input() options: IModalWrapperOptions;
  @ViewChild('modalContent') content: ElementRef;
  @ViewChild('modal') modal: ElementRef;

  ngOnInit(): void {
    this.modalBody = this.content.nativeElement;
    this.modal.nativeElement.actions = [{
      label: 'Close',
      primary: true,
      onclick: () => this.modal.nativeElement.hide()
    }];
  }

  open(): void {
    this.modal.nativeElement.show();
  }
}
<div>
  <a class="modal-link" (click)="open()">
    <span [attr.wk-icon]="options.icon"></span>
    <span class="modal-button-text">{{options.buttonText}}</span>
  </a>
  <wk-modal #modal [title]="options.title" [size]="options.size" closable overlay [body]="modalBody"></wk-modal>
  <div #modalContent class="content-example">
    <ng-content></ng-content>
  </div>
</div>

Wrapping an element inside A Component

// inside your component files:
modalOptions: IModalWrapperOptions = {
  title: 'My modal title',
  size: 'medium',
  buttonText: 'Open modal',
  icon: 'info'
};

// inside your components templates
<wk-modal-wrapper [options]="modalOptions">
  <h2>The modal content</h2>
  <p>Will now have a default action 'close' with a button.</p>
</wk-modal-wrapper>

Caveats

There are no silver bullets

Passing attributes

Make sure you bind attributes in wk-elements using the bracket syntax.

Order is important

For some wk-elements it is important the order they have inside your templates. This is due to the way angular parses them.

<wk-tooltip
  [attr.title]="title"
  [attr.target]="target">
</wk-tooltip>
<button #with-tooltip>
  Show tooltip
</button>
// Tooltip must be declared
// after the target declaration
<wk-tooltip
  [attr.title]="title"
  [attr.target]="target">
</wk-tooltip>

Thank You!

wk-elements + angular

By Ricardo Casares

wk-elements + angular

  • 687