]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/blob
24415b9b1d80f0bef73ad6a80f0627da7410b03d
[ceph-ci.git] /
1 import { ChangeDetectorRef, Component, Inject, OnInit, Optional } from '@angular/core';
2 import { FormArray, FormControl, FormGroup, UntypedFormControl, Validators } from '@angular/forms';
3 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
4 import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
5 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
6 import { CdValidators } from '~/app/shared/forms/cd-validators';
7
8 import { NotificationService } from '~/app/shared/services/notification.service';
9 import { RgwRealmService } from '~/app/shared/api/rgw-realm.service';
10 import { SmbService } from '~/app/shared/api/smb.service';
11 import { CdForm } from '~/app/shared/forms/cd-form';
12 import { DomainSettings, JoinSource, SMBJoinAuth } from '../smb.model';
13 import { Observable } from 'rxjs';
14 import { Router } from '@angular/router';
15 import { JOINAUTH_URL } from '../smb-join-auth-list/smb-join-auth-list.component';
16
17 @Component({
18   selector: 'cd-smb-domain-setting-modal',
19   templateUrl: './smb-domain-setting-modal.component.html',
20   styleUrls: ['./smb-domain-setting-modal.component.scss']
21 })
22 export class SmbDomainSettingModalComponent extends CdForm implements OnInit {
23   domainSettingsForm: CdFormGroup;
24   realmNames: string[];
25   joinAuths$: Observable<SMBJoinAuth[]>;
26
27   constructor(
28     public activeModal: NgbActiveModal,
29     public actionLabels: ActionLabelsI18n,
30     public rgwRealmService: RgwRealmService,
31     public notificationService: NotificationService,
32     public smbService: SmbService,
33     private cd: ChangeDetectorRef,
34     private router: Router,
35     @Optional() @Inject('action') public action: string,
36     @Optional() @Inject('resource') public resource: string,
37     @Optional()
38     @Inject('domainSettingsObject')
39     public domainSettingsObject?: DomainSettings
40   ) {
41     super();
42     this.action = this.actionLabels.UPDATE;
43     this.resource = $localize`Active Directory (AD) parameters`;
44   }
45
46   private createForm() {
47     this.domainSettingsForm = new CdFormGroup({
48       realm: new UntypedFormControl('', {
49         validators: [
50           Validators.required,
51           CdValidators.custom('uniqueName', (realm: string) => {
52             return this.realmNames && this.realmNames.indexOf(realm) !== -1;
53           })
54         ]
55       }),
56       join_sources: new FormArray([])
57     });
58   }
59
60   ngOnInit(): void {
61     this.createForm();
62     this.loadingReady();
63     this.joinAuths$ = this.smbService.listJoinAuths();
64     this.domainSettingsForm.get('realm').setValue(this.domainSettingsObject?.realm);
65     const join_sources = this.domainSettingsForm.get('join_sources') as FormArray;
66
67     if (this.domainSettingsObject?.join_sources) {
68       this.domainSettingsObject.join_sources.forEach((source: JoinSource) => {
69         join_sources.push(this.newJoinSource(source));
70       });
71     }
72
73     if (!this.domainSettingsObject) {
74       this.addJoinSource();
75     } else {
76       this.action = this.actionLabels.EDIT;
77     }
78   }
79
80   submit() {
81     this.smbService.passData(this.domainSettingsForm.value);
82     this.closeModal();
83   }
84
85   get join_sources() {
86     return this.domainSettingsForm.get('join_sources') as FormArray;
87   }
88
89   newJoinSource(joinSource?: JoinSource) {
90     return new FormGroup({
91       ref: new FormControl(joinSource?.ref || null, Validators.required)
92     });
93   }
94
95   addJoinSource() {
96     this.join_sources.push(this.newJoinSource());
97     this.cd.detectChanges();
98   }
99
100   navigateCreateJoinSource() {
101     this.closeModal();
102     this.router.navigate([`${JOINAUTH_URL}/${URLVerbs.CREATE}`]);
103   }
104
105   removeJoinSource(index: number) {
106     const join_sources = this.domainSettingsForm.get('join_sources') as FormArray;
107
108     if (index >= 0 && index < join_sources.length) {
109       join_sources.removeAt(index);
110     }
111
112     this.cd.detectChanges();
113   }
114 }