Skip to content

Commit e9dd12a

Browse files
committed
[us40] Show tooltip when the category are automatically set by rules
1 parent 94977a4 commit e9dd12a

5 files changed

+47
-19
lines changed

src/app/app.module.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {MatSnackBarModule} from "@angular/material/snack-bar";
3737
import {UserRootComponent} from './user-root/user-root.component';
3838
import {routeReuseStrategyProvider} from "./route-strategy.service";
3939
import {AceEditorComponent} from "./ace-editor/ace-editor.component";
40+
import {MatTooltipModule} from "@angular/material/tooltip";
4041

4142
@NgModule({
4243
declarations: [
@@ -77,7 +78,8 @@ import {AceEditorComponent} from "./ace-editor/ace-editor.component";
7778
MatChipsModule,
7879
MatSortModule,
7980
MatExpansionModule,
80-
MatSnackBarModule
81+
MatSnackBarModule,
82+
MatTooltipModule
8183
],
8284
providers: [
8385
httpInterceptorProviders,

src/app/file-list/file-list.component.html

+3-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
<th *matHeaderCellDef mat-header-cell> Category</th>
6060
<td *matCellDef="let element" mat-cell>
6161
<mat-chip-listbox [multiple]="true">
62+
<mat-icon *ngIf="hasMatchingRule(element)" [matTooltip]="getAssignCategoryTooltip(element)">calculate
63+
</mat-icon>
6264
<mat-chip-option (selectionChange)="filterByCategory(cat, $event.selected)" *ngFor="let cat of getCategories(element)"
6365
[selected]="isCategorySelected(cat)">{{cat.name}}</mat-chip-option>
6466
</mat-chip-listbox>
@@ -80,7 +82,7 @@
8082
<span>Download</span>
8183
</a>
8284
<button (click)="setCategory(element)" [disabled]="hasMatchingRule(element)" class="set-category-file"
83-
mat-menu-item>
85+
[matTooltip]="getAssignCategoryTooltip(element)" mat-menu-item>
8486
<mat-icon>category</mat-icon>
8587
<span>Set category</span>
8688
</button>

src/app/file-list/file-list.component.spec.ts

+29-17
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import {BreakpointObserver} from "@angular/cdk/layout";
3838
import {FilesCacheService} from "../files-cache/files-cache.service";
3939
import {mockFilesCacheService} from "../files-cache/files-cache.service.spec";
4040
import {RuleService} from "../rules/rule.service";
41+
import {MatTooltipModule} from "@angular/material/tooltip";
42+
import {MatTooltipHarness} from "@angular/material/tooltip/testing";
4143

4244
function mockRenderAndWaitForChanges() {
4345
let fixture = MockRender(FileListComponent, null, {reset: true});
@@ -62,6 +64,7 @@ describe('FileListComponent', () => {
6264
.keep(MatChipsModule)
6365
.keep(MatSortModule)
6466
.keep(BreakpointObserver)
67+
.keep(MatTooltipModule)
6568
.provide({
6669
provide: FilesCacheService,
6770
useValue: mock<FilesCacheService>()
@@ -526,23 +529,29 @@ describe('FileListComponent', () => {
526529

527530
it('should prevent category assignment when the file categories were automatically assigned', fakeAsync(async () => {
528531
// Arrange
529-
let file = mockFileElement('name');
530-
mockFilesCacheService([file], true);
532+
let folder = mockFolderElement('Auto');
533+
let file = mockFileElement('name', folder.id);
534+
mockFilesCacheService([file, folder], true);
531535

532536
let ruleService = ngMocks.get(RuleService);
533537
let fileToMatchingRuleMap = new Map();
534-
fileToMatchingRuleMap.set(file.id, "existing rule");
538+
fileToMatchingRuleMap.set(file.id, "Existing Rule");
535539
when(() => ruleService.getFileToMatchingRuleMap()).thenResolve(fileToMatchingRuleMap);
536540

537541
let fixture = mockRenderAndWaitForChanges();
538542
let page = new Page(fixture);
539543

540544
// Act
541545
Page.openItemMenu('name');
542-
let isMenuDisabled = await page.isMenuAssignCategoryDisabled();
543546

544547
// Assert
548+
fixture.detectChanges();
549+
flush();
550+
let isMenuDisabled = await page.isMenuAssignCategoryDisabled();
545551
expect(isMenuDisabled).toBeTruthy();
552+
let tooltip = await page.getMenuAssignCategoryTooltip();
553+
expect(tooltip).toEqual('Automatically assigned by rule "Existing Rule"');
554+
expect(Page.getTableRows()).toEqual([['name', 'calculateAuto', 'Jan 1, 2000, 12:00:00 AM', '0 B', 'more_vert']]);
546555
}))
547556
})
548557

@@ -878,15 +887,25 @@ class Page {
878887
}
879888

880889
async clickMenuTrash() {
881-
await this.clickMenu('.trash-file');
890+
let matMenuItemHarness = await this.getMenu('.trash-file');
891+
await matMenuItemHarness.click();
882892
}
883893

884894
async clickMenuAssignCategory() {
885-
await this.clickMenu('.set-category-file');
895+
let matMenuItemHarness = await this.getMenu('.set-category-file');
896+
await matMenuItemHarness.click();
897+
}
898+
899+
async isMenuAssignCategoryDisabled() {
900+
let matMenuItemHarness = await this.getMenu('.set-category-file');
901+
return matMenuItemHarness.isDisabled();
886902
}
887903

888-
isMenuAssignCategoryDisabled() {
889-
return this.isMenuDisabled('.set-category-file');
904+
async getMenuAssignCategoryTooltip() {
905+
// There is only one toolTip in our tests, so we can simplify this method
906+
let matTooltipHarness = await this.loader.getHarness(MatTooltipHarness);
907+
await matTooltipHarness.show();
908+
return matTooltipHarness.getTooltipText();
890909
}
891910

892911
async setCategoryInDialog(category: string) {
@@ -962,22 +981,15 @@ class Page {
962981
return this.fixture.debugElement.parent?.query(By.directive(SelectFileCategoryDialog)).componentInstance as SelectFileCategoryDialog;
963982
}
964983

965-
private async clickMenu(selector: string) {
966-
let matMenuHarnesses = await this.loader.getAllHarnesses(MatMenuHarness);
967-
// The menu should be the one opened
968-
let matMenuHarness = await findAsyncSequential(matMenuHarnesses, value => value.isOpen());
969-
await matMenuHarness?.clickItem({selector: selector});
970-
}
971-
972-
private async isMenuDisabled(selector: string) {
984+
private async getMenu(selector: string) {
973985
let matMenuHarnesses = await this.loader.getAllHarnesses(MatMenuHarness);
974986
// The menu should be the one opened
975987
let matMenuHarness = await findAsyncSequential(matMenuHarnesses, value => value.isOpen());
976988
if (!matMenuHarness) {
977989
throw new Error("No menu for selector: " + selector);
978990
}
979991
let menuItems = await matMenuHarness.getItems({selector: selector});
980-
return menuItems[0].isDisabled();
992+
return menuItems[0];
981993
}
982994

983995
}

src/app/file-list/file-list.component.ts

+8
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,14 @@ export class FileListComponent implements OnInit {
257257
hasMatchingRule(file: FileElement) {
258258
return this.fileToMatchingRuleMap.has(file.id);
259259
}
260+
261+
getAssignCategoryTooltip(file: FileElement) {
262+
let matchingRule = this.fileToMatchingRuleMap.get(file.id);
263+
if (matchingRule) {
264+
return 'Automatically assigned by rule "' + matchingRule + '"'
265+
}
266+
return "";
267+
}
260268
}
261269

262270
@Component({

src/styles.scss

+4
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22

33
html, body { height: 100%; }
44
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }
5+
6+
mat-chip-listbox > div {
7+
align-items: center;
8+
}

0 commit comments

Comments
 (0)