diff --git a/src/app/modules/sample-providers/components/form-control/form-control.component.scss b/src/app/modules/sample-providers/components/form-control/form-control.component.scss new file mode 100644 index 0000000..f8444c5 --- /dev/null +++ b/src/app/modules/sample-providers/components/form-control/form-control.component.scss @@ -0,0 +1,19 @@ +:host { + label { + display: block; + } + input, textarea { + box-sizing: border-box; + padding: 10px; + border-radius: 5px; + border-width: 1px; + border-style: solid; + border-color: #555555; + &::placeholder { + border-color: #a0a0a0bd; + } + width: 100%; + display: block; + margin-bottom: 10px; + } +} diff --git a/src/app/modules/sample-providers/components/form-control/form-control.component.ts b/src/app/modules/sample-providers/components/form-control/form-control.component.ts new file mode 100644 index 0000000..dd502e1 --- /dev/null +++ b/src/app/modules/sample-providers/components/form-control/form-control.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; + +@Component({ + selector: 'app-form-control', + template: ` +
+ + +
+ +
+ + +
+
+ `, + styleUrls: ['./form-control.component.scss'], +}) +export class FormControlComponent { + @Input() c: AbstractControl; // control + @Input() l: string; // label + @Input() t: boolean; // is textarea + // TODO add @Input checkbox, @Input file, @Input radio etc +} diff --git a/src/app/modules/sample-providers/components/submission-form/submission-form.component.html b/src/app/modules/sample-providers/components/submission-form/submission-form.component.html index 2e8324c..5e64dca 100644 --- a/src/app/modules/sample-providers/components/submission-form/submission-form.component.html +++ b/src/app/modules/sample-providers/components/submission-form/submission-form.component.html @@ -1,28 +1,44 @@
- - + +
- - + +
Description cannot be over 200 characters.
- - + +
Email must be in a valid format.
+ +
+ +
+
+ +
+
+ +
+ diff --git a/src/app/modules/sample-providers/components/submission-form/submission-form.component.scss b/src/app/modules/sample-providers/components/submission-form/submission-form.component.scss index 31d6693..a93828f 100644 --- a/src/app/modules/sample-providers/components/submission-form/submission-form.component.scss +++ b/src/app/modules/sample-providers/components/submission-form/submission-form.component.scss @@ -1,18 +1,4 @@ :host { - input, textarea { - box-sizing: border-box; - padding: 10px; - border-radius: 5px; - border-width: 1px; - border-style: solid; - border-color: #555555; - &::placeholder { - border-color: #a0a0a0bd; - } - width: 100%; - display: block; - margin-bottom: 10px; - } button { display: inline-flex; align-items: center; diff --git a/src/app/modules/sample-providers/components/submission-form/submission-form.component.ts b/src/app/modules/sample-providers/components/submission-form/submission-form.component.ts index a6beea4..7771085 100644 --- a/src/app/modules/sample-providers/components/submission-form/submission-form.component.ts +++ b/src/app/modules/sample-providers/components/submission-form/submission-form.component.ts @@ -1,22 +1,74 @@ -import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import { + Component, + OnInit, + Output, + EventEmitter, + Input, + ElementRef, + ViewChild, + HostListener, + ChangeDetectionStrategy, + ChangeDetectorRef, +} from '@angular/core'; import { AbstractControl, FormBuilder, FormGroup, Validators, + NG_VALUE_ACCESSOR, + ControlValueAccessor, } from '@angular/forms'; @Component({ selector: 'app-submission-form', templateUrl: './submission-form.component.html', styleUrls: ['./submission-form.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: SubmissionFormComponent, + multi: true, + }, + ], + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SubmissionFormComponent implements OnInit { +export class SubmissionFormComponent implements OnInit, ControlValueAccessor { form: FormGroup; + f: File; // demo file + + @ViewChild('p', { read: ElementRef }) p: ElementRef; + @Output() submitForm = new EventEmitter(); + @Input() + onChange = (f: File) => {}; + + @HostListener('change', ['$event.target.files']) + emitFiles(e: FileList) { + this.f = e && e.item(0); + this.a(); + this.onChange(this.f); + } + + registerOnChange(fn) { + this.onChange = fn; + } + + registerOnTouched(fn) {} + + /** @ignore */ + writeValue(value) { + if (value === null && this.f) { + this.f = null; + } + } + // add audioFile + a() { + this.p.nativeElement.src = URL.createObjectURL(this.f); + } + constructor(private formBuilder: FormBuilder) {} ngOnInit(): void { diff --git a/src/app/modules/sample-providers/sample-providers.module.ts b/src/app/modules/sample-providers/sample-providers.module.ts index 710cc63..e42d294 100644 --- a/src/app/modules/sample-providers/sample-providers.module.ts +++ b/src/app/modules/sample-providers/sample-providers.module.ts @@ -4,9 +4,14 @@ import { RouterModule } from '@angular/router'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormContainerComponent } from './routes/form-container/form-container.component'; import { SubmissionFormComponent } from './components/submission-form/submission-form.component'; +import { FormControlComponent } from './components/form-control/form-control.component'; @NgModule({ - declarations: [FormContainerComponent, SubmissionFormComponent], + declarations: [ + FormContainerComponent, + SubmissionFormComponent, + FormControlComponent, + ], imports: [CommonModule, FormsModule, ReactiveFormsModule, RouterModule], }) export class SampleProvidersModule {}