[ACS-5226] Make Categories & Tags View Details Edit consistent (#8826)

* [ACS-5226] hide & clear tags input

* [ACS-5226] added unit test for reseting properties
This commit is contained in:
Mykyta Maliarchuk 2023-08-17 17:54:24 +02:00 committed by GitHub
parent f8d587bc2e
commit 3e56b9a4cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 9 deletions

View File

@ -187,7 +187,8 @@ describe('CategoriesManagementComponent', () => {
expect(categoryControlLabel.textContent.trim()).toBe('CATEGORIES_MANAGEMENT.NAME'); expect(categoryControlLabel.textContent.trim()).toBe('CATEGORIES_MANAGEMENT.NAME');
}); });
it('should hide category control and existing categories panel on clicking hide button', () => { it('should hide and clear category control and existing categories panel on clicking hide button', fakeAsync(() => {
typeCategory('test');
const categoryControlHideBtn: HTMLButtonElement = fixture.debugElement.query(By.css('.adf-category-name-field button')).nativeElement; const categoryControlHideBtn: HTMLButtonElement = fixture.debugElement.query(By.css('.adf-category-name-field button')).nativeElement;
const controlVisibilityChangeSpy = spyOn(component.categoryNameControlVisibleChange, 'emit').and.callThrough(); const controlVisibilityChangeSpy = spyOn(component.categoryNameControlVisibleChange, 'emit').and.callThrough();
categoryControlHideBtn.click(); categoryControlHideBtn.click();
@ -198,7 +199,12 @@ describe('CategoriesManagementComponent', () => {
expect(component.categoryNameControlVisible).toBeFalse(); expect(component.categoryNameControlVisible).toBeFalse();
expect(component.existingCategoriesPanelVisible).toBeFalse(); expect(component.existingCategoriesPanelVisible).toBeFalse();
expect(controlVisibilityChangeSpy).toHaveBeenCalledOnceWith(false); expect(controlVisibilityChangeSpy).toHaveBeenCalledOnceWith(false);
});
component.categoryNameControlVisible = true;
fixture.detectChanges();
tick(100);
expect(getCategoryControlInput().value).toBe('');
}));
}); });
describe('Spinner', () => { describe('Spinner', () => {

View File

@ -89,6 +89,7 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
this._existingCategoriesPanelVisible = true; this._existingCategoriesPanelVisible = true;
} else { } else {
this._existingCategoriesPanelVisible = false; this._existingCategoriesPanelVisible = false;
this.clearCategoryNameInput();
} }
} }
@ -211,6 +212,7 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
this.categoryNameControlVisible = false; this.categoryNameControlVisible = false;
this.categoryNameControlVisibleChange.emit(false); this.categoryNameControlVisibleChange.emit(false);
this._existingCategoriesPanelVisible = false; this._existingCategoriesPanelVisible = false;
this.clearCategoryNameInput();
} }
/** /**
@ -222,8 +224,7 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
const newCat = new Category({ id: newCatName, name: newCatName }); const newCat = new Category({ id: newCatName, name: newCatName });
this.categories.push(newCat); this.categories.push(newCat);
this.hideNameInput(); this.hideNameInput();
this.categoryNameControl.setValue(''); this.clearCategoryNameInput();
this.categoryNameControl.markAsUntouched();
this._existingCategories = null; this._existingCategories = null;
this.categoriesChange.emit(this.categories); this.categoriesChange.emit(this.categories);
} }
@ -336,4 +337,9 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
private sortCategoriesList(categoriesList: Category[]) { private sortCategoriesList(categoriesList: Category[]) {
categoriesList.sort((category1, category2) => category1.name.localeCompare(category2.name)); categoriesList.sort((category1, category2) => category1.name.localeCompare(category2.name));
} }
private clearCategoryNameInput() {
this.categoryNameControl.setValue('');
this.categoryNameControl.markAsUntouched();
}
} }

View File

@ -388,9 +388,11 @@ describe('ContentMetadataComponent', () => {
}); });
describe('Reseting', () => { describe('Reseting', () => {
it('should reset changedProperties on reset click', async () => { it('should reset properties on reset click', async () => {
component.changedProperties = { properties: { 'property-key': 'updated-value' } }; component.changedProperties = { properties: { 'property-key': 'updated-value' } };
component.hasMetadataChanged = true; component.hasMetadataChanged = true;
component.tagNameControlVisible = true;
component.categoryControlVisible = true;
component.editable = true; component.editable = true;
const expectedNode = Object.assign({}, node, { name: 'some-modified-value' }); const expectedNode = Object.assign({}, node, { name: 'some-modified-value' });
spyOn(nodesApiService, 'updateNode').and.returnValue(of(expectedNode)); spyOn(nodesApiService, 'updateNode').and.returnValue(of(expectedNode));
@ -403,6 +405,9 @@ describe('ContentMetadataComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
expect(component.changedProperties).toEqual({}); expect(component.changedProperties).toEqual({});
expect(nodesApiService.updateNode).not.toHaveBeenCalled(); expect(nodesApiService.updateNode).not.toHaveBeenCalled();
expect(component.hasMetadataChanged).toBeFalse();
expect(component.tagNameControlVisible).toBeFalse();
expect(component.categoryControlVisible).toBeFalse();
}); });
}); });

View File

@ -267,6 +267,8 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
revertChanges() { revertChanges() {
this.changedProperties = {}; this.changedProperties = {};
this.hasMetadataChanged = false; this.hasMetadataChanged = false;
this.tagNameControlVisible = false;
this.categoryControlVisible = false;
} }
cancelChanges() { cancelChanges() {

View File

@ -211,7 +211,6 @@ describe('TagsCreatorComponent', () => {
expect(getAddedTags().length).toBe(0); expect(getAddedTags().length).toBe(0);
})); }));
it('should remove specific tag after clicking at remove icon', fakeAsync(() => { it('should remove specific tag after clicking at remove icon', fakeAsync(() => {
const tag1 = 'Tag 1'; const tag1 = 'Tag 1';
const tag2 = 'Tag 2'; const tag2 = 'Tag 2';
@ -266,8 +265,9 @@ describe('TagsCreatorComponent', () => {
expect(tagNameField.query(By.directive(MatFormField))).toBeTruthy(); expect(tagNameField.query(By.directive(MatFormField))).toBeTruthy();
}); });
it('should be hidden after clicking button for hiding input', fakeAsync(() => { it('should be hidden and cleared after clicking button for hiding input', fakeAsync(() => {
component.tagNameControlVisible = true; component.tagNameControlVisible = true;
typeTag('test');
fixture.detectChanges(); fixture.detectChanges();
tick(100); tick(100);
@ -275,6 +275,12 @@ describe('TagsCreatorComponent', () => {
const tagNameField = fixture.debugElement.query(By.css(tagNameFieldSelector)); const tagNameField = fixture.debugElement.query(By.css(tagNameFieldSelector));
expect(tagNameField).toBeFalsy(); expect(tagNameField).toBeFalsy();
component.tagNameControlVisible = true;
fixture.detectChanges();
tick(100);
expect(getNameInput().value).toBe('');
})); }));
it('should input be autofocused', fakeAsync(() => { it('should input be autofocused', fakeAsync(() => {
@ -297,6 +303,25 @@ describe('TagsCreatorComponent', () => {
expect(getNameInput()).toBe(document.activeElement as HTMLInputElement); expect(getNameInput()).toBe(document.activeElement as HTMLInputElement);
})); }));
it('should be hidden and cleared on discard changes', fakeAsync(() => {
component.tagNameControlVisible = true;
component.tags = ['Passed tag 1', 'Passed tag 2'];
typeTag('test');
fixture.detectChanges();
tick(100);
expect(getNameInput().value).toBe('test');
component.tagNameControlVisible = false;
fixture.detectChanges();
tick(100);
expect(getNameInput()).toBeFalsy();
component.tagNameControlVisible = true;
fixture.detectChanges();
tick(100);
expect(getNameInput().value).toBe('');
}));
describe('Errors', () => { describe('Errors', () => {
function getFirstError(): string { function getFirstError(): string {
const error = fixture.debugElement.query(By.directive(MatError)); const error = fixture.debugElement.query(By.directive(MatError));

View File

@ -108,6 +108,7 @@ export class TagsCreatorComponent implements OnInit, OnDestroy {
}); });
} else { } else {
this._existingTagsPanelVisible = false; this._existingTagsPanelVisible = false;
this.clearTagNameInput();
} }
this.existingTagsPanelVisibilityChange.emit(this.existingTagsPanelVisible); this.existingTagsPanelVisibilityChange.emit(this.existingTagsPanelVisible);
} }
@ -250,6 +251,7 @@ export class TagsCreatorComponent implements OnInit, OnDestroy {
this._existingTagsPanelVisible = false; this._existingTagsPanelVisible = false;
this.existingTagsPanelVisibilityChange.emit(this.existingTagsPanelVisible); this.existingTagsPanelVisibilityChange.emit(this.existingTagsPanelVisible);
this.tagNameControlVisibleChange.emit(this.tagNameControlVisible); this.tagNameControlVisibleChange.emit(this.tagNameControlVisible);
this.clearTagNameInput();
} }
/** /**
@ -260,9 +262,8 @@ export class TagsCreatorComponent implements OnInit, OnDestroy {
if (!this._typing && !this.tagNameControl.invalid) { if (!this._typing && !this.tagNameControl.invalid) {
this.tags.push(this.tagNameControl.value.trim()); this.tags.push(this.tagNameControl.value.trim());
this.hideNameInput(); this.hideNameInput();
this.tagNameControl.setValue(''); this.clearTagNameInput();
this.checkScrollbarVisibility(); this.checkScrollbarVisibility();
this.tagNameControl.markAsUntouched();
this.tagsChange.emit(this.tags); this.tagsChange.emit(this.tags);
} }
} }
@ -425,4 +426,9 @@ export class TagsCreatorComponent implements OnInit, OnDestroy {
private excludeAlreadyAddedTags(tags: TagEntry[]) { private excludeAlreadyAddedTags(tags: TagEntry[]) {
this._existingTags = tags.filter((tag) => !this.tags.includes(tag.entry.tag)); this._existingTags = tags.filter((tag) => !this.tags.includes(tag.entry.tag));
} }
private clearTagNameInput() {
this.tagNameControl.setValue('');
this.tagNameControl.markAsUntouched();
}
} }