<!DOCTYPE html>
<html>
  <head>
    <title>Angular 2 Button - Example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- CSS file -->
    <link rel="stylesheet" type="text/css" href="style.css">
   <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" >

    <!-- IE polyfills, keep the order please -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.33.3/es6-shim.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.20/system-polyfills.js"></script>
    
    <!-- Agular 2 -->
    <script src="https://code.angularjs.org/2.0.0-beta.7/angular2-polyfills.js"></script>
    <script src="https://code.angularjs.org/tools/system.js"></script>
    <script src="https://code.angularjs.org/tools/typescript.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.7/Rx.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.7/angular2.dev.js"></script>
     <!-- Config Agular 2 and Typescript -->
    <script>
      System.config({
        transpiler: 'typescript', 
        typescriptOptions: { emitDecoratorMetadata: true }, 
        packages: {'app': {defaultExtension: 'ts'}} 
      });
      System.import('app/main')
            .then(null, console.error.bind(console));
    </script>

  </head>
 
  <!-- Run the application -->
  <body>
    <h1>Angular 2 Button</h1> 
    <my-app class="container" style="display: block">Loading Sample...</my-app>
  
    <div style="padding-top:50px">
    <a target="_blank" href="http://www.angulartypescript.com/angular-2-tutorial/" title="Angular 2 Tutorial"> 
     <img src="http://www.angulartypescript.com/wp-content/uploads/2016/03/learn-more-angular-2.png" alt="Smiley face" height="200" width="500">   
    </a>  
        <ul class="nav nav-pills nav-stacked" >
            <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-tutorial/" title="Angular 2 Home"> Angular 2 Tutorial </a></li>
          <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-introduction/">Angular 2 Introduction</a></li>
          <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-architecture/">Angular 2 Architecture</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-annotations/">Angular 2 Annotations</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-getting-started/">Angular 2 Setup</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-hello-world/">Angular 2 Hello World</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-components/">Angular 2 Components</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-template-syntax/">Angular 2 Template Syntax</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-data-binding/">Angular 2 Data Binding</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-forms/">Angular 2 Forms</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-formbuilder-example/">Angular 2 Formbuilder</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-router-example/">Angular 2 Router</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-http-example-typescript/">Angular 2 HTTP</a></li>
      <li><a target="_blank" href="http://www.angulartypescript.com/angular-2-services/">Angular 2 Service</a></li> 
    
        </ul>
    </div> 
  </body>

</html>
<!-- 
Copyright 2016 angulartypescript.com. All Rights Reserved.
Everyone can use this source code; don’t forget to indicate the source please:
http://www.angulartypescript.com/ 
-->

/* Styles go here */

/**
 * Created by Tareq Boulakjar. from angulartypescript.com
 */
import {bootstrap}  from 'angular2/platform/browser';
import {Angular2Button} from './button-example';

bootstrap(Angular2Button);


/*
Copyright 2016 angulartypescript.com. All Rights Reserved.
Everyone can use this source code; don’t forget to indicate the source please:
http://www.angulartypescript.com/ 
*/
/**
 * Created by Tareq Boulakjar. from angulartypescript.com
 */
import {Component} from 'angular2/core';
import {CORE_DIRECTIVES, FORM_DIRECTIVES } from 'angular2/common';
import {ButtonCheckbox} from './button-checkbox.component';
import {ButtonRadio} from './button-radio.component';
/*Angular 2 Button*/
@Component({
    selector: 'my-app',
    template:`
                    <h3>Switch Button (toggle)</h3>
                    <p class="card card-block card-header"><b>{{switchButtonModel}}</b></p>
                    <button type="button" class="btn btn-primary"
                            [(ngModel)]="switchButtonModel" btnCheckbox
                            btnCheckboxTrue="1" btnCheckboxFalse="0">
                      Switch Button
                    </button>
                    
                    <h3>Checkbox Set</h3>
                    <p class="card card-block card-header">
                    BMW: <span style="color: red">{{checkButtonModel.bmw}}</span>
                    Audi: <span style="color: red">{{checkButtonModel.audi}}</span>
                    Volkswagen: <span style="color: red">{{checkButtonModel.volkswagen}}</span>
                    </p>
                    <div class="btn-group">
                      <label class="btn btn-primary" [(ngModel)]="checkButtonModel.bmw"  btnCheckbox>BMW</label>
                      <label class="btn btn-primary" [(ngModel)]="checkButtonModel.audi" btnCheckbox>Audi</label>
                      <label class="btn btn-primary" [(ngModel)]="checkButtonModel.volkswagen" btnCheckbox>Volkswagen</label>
                    </div>

                    <h3>Radio Button</h3>
                    <p class="card card-block card-header"><span style="color: red">{{radioButtonModel || 'No Value Selected !'}}</span></p>
                    <div class="btn-group">
                      <label class="btn btn-primary" [(ngModel)]="radioButtonModel" btnRadio="Porsche">Porsche</label>
                      <label class="btn btn-primary" [(ngModel)]="radioButtonModel" btnRadio="Maserati">Maserati</label>
                      <label class="btn btn-primary" [(ngModel)]="radioButtonModel" btnRadio="Opel">Opel</label>
                    </div>

                    <h3>Radio Button with Uncheckable option (ctrl + click)</h3>
                    <div class="btn-group">
                      <label class="btn btn-success" [(ngModel)]="radioButtonModel" btnRadio="Porsche" uncheckable>Porsche</label>
                      <label class="btn btn-success" [(ngModel)]="radioButtonModel" btnRadio="Maserati"uncheckable>Maserati</label>
                      <label class="btn btn-success" [(ngModel)]="radioButtonModel" btnRadio="Opel" uncheckable>Opel</label>
                    </div>

             `,
    directives: [ ButtonCheckbox, ButtonRadio, CORE_DIRECTIVES, FORM_DIRECTIVES ]
})
export class Angular2Button {
    //Switch button or toggle button contains 1 or 0
    private switchButtonModel:string = '1';
    //Radio button contains one value from a set of pre defined values
    private radioButtonModel:string = 'Maserati';
    //Set multiple values
    public checkButtonModel:any = {bmw: false, audi: true, volkswagen: false};
}
import { Directive,  OnInit, Input, HostBinding, HostListener,
    Self, ElementRef } from 'angular2/core';
import { ControlValueAccessor, NgModel } from 'angular2/common';

@Directive({ selector: '[btnRadio][ngModel]' })
export class ButtonRadio implements ControlValueAccessor, OnInit {
    @Input() private btnRadio:string;
    @Input() private uncheckable:boolean;

    @HostBinding('class.active')
    private get isActive() {
        return this.btnRadio === this.value;
    }

    @HostListener('click')
    private onClick() {
        if (this.uncheckable && this.btnRadio === this.value) {
            return this.cd.viewToModelUpdate(null);
        }

        this.cd.viewToModelUpdate(this.btnRadio);
    }

    constructor(@Self() public cd:NgModel, public el:ElementRef) {
        // hack!
        cd.valueAccessor = this;
    }

    public ngOnInit() {
        this.uncheckable = typeof this.uncheckable !== 'undefined';
    }

    // hack view model!
    protected get value() {
        return this.cd.viewModel;
    }

    protected set value(value) {
        this.cd.viewModel = value;
    }

    // ControlValueAccessor
    // model -> view
    public writeValue(value:any) {
        this.value = value;
    }

    public onChange = (_:any) => {};
    public onTouched = () => {};

    public registerOnChange(fn:(_:any) => {}):void {
        this.onChange = fn;
    }

    public registerOnTouched(fn:() => {}):void {
        this.onTouched = fn;
    }
}
import { Directive, OnInit, Input, HostBinding, HostListener,
    Self, Renderer, ElementRef } from 'angular2/core';
import { ControlValueAccessor, NgModel } from 'angular2/common';

@Directive({ selector: '[btnCheckbox][ngModel]' })
export class ButtonCheckbox implements ControlValueAccessor, OnInit {
    @Input() private btnCheckboxTrue:any;
    @Input() private btnCheckboxFalse:any;

    @HostBinding('class.active')
    private state:boolean = false;

    // view -> model
    @HostListener('click')
    private onClick() {
        this.toggle(!this.state);
        this.cd.viewToModelUpdate(this.value);
    }

    private value:any;

    constructor(@Self() public cd:NgModel) {
        // hack !
        cd.valueAccessor = this;
    }

    public ngOnInit() {
        this.toggle(this.trueValue === this.value);
    }

    private get trueValue() {
        return typeof this.btnCheckboxTrue !== 'undefined' ? this.btnCheckboxTrue : true;
    }

    private get falseValue() {
        return typeof this.btnCheckboxFalse !== 'undefined' ? this.btnCheckboxFalse : false;
    }

    private toggle(state:boolean) {
        this.state = state;
        this.value = this.state ? this.trueValue : this.falseValue;
    }

    // ControlValueAccessor
    // model -> view
    public writeValue(value:any) {
        this.state = this.trueValue === value;
        this.value = value;
    }

    protected onChange = (_:any) => {};
    protected onTouched = () => {};

    public registerOnChange(fn:(_:any) => {}):void {
        this.onChange = fn;
    }

    public registerOnTouched(fn:() => {}):void {
        this.onTouched = fn;
    }
}