import { Component, ElementRef } from 'angular2/core'; import { FORM_DIRECTIVES, FormBuilder, Control, ControlGroup, Validators, AbstractControl } from 'angular2/common'; import { CustomValidators } from "ng2-contact-form/src/custom.validators"; declare var document; declare var window; const DEFAULT_TEMPLATE = `

{{ titleAttr }}

`; /* @component: contact-form @descrip: Component for implement contact form using ajax and validators */ @Component({ selector: 'contact-form', directives: [FORM_DIRECTIVES], template: DEFAULT_TEMPLATE }) export class ContactForm { //Properties myForm: ControlGroup; firstname: AbstractControl; lastname: AbstractControl; email: AbstractControl; message: AbstractControl; titleAttr: string; firstnameAttr: string; lastnameAttr: string; emailAttr: string; messageAttr: string; sendAttr: string; urlAttr: string; frameworkCssAttr: string; inputsClass: string; btnClass: string; textareaClass: string; alertClass: string; constructor(fb: FormBuilder, private element:ElementRef) { //Get attributes values let tag = this.element.nativeElement; this.titleAttr = typeof tag.getAttribute('title') !== 'undefined' ? tag.getAttribute('title') : "Title"; this.firstnameAttr = typeof tag.getAttribute('firstname') !== 'undefined' ? tag.getAttribute('firstname') : "First Name"; this.lastnameAttr = typeof tag.getAttribute('lastname') !== 'undefined' ? tag.getAttribute('lastname') : "Last Name"; this.emailAttr = typeof tag.getAttribute('email') !== 'undefined' ? tag.getAttribute('email') : "Email"; this.sendAttr = typeof tag.getAttribute('send') !== 'undefined' ? tag.getAttribute('send') : "Send"; this.messageAttr = typeof tag.getAttribute('message') !== 'undefined' ? tag.getAttribute('message') : "Message"; this.urlAttr = typeof tag.getAttribute('url') !== 'undefined' ? tag.getAttribute('url') : "/send/"; this.frameworkCssAttr = typeof tag.getAttribute('frameworkCss') !== 'undefined' ? tag.getAttribute('frameworkCss') : "bootstrap"; //Check framework css to use switch(this.frameworkCssAttr.toLowerCase()){ //MaterializeCSS case 'materialize': this.inputsClass = "validate"; this.btnClass = "btn-large waves-effect waves-light teal default_color scrollspy"; this.textareaClass = "materialize-textarea"; this.alertClass = "card-panel"; break; //Bootstrap default: this.inputsClass = "form-control"; this.btnClass = "btn btn-default"; this.textareaClass = ""; this.alertClass = "alert alert-info"; break; } //Validators form this.myForm = fb.group({ 'firstname': ['', Validators.required], 'lastname': ['', Validators.required], 'email': ['', Validators.compose([Validators.required, CustomValidators.validateEmail])], 'message': ['', Validators.required] }); this.firstname = this.myForm.controls['firstname']; this.lastname = this.myForm.controls['lastname']; this.email = this.myForm.controls['email']; this.message = this.myForm.controls['message']; } /* @method: sendEmail @descrip: Event submit for contact form */ sendEmail(value: any): void { //Result to send email let result = document.querySelector("#result"); let result_card = document.querySelector("#result_card"); let progress = document.querySelector("#progress"); //Hide elements result_card.style.display = "none"; //Show progress progress.removeAttribute("style"); //Parameters let creds = "firstname=" + value.firstname + "&lastname=" + value.lastname; creds = creds + "&message=" + value.message + "&email=" + value.email; //Send email window.fetch(this.urlAttr, { method: 'POST', headers: { "Content-type": "application/x-www-form-urlencoded; charset=UTF-8" }, body: creds }) .then((data) => { let res = data.text(); res.then((message) => { result.innerHTML = message; //Show card message and hide progress result_card.style.display = "block"; progress.style.display = "none"; }); }) .catch((error) => { result.innerHTML = "Error al procesar el formulario"; //Show card message and hide progress result_card.style.display = "block"; progress.style.display = "none"; }); } }