Guest User

Untitled

a guest
Jun 21st, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.38 KB | None | 0 0
  1. <form #myForm="ngForm">
  2. <div>
  3. <label>Birth Year</label>
  4. <vng-controls-textbox #user="ngModel" name="user" minlength="5" ngModel ></vng-controls-textbox>
  5.  
  6. <label>Text</label>
  7. <vng-controls-textbox #text="ngModel" name="text" maxlength="5" ngModel ></vng-controls-textbox>
  8. </div>
  9.  
  10. <div vng-control-group [icon]="['fa','user']">
  11. <vng-controls-textbox required type="text" #username="ngModel" ngModel name="Username">
  12. </vng-controls-textbox>
  13. <vng-controls-textbox required type="password" #password="ngModel" ngModel name="Passwort">
  14. </vng-controls-textbox>
  15. </div>
  16. </form>
  17.  
  18. import { Component, OnInit, EventEmitter, Input, Output, forwardRef, AfterViewInit, Self } from '@angular/core';
  19. import { Validator, ControlValueAccessor, FormControl, NgControl } from '@angular/forms';
  20.  
  21. @Component({
  22. selector: 'app-base'
  23. })
  24. export class BaseComponent implements OnInit, ControlValueAccessor, Validator, AfterViewInit//, IControlBase<any>
  25. {
  26. public ngControl: any;
  27. private parseError: boolean;
  28. private _value: any = '';
  29.  
  30. /** Input value */
  31. @Input() set value(newValue: any) {
  32. if (newValue != this._value && newValue !== undefined) {
  33. console.log("[BaseComponent]: Set value " + newValue);
  34. this.valueChange.emit(newValue);
  35. this._value = newValue;
  36. }
  37.  
  38. };
  39. get value(): any {
  40. if (this._value) {
  41. return this._value;
  42. }
  43. }
  44. /** Platzhalter */
  45. @Input() placeholder: any;
  46.  
  47. /** Disabled */
  48. @Input() disabled: boolean;
  49.  
  50. /** Name des Controls */
  51. @Input() name: string;
  52.  
  53. /** Optional: Typ des Controls (Text, Password) */
  54. @Input() type?: string;
  55.  
  56. @Input() hideErrors: boolean = false;
  57.  
  58. @Output() valueChange: EventEmitter<any> = new EventEmitter<any>();
  59.  
  60. // this is the initial value set to the component
  61. public writeValue(obj: any) {
  62. if (obj !== undefined && obj) {
  63. console.log("[BaseComponent] writeValue ", obj)
  64. this._value = obj;
  65. }
  66. }
  67.  
  68. // registers 'fn' that will be fired wheb changes are made
  69. // this is how we emit the changes back to the form
  70. public registerOnChange(fn: any) {
  71. this.propagateChange = fn;
  72. }
  73.  
  74. // validates the form, returns null when valid else the validation object
  75. // in this case we're checking if the json parsing has passed or failed from the onChange method
  76. public validate(c: FormControl) {
  77.  
  78. return null;
  79. }
  80.  
  81. // not used, used for touch input
  82. public registerOnTouched() { }
  83.  
  84. // change events from the textarea
  85. private onChange(event) {
  86.  
  87. if (event.target.value !== undefined) {
  88. console.log("[BaseComponent] "+this.name+" OnChange " + event.target.value)
  89. // get value from text area
  90. this._value = event.target.value;
  91. this.propagateChange(this._value);
  92. }
  93.  
  94. }
  95.  
  96. // the method set in registerOnChange to emit changes back to the form
  97. private propagateChange = (_: any) => { };
  98.  
  99. registerOnValidatorChange?(fn: () => void): void {
  100. console.log("[BaseComponent]: registerOnValidatorChange");
  101. }
  102. setDisabledState?(isDisabled: boolean): void {
  103. console.log("[BaseComponent]: setDisabledState");
  104. }
  105.  
  106. constructor(@Self() ngControl: NgControl) {
  107. ngControl.valueAccessor = this;
  108. if (ngControl) {
  109. this.ngControl = ngControl;
  110. }
  111. }
  112. ngOnInit() {
  113.  
  114. }
  115. ngAfterViewInit(): void {
  116. //debugger;
  117. //this.placeholder = this.translateService.instant((this.placeholder ? this.placeholder : this.name))
  118. }
  119.  
  120. }
  121.  
  122. import { Component, OnInit, Input, Host, Self } from '@angular/core';
  123. import { ControlContainer, FormControl, AbstractControl, NgControl } from '@angular/forms';
  124. import { BaseComponent } from '../../_bases/base.component'
  125. import { QueryList, ViewChildren, ContentChildren, TemplateRef, ContentChild } from '@angular/core';
  126.  
  127. import { TextboxComponent } from '../textbox/textbox.component';
  128.  
  129. /**
  130. * Komponente für Input-Groups
  131. * @example
  132. * <div vng-control-group [config]="textboxUsernameConfig">
  133. * // Kann ein diverses Control sein, was als CSS-Klasse "form-control besitzt"
  134. * <input class="input form-control" />
  135. * </div>
  136. *
  137. * // oder
  138. *
  139. * <div vng-control-group [icon]="['fa','user']" [label]="Test Label" [position]="'append'">
  140. */
  141. @Component({
  142. selector: 'div[vng-control-group]',
  143. templateUrl: './control-group.component.html'
  144. })
  145.  
  146. export class ControlGroupComponent {
  147. private controlContainer: ControlContainer;
  148. public formControl: AbstractControl;
  149.  
  150. @ContentChild(TemplateRef) template: TemplateRef<any>;
  151.  
  152. ngAfterContentInit() {
  153.  
  154. }
  155.  
  156. /** Konfiguration der Inputgroup als Objekt */
  157. @Input() config: InputGroupConfig;
  158.  
  159. /** Icon als Attribut (z.B. im HTML) */
  160. @Input() icon?: object;
  161.  
  162. /** Label als Attribut (z.B. im HTML) */
  163. @Input() label?: string;
  164.  
  165. /** Position als Attribut (z.B. im HTML) */
  166. @Input() position?: GroupPosition;
  167.  
  168. constructor(@Host() parent: ControlContainer) {
  169. //this.controlContainer = parent;
  170. //this.formControl = this.controlContainer.control;
  171. }
  172.  
  173. ngOnInit() {
  174.  
  175. // Wenn kein Konfig-Objekt übergeben worden ist, setze die Attribute bzw. setze Default-Werte
  176. if (!this.config) {
  177. console.log("[ControlGroupComponent]: Keine Config übergeben")
  178. this.config = {
  179. icon: this.icon || ['fa', 'question'],
  180. label: this.label || '',
  181. position: this.position || GroupPosition.prepend
  182. }
  183. }
  184. }
  185. }
  186.  
  187.  
  188. export interface InputGroupConfig {
  189. icon?: object,
  190. label?: string,
  191. position?: GroupPosition
  192. }
  193.  
  194. export enum GroupPosition {
  195. append = 'append',
  196. prepend = 'prepend'
  197. }
  198.  
  199. <div class="input-group">
  200. <div class="input-group-prepend">
  201. <span class="input-group-text" id="basic-addon1">@</span>
  202. </div>
  203. <ng-content></ng-content>
  204. </div>
  205.  
  206. Show error component (ts/html):
  207. // show-errors.component.ts
  208. import { Component, Input } from '@angular/core';
  209. import { AbstractControlDirective, AbstractControl } from '@angular/forms';
  210.  
  211. @Component({
  212. selector: 'show-errors',
  213. template: `
  214. <ul *ngIf="shouldShowErrors()">
  215. <li style="color: red" *ngFor="let error of listOfErrors()">{{error}}</li>
  216. </ul>
  217. `,
  218. })
  219. export class ShowErrorsComponent {
  220.  
  221. private static readonly errorMessages = {
  222. 'required': () => 'This field is required',
  223. 'minlength': (params) => 'The min number of characters is ' + params.requiredLength,
  224. 'maxlength': (params) => 'The max allowed number of characters is ' + params.requiredLength,
  225. 'pattern': (params) => 'The required pattern is: ' + params.requiredPattern,
  226. 'years': (params) => params.message,
  227. 'countryCity': (params) => params.message,
  228. 'uniqueName': (params) => params.message,
  229. 'telephoneNumbers': (params) => params.message,
  230. 'telephoneNumber': (params) => params.message
  231. };
  232.  
  233. @Input()
  234. private control: AbstractControlDirective | AbstractControl;
  235.  
  236. shouldShowErrors(): boolean {
  237. return this.control &&
  238. this.control.errors &&
  239. (this.control.dirty || this.control.touched);
  240. }
  241.  
  242. listOfErrors(): string[] {
  243. return Object.keys(this.control.errors)
  244. .map(field => this.getMessage(field, this.control.errors[field]));
  245. }
  246.  
  247. private getMessage(type: string, params: any) {
  248. return ShowErrorsComponent.errorMessages[type](params);
  249. }
  250.  
  251. }
Add Comment
Please, Sign In to add comment