Merge pull request #8263 from vvlladd28/engix-ltd-duplicate_filter

Fixed and resolve conflict: Add dashboard filter duplication option
This commit is contained in:
Igor Kulikov 2023-03-28 19:47:19 +03:00 committed by GitHub
commit 9dcc2cec59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 0 deletions

View File

@ -64,6 +64,15 @@
matTooltipPosition="above">
<mat-icon>edit</mat-icon>
</button>
<button [disabled]="isLoading$ | async"
mat-icon-button color="primary"
style="min-width: 48px;"
type="button"
(click)="duplicateFilter($index)"
matTooltip="{{ 'filter.duplicate-filter' | translate }}"
matTooltipPosition="above">
<mat-icon>content_copy</mat-icon>
</button>
<button [disabled]="isLoading$ | async"
mat-icon-button color="primary"
style="min-width: 40px;"

View File

@ -64,6 +64,8 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
filterToWidgetsMap: {[filterId: string]: Array<string>} = {};
filterNames: Set<string> = new Set<string>();
filtersFormGroup: UntypedFormGroup;
submitted = false;
@ -112,6 +114,7 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
if (isUndefined(filter.editable)) {
filter.editable = true;
}
this.filterNames.add(filter.filter);
filterControls.push(this.createFilterFormControl(filterId, filter));
}
@ -158,10 +161,37 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
message, this.translate.instant('action.close'), true);
} else {
(this.filtersFormGroup.get('filters') as UntypedFormArray).removeAt(index);
this.filterNames.delete(filter.filter);
this.filtersFormGroup.markAsDirty();
}
}
private getNextDuplicatedName(filterName: string): string {
const suffix = ` - ${this.translate.instant('action.copy')} `;
let counter = 0;
while (++counter < Number.MAX_SAFE_INTEGER) {
const newName = `${filterName}${suffix}${counter}`;
if (!this.filterNames.has(newName)) {
return newName;
}
}
return null;
}
duplicateFilter(index: number) {
const originalFilter = (this.filtersFormGroup.get('filters').value as any[])[index];
const newFilterName = this.getNextDuplicatedName(originalFilter.filter);
if (newFilterName) {
const duplicatedFilter = deepClone(originalFilter);
duplicatedFilter.id = this.utils.guid();
duplicatedFilter.filter = newFilterName;
(this.filtersFormGroup.get('filters') as UntypedFormArray).
insert(index + 1, this.createFilterFormControl(duplicatedFilter.id, duplicatedFilter));
this.filterNames.add(duplicatedFilter.filter);
}
}
public addFilter() {
this.openFilterDialog(-1);
}
@ -176,6 +206,7 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
const filtersArray = this.filtersFormGroup.get('filters').value as any[];
if (!isAdd) {
filter = filtersArray[index];
this.filterNames.delete(filter.filter);
}
this.dialog.open<FilterDialogComponent, FilterDialogData,
Filter>(FilterDialogComponent, {
@ -197,6 +228,7 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
filterFormControl.get('editable').patchValue(result.editable);
filterFormControl.get('keyFilters').patchValue(result.keyFilters);
}
this.filterNames.add(result.filter);
this.filtersFormGroup.markAsDirty();
}
});

View File

@ -2385,6 +2385,7 @@
"ignore-case": "ignore case",
"value": "Value",
"remove-filter": "Remove filter",
"duplicate-filter": "Duplicate filter",
"preview": "Filter preview",
"no-filters": "No filters configured",
"add-filter": "Add filter",