Add filter duplication option.

This commit is contained in:
devaskim 2022-11-15 21:56:59 +05:00
parent 9c5de9b7fc
commit d01201acf3
3 changed files with 43 additions and 1 deletions

View File

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

View File

@ -36,7 +36,7 @@ import { UtilsService } from '@core/services/utils.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { ActionNotificationShow } from '@core/notification/notification.actions'; import { ActionNotificationShow } from '@core/notification/notification.actions';
import { DialogService } from '@core/services/dialog.service'; import { DialogService } from '@core/services/dialog.service';
import { deepClone, isUndefined } from '@core/utils'; import { deepClone, isNumber, isUndefined } from '@core/utils';
import { Filter, Filters, KeyFilterInfo } from '@shared/models/query/query.models'; import { Filter, Filters, KeyFilterInfo } from '@shared/models/query/query.models';
import { FilterDialogComponent, FilterDialogData } from '@home/components/filter/filter-dialog.component'; import { FilterDialogComponent, FilterDialogData } from '@home/components/filter/filter-dialog.component';
@ -64,6 +64,8 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
filterToWidgetsMap: {[filterId: string]: Array<string>} = {}; filterToWidgetsMap: {[filterId: string]: Array<string>} = {};
filterNames: Set<string> = new Set<string>();
filtersFormGroup: FormGroup; filtersFormGroup: FormGroup;
submitted = false; submitted = false;
@ -112,6 +114,7 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
if (isUndefined(filter.editable)) { if (isUndefined(filter.editable)) {
filter.editable = true; filter.editable = true;
} }
this.filterNames.add(filter.filter);
filterControls.push(this.createFilterFormControl(filterId, filter)); filterControls.push(this.createFilterFormControl(filterId, filter));
} }
@ -158,10 +161,37 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
message, this.translate.instant('action.close'), true); message, this.translate.instant('action.close'), true);
} else { } else {
(this.filtersFormGroup.get('filters') as FormArray).removeAt(index); (this.filtersFormGroup.get('filters') as FormArray).removeAt(index);
this.filterNames.delete(filter.filter);
this.filtersFormGroup.markAsDirty(); this.filtersFormGroup.markAsDirty();
} }
} }
private getNextDuplicatedName(filterName: string): string {
const suffix = ' - 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 FormArray).
insert(index + 1, this.createFilterFormControl(duplicatedFilter.id, duplicatedFilter));
this.filterNames.add(duplicatedFilter.filter);
}
}
public addFilter() { public addFilter() {
this.openFilterDialog(-1); this.openFilterDialog(-1);
} }
@ -176,6 +206,7 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
const filtersArray = this.filtersFormGroup.get('filters').value as any[]; const filtersArray = this.filtersFormGroup.get('filters').value as any[];
if (!isAdd) { if (!isAdd) {
filter = filtersArray[index]; filter = filtersArray[index];
this.filterNames.delete(filter.filter);
} }
this.dialog.open<FilterDialogComponent, FilterDialogData, this.dialog.open<FilterDialogComponent, FilterDialogData,
Filter>(FilterDialogComponent, { Filter>(FilterDialogComponent, {
@ -197,6 +228,7 @@ export class FiltersDialogComponent extends DialogComponent<FiltersDialogCompone
filterFormControl.get('editable').patchValue(result.editable); filterFormControl.get('editable').patchValue(result.editable);
filterFormControl.get('keyFilters').patchValue(result.keyFilters); filterFormControl.get('keyFilters').patchValue(result.keyFilters);
} }
this.filterNames.add(result.filter);
this.filtersFormGroup.markAsDirty(); this.filtersFormGroup.markAsDirty();
} }
}); });

View File

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