Add filter duplication option.
This commit is contained in:
parent
9c5de9b7fc
commit
d01201acf3
@ -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;"
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user