]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/blob
86afc72a562d0af2eef642f4eb89b828afb947a7
[ceph-ci.git] /
1 /**
2  * MIT License
3  *
4  * Copyright (c) 2017 Kevin Kipp
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  *
24  *
25  * Based on https://github.com/third774/ng-bootstrap-form-validation
26  */
27
28 import { Directive, Host, HostBinding, Input, Optional, SkipSelf } from '@angular/core';
29 import { ControlContainer, FormControl } from '@angular/forms';
30
31 export function controlPath(name: string, parent: ControlContainer): string[] {
32   // tslint:disable-next-line:no-non-null-assertion
33   return [...parent.path!, name];
34 }
35
36 @Directive({
37   // tslint:disable-next-line:directive-selector
38   selector: '.form-control,.form-check-input,.custom-control-input'
39 })
40 export class CdFormControlDirective {
41   @Input()
42   formControlName: string;
43   @Input()
44   formControl: string;
45
46   @HostBinding('class.is-valid')
47   get validClass() {
48     if (!this.control) {
49       return false;
50     }
51     return this.control.valid && (this.control.touched || this.control.dirty);
52   }
53
54   @HostBinding('class.is-invalid')
55   get invalidClass() {
56     if (!this.control) {
57       return false;
58     }
59     return this.control.invalid && this.control.touched && this.control.dirty;
60   }
61
62   get path() {
63     return controlPath(this.formControlName, this.parent);
64   }
65
66   get control(): FormControl {
67     return this.formDirective && this.formDirective.getControl(this);
68   }
69
70   get formDirective(): any {
71     return this.parent ? this.parent.formDirective : null;
72   }
73
74   constructor(
75     // this value might be null, but we union type it as such until
76     // this issue is resolved: https://github.com/angular/angular/issues/25544
77     @Optional()
78     @Host()
79     @SkipSelf()
80     private parent: ControlContainer
81   ) {}
82 }