thingsboard/ui-ngx/src/app/modules/home/components/vc/auto-commit-settings.component.ts

218 lines
8.3 KiB
TypeScript
Raw Normal View History

2022-05-31 18:42:33 +03:00
///
/// Copyright © 2016-2022 The Thingsboard Authors
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
import { Component, OnInit } from '@angular/core';
import { PageComponent } from '@shared/components/page.component';
import { AbstractControl, FormArray, FormBuilder, FormGroup, FormGroupDirective, Validators } from '@angular/forms';
import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
import { AdminService } from '@core/http/admin.service';
import { AutoCommitSettings, AutoVersionCreateConfig } from '@shared/models/settings.models';
import { TranslateService } from '@ngx-translate/core';
import { DialogService } from '@core/services/dialog.service';
import { catchError, map, mergeMap } from 'rxjs/operators';
import { Observable, of } from 'rxjs';
2022-05-31 18:42:33 +03:00
import { EntityTypeVersionCreateConfig, exportableEntityTypes } from '@shared/models/vc.models';
import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Component({
selector: 'tb-auto-commit-settings',
templateUrl: './auto-commit-settings.component.html',
styleUrls: ['./auto-commit-settings.component.scss', './../../pages/admin/settings-card.scss']
})
export class AutoCommitSettingsComponent extends PageComponent implements OnInit {
autoCommitSettingsForm: FormGroup;
settings: AutoCommitSettings = null;
2022-06-02 12:32:10 +03:00
entityTypes = EntityType;
isReadOnly: Observable<boolean>;
2022-05-31 18:42:33 +03:00
constructor(protected store: Store<AppState>,
private adminService: AdminService,
private dialogService: DialogService,
private sanitizer: DomSanitizer,
private translate: TranslateService,
public fb: FormBuilder) {
super(store);
}
ngOnInit() {
this.autoCommitSettingsForm = this.fb.group({
entityTypes: this.fb.array([], [])
});
this.adminService.autoCommitSettingsExists().pipe(
catchError(() => of(false)),
mergeMap((hasAutoCommitSettings) => {
if (hasAutoCommitSettings) {
return this.adminService.getAutoCommitSettings({ignoreErrors: true}).pipe(
catchError(() => of(null))
);
} else {
return of(null);
}
})
).subscribe(
(settings) => {
this.settings = settings;
this.autoCommitSettingsForm.setControl('entityTypes',
this.prepareEntityTypesFormArray(settings), {emitEvent: false});
});
this.isReadOnly = this.adminService.getRepositorySettingsInfo().pipe(map(settings => settings.readOnly));
2022-05-31 18:42:33 +03:00
}
entityTypesFormGroupArray(): FormGroup[] {
return (this.autoCommitSettingsForm.get('entityTypes') as FormArray).controls as FormGroup[];
}
entityTypesFormGroupExpanded(entityTypeControl: AbstractControl): boolean {
return !!(entityTypeControl as any).expanded;
}
public trackByEntityType(index: number, entityTypeControl: AbstractControl): any {
return entityTypeControl;
}
public removeEntityType(index: number) {
(this.autoCommitSettingsForm.get('entityTypes') as FormArray).removeAt(index);
this.autoCommitSettingsForm.markAsDirty();
}
public addEnabled(): boolean {
const entityTypesArray = this.autoCommitSettingsForm.get('entityTypes') as FormArray;
return entityTypesArray.length < exportableEntityTypes.length;
}
public addEntityType() {
const entityTypesArray = this.autoCommitSettingsForm.get('entityTypes') as FormArray;
const config: AutoVersionCreateConfig = {
branch: null,
2022-06-01 16:35:20 +03:00
saveAttributes: true,
2022-06-02 12:32:10 +03:00
saveRelations: false,
saveCredentials: true
2022-05-31 18:42:33 +03:00
};
const allowed = this.allowedEntityTypes();
let entityType: EntityType = null;
if (allowed.length) {
entityType = allowed[0];
}
const entityTypeControl = this.createEntityTypeControl(entityType, config);
(entityTypeControl as any).expanded = true;
entityTypesArray.push(entityTypeControl);
this.autoCommitSettingsForm.updateValueAndValidity();
this.autoCommitSettingsForm.markAsDirty();
}
public removeAll() {
const entityTypesArray = this.autoCommitSettingsForm.get('entityTypes') as FormArray;
entityTypesArray.clear();
this.autoCommitSettingsForm.updateValueAndValidity();
this.autoCommitSettingsForm.markAsDirty();
}
entityTypeText(entityTypeControl: AbstractControl): SafeHtml {
const entityType: EntityType = entityTypeControl.get('entityType').value;
const config: AutoVersionCreateConfig = entityTypeControl.get('config').value;
let message = entityType ? this.translate.instant(entityTypeTranslations.get(entityType).typePlural) : 'Undefined';
let branchName;
if (config.branch) {
branchName = config.branch;
} else {
branchName = this.translate.instant('version-control.default');
}
message += ` (<small>${this.translate.instant('version-control.auto-commit-to-branch', {branch: branchName})}</small>)`;
return this.sanitizer.bypassSecurityTrustHtml(message);
}
allowedEntityTypes(entityTypeControl?: AbstractControl): Array<EntityType> {
let res = [...exportableEntityTypes];
const currentEntityType: EntityType = entityTypeControl?.get('entityType')?.value;
const value: [{entityType: string, config: EntityTypeVersionCreateConfig}] =
this.autoCommitSettingsForm.get('entityTypes').value || [];
const usedEntityTypes = value.map(val => val.entityType).filter(val => val);
res = res.filter(entityType => !usedEntityTypes.includes(entityType) || entityType === currentEntityType);
return res;
}
save(): void {
const value: [{entityType: string, config: AutoVersionCreateConfig}] =
this.autoCommitSettingsForm.get('entityTypes').value || [];
const settings: AutoCommitSettings = {};
if (value && value.length) {
value.forEach((val) => {
settings[val.entityType] = val.config;
});
}
this.adminService.saveAutoCommitSettings(settings).subscribe(
(savedSettings) => {
this.settings = savedSettings;
this.autoCommitSettingsForm.setControl('entityTypes',
this.prepareEntityTypesFormArray(savedSettings), {emitEvent: false});
this.autoCommitSettingsForm.markAsPristine();
}
);
}
delete(formDirective: FormGroupDirective): void {
this.dialogService.confirm(
this.translate.instant('admin.delete-auto-commit-settings-title', ),
this.translate.instant('admin.delete-auto-commit-settings-text'), null,
this.translate.instant('action.delete')
).subscribe((data) => {
if (data) {
this.adminService.deleteAutoCommitSettings().subscribe(
() => {
this.settings = null;
this.autoCommitSettingsForm.setControl('entityTypes',
this.prepareEntityTypesFormArray(this.settings), {emitEvent: false});
this.autoCommitSettingsForm.markAsPristine();
}
);
}
});
}
private prepareEntityTypesFormArray(settings: AutoCommitSettings | null): FormArray {
const entityTypesControls: Array<AbstractControl> = [];
if (settings) {
for (const entityType of Object.keys(settings)) {
const config = settings[entityType];
entityTypesControls.push(this.createEntityTypeControl(entityType as EntityType, config));
}
}
return this.fb.array(entityTypesControls);
}
private createEntityTypeControl(entityType: EntityType, config: AutoVersionCreateConfig): AbstractControl {
const entityTypeControl = this.fb.group(
{
entityType: [entityType, [Validators.required]],
config: this.fb.group({
branch: [config.branch, []],
saveRelations: [config.saveRelations, []],
2022-06-02 12:32:10 +03:00
saveAttributes: [config.saveAttributes, []],
saveCredentials: [config.saveCredentials, []]
2022-05-31 18:42:33 +03:00
})
}
);
return entityTypeControl;
}
}