Revert "ACS-8106: (a11y) Replace Material Tooltip with standard tooltip (#9894)" (#9905)

This reverts commit f3a94bdfa44108082089ed21f79e3a466359344b.
This commit is contained in:
Pablo Martinez 2024-07-03 14:08:21 +02:00 committed by GitHub
parent e457dd3a78
commit 41c3667906
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
96 changed files with 561 additions and 254 deletions

View File

@ -12,7 +12,7 @@
<adf-search-filter-chips></adf-search-filter-chips> <adf-search-filter-chips></adf-search-filter-chips>
</div> </div>
<mat-icon adf-reset-search title="reset" style="padding-right: 5px;">refresh</mat-icon> <mat-icon adf-reset-search matTooltip="reset" style="padding-right: 5px;">refresh</mat-icon>
<adf-search-sorting-picker style="width: 240px"></adf-search-sorting-picker> <adf-search-sorting-picker style="width: 240px"></adf-search-sorting-picker>
</div> </div>

View File

@ -16,3 +16,4 @@
*/ */
export * from './error.component'; export * from './error.component';
export * from './validation.component';

View File

@ -16,7 +16,10 @@
*/ */
export const materialLocators = { export const materialLocators = {
Error: { Error: {
root: 'mat-error' root: 'mat-error'
} },
Tooltip: {
root: 'mat-tooltip-component'
}
}; };

View File

@ -0,0 +1,29 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Page } from '@playwright/test';
import { BaseComponent } from '../base.component';
import { materialLocators } from './material-locators';
export class TooltipComponent extends BaseComponent {
private static rootElement = materialLocators.Tooltip.root;
public content = this.getChild('div');
constructor(page: Page) {
super(page, TooltipComponent.rootElement);
}
}

View File

@ -17,11 +17,13 @@
import { Page } from '@playwright/test'; import { Page } from '@playwright/test';
import { BaseComponent } from '../../page-object/components/base.component'; import { BaseComponent } from '../../page-object/components/base.component';
import { ErrorComponent } from '../../page-object/components'; import { ErrorComponent, TooltipComponent, ListboxComponent } from '../../page-object/components';
export class GroupComponent extends BaseComponent { export class GroupComponent extends BaseComponent {
private static rootElement = 'adf-cloud-group'; private static rootElement = 'adf-cloud-group';
public error = new ErrorComponent(this.page); public error = new ErrorComponent(this.page);
public tooltip = new TooltipComponent(this.page);
public listbox = new ListboxComponent(this.page);
public groupNaming = this.getChild('[data-automation-id="adf-cloud-group-chip-list"]'); public groupNaming = this.getChild('[data-automation-id="adf-cloud-group-chip-list"]');
public groupInput = this.getChild('[data-automation-id="adf-group-cloud-search-input"]'); public groupInput = this.getChild('[data-automation-id="adf-group-cloud-search-input"]');
@ -31,4 +33,5 @@ export class GroupComponent extends BaseComponent {
} }
public getUserLocator = (userName: string) => this.getChild(`[data-automation-id="adf-cloud-group-chip-${userName}"]`); public getUserLocator = (userName: string) => this.getChild(`[data-automation-id="adf-cloud-group-chip-${userName}"]`);
} }

View File

@ -17,11 +17,12 @@
import { Page } from '@playwright/test'; import { Page } from '@playwright/test';
import { BaseComponent } from '../../page-object/components/base.component'; import { BaseComponent } from '../../page-object/components/base.component';
import { ErrorComponent, ListboxComponent } from '../../page-object/components'; import { ErrorComponent, TooltipComponent, ListboxComponent } from '../../page-object/components';
export class PeopleComponent extends BaseComponent { export class PeopleComponent extends BaseComponent {
private static rootElement = 'adf-cloud-people'; private static rootElement = 'adf-cloud-people';
public error = new ErrorComponent(this.page); public error = new ErrorComponent(this.page);
public tooltip = new TooltipComponent(this.page);
public listbox = new ListboxComponent(this.page); public listbox = new ListboxComponent(this.page);
public usersNaming = this.getChild('[data-automation-id="adf-cloud-people-chip-list"]'); public usersNaming = this.getChild('[data-automation-id="adf-cloud-people-chip-list"]');
@ -32,4 +33,5 @@ export class PeopleComponent extends BaseComponent {
} }
public getUserLocator = (userName: string) => this.getChild(`[data-automation-id="adf-people-cloud-chip-${userName}"]`); public getUserLocator = (userName: string) => this.getChild(`[data-automation-id="adf-people-cloud-chip-${userName}"]`);
} }

View File

@ -39,6 +39,9 @@ test.describe('Groups component stories tests', () => {
await processServicesCloud.navigateTo({ moduleNames: ['group-cloud'], componentName: 'group-cloud', story: 'mandatory-preselected-groups' }); await processServicesCloud.navigateTo({ moduleNames: ['group-cloud'], componentName: 'group-cloud', story: 'mandatory-preselected-groups' });
await expect.soft(groupComponent.groupNaming).toContainText(expectedUsersName); await expect.soft(groupComponent.groupNaming).toContainText(expectedUsersName);
await groupComponent.getUserLocator('Meat Chicken').hover();
await expect(groupComponent.tooltip.content).toContainText('Mandatory');
}); });
test('Invalid Preselected Groups', async ({ processServicesCloud, groupComponent }) => { test('Invalid Preselected Groups', async ({ processServicesCloud, groupComponent }) => {
@ -49,4 +52,5 @@ test.describe('Groups component stories tests', () => {
await expect(groupComponent.error.content).toContainText(expectedWarningIcon + expectedWarningMessage); await expect(groupComponent.error.content).toContainText(expectedWarningIcon + expectedWarningMessage);
}); });
}); });

View File

@ -42,6 +42,7 @@ test.describe('People component stories tests', () => {
await peopleComponent.getUserLocator('Kielbasa Sausage').hover(); await peopleComponent.getUserLocator('Kielbasa Sausage').hover();
await expect.soft(peopleComponent.usersNaming).toContainText(expectedUsersName); await expect.soft(peopleComponent.usersNaming).toContainText(expectedUsersName);
await expect(peopleComponent.tooltip.content).toContainText('Mandatory');
}); });
test('Invalid Preselected Users', async ({ processServicesCloud, peopleComponent }) => { test('Invalid Preselected Users', async ({ processServicesCloud, peopleComponent }) => {

View File

@ -16,7 +16,7 @@
<mat-panel-description <mat-panel-description
class="adf-accordion-aspect-list-expansion-panel-header-description" class="adf-accordion-aspect-list-expansion-panel-header-description"
[id]="'aspect-list-'+colIndex+'-title'" [id]="'aspect-list-'+colIndex+'-title'"
[title]="getTitle(aspect)"> [matTooltip]="getTitle(aspect)">
{{getTitle(aspect)}} {{getTitle(aspect)}}
</mat-panel-description> </mat-panel-description>
</mat-expansion-panel-header> </mat-expansion-panel-header>

View File

@ -26,6 +26,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { AspectListDialogComponent } from './aspect-list-dialog.component'; import { AspectListDialogComponent } from './aspect-list-dialog.component';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { ContentDirectiveModule } from '../directives/content-directive.module'; import { ContentDirectiveModule } from '../directives/content-directive.module';
@ -39,10 +40,17 @@ import { ContentDirectiveModule } from '../directives/content-directive.module';
TranslateModule, TranslateModule,
MatDialogModule, MatDialogModule,
MatButtonModule, MatButtonModule,
MatTooltipModule,
MatProgressSpinnerModule, MatProgressSpinnerModule,
ContentDirectiveModule ContentDirectiveModule
], ],
exports: [AspectListComponent, AspectListDialogComponent], exports: [
declarations: [AspectListComponent, AspectListDialogComponent] AspectListComponent,
AspectListDialogComponent
],
declarations: [
AspectListComponent,
AspectListDialogComponent
]
}) })
export class AspectListModule {} export class AspectListModule { }

View File

@ -25,7 +25,7 @@
{{ 'NODE_SELECTOR.UPLOAD_FROM_DEVICE' | translate }} {{ 'NODE_SELECTOR.UPLOAD_FROM_DEVICE' | translate }}
<mat-icon *ngIf="hasUploadError()" <mat-icon *ngIf="hasUploadError()"
data-automation-id="adf-content-node-selector-disabled-tab-info-icon" data-automation-id="adf-content-node-selector-disabled-tab-info-icon"
title="{{ getWarningMessage() | translate }}">info matTooltip="{{ getWarningMessage() | translate }}">info
</mat-icon> </mat-icon>
</ng-template> </ng-template>
</div> </div>

View File

@ -334,12 +334,12 @@ describe('ContentNodeSelectorComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
const infoMatIcon = getTabInfoButton(); const infoMatIcon = getTabInfoButton();
const iconTooltipMessage = infoMatIcon.attributes['title']; const iconTooltipMessage = infoMatIcon.attributes['ng-reflect-message'];
const expectedMessage = 'NODE_SELECTOR.UPLOAD_BUTTON_SEARCH_WARNING_MESSAGE'; const expectedMessage = 'NODE_SELECTOR.UPLOAD_BUTTON_SEARCH_WARNING_MESSAGE';
expect(component.getWarningMessage()).toEqual(expectedMessage); expect(component.getWarningMessage()).toEqual(expectedMessage);
expect(iconTooltipMessage).toEqual(expectedMessage); expect(iconTooltipMessage).toEqual(expectedMessage.substring(0, 30));
}); });
it('should not be able to show warning message if it is not in search mode', () => { it('should not be able to show warning message if it is not in search mode', () => {
@ -394,11 +394,11 @@ describe('ContentNodeSelectorComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
const infoMatIcon = getTabInfoButton(); const infoMatIcon = getTabInfoButton();
const iconTooltipMessage = infoMatIcon.attributes['title']; const iconTooltipMessage = infoMatIcon.attributes['ng-reflect-message'];
const expectedMessage = 'NODE_SELECTOR.UPLOAD_BUTTON_PERMISSION_WARNING_MESSAGE'; const expectedMessage = 'NODE_SELECTOR.UPLOAD_BUTTON_PERMISSION_WARNING_MESSAGE';
expect(component.getWarningMessage()).toEqual(expectedMessage); expect(component.getWarningMessage()).toEqual(expectedMessage);
expect(iconTooltipMessage).toEqual(expectedMessage); expect(iconTooltipMessage).toEqual(expectedMessage.substring(0, 30));
}); });
it('should not be able to show warning message while loading documents', () => { it('should not be able to show warning message while loading documents', () => {

View File

@ -5,13 +5,13 @@
<mat-dialog-content> <mat-dialog-content>
<br /> <br />
<form [formGroup]="form" (submit)="submit()"> <form [formGroup]="form" (submit)="submit()">
<mat-checkbox data-automation-id="adf-lock-node-checkbox" class="adf-lock-file-name" [title]="nodeName" [formControlName]="'isLocked'" ngDefaultControl> <mat-checkbox data-automation-id="adf-lock-node-checkbox" class="adf-lock-file-name" matTooltip="{{ nodeName }}" [formControlName]="'isLocked'" ngDefaultControl>
{{ 'CORE.FILE_DIALOG.FILE_LOCK_CHECKBOX' | translate }} <strong>"{{ nodeName }}"</strong> {{ 'CORE.FILE_DIALOG.FILE_LOCK_CHECKBOX' | translate }} <strong>"{{ nodeName }}"</strong>
</mat-checkbox> </mat-checkbox>
<br /> <br />
<div *ngIf="form.value?.isLocked"> <div *ngIf="form.value.isLocked">
<mat-checkbox class="adf-lock-file-name" [formControlName]="'allowOwner'" ngDefaultControl> <mat-checkbox class="adf-lock-file-name" [formControlName]="'allowOwner'" ngDefaultControl>
{{ 'CORE.FILE_DIALOG.ALLOW_OTHERS_CHECKBOX' | translate }} {{ 'CORE.FILE_DIALOG.ALLOW_OTHERS_CHECKBOX' | translate }}
</mat-checkbox> </mat-checkbox>
@ -24,7 +24,7 @@
<br /> <br />
<mat-form-field *ngIf="form.value?.isTimeLock"> <mat-form-field *ngIf="form.value.isTimeLock">
<mat-datetimepicker-toggle [for]="datetimePicker" matSuffix></mat-datetimepicker-toggle> <mat-datetimepicker-toggle [for]="datetimePicker" matSuffix></mat-datetimepicker-toggle>
<mat-datetimepicker #datetimePicker type="datetime" [openOnFocus]="true" [timeInterval]="1"></mat-datetimepicker> <mat-datetimepicker #datetimePicker type="datetime" [openOnFocus]="true" [timeInterval]="1"></mat-datetimepicker>
<input matInput [formControlName]="'time'" [matDatetimepicker]="datetimePicker" required autocomplete="false"> <input matInput [formControlName]="'time'" [matDatetimepicker]="datetimePicker" required autocomplete="false">

View File

@ -8,7 +8,9 @@
[attr.aria-label]="option.name | translate" [attr.aria-label]="option.name | translate"
(change)="changeHandler($event, option)" (change)="changeHandler($event, option)"
class="adf-facet-filter"> class="adf-facet-filter">
<div title="{{ option.name | translate }}" class="adf-search-check-list-label"> <div matTooltip="{{ option.name | translate }}"
matTooltipPosition="before"
class="adf-search-check-list-label">
{{ option.name | translate }} {{ option.name | translate }}
</div> </div>

View File

@ -4,11 +4,14 @@
class="adf-option-chips adf-autocomplete-added-option-chips" class="adf-option-chips adf-autocomplete-added-option-chips"
*ngFor="let option of selectedOptions" *ngFor="let option of selectedOptions"
(removed)="remove(option)"> (removed)="remove(option)">
<span [title]="option.fullPath ? ('SEARCH.RESULTS.WILL_CONTAIN' | translate:{searchTerm: option.fullPath}) : undefined"> <span [matTooltip]="'SEARCH.RESULTS.WILL_CONTAIN' | translate:{searchTerm: option.fullPath}"
[matTooltipDisabled]="!option.fullPath" [matTooltipShowDelay]="tooltipShowDelay">
{{ option.value }} {{ option.value }}
</span> </span>
<button matChipRemove class="adf-option-chips-delete-button adf-autocomplete-added-option-chips-delete-button" <button matChipRemove class="adf-option-chips-delete-button adf-autocomplete-added-option-chips-delete-button" [matTooltipDisabled]="!option.fullPath"
[title]="'SEARCH.FILTER.BUTTONS.REMOVE' | translate"> [matTooltip]="('SEARCH.FILTER.BUTTONS.REMOVE' | translate) + ' \'' + option.fullPath + '\''"
[matTooltipShowDelay]="tooltipShowDelay"
[attr.aria-label]="('SEARCH.FILTER.BUTTONS.REMOVE' | translate) + ' ' + option.value">
<mat-icon class="adf-option-chips-delete-icon adf-autocomplete-added-option-chips-delete-icon">close</mat-icon> <mat-icon class="adf-option-chips-delete-icon adf-autocomplete-added-option-chips-delete-icon">close</mat-icon>
</button> </button>
</mat-chip> </mat-chip>
@ -30,9 +33,10 @@
<ng-container *ngIf="optionInput.value.length > 0"> <ng-container *ngIf="optionInput.value.length > 0">
<mat-option <mat-option
[disabled]="option | adfIsIncluded: selectedOptions : compareOption" [disabled]="option | adfIsIncluded: selectedOptions : compareOption"
*ngFor="let option of filteredOptions" [value]="option" *ngFor="let option of filteredOptions" [value]="option" [matTooltipShowDelay]="tooltipShowDelay"
[matTooltipDisabled]="!option.fullPath" matTooltipPosition="right"
[attr.data-automation-id]="'option-' + (option.value)" [attr.data-automation-id]="'option-' + (option.value)"
[title]="option.fullPath ? ('SEARCH.RESULTS.WILL_CONTAIN' | translate:{searchTerm: option.fullPath || option.value}): undefined" [matTooltip]="'SEARCH.RESULTS.WILL_CONTAIN' | translate:{searchTerm: option.fullPath || option.value}"
class="adf-search-chip-autocomplete-added-option" class="adf-search-chip-autocomplete-added-option"
[ngClass]="(option | adfIsIncluded: selectedOptions : compareOption) && 'adf-autocomplete-added-option'"> [ngClass]="(option | adfIsIncluded: selectedOptions : compareOption) && 'adf-autocomplete-added-option'">
{{ option.fullPath || option.value }} {{ option.fullPath || option.value }}

View File

@ -67,7 +67,7 @@ export class SearchChipAutocompleteInputComponent implements OnInit, OnDestroy,
@Input() @Input()
filter = (options: AutocompleteOption[], value: string): AutocompleteOption[] => { filter = (options: AutocompleteOption[], value: string): AutocompleteOption[] => {
const filterValue = value.toLowerCase(); const filterValue = value.toLowerCase();
return options.filter((option) => option.value.toLowerCase().includes(filterValue)).slice(0, 15); return options.filter(option => option.value.toLowerCase().includes(filterValue)).slice(0, 15);
}; };
@Output() @Output()
@ -80,6 +80,7 @@ export class SearchChipAutocompleteInputComponent implements OnInit, OnDestroy,
formCtrl = new FormControl(''); formCtrl = new FormControl('');
filteredOptions: AutocompleteOption[] = []; filteredOptions: AutocompleteOption[] = [];
selectedOptions: AutocompleteOption[] = []; selectedOptions: AutocompleteOption[] = [];
tooltipShowDelay = 800;
private onDestroy$ = new Subject<void>(); private onDestroy$ = new Subject<void>();
private _activeAnyOption = false; private _activeAnyOption = false;
@ -91,7 +92,7 @@ export class SearchChipAutocompleteInputComponent implements OnInit, OnDestroy,
this.formCtrl.valueChanges this.formCtrl.valueChanges
.pipe( .pipe(
startWith(''), startWith(''),
tap(() => (this.activeAnyOption = false)), tap(() => this.activeAnyOption = false),
debounce((value: string) => (value ? timer(300) : EMPTY)), debounce((value: string) => (value ? timer(300) : EMPTY)),
takeUntil(this.onDestroy$) takeUntil(this.onDestroy$)
) )
@ -104,10 +105,7 @@ export class SearchChipAutocompleteInputComponent implements OnInit, OnDestroy,
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {
if (changes.autocompleteOptions) { if (changes.autocompleteOptions) {
this.filteredOptions = this.filteredOptions = changes.autocompleteOptions.currentValue?.length > 0 ? this.filter(changes.autocompleteOptions.currentValue, this.formCtrl.value) : [];
changes.autocompleteOptions.currentValue?.length > 0
? this.filter(changes.autocompleteOptions.currentValue, this.formCtrl.value)
: [];
} }
} }
@ -125,10 +123,10 @@ export class SearchChipAutocompleteInputComponent implements OnInit, OnDestroy,
if (value && this.isExists(value) && !this.isAdded(value)) { if (value && this.isExists(value) && !this.isAdded(value)) {
if (this.allowOnlyPredefinedValues) { if (this.allowOnlyPredefinedValues) {
const index = this.autocompleteOptions.findIndex((option) => option.value.toLowerCase() === value.toLowerCase()); const index = this.autocompleteOptions.findIndex(option => option.value.toLowerCase() === value.toLowerCase());
this.selectedOptions.push(this.autocompleteOptions[index]); this.selectedOptions.push(this.autocompleteOptions[index]);
} else { } else {
this.selectedOptions.push({ value }); this.selectedOptions.push({value});
} }
this.optionsChanged.emit(this.selectedOptions); this.optionsChanged.emit(this.selectedOptions);
event.chipInput.clear(); event.chipInput.clear();
@ -155,12 +153,14 @@ export class SearchChipAutocompleteInputComponent implements OnInit, OnDestroy,
private isAdded(value: string): boolean { private isAdded(value: string): boolean {
const valueLowerCase = value.toLowerCase(); const valueLowerCase = value.toLowerCase();
return this.selectedOptions.some((option) => option.value.toLowerCase() === valueLowerCase); return this.selectedOptions.some(option => option.value.toLowerCase() === valueLowerCase);
} }
private isExists(value: string): boolean { private isExists(value: string): boolean {
const valueLowerCase = value.toLowerCase(); const valueLowerCase = value.toLowerCase();
return this.allowOnlyPredefinedValues ? this.autocompleteOptions.some((option) => option.value.toLowerCase() === valueLowerCase) : true; return this.allowOnlyPredefinedValues
? this.autocompleteOptions.some(option => option.value.toLowerCase() === valueLowerCase)
: true;
} }
private reset() { private reset() {

View File

@ -5,7 +5,8 @@
color="primary" color="primary"
selected selected
class="adf-search-chip-list-item" class="adf-search-chip-list-item"
title="{{ 'SEARCH.FILTER.BUTTONS.CLEAR-ALL.TOOLTIP' | translate }}" matTooltip="{{ 'SEARCH.FILTER.BUTTONS.CLEAR-ALL.TOOLTIP' | translate }}"
matTooltipPosition="right"
(click)="facetFiltersService.resetAllSelectedBuckets()"> (click)="facetFiltersService.resetAllSelectedBuckets()">
{{ 'SEARCH.FILTER.BUTTONS.CLEAR-ALL.LABEL' | translate }} {{ 'SEARCH.FILTER.BUTTONS.CLEAR-ALL.LABEL' | translate }}
</mat-chip> </mat-chip>

View File

@ -34,7 +34,8 @@
class="adf-search-filter-facet-checkbox" class="adf-search-filter-facet-checkbox"
> >
<div <div
title="{{ bucket.display || bucket.label | translate }} {{ getBucketCountDisplay(bucket) }}" matTooltip="{{ bucket.display || bucket.label | translate }} {{ getBucketCountDisplay(bucket) }}"
matTooltipPosition="right"
class="adf-facet-label" class="adf-facet-label"
[class.adf-search-filter-facet-checkbox-checked]="bucket.checked" [class.adf-search-filter-facet-checkbox-checked]="bucket.checked"
> >

View File

@ -4,8 +4,9 @@
<button mat-icon-button <button mat-icon-button
class="adf-search-filter-title-action" class="adf-search-filter-title-action"
aria-hidden="false" aria-hidden="false"
[attr.aria-label]="'SEARCH.FILTER.BUTTONS.CLOSE' | translate"
(click)="onClose()" (click)="onClose()"
[title]="'SEARCH.FILTER.BUTTONS.CLOSE' | translate"> [matTooltip]="'SEARCH.FILTER.BUTTONS.CLOSE' | translate">
<mat-icon> <mat-icon>
close close
</mat-icon> </mat-icon>

View File

@ -9,7 +9,7 @@
(keyup.enter)="$event.stopPropagation()" (keyup.enter)="$event.stopPropagation()"
class="adf-filter-button" class="adf-filter-button"
[attr.aria-label]="getTooltipTranslation(col?.title)" [attr.aria-label]="getTooltipTranslation(col?.title)"
[title]="getTooltipTranslation(col?.title)" [matTooltip]="getTooltipTranslation(col?.title)"
> >
<adf-icon <adf-icon
value="filter_list" value="filter_list"

View File

@ -3,7 +3,8 @@
<button *ngIf="displayResetButton && facetFiltersService.responseFacets" <button *ngIf="displayResetButton && facetFiltersService.responseFacets"
mat-button mat-button
color="primary" color="primary"
title="{{ 'SEARCH.FILTER.BUTTONS.RESET-ALL.TOOLTIP' | translate }}" matTooltip="{{ 'SEARCH.FILTER.BUTTONS.RESET-ALL.TOOLTIP' | translate }}"
matTooltipPosition="right"
adf-reset-search> adf-reset-search>
{{ 'SEARCH.FILTER.BUTTONS.RESET-ALL.LABEL' | translate }} {{ 'SEARCH.FILTER.BUTTONS.RESET-ALL.LABEL' | translate }}
</button> </button>
@ -16,7 +17,7 @@
{{ category.name | translate }} {{ category.name | translate }}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<adf-search-filter-card <adf-search-filter-card
[category]="category"> [category]="category">
</adf-search-filter-card> </adf-search-filter-card>
</mat-expansion-panel> </mat-expansion-panel>

View File

@ -6,7 +6,10 @@
*ngFor="let option of options" *ngFor="let option of options"
[value]="option.value" [value]="option.value"
class="adf-facet-filter"> class="adf-facet-filter">
<div title="{{ option.name | translate }}" class="adf-filter-label"> <div
matTooltip="{{ option.name | translate }}"
matTooltipPosition="right"
class="adf-filter-label">
{{ option.name | translate }} {{ option.name | translate }}
</div> </div>
</mat-radio-button> </mat-radio-button>

View File

@ -12,7 +12,8 @@
mat-icon-button mat-icon-button
(click)="toggleCompact()" (click)="toggleCompact()"
color="primary" color="primary"
[title]="'CORE.BREADCRUMBS.SHOWALL' | translate" [matTooltip]="'CORE.BREADCRUMBS.SHOWALL' | translate"
matTooltipClass="adf-tooltip"
[attr.aria-label]="'CORE.BREADCRUMBS.SHOWALL' | translate" [attr.aria-label]="'CORE.BREADCRUMBS.SHOWALL' | translate"
> >
<mat-icon class="adf-breadcrumb__show-all-button-icon--rotate">more_vert</mat-icon > <mat-icon class="adf-breadcrumb__show-all-button-icon--rotate">more_vert</mat-icon >

View File

@ -15,24 +15,11 @@
* limitations under the License. * limitations under the License.
*/ */
import { import { AfterContentInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, EventEmitter, Input, OnChanges, Output, QueryList, SimpleChanges, TemplateRef, ViewChildren } from '@angular/core';
AfterContentInit,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ContentChildren,
EventEmitter,
Input,
OnChanges,
Output,
QueryList,
SimpleChanges,
TemplateRef,
ViewChildren
} from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatTooltipModule } from '@angular/material/tooltip';
import { map, startWith } from 'rxjs/operators'; import { map, startWith } from 'rxjs/operators';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@ -45,7 +32,7 @@ import { BreadcrumbItemComponent } from '../breadcrumb-item/breadcrumb-item.comp
templateUrl: './breadcrumb.component.html', templateUrl: './breadcrumb.component.html',
styleUrls: ['./breadcrumb.component.scss'], styleUrls: ['./breadcrumb.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
imports: [CommonModule, MatIconModule, TranslateModule, MatButtonModule, BreadcrumbFocusDirective] imports: [ CommonModule, MatIconModule, TranslateModule, MatButtonModule, MatTooltipModule ]
}) })
export class BreadcrumbComponent implements AfterContentInit, OnChanges { export class BreadcrumbComponent implements AfterContentInit, OnChanges {
private _breadcrumbTemplateRefs: Array<TemplateRef<unknown>> = []; private _breadcrumbTemplateRefs: Array<TemplateRef<unknown>> = [];
@ -70,7 +57,9 @@ export class BreadcrumbComponent implements AfterContentInit, OnChanges {
this.breadcrumbItems.changes this.breadcrumbItems.changes
.pipe( .pipe(
startWith(this.breadcrumbItems), startWith(this.breadcrumbItems),
map((breadcrumbItems: QueryList<BreadcrumbItemComponent>) => this.mapToTemplateRefs(breadcrumbItems)) map((breadcrumbItems: QueryList<BreadcrumbItemComponent>) =>
this.mapToTemplateRefs(breadcrumbItems)
)
) )
.subscribe((templateRefs) => { .subscribe((templateRefs) => {
this._breadcrumbTemplateRefs = templateRefs; this._breadcrumbTemplateRefs = templateRefs;
@ -94,11 +83,16 @@ export class BreadcrumbComponent implements AfterContentInit, OnChanges {
} }
private setBreadcrumbs(breadcrumbs: Array<TemplateRef<unknown>>) { private setBreadcrumbs(breadcrumbs: Array<TemplateRef<unknown>>) {
this.selectedBreadcrumbs = this.compact && breadcrumbs.length > 2 ? [breadcrumbs[0], breadcrumbs[breadcrumbs.length - 1]] : [...breadcrumbs]; this.selectedBreadcrumbs =
this.compact && breadcrumbs.length > 2
? [breadcrumbs[0], breadcrumbs[breadcrumbs.length - 1]]
: [...breadcrumbs];
this.cdr.detectChanges(); this.cdr.detectChanges();
} }
private mapToTemplateRefs(breadcrumbItems: QueryList<BreadcrumbItemComponent>) { private mapToTemplateRefs( breadcrumbItems: QueryList<BreadcrumbItemComponent> ) {
return breadcrumbItems.toArray().map((breadcrumbItem) => breadcrumbItem.templateRef); return breadcrumbItems
.toArray()
.map((breadcrumbItem) => breadcrumbItem.templateRef);
} }
} }

View File

@ -45,7 +45,7 @@
<ng-container matColumnDef="value"> <ng-container matColumnDef="value">
<th mat-header-cell class="adf-val-col header-cell" *matHeaderCellDef> <th mat-header-cell class="adf-val-col header-cell" *matHeaderCellDef>
<div class="adf-input-field-buttons-container"> <div class="adf-input-field-buttons-container">
<button *ngIf="showPlusButton$ | async" mat-icon-button title="{{'CORE.FEATURE-FLAGS.ADD_NEW' | translate}}" color="accent" (click)="onAddButtonClick()"> <button *ngIf="showPlusButton$ | async" mat-icon-button matTooltip="{{'CORE.FEATURE-FLAGS.ADD_NEW' | translate}}" color="accent" (click)="onAddButtonClick()">
<mat-icon class="material-icons-outlined" fontIcon="add_circle"></mat-icon> <mat-icon class="material-icons-outlined" fontIcon="add_circle"></mat-icon>
</button> </button>
<button *ngIf="inputValue" matSuffix mat-icon-button aria-label="Clear" (click)="onClearInput()" class="adf-clear-button"> <button *ngIf="inputValue" matSuffix mat-icon-button aria-label="Clear" (click)="onClearInput()" class="adf-clear-button">

View File

@ -34,6 +34,7 @@ import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatTooltipModule } from '@angular/material/tooltip';
import { FlagsOverrideComponent } from '../feature-override-indicator.component'; import { FlagsOverrideComponent } from '../feature-override-indicator.component';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@ -51,6 +52,7 @@ import { TranslateModule } from '@ngx-translate/core';
MatIconModule, MatIconModule,
MatButtonModule, MatButtonModule,
MatInputModule, MatInputModule,
MatTooltipModule,
MatDialogModule, MatDialogModule,
TranslateModule TranslateModule
], ],

View File

@ -30,6 +30,7 @@ import { MatMenuModule } from '@angular/material/menu';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatDatetimepickerModule, MatNativeDatetimeModule } from '@mat-datetimepicker/core'; import { MatDatetimepickerModule, MatNativeDatetimeModule } from '@mat-datetimepicker/core';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@ -63,7 +64,8 @@ import { SelectFilterInputComponent } from './components/card-view-selectitem/se
MatCardModule, MatCardModule,
MatDatetimepickerModule, MatDatetimepickerModule,
MatNativeDatetimeModule, MatNativeDatetimeModule,
MatSlideToggleModule MatSlideToggleModule,
MatTooltipModule
], ],
declarations: [ declarations: [
CardViewComponent, CardViewComponent,

View File

@ -13,7 +13,8 @@
*ngIf="showProperty" *ngIf="showProperty"
[attr.data-automation-id]="'card-dateitem-' + property.key" [attr.data-automation-id]="'card-dateitem-' + property.key"
(dblclick)="copyToClipboard(property.displayValue)" (dblclick)="copyToClipboard(property.displayValue)"
[title]="'CORE.METADATA.ACTIONS.COPY_TO_CLIPBOARD' | translate" matTooltipShowDelay="1000"
[matTooltip]="'CORE.METADATA.ACTIONS.COPY_TO_CLIPBOARD' | translate"
>{{ property.displayValue }}</span >{{ property.displayValue }}</span
> >
</span> </span>

View File

@ -34,7 +34,9 @@
[attr.aria-label]="property.label | translate" [attr.aria-label]="property.label | translate"
[formControl]="textInput" [formControl]="textInput"
(dblclick)="copyToClipboard(property.displayValue)" (dblclick)="copyToClipboard(property.displayValue)"
[title]="'CORE.METADATA.ACTIONS.COPY_TO_CLIPBOARD' | translate" matTooltipShowDelay="1000"
[matTooltip]="'CORE.METADATA.ACTIONS.COPY_TO_CLIPBOARD' | translate"
[matTooltipDisabled]="isEditable"
[attr.data-automation-id]="'card-textitem-value-' + property.key" [attr.data-automation-id]="'card-textitem-value-' + property.key"
(keydown)="undoText($event)" (keydown)="undoText($event)"
/> />
@ -43,6 +45,7 @@
*ngIf="property.multiline" *ngIf="property.multiline"
title="{{ property.label | translate }}" title="{{ property.label | translate }}"
[cdkTextareaAutosize]="true" [cdkTextareaAutosize]="true"
[cdkAutosizeMaxRows]="1"
[cdkAutosizeMaxRows]="5" [cdkAutosizeMaxRows]="5"
class="adf-property-value" class="adf-property-value"
[ngClass]="{ [ngClass]="{

View File

@ -5,7 +5,7 @@
[attr.data-automation-id]="'context-' + (link.title || link.model?.title | translate)" [attr.data-automation-id]="'context-' + (link.title || link.model?.title | translate)"
mat-menu-item mat-menu-item
[disabled]="link.model?.disabled" [disabled]="link.model?.disabled"
[title]="link.model?.tooltip | translate" [matTooltip]="link.model?.tooltip | translate"
(click)="onMenuItemClick($event, link)"> (click)="onMenuItemClick($event, link)">
<mat-icon *ngIf="link.model?.icon">{{ link.model.icon }}</mat-icon> <mat-icon *ngIf="link.model?.icon">{{ link.model.icon }}</mat-icon>
<span>{{ link.title || link.model?.title | translate }}</span> <span>{{ link.title || link.model?.title | translate }}</span>

View File

@ -26,6 +26,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { contextMenuAnimation } from './animations'; import { contextMenuAnimation } from './animations';
import { ContextMenuOverlayRef } from './context-menu-overlay'; import { ContextMenuOverlayRef } from './context-menu-overlay';
import { CONTEXT_MENU_DATA } from './context-menu.tokens'; import { CONTEXT_MENU_DATA } from './context-menu.tokens';
import { MatTooltipModule } from '@angular/material/tooltip';
@Component({ @Component({
selector: 'adf-context-menu', selector: 'adf-context-menu',
@ -36,7 +37,7 @@ import { CONTEXT_MENU_DATA } from './context-menu.tokens';
class: 'adf-context-menu' class: 'adf-context-menu'
}, },
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
imports: [MatIconModule, MatMenuModule, NgForOf, NgIf, TranslateModule], imports: [MatIconModule, MatMenuModule, MatTooltipModule, NgForOf, NgIf, TranslateModule],
animations: [trigger('panelAnimation', contextMenuAnimation)] animations: [trigger('panelAnimation', contextMenuAnimation)]
}) })
export class ContextMenuListComponent implements AfterViewInit { export class ContextMenuListComponent implements AfterViewInit {

View File

@ -21,6 +21,7 @@ import { ContextMenuModule } from './context-menu.module';
import { CoreTestingModule } from '../testing/core.testing.module'; import { CoreTestingModule } from '../testing/core.testing.module';
import { HarnessLoader } from '@angular/cdk/testing'; import { HarnessLoader } from '@angular/cdk/testing';
import { MatIconHarness } from '@angular/material/icon/testing'; import { MatIconHarness } from '@angular/material/icon/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
@Component({ @Component({
@ -196,5 +197,27 @@ describe('ContextMenuDirective', () => {
).length ).length
).toBe(0); ).toBe(0);
}); });
it('should show tooltip if is set', async () => {
const expectedTooltipText = 'Action 5 tooltip';
const tooltip = await loader.getHarness(
MatTooltipHarness.with({
selector: '[data-automation-id="context-action-5"]'
})
);
await tooltip.show();
expect(await tooltip.isOpen()).toBeTrue();
expect(await tooltip.getTooltipText()).toEqual(expectedTooltipText);
});
it('should not show tooltip if is not set', async () => {
const tooltip = await loader.getHarness(
MatTooltipHarness.with({
selector: '[data-automation-id="context-action-6"]'
})
);
await tooltip.show();
expect(await tooltip.isOpen()).toBeFalse();
});
}); });
}); });

View File

@ -68,7 +68,7 @@
!isResizing && col.sortable}" !isResizing && col.sortable}"
> >
<ng-container *ngIf="!col.header"> <ng-container *ngIf="!col.header">
<span *ngIf="col.title" title="{{col.title | translate}}" class="adf-datatable-cell-value">{{col.title | translate}}</span> <span *ngIf="col.title" matTooltip="{{col.title | translate}}" class="adf-datatable-cell-value">{{col.title | translate}}</span>
<span *ngIf="col.title && col.sortable && isDraggingHeaderColumn" class="adf-sr-only" aria-live="polite"> <span *ngIf="col.title && col.sortable && isDraggingHeaderColumn" class="adf-sr-only" aria-live="polite">
{{ getSortLiveAnnouncement(col) | translate: { string: col.title | translate } }} {{ getSortLiveAnnouncement(col) | translate: { string: col.title | translate } }}
@ -124,7 +124,7 @@
<ng-container *ngIf="mainActionTemplate"> <ng-container *ngIf="mainActionTemplate">
<button <button
data-automation-id="adf-datatable-main-menu-button" data-automation-id="adf-datatable-main-menu-button"
title="{{ 'ADF-DATATABLE.CONTENT-ACTIONS.SELECT_COLUMNS' | translate }}" matTooltip="{{ 'ADF-DATATABLE.CONTENT-ACTIONS.SELECT_COLUMNS' | translate }}"
mat-icon-button mat-icon-button
#mainMenuTrigger="matMenuTrigger" #mainMenuTrigger="matMenuTrigger"
(keydown.enter)="mainMenuTrigger.openMenu()" (keydown.enter)="mainMenuTrigger.openMenu()"

View File

@ -32,7 +32,7 @@ export class DecimalRenderMiddlewareService implements FormFieldModelRenderMiddl
return field; return field;
} }
private forceMaxPrecisionIfNeeded(value: string | number, allowedMaxPrecision: number): string | number { private forceMaxPrecisionIfNeeded(value: string | number, allowedMaxPrecision): string | number {
let numberOfDecimalDigits = 0; let numberOfDecimalDigits = 0;
const stringValue = typeof value === 'string' ? value : `${value}`; const stringValue = typeof value === 'string' ? value : `${value}`;
const numberChunks = stringValue.split('.'); const numberChunks = stringValue.split('.');
@ -42,9 +42,12 @@ export class DecimalRenderMiddlewareService implements FormFieldModelRenderMiddl
} }
if (numberOfDecimalDigits > allowedMaxPrecision) { if (numberOfDecimalDigits > allowedMaxPrecision) {
return parseFloat(value.toString()).toFixed(allowedMaxPrecision); const valueWithCorrectPrecision = parseFloat(value.toString())
.toFixed(allowedMaxPrecision);
return valueWithCorrectPrecision;
} }
return value; return value;
} }
} };

View File

@ -12,7 +12,9 @@
<mat-form-field class="adf-amount-widget__input" [hideRequiredMarker]="true"> <mat-form-field class="adf-amount-widget__input" [hideRequiredMarker]="true">
<span matPrefix class="adf-amount-widget__prefix-spacing">{{ currency }} &nbsp;</span> <span matPrefix class="adf-amount-widget__prefix-spacing">{{ currency }} &nbsp;</span>
<input matInput <input matInput
[title]="field.tooltip" [matTooltip]="field.tooltip"
matTooltipPosition="above"
[matTooltipShowDelay]="1000"
class="adf-input" class="adf-input"
type="text" type="text"
[id]="field.id" [id]="field.id"

View File

@ -20,6 +20,7 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatFormFieldHarness } from '@angular/material/form-field/testing'; import { MatFormFieldHarness } from '@angular/material/form-field/testing';
import { MatInputHarness } from '@angular/material/input/testing'; import { MatInputHarness } from '@angular/material/input/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { FormFieldModel, FormFieldTypes, FormModel } from '../core'; import { FormFieldModel, FormFieldTypes, FormModel } from '../core';
import { ADF_AMOUNT_SETTINGS, AmountWidgetComponent } from './amount.widget'; import { ADF_AMOUNT_SETTINGS, AmountWidgetComponent } from './amount.widget';
@ -89,8 +90,17 @@ describe('AmountWidgetComponent', () => {
const input = await loader.getHarness(MatInputHarness); const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover(); await (await input.host()).hover();
const tooltip = await (await input.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover();
await (await input.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });

View File

@ -22,6 +22,7 @@ import { Component, OnInit, ViewEncapsulation, InjectionToken, Inject, Optional
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { ErrorWidgetComponent } from '../error/error.component'; import { ErrorWidgetComponent } from '../error/error.component';
@ -49,7 +50,7 @@ export const ADF_AMOUNT_SETTINGS = new InjectionToken<AmountWidgetSettings>('adf
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [MatFormFieldModule, MatInputModule, FormsModule, ErrorWidgetComponent, TranslateModule, NgIf], imports: [MatFormFieldModule, MatTooltipModule, MatInputModule, FormsModule, ErrorWidgetComponent, TranslateModule, NgIf],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class AmountWidgetComponent extends WidgetComponent implements OnInit { export class AmountWidgetComponent extends WidgetComponent implements OnInit {

View File

@ -6,8 +6,10 @@
[disabled]="field.readOnly || readOnly" [disabled]="field.readOnly || readOnly"
[(ngModel)]="field.value" [(ngModel)]="field.value"
(ngModelChange)="onFieldChanged(field)" (ngModelChange)="onFieldChanged(field)"
[title]="field.tooltip" [matTooltip]="field.tooltip"
(click)="markAsTouched()"> (click)="markAsTouched()"
matTooltipPosition="right"
[matTooltipShowDelay]="1000">
{{ field.name | translate }} {{ field.name | translate }}
<span class="adf-asterisk" *ngIf="isRequired()">*</span> <span class="adf-asterisk" *ngIf="isRequired()">*</span>
</mat-checkbox> </mat-checkbox>

View File

@ -20,6 +20,8 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatCheckboxHarness } from '@angular/material/checkbox/testing'; import { MatCheckboxHarness } from '@angular/material/checkbox/testing';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { TranslateLoader } from '@ngx-translate/core'; import { TranslateLoader } from '@ngx-translate/core';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { TranslateLoaderService } from '../../../../translation'; import { TranslateLoaderService } from '../../../../translation';
@ -34,7 +36,7 @@ describe('CheckboxWidgetComponent', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [CoreTestingModule, MatCheckboxModule], imports: [CoreTestingModule, MatCheckboxModule, MatTooltipModule],
providers: [{ provide: TranslateLoader, useClass: TranslateLoaderService }] providers: [{ provide: TranslateLoader, useClass: TranslateLoaderService }]
}); });
fixture = TestBed.createComponent(CheckboxWidgetComponent); fixture = TestBed.createComponent(CheckboxWidgetComponent);
@ -108,8 +110,17 @@ describe('CheckboxWidgetComponent', () => {
const checkbox = await loader.getHarness(MatCheckboxHarness); const checkbox = await loader.getHarness(MatCheckboxHarness);
await (await checkbox.host()).hover(); await (await checkbox.host()).hover();
const tooltip = await (await checkbox.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const checkbox = await loader.getHarness(MatCheckboxHarness);
await (await checkbox.host()).hover();
await (await checkbox.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });
}); });

View File

@ -21,6 +21,7 @@ import { NgClass, NgIf } from '@angular/common';
import { Component, ViewEncapsulation } from '@angular/core'; import { Component, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { ErrorWidgetComponent } from '../error/error.component'; import { ErrorWidgetComponent } from '../error/error.component';
@ -41,7 +42,7 @@ import { WidgetComponent } from '../widget.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [NgClass, MatCheckboxModule, FormsModule, TranslateModule, ErrorWidgetComponent, NgIf], imports: [NgClass, MatCheckboxModule, FormsModule, TranslateModule, MatTooltipModule, ErrorWidgetComponent, NgIf],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class CheckboxWidgetComponent extends WidgetComponent { export class CheckboxWidgetComponent extends WidgetComponent {

View File

@ -24,8 +24,10 @@
(dateChange)="onDateChanged($event)" (dateChange)="onDateChanged($event)"
(keydown.enter)="datetimePicker.open()" (keydown.enter)="datetimePicker.open()"
[placeholder]="field.placeholder" [placeholder]="field.placeholder"
[title]="field.tooltip" [matTooltip]="field.tooltip"
(blur)="markAsTouched()" (blur)="markAsTouched()"
matTooltipPosition="above"
[matTooltipShowDelay]="1000"
[min]="minDate" [min]="minDate"
[max]="maxDate"> [max]="maxDate">
<mat-datetimepicker-toggle matSuffix [for]="datetimePicker" <mat-datetimepicker-toggle matSuffix [for]="datetimePicker"

View File

@ -19,6 +19,8 @@ import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatInputHarness } from '@angular/material/input/testing'; import { MatInputHarness } from '@angular/material/input/testing';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { DateFieldValidator, DateTimeFieldValidator, FormFieldModel, FormFieldTypes, FormModel } from '../core'; import { DateFieldValidator, DateTimeFieldValidator, FormFieldModel, FormFieldTypes, FormModel } from '../core';
import { DateTimeWidgetComponent } from './date-time.widget'; import { DateTimeWidgetComponent } from './date-time.widget';
@ -32,7 +34,7 @@ describe('DateTimeWidgetComponent', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [CoreTestingModule] imports: [CoreTestingModule, MatTooltipModule]
}); });
fixture = TestBed.createComponent(DateTimeWidgetComponent); fixture = TestBed.createComponent(DateTimeWidgetComponent);
@ -244,8 +246,17 @@ describe('DateTimeWidgetComponent', () => {
const input = await loader.getHarness(MatInputHarness); const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover(); await (await input.host()).hover();
const tooltip = await (await input.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover();
await (await input.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });

View File

@ -23,6 +23,7 @@ import { FormsModule } from '@angular/forms';
import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core'; import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepickerInputEvent, MatDatetimepickerModule } from '@mat-datetimepicker/core'; import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepickerInputEvent, MatDatetimepickerModule } from '@mat-datetimepicker/core';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { isValid } from 'date-fns'; import { isValid } from 'date-fns';
@ -42,7 +43,16 @@ import { WidgetComponent } from '../widget.component';
], ],
templateUrl: './date-time.widget.html', templateUrl: './date-time.widget.html',
styleUrls: ['./date-time.widget.scss'], styleUrls: ['./date-time.widget.scss'],
imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, MatDatetimepickerModule, FormsModule, ErrorWidgetComponent], imports: [
NgIf,
TranslateModule,
MatFormFieldModule,
MatInputModule,
MatDatetimepickerModule,
FormsModule,
MatTooltipModule,
ErrorWidgetComponent
],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class DateTimeWidgetComponent extends WidgetComponent implements OnInit { export class DateTimeWidgetComponent extends WidgetComponent implements OnInit {

View File

@ -24,8 +24,10 @@
(ngModelChange)="onFieldChanged(field)" (ngModelChange)="onFieldChanged(field)"
[disabled]="field.readOnly" [disabled]="field.readOnly"
[placeholder]="field.placeholder" [placeholder]="field.placeholder"
[title]="field.tooltip" [matTooltip]="field.tooltip"
(blur)="markAsTouched()" /> (blur)="markAsTouched()"
matTooltipPosition="above"
[matTooltipShowDelay]="1000" />
</mat-form-field> </mat-form-field>
<error-widget [error]="field.validationSummary"></error-widget> <error-widget [error]="field.validationSummary"></error-widget>

View File

@ -20,6 +20,7 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatInputHarness } from '@angular/material/input/testing'; import { MatInputHarness } from '@angular/material/input/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { FormFieldModel, FormFieldTypes, FormModel } from '../core'; import { FormFieldModel, FormFieldTypes, FormModel } from '../core';
@ -57,8 +58,17 @@ describe('DecimalComponent', () => {
const input = await loader.getHarness(MatInputHarness); const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover(); await (await input.host()).hover();
const tooltip = await (await input.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover();
await (await input.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });

View File

@ -20,6 +20,7 @@ import { Component, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { ErrorWidgetComponent } from '../error/error.component'; import { ErrorWidgetComponent } from '../error/error.component';
@ -41,7 +42,7 @@ import { WidgetComponent } from '../widget.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, FormsModule, ErrorWidgetComponent], imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, FormsModule, MatTooltipModule, ErrorWidgetComponent],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class DecimalWidgetComponent extends WidgetComponent { export class DecimalWidgetComponent extends WidgetComponent {

View File

@ -1,3 +1,6 @@
<div [title]="field.tooltip" class="adf-display-text-widget {{ field.className }}"> <div [matTooltip]="field.tooltip"
matTooltipPosition="above"
[matTooltipShowDelay]="1000"
class="adf-display-text-widget {{ field.className }}">
{{ field.value | translate }} {{ field.value | translate }}
</div> </div>

View File

@ -18,6 +18,7 @@
/* eslint-disable @angular-eslint/component-selector */ /* eslint-disable @angular-eslint/component-selector */
import { Component, ViewEncapsulation } from '@angular/core'; import { Component, ViewEncapsulation } from '@angular/core';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { WidgetComponent } from '../widget.component'; import { WidgetComponent } from '../widget.component';
@ -38,7 +39,7 @@ import { WidgetComponent } from '../widget.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [TranslateModule], imports: [MatTooltipModule, TranslateModule],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class DisplayTextWidgetComponent extends WidgetComponent { export class DisplayTextWidgetComponent extends WidgetComponent {

View File

@ -2,7 +2,9 @@
<label class="adf-label" [attr.for]="field.id"> <label class="adf-label" [attr.for]="field.id">
{{ field.name | translate }}<span class="adf-asterisk" *ngIf="isRequired()">*</span> {{ field.name | translate }}<span class="adf-asterisk" *ngIf="isRequired()">*</span>
</label> </label>
<div [title]="field.tooltip"> <div [matTooltip]="field.tooltip"
matTooltipPosition="above"
[matTooltipShowDelay]="1000">
<a [href]="linkUrl" target="_blank" rel="nofollow">{{ linkText }}</a> <a [href]="linkUrl" target="_blank" rel="nofollow">{{ linkText }}</a>
</div> </div>
</div> </div>

View File

@ -16,6 +16,7 @@
*/ */
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatTooltipModule } from '@angular/material/tooltip';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { FormFieldModel, FormFieldTypes, FormModel } from '../core'; import { FormFieldModel, FormFieldTypes, FormModel } from '../core';
import { HyperlinkWidgetComponent } from './hyperlink.widget'; import { HyperlinkWidgetComponent } from './hyperlink.widget';
@ -27,7 +28,7 @@ describe('HyperlinkWidgetComponent', () => {
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [CoreTestingModule] imports: [CoreTestingModule, MatTooltipModule]
}); });
fixture = TestBed.createComponent(HyperlinkWidgetComponent); fixture = TestBed.createComponent(HyperlinkWidgetComponent);
widget = fixture.componentInstance; widget = fixture.componentInstance;
@ -198,7 +199,7 @@ describe('HyperlinkWidgetComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
const checkbox = fixture.debugElement.nativeElement.querySelector('.adf-hyperlink-widget div'); const checkbox = fixture.debugElement.nativeElement.querySelector('.adf-hyperlink-widget div');
const tooltip = checkbox.getAttribute('title'); const tooltip = checkbox.getAttribute('ng-reflect-message');
expect(tooltip).toEqual(widget.field.tooltip); expect(tooltip).toEqual(widget.field.tooltip);
}); });

View File

@ -19,6 +19,7 @@
import { NgIf } from '@angular/common'; import { NgIf } from '@angular/common';
import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { FormFieldModel } from '../core'; import { FormFieldModel } from '../core';
@ -40,7 +41,7 @@ import { WidgetComponent } from '../widget.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [TranslateModule, NgIf], imports: [TranslateModule, MatTooltipModule, NgIf],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class HyperlinkWidgetComponent extends WidgetComponent implements OnInit { export class HyperlinkWidgetComponent extends WidgetComponent implements OnInit {

View File

@ -16,8 +16,10 @@
(ngModelChange)="onFieldChanged(field)" (ngModelChange)="onFieldChanged(field)"
[disabled]="field.readOnly || readOnly" [disabled]="field.readOnly || readOnly"
[placeholder]="field.placeholder" [placeholder]="field.placeholder"
[title]="field.tooltip" [matTooltip]="field.tooltip"
(blur)="markAsTouched()"> (blur)="markAsTouched()"
matTooltipPosition="above"
[matTooltipShowDelay]="1000">
</textarea> </textarea>
</mat-form-field> </mat-form-field>
<div *ngIf="field.maxLength > 0" class="adf-multiline-word-counter"> <div *ngIf="field.maxLength > 0" class="adf-multiline-word-counter">

View File

@ -19,6 +19,7 @@ import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatInputHarness } from '@angular/material/input/testing'; import { MatInputHarness } from '@angular/material/input/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { FormFieldModel, FormFieldTypes, FormModel } from '../core'; import { FormFieldModel, FormFieldTypes, FormModel } from '../core';
import { MultilineTextWidgetComponentComponent } from './multiline-text.widget'; import { MultilineTextWidgetComponentComponent } from './multiline-text.widget';
@ -52,8 +53,17 @@ describe('MultilineTextWidgetComponentComponent', () => {
const input = await loader.getHarness(MatInputHarness); const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover(); await (await input.host()).hover();
const tooltip = await (await input.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover();
await (await input.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });

View File

@ -22,6 +22,7 @@ import { Component, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { ErrorWidgetComponent } from '../error/error.component'; import { ErrorWidgetComponent } from '../error/error.component';
@ -43,7 +44,7 @@ import { WidgetComponent } from '../widget.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [MatFormFieldModule, NgIf, TranslateModule, MatInputModule, FormsModule, ErrorWidgetComponent], imports: [MatFormFieldModule, NgIf, TranslateModule, MatInputModule, FormsModule, MatTooltipModule, ErrorWidgetComponent],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class MultilineTextWidgetComponentComponent extends WidgetComponent { export class MultilineTextWidgetComponentComponent extends WidgetComponent {

View File

@ -24,8 +24,10 @@
(ngModelChange)="onFieldChanged(field)" (ngModelChange)="onFieldChanged(field)"
[disabled]="field.readOnly" [disabled]="field.readOnly"
[placeholder]="field.placeholder" [placeholder]="field.placeholder"
[title]="field.tooltip" [matTooltip]="field.tooltip"
(blur)="markAsTouched()"> (blur)="markAsTouched()"
matTooltipPosition="above"
[matTooltipShowDelay]="1000">
</mat-form-field> </mat-form-field>
<error-widget [error]="field.validationSummary"></error-widget> <error-widget [error]="field.validationSummary"></error-widget>
<error-widget *ngIf="isInvalidFieldRequired() && isTouched()" <error-widget *ngIf="isInvalidFieldRequired() && isTouched()"

View File

@ -21,6 +21,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatInputHarness } from '@angular/material/input/testing'; import { MatInputHarness } from '@angular/material/input/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { CoreTestingModule } from '../../../../testing'; import { CoreTestingModule } from '../../../../testing';
import { FormFieldModel, FormFieldTypes, FormModel } from '../core'; import { FormFieldModel, FormFieldTypes, FormModel } from '../core';
import { NumberWidgetComponent } from './number.widget'; import { NumberWidgetComponent } from './number.widget';
@ -54,8 +55,17 @@ describe('NumberWidgetComponent', () => {
const input = await loader.getHarness(MatInputHarness); const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover(); await (await input.host()).hover();
const tooltip = await (await input.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover();
await (await input.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });

View File

@ -22,6 +22,7 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { DecimalNumberPipe } from '../../../../pipes'; import { DecimalNumberPipe } from '../../../../pipes';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
@ -44,7 +45,7 @@ import { WidgetComponent } from '../widget.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, FormsModule, ErrorWidgetComponent], imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, FormsModule, MatTooltipModule, ErrorWidgetComponent],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class NumberWidgetComponent extends WidgetComponent implements OnInit { export class NumberWidgetComponent extends WidgetComponent implements OnInit {

View File

@ -23,8 +23,10 @@
[disabled]="field.readOnly || readOnly" [disabled]="field.readOnly || readOnly"
[textMask]="{mask: mask, isReversed: isMaskReversed}" [textMask]="{mask: mask, isReversed: isMaskReversed}"
[placeholder]="placeholder" [placeholder]="placeholder"
[title]="field.tooltip" [matTooltip]="field.tooltip"
(blur)="markAsTouched()"> (blur)="markAsTouched()"
matTooltipPosition="above"
[matTooltipShowDelay]="1000">
</mat-form-field> </mat-form-field>
<error-widget [error]="field.validationSummary"></error-widget> <error-widget [error]="field.validationSummary"></error-widget>
<error-widget *ngIf="isInvalidFieldRequired() && isTouched()" <error-widget *ngIf="isInvalidFieldRequired() && isTouched()"

View File

@ -28,6 +28,7 @@ import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatInputHarness } from '@angular/material/input/testing'; import { MatInputHarness } from '@angular/material/input/testing';
import { MatFormFieldHarness } from '@angular/material/form-field/testing'; import { MatFormFieldHarness } from '@angular/material/form-field/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
describe('TextWidgetComponent', () => { describe('TextWidgetComponent', () => {
const form = new FormModel({ taskId: 'fake-task-id' }); const form = new FormModel({ taskId: 'fake-task-id' });
@ -165,8 +166,17 @@ describe('TextWidgetComponent', () => {
const input = await loader.getHarness(MatInputHarness); const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover(); await (await input.host()).hover();
const tooltip = await (await input.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const input = await loader.getHarness(MatInputHarness);
await (await input.host()).hover();
await (await input.host()).mouseAway();
const tooltip = await loader.getHarness(MatTooltipHarness);
expect(await tooltip.isOpen()).toBe(false);
}); });
}); });

View File

@ -22,6 +22,7 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FormService } from '../../../services/form.service'; import { FormService } from '../../../services/form.service';
import { ErrorWidgetComponent } from '../error/error.component'; import { ErrorWidgetComponent } from '../error/error.component';
@ -44,7 +45,7 @@ import { InputMaskDirective } from './text-mask.component';
'(invalid)': 'event($event)', '(invalid)': 'event($event)',
'(select)': 'event($event)' '(select)': 'event($event)'
}, },
imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, FormsModule, ErrorWidgetComponent, InputMaskDirective], imports: [NgIf, TranslateModule, MatFormFieldModule, MatInputModule, FormsModule, MatTooltipModule, ErrorWidgetComponent, InputMaskDirective],
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class TextWidgetComponent extends WidgetComponent implements OnInit { export class TextWidgetComponent extends WidgetComponent implements OnInit {

View File

@ -42,70 +42,25 @@ import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs'; import { MatTabsModule } from '@angular/material/tabs';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatBadgeModule } from '@angular/material/badge'; import { MatBadgeModule } from '@angular/material/badge';
@NgModule({ @NgModule({
imports: [ imports: [
MatAutocompleteModule, MatAutocompleteModule, MatButtonModule, MatCardModule, MatCheckboxModule,
MatButtonModule, MatChipsModule, MatDatepickerModule, MatDialogModule, MatGridListModule, MatIconModule,
MatCardModule, MatInputModule, MatListModule, MatNativeDateModule, MatOptionModule, MatProgressSpinnerModule, MatRadioModule,
MatCheckboxModule, MatRippleModule, MatSelectModule, MatSlideToggleModule, MatTableModule, MatTabsModule,
MatChipsModule, MatMenuModule, MatProgressBarModule, MatSidenavModule, MatSnackBarModule, MatToolbarModule,
MatDatepickerModule, MatTooltipModule, MatDatetimepickerModule, MatNativeDatetimeModule, MatExpansionModule, MatBadgeModule
MatDialogModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatNativeDateModule,
MatOptionModule,
MatProgressSpinnerModule,
MatRadioModule,
MatRippleModule,
MatSelectModule,
MatSlideToggleModule,
MatTableModule,
MatTabsModule,
MatMenuModule,
MatProgressBarModule,
MatSidenavModule,
MatSnackBarModule,
MatToolbarModule,
MatDatetimepickerModule,
MatNativeDatetimeModule,
MatExpansionModule,
MatBadgeModule
], ],
exports: [ exports: [
MatAutocompleteModule, MatAutocompleteModule, MatButtonModule, MatCardModule, MatCheckboxModule,
MatButtonModule, MatChipsModule, MatDatepickerModule, MatDialogModule, MatGridListModule, MatIconModule,
MatCardModule, MatInputModule, MatListModule, MatNativeDateModule, MatOptionModule, MatProgressSpinnerModule, MatRadioModule,
MatCheckboxModule, MatRippleModule, MatSelectModule, MatSlideToggleModule, MatTableModule, MatTabsModule,
MatChipsModule, MatMenuModule, MatProgressBarModule, MatSidenavModule, MatSnackBarModule, MatToolbarModule,
MatDatepickerModule, MatTooltipModule, MatDatetimepickerModule, MatNativeDatetimeModule, MatExpansionModule, MatBadgeModule
MatDialogModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatNativeDateModule,
MatOptionModule,
MatProgressSpinnerModule,
MatRadioModule,
MatRippleModule,
MatSelectModule,
MatSlideToggleModule,
MatTableModule,
MatTabsModule,
MatMenuModule,
MatProgressBarModule,
MatSidenavModule,
MatSnackBarModule,
MatToolbarModule,
MatDatetimepickerModule,
MatNativeDatetimeModule,
MatExpansionModule,
MatBadgeModule
] ]
}) })
export class MaterialModule {} export class MaterialModule {}

View File

@ -51,7 +51,8 @@
<p class="adf-notification-history-menu-text adf-notification-history-menu-message" <p class="adf-notification-history-menu-text adf-notification-history-menu-message"
*ngFor="let message of notification.messages" *ngFor="let message of notification.messages"
mat-line mat-line
[title]="message"> [matTooltip]="message"
matTooltipShowDelay="{{ 1000 }}">
{{ message }} {{ message }}
</p> </p>
<p class="adf-notification-history-menu-text adf-notification-history-menu-date" mat-line> <p class="adf-notification-history-menu-text adf-notification-history-menu-date" mat-line>

View File

@ -29,6 +29,7 @@ import { MatIconModule } from '@angular/material/icon';
import { MatBadgeModule } from '@angular/material/badge'; import { MatBadgeModule } from '@angular/material/badge';
import { MatListModule } from '@angular/material/list'; import { MatListModule } from '@angular/material/list';
import { NgForOf, NgIf } from '@angular/common'; import { NgForOf, NgIf } from '@angular/common';
import { MatTooltipModule } from '@angular/material/tooltip';
import { InitialUsernamePipe, TimeAgoPipe } from '../../pipes'; import { InitialUsernamePipe, TimeAgoPipe } from '../../pipes';
@Component({ @Component({
@ -45,6 +46,7 @@ import { InitialUsernamePipe, TimeAgoPipe } from '../../pipes';
MatListModule, MatListModule,
NgIf, NgIf,
NgForOf, NgForOf,
MatTooltipModule,
TimeAgoPipe, TimeAgoPipe,
InitialUsernamePipe InitialUsernamePipe
], ],

View File

@ -3,7 +3,7 @@
<button <button
mat-icon-button mat-icon-button
*ngFor="let report of reports; let idx = index" *ngFor="let report of reports; let idx = index"
[title]="report.title" [matTooltip]="report.title"
[color]="isCurrent(idx) ? 'primary' : null" [color]="isCurrent(idx) ? 'primary' : null"
(click)="selectCurrent(idx)" (click)="selectCurrent(idx)"
> >

View File

@ -21,6 +21,7 @@ import { Chart } from '../../diagram/models/chart/chart.model';
import { AnalyticsService } from '../services/analytics.service'; import { AnalyticsService } from '../services/analytics.service';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { NgChartsModule } from 'ng2-charts'; import { NgChartsModule } from 'ng2-charts';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@ -34,6 +35,7 @@ import { AnalyticsReportHeatMapComponent } from './analytics-report-heat-map.com
imports: [ imports: [
CommonModule, CommonModule,
MatButtonModule, MatButtonModule,
MatTooltipModule,
MatIconModule, MatIconModule,
NgChartsModule, NgChartsModule,
TranslateModule, TranslateModule,

View File

@ -10,7 +10,7 @@
<adf-toolbar class="adf-cloud-form-toolbar" *ngIf="displayMode === 'fullScreen' && findDisplayConfiguration('fullScreen')?.options?.displayToolbar"> <adf-toolbar class="adf-cloud-form-toolbar" *ngIf="displayMode === 'fullScreen' && findDisplayConfiguration('fullScreen')?.options?.displayToolbar">
<div class="adf-cloud-form__form-title"> <div class="adf-cloud-form__form-title">
<span class="adf-cloud-form__display-name" [title]="form.taskName"> <span class="adf-cloud-form__display-name" [matTooltip]="form.taskName">
{{form.taskName}} {{form.taskName}}
<ng-container *ngIf="!form.taskName"> <ng-container *ngIf="!form.taskName">
{{'FORM.FORM_RENDERER.NAMELESS_TASK' | translate}} {{'FORM.FORM_RENDERER.NAMELESS_TASK' | translate}}
@ -23,7 +23,7 @@
data-automation-id="adf-toolbar-right-back" data-automation-id="adf-toolbar-right-back"
[attr.aria-label]="'ADF_VIEWER.ACTIONS.CLOSE' | translate" [attr.aria-label]="'ADF_VIEWER.ACTIONS.CLOSE' | translate"
[attr.data-automation-id]="'adf-cloud-form-close-button'" [attr.data-automation-id]="'adf-cloud-form-close-button'"
[title]="'ADF_VIEWER.ACTIONS.CLOSE' | translate" [matTooltip]="'ADF_VIEWER.ACTIONS.CLOSE' | translate"
mat-icon-button mat-icon-button
title="{{ 'ADF_VIEWER.ACTIONS.CLOSE' | translate }}" title="{{ 'ADF_VIEWER.ACTIONS.CLOSE' | translate }}"
(click)="switchToDisplayMode()"> (click)="switchToDisplayMode()">
@ -48,12 +48,12 @@
<mat-icon>fullscreen</mat-icon> <mat-icon>fullscreen</mat-icon>
</button> </button>
</div> </div>
<div *ngIf="showRefreshButton" class="adf-cloud-form-reload-button" [title]="'ADF_VIEWER.ACTIONS.FULLSCREEN' | translate"> <div *ngIf="showRefreshButton" class="adf-cloud-form-reload-button" [matTooltip]="'ADF_VIEWER.ACTIONS.FULLSCREEN' | translate">
<button mat-icon-button (click)="onRefreshClicked()" [attr.aria-label]="'ADF_VIEWER.ACTIONS.FULLSCREEN' | translate"> <button mat-icon-button (click)="onRefreshClicked()" [attr.aria-label]="'ADF_VIEWER.ACTIONS.FULLSCREEN' | translate">
<mat-icon>refresh</mat-icon> <mat-icon>refresh</mat-icon>
</button> </button>
</div> </div>
<span *ngIf="isTitleEnabled()" class="adf-cloud-form-title" [title]="form.taskName"> <span *ngIf="isTitleEnabled()" class="adf-cloud-form-title" [matTooltip]="form.taskName">
{{form.taskName}} {{form.taskName}}
<ng-container *ngIf="!form.taskName"> <ng-container *ngIf="!form.taskName">
{{'FORM.FORM_RENDERER.NAMELESS_TASK' | translate}} {{'FORM.FORM_RENDERER.NAMELESS_TASK' | translate}}

View File

@ -12,7 +12,9 @@
class="adf-attach-widget__menu-upload__button" class="adf-attach-widget__menu-upload__button"
color="primary" color="primary"
[id]="field.id" [id]="field.id"
[title]="field.tooltip"> [matTooltip]="field.tooltip"
matTooltipPosition="above"
matTooltipShowDelay="1000">
{{ 'FORM.FIELD.ATTACH' | translate }} {{ 'FORM.FIELD.ATTACH' | translate }}
<mat-icon class="adf-attach-widget__menu-upload__button__icon">{{getWidgetIcon()}}</mat-icon> <mat-icon class="adf-attach-widget__menu-upload__button__icon">{{getWidgetIcon()}}</mat-icon>
</button> </button>

View File

@ -71,6 +71,9 @@ import {
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
import { of, throwError } from 'rxjs'; import { of, throwError } from 'rxjs';
import { FormCloudModule } from '../../../form-cloud.module'; import { FormCloudModule } from '../../../form-cloud.module';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
const mockNodeToBeVersioned: any = { const mockNodeToBeVersioned: any = {
isFile: true, isFile: true,
@ -122,6 +125,7 @@ describe('AttachFileCloudWidgetComponent', () => {
let localizedDataPipe: LocalizedDatePipe; let localizedDataPipe: LocalizedDatePipe;
let newVersionUploaderService: NewVersionUploaderService; let newVersionUploaderService: NewVersionUploaderService;
let notificationService: NotificationService; let notificationService: NotificationService;
let loader: HarnessLoader;
const createUploadWidgetField = ( const createUploadWidgetField = (
form: FormModel, form: FormModel,
@ -165,6 +169,7 @@ describe('AttachFileCloudWidgetComponent', () => {
contentNodeSelectorPanelService = TestBed.inject(ContentNodeSelectorPanelService); contentNodeSelectorPanelService = TestBed.inject(ContentNodeSelectorPanelService);
openUploadFileDialogSpy = spyOn(contentCloudNodeSelectorService, 'openUploadFileDialog').and.returnValue(of([fakeNode])); openUploadFileDialogSpy = spyOn(contentCloudNodeSelectorService, 'openUploadFileDialog').and.returnValue(of([fakeNode]));
localizedDataPipe = new LocalizedDatePipe(); localizedDataPipe = new LocalizedDatePipe();
loader = TestbedHarnessEnvironment.loader(fixture);
}); });
afterEach(() => { afterEach(() => {
@ -921,4 +926,37 @@ describe('AttachFileCloudWidgetComponent', () => {
expect(spyOnShowError).toHaveBeenCalledWith(mockError.value); expect(spyOnShowError).toHaveBeenCalledWith(mockError.value);
}); });
}); });
describe('when tooltip is set', () => {
beforeEach(() => {
widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), {
type: FormFieldTypes.UPLOAD,
tooltip: 'my custom tooltip'
});
fixture.detectChanges();
});
it('should show tooltip', async () => {
const attachButton = fixture.nativeElement.querySelector('button');
attachButton.dispatchEvent(new Event('mouseenter'));
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeTrue();
expect(await tooltipElement.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const attachButton = fixture.nativeElement.querySelector('.adf-attach-widget__menu-upload__button');
attachButton.dispatchEvent(new Event('mouseenter'));
fixture.detectChanges();
attachButton.dispatchEvent(new Event('mouseleave'));
fixture.detectChanges();
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeFalse();
});
});
}); });

View File

@ -20,7 +20,8 @@
</div> </div>
<div *ngIf="(!hasFile || multipleOption) && !field.readOnly"> <div *ngIf="(!hasFile || multipleOption) && !field.readOnly">
<button mat-raised-button color="primary" (click)="uploadFiles.click()" [title]="field.tooltip"> <button mat-raised-button color="primary" (click)="uploadFiles.click()" [matTooltip]="field.tooltip"
matTooltipPosition="above" matTooltipShowDelay="1000">
{{ 'FORM.FIELD.UPLOAD' | translate }}<mat-icon>file_upload</mat-icon> {{ 'FORM.FIELD.UPLOAD' | translate }}<mat-icon>file_upload</mat-icon>
<input #uploadFiles [multiple]="multipleOption" type="file" [id]="field.form.nodeId" <input #uploadFiles [multiple]="multipleOption" type="file" [id]="field.form.nodeId"
(change)="onFileChanged($event)" /> (change)="onFileChanged($event)" />

View File

@ -15,7 +15,9 @@
[min]="minDate" [min]="minDate"
[max]="maxDate" [max]="maxDate"
[disabled]="field.readOnly" [disabled]="field.readOnly"
[title]="field.tooltip" [matTooltip]="field.tooltip"
matTooltipPosition="above"
matTooltipShowDelay="1000"
(dateChange)="onDateChanged($event)" (dateChange)="onDateChanged($event)"
(blur)="markAsTouched()"> (blur)="markAsTouched()">
<mat-datepicker-toggle matSuffix [for]="datePicker" [disabled]="field.readOnly"></mat-datepicker-toggle> <mat-datepicker-toggle matSuffix [for]="datePicker" [disabled]="field.readOnly"></mat-datepicker-toggle>

View File

@ -21,6 +21,10 @@ import { FormFieldModel, FormModel, FormFieldTypes, DateFieldValidator, MinDateF
import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module'; import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module';
import { DateAdapter } from '@angular/material/core'; import { DateAdapter } from '@angular/material/core';
import { isEqual, subDays, addDays } from 'date-fns'; import { isEqual, subDays, addDays } from 'date-fns';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { MatInputHarness } from '@angular/material/input/testing';
describe('DateWidgetComponent', () => { describe('DateWidgetComponent', () => {
let widget: DateCloudWidgetComponent; let widget: DateCloudWidgetComponent;
@ -28,6 +32,7 @@ describe('DateWidgetComponent', () => {
let element: HTMLElement; let element: HTMLElement;
let adapter: DateAdapter<Date>; let adapter: DateAdapter<Date>;
let form: FormModel; let form: FormModel;
let loader: HarnessLoader;
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
@ -42,6 +47,7 @@ describe('DateWidgetComponent', () => {
widget = fixture.componentInstance; widget = fixture.componentInstance;
element = fixture.nativeElement; element = fixture.nativeElement;
loader = TestbedHarnessEnvironment.loader(fixture);
}); });
it('should setup min value for date picker', () => { it('should setup min value for date picker', () => {
@ -427,6 +433,34 @@ describe('DateWidgetComponent', () => {
}); });
}); });
describe('when tooltip is set', () => {
beforeEach(() => {
widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), {
type: FormFieldTypes.DATE,
tooltip: 'my custom tooltip'
});
fixture.detectChanges();
});
it('should show tooltip', async () => {
const dateCloudInput = await loader.getHarness(MatInputHarness);
await (await dateCloudInput.host()).dispatchEvent('mouseenter');
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeTruthy();
expect(await tooltipElement.getTooltipText()).toEqual('my custom tooltip');
});
it('should hide tooltip', async () => {
const dateCloudInput = await loader.getHarness(MatInputHarness);
await (await dateCloudInput.host()).dispatchEvent('mouseenter');
await (await dateCloudInput.host()).dispatchEvent('mouseleave');
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeFalsy();
});
});
describe('when is required', () => { describe('when is required', () => {
beforeEach(() => { beforeEach(() => {
widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), { widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), {

View File

@ -16,10 +16,12 @@
[disabled]="field.readOnly" [disabled]="field.readOnly"
[compareWith]="compareDropdownValues" [compareWith]="compareDropdownValues"
(ngModelChange)="selectionChangedForField(field)" (ngModelChange)="selectionChangedForField(field)"
[title]="field.tooltip" [matTooltip]="field.tooltip"
[required]="isRequired()" [required]="isRequired()"
panelClass="adf-select-filter" panelClass="adf-select-filter"
(blur)="markAsTouched()" (blur)="markAsTouched()"
matTooltipPosition="above"
matTooltipShowDelay="1000"
[multiple]="field.hasMultipleValues"> [multiple]="field.hasMultipleValues">
<adf-select-filter-input *ngIf="showInputFilter" (change)="filter$.next($event)"></adf-select-filter-input> <adf-select-filter-input *ngIf="showInputFilter" (change)="filter$.next($event)"></adf-select-filter-input>

View File

@ -37,6 +37,7 @@ import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatSelectHarness } from '@angular/material/select/testing'; import { MatSelectHarness } from '@angular/material/select/testing';
import { MatFormFieldHarness } from '@angular/material/form-field/testing'; import { MatFormFieldHarness } from '@angular/material/form-field/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
describe('DropdownCloudWidgetComponent', () => { describe('DropdownCloudWidgetComponent', () => {
let formService: FormService; let formService: FormService;
@ -258,6 +259,38 @@ describe('DropdownCloudWidgetComponent', () => {
}); });
}); });
describe('when tooltip is set', () => {
beforeEach(() => {
widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), {
type: FormFieldTypes.DROPDOWN,
tooltip: 'my custom tooltip'
});
fixture.detectChanges();
});
it('should show tooltip', async () => {
const dropdown = await loader.getHarness(MatSelectHarness.with({ selector: '.adf-select' }));
const dropdownInput = await dropdown.host();
dropdownInput.dispatchEvent('mouseenter');
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(tooltipElement).toBeTruthy();
expect(await tooltipElement.getTooltipText()).toBe('my custom tooltip');
expect(await tooltipElement.isOpen()).toBeTruthy();
});
it('should hide tooltip', async () => {
const dropdown = await loader.getHarness(MatSelectHarness.with({ selector: '.adf-select' }));
const dropdownInput = await dropdown.host();
await dropdownInput.dispatchEvent('mouseenter');
await dropdownInput.dispatchEvent('mouseleave');
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeFalsy();
});
});
describe('when is required', () => { describe('when is required', () => {
beforeEach(() => { beforeEach(() => {
widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), { widget.field = new FormFieldModel(new FormModel({ taskId: '<id>' }), {

View File

@ -15,7 +15,9 @@
(changedGroups)="onChangedGroup($event)" (changedGroups)="onChangedGroup($event)"
[preSelectGroups]="preSelectGroup" [preSelectGroups]="preSelectGroup"
(blur)="markAsTouched()" (blur)="markAsTouched()"
[attr.title]="field.tooltip"> [matTooltip]="field.tooltip"
[matTooltipPosition]="'above'"
[matTooltipShowDelay]="1000">
</adf-cloud-group> </adf-cloud-group>
<error-widget [error]="field.validationSummary"></error-widget> <error-widget [error]="field.validationSummary"></error-widget>
<error-widget class="adf-dropdown-required-message" *ngIf="isInvalidFieldRequired() && isTouched()" <error-widget class="adf-dropdown-required-message" *ngIf="isInvalidFieldRequired() && isTouched()"

View File

@ -22,6 +22,7 @@ import { ProcessServiceCloudTestingModule } from '../../../../testing/process-se
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { HarnessLoader } from '@angular/cdk/testing'; import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { MatChipHarness } from '@angular/material/chips/testing'; import { MatChipHarness } from '@angular/material/chips/testing';
import { MatFormFieldHarness } from '@angular/material/form-field/testing'; import { MatFormFieldHarness } from '@angular/material/form-field/testing';
@ -73,8 +74,23 @@ describe('GroupCloudWidgetComponent', () => {
await fixture.whenStable(); await fixture.whenStable();
fixture.detectChanges(); fixture.detectChanges();
const tooltip = cloudGroupInput.getAttribute('title'); const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toEqual('my custom tooltip'); expect(await tooltipElement.isOpen()).toBeTruthy();
expect(await tooltipElement.getTooltipText()).toEqual('my custom tooltip');
});
it('should hide tooltip', async () => {
const cloudGroupInput = element.querySelector('[data-automation-id="adf-cloud-group-search-input"]');
cloudGroupInput.dispatchEvent(new Event('mouseenter'));
await fixture.whenStable();
fixture.detectChanges();
cloudGroupInput.dispatchEvent(new Event('mouseleave'));
await fixture.whenStable();
fixture.detectChanges();
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeFalsy();
}); });
}); });
@ -151,8 +167,8 @@ describe('GroupCloudWidgetComponent', () => {
const formField = await loader.getHarness(MatFormFieldHarness); const formField = await loader.getHarness(MatFormFieldHarness);
expect(await formField.isDisabled()).toBeTrue(); expect(await formField.isDisabled()).toBeTrue();
const groupChip = await loader.getHarness(MatChipHarness); const gtoupChip = await loader.getHarness(MatChipHarness);
expect(await groupChip.isDisabled()).toBeTrue(); expect(await gtoupChip.isDisabled()).toBeTrue();
}); });
it('should multi chips be disabled', async () => { it('should multi chips be disabled', async () => {

View File

@ -17,7 +17,9 @@
[mode]="mode" [mode]="mode"
[groupsRestriction]="groupsRestriction" [groupsRestriction]="groupsRestriction"
(blur)="markAsTouched()" (blur)="markAsTouched()"
[attr.title]="field.tooltip"> [matTooltip]="field.tooltip"
matTooltipPosition="above"
matTooltipShowDelay="1000">
</adf-cloud-people> </adf-cloud-people>
<error-widget [error]="field.validationSummary"></error-widget> <error-widget [error]="field.validationSummary"></error-widget>
<error-widget class="adf-dropdown-required-message" *ngIf="isInvalidFieldRequired() && isTouched()" <error-widget class="adf-dropdown-required-message" *ngIf="isInvalidFieldRequired() && isTouched()"

View File

@ -24,6 +24,7 @@ import { IdentityUserService } from '../../../../people/services/identity-user.s
import { mockShepherdsPie, mockYorkshirePudding } from '../../../../people/mock/people-cloud.mock'; import { mockShepherdsPie, mockYorkshirePudding } from '../../../../people/mock/people-cloud.mock';
import { HarnessLoader } from '@angular/cdk/testing'; import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
import { MatFormFieldHarness } from '@angular/material/form-field/testing'; import { MatFormFieldHarness } from '@angular/material/form-field/testing';
import { MatChipHarness } from '@angular/material/chips/testing'; import { MatChipHarness } from '@angular/material/chips/testing';
@ -101,8 +102,23 @@ describe('PeopleCloudWidgetComponent', () => {
await fixture.whenStable(); await fixture.whenStable();
fixture.detectChanges(); fixture.detectChanges();
const tooltip = cloudPeopleInput.getAttribute('title'); const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toEqual('my custom tooltip'); expect(await tooltipElement.isOpen()).toBeTruthy();
expect(await tooltipElement.getTooltipText()).toEqual('my custom tooltip');
});
it('should hide tooltip', async () => {
const cloudPeopleInput = element.querySelector('adf-cloud-people');
cloudPeopleInput.dispatchEvent(new Event('mouseenter'));
await fixture.whenStable();
fixture.detectChanges();
cloudPeopleInput.dispatchEvent(new Event('mouseleave'));
await fixture.whenStable();
fixture.detectChanges();
const tooltipElement = await loader.getHarness(MatTooltipHarness);
expect(await tooltipElement.isOpen()).toBeFalsy();
}); });
}); });

View File

@ -4,7 +4,9 @@
<label class="adf-label" [attr.for]="field.id">{{field.name | translate }}<span class="adf-asterisk" *ngIf="isRequired()">*</span></label> <label class="adf-label" [attr.for]="field.id">{{field.name | translate }}<span class="adf-asterisk" *ngIf="isRequired()">*</span></label>
<mat-radio-group [ngClass]="(field.alignmentType === 'vertical') ? 'adf-radio-group': 'adf-radio-group-horizontal'" class="adf-radio-group" [(ngModel)]="field.value" [disabled]="field.readOnly"> <mat-radio-group [ngClass]="(field.alignmentType === 'vertical') ? 'adf-radio-group': 'adf-radio-group-horizontal'" class="adf-radio-group" [(ngModel)]="field.value" [disabled]="field.readOnly">
<mat-radio-button <mat-radio-button
[title]="field.tooltip" [matTooltip]="field.tooltip"
matTooltipPosition="above"
matTooltipShowDelay="1000"
[id]="field.id + '-' + opt.id" [id]="field.id + '-' + opt.id"
[name]="field.id" [name]="field.id"
[value]="opt.id" [value]="opt.id"

View File

@ -24,6 +24,7 @@ import { of, throwError } from 'rxjs';
import { HarnessLoader } from '@angular/cdk/testing'; import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatRadioButtonHarness, MatRadioGroupHarness } from '@angular/material/radio/testing'; import { MatRadioButtonHarness, MatRadioGroupHarness } from '@angular/material/radio/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
describe('RadioButtonsCloudWidgetComponent', () => { describe('RadioButtonsCloudWidgetComponent', () => {
let fixture: ComponentFixture<RadioButtonsCloudWidgetComponent>; let fixture: ComponentFixture<RadioButtonsCloudWidgetComponent>;
@ -218,8 +219,19 @@ describe('RadioButtonsCloudWidgetComponent', () => {
it('should show tooltip', async () => { it('should show tooltip', async () => {
const radioButton = await loader.getHarness(MatRadioButtonHarness); const radioButton = await loader.getHarness(MatRadioButtonHarness);
await (await radioButton.host()).hover(); await (await radioButton.host()).hover();
const tooltip = await (await radioButton.host()).getAttribute('title'); const tooltip = await loader.getHarness(MatTooltipHarness);
expect(tooltip).toBe('my custom tooltip'); expect(await tooltip.getTooltipText()).toBe('my custom tooltip');
});
it('should hide tooltip', async () => {
const radioButton = await loader.getHarness(MatRadioButtonHarness);
const tooltipElement = await loader.getHarness(MatTooltipHarness);
await (await radioButton.host()).hover();
expect(await tooltipElement.isOpen()).toBeTrue();
await (await radioButton.host()).mouseAway();
expect(await tooltipElement.isOpen()).toBeFalse();
}); });
}); });
}); });

View File

@ -8,7 +8,7 @@
[removable]="!(group.readonly)" [removable]="!(group.readonly)"
[attr.data-automation-id]="'adf-cloud-group-chip-' + group.name" [attr.data-automation-id]="'adf-cloud-group-chip-' + group.name"
(removed)="onRemove(group)" (removed)="onRemove(group)"
title="{{ (group.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}"> matTooltip="{{ (group.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}">
{{group.name}} {{group.name}}
<mat-icon <mat-icon
*ngIf="!(group.readonly || readOnly)" *ngIf="!(group.readonly || readOnly)"

View File

@ -37,56 +37,25 @@ import { MatSelectModule } from '@angular/material/select';
import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs'; import { MatTabsModule } from '@angular/material/tabs';
import { MatTooltipModule } from '@angular/material/tooltip';
@NgModule({ @NgModule({
providers: [{ provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { floatLabel: 'never' } }], providers: [
{ provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { floatLabel: 'never' } }
],
imports: [ imports: [
MatAutocompleteModule, MatAutocompleteModule, MatButtonModule, MatCardModule, MatDialogModule,
MatButtonModule, MatCheckboxModule, MatDatepickerModule, MatGridListModule, MatIconModule, MatInputModule,
MatCardModule, MatListModule, MatOptionModule, MatRadioModule, MatSelectModule, MatSlideToggleModule, MatTableModule,
MatDialogModule, MatTabsModule, MatProgressSpinnerModule, MatNativeDateModule, MatRippleModule, MatTooltipModule,
MatCheckboxModule, MatChipsModule, MatMenuModule, MatExpansionModule
MatDatepickerModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatOptionModule,
MatRadioModule,
MatSelectModule,
MatSlideToggleModule,
MatTableModule,
MatTabsModule,
MatProgressSpinnerModule,
MatNativeDateModule,
MatRippleModule,
MatChipsModule,
MatMenuModule,
MatExpansionModule
], ],
exports: [ exports: [
MatAutocompleteModule, MatAutocompleteModule, MatButtonModule, MatCardModule, MatDialogModule,
MatButtonModule, MatCheckboxModule, MatDatepickerModule, MatGridListModule, MatIconModule, MatInputModule,
MatCardModule, MatListModule, MatOptionModule, MatRadioModule, MatSelectModule, MatSlideToggleModule, MatTableModule,
MatDialogModule, MatTabsModule, MatProgressSpinnerModule, MatNativeDateModule, MatRippleModule, MatTooltipModule,
MatCheckboxModule, MatChipsModule, MatMenuModule, MatExpansionModule
MatDatepickerModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatOptionModule,
MatRadioModule,
MatSelectModule,
MatSlideToggleModule,
MatTableModule,
MatTabsModule,
MatProgressSpinnerModule,
MatNativeDateModule,
MatRippleModule,
MatChipsModule,
MatMenuModule,
MatExpansionModule
] ]
}) })
export class MaterialModule {} export class MaterialModule {}

View File

@ -8,7 +8,7 @@
[removable]="!(user.readonly)" [removable]="!(user.readonly)"
[attr.data-automation-id]="'adf-people-cloud-chip-' + user.username" [attr.data-automation-id]="'adf-people-cloud-chip-' + user.username"
(removed)="onRemove(user)" (removed)="onRemove(user)"
title="{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}"> matTooltip="{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}">
{{user | fullName}} {{user | fullName}}
<mat-icon <mat-icon
matChipRemove matChipRemove

View File

@ -8,7 +8,7 @@
<span *ngIf="showTitle"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span> <span *ngIf="showTitle"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span>
<div *ngIf="showFilterActions" class="adf-cloud-edit-process-filter-actions"> <div *ngIf="showFilterActions" class="adf-cloud-edit-process-filter-actions">
<ng-container *ngIf="toggleFilterActions"> <ng-container *ngIf="toggleFilterActions">
<button *ngFor="let filterAction of processFilterActions" mat-icon-button title="{{ filterAction.tooltip | translate}}" [attr.data-automation-id]="'adf-filter-action-' + filterAction.actionType" [disabled]="isDisabledAction(filterAction)" (click)="executeFilterActions($event, filterAction)"> <button *ngFor="let filterAction of processFilterActions" mat-icon-button matTooltip="{{ filterAction.tooltip | translate}}" [attr.data-automation-id]="'adf-filter-action-' + filterAction.actionType" [disabled]="isDisabledAction(filterAction)" (click)="executeFilterActions($event, filterAction)">
<adf-icon [value]="filterAction.icon"></adf-icon> <adf-icon [value]="filterAction.icon"></adf-icon>
</button> </button>
</ng-container> </ng-container>

View File

@ -10,7 +10,7 @@
<ng-container *ngIf="toggleFilterActions"> <ng-container *ngIf="toggleFilterActions">
<button *ngFor="let filterAction of taskFilterActions" <button *ngFor="let filterAction of taskFilterActions"
mat-icon-button mat-icon-button
title="{{ filterAction.tooltip | translate}}" matTooltip="{{ filterAction.tooltip | translate}}"
[attr.data-automation-id]="'adf-filter-action-' + filterAction.actionType" [attr.data-automation-id]="'adf-filter-action-' + filterAction.actionType"
[disabled]="isDisabledAction(filterAction)" [disabled]="isDisabledAction(filterAction)"
(click)="executeFilterActions(filterAction)"> (click)="executeFilterActions(filterAction)">

View File

@ -20,7 +20,7 @@
<mat-icon>refresh</mat-icon> <mat-icon>refresh</mat-icon>
</button> </button>
</div> </div>
<span *ngIf="isTitleEnabled()" class="adf-form-title" [title]="form.taskName"> <span *ngIf="isTitleEnabled()" class="adf-form-title" [matTooltip]="form.taskName">
{{form.taskName}} {{form.taskName}}
<ng-container *ngIf="!form.taskName"> <ng-container *ngIf="!form.taskName">
{{'FORM.FORM_RENDERER.NAMELESS_TASK' | translate}} {{'FORM.FORM_RENDERER.NAMELESS_TASK' | translate}}

View File

@ -45,12 +45,13 @@ import { CommonModule } from '@angular/common';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@Component({ @Component({
selector: 'adf-form', selector: 'adf-form',
standalone: true, standalone: true,
imports: [CommonModule, MatCardModule, MatButtonModule, MatIconModule, TranslateModule, FormRendererComponent, FormatSpacePipe], imports: [CommonModule, MatCardModule, MatButtonModule, MatIconModule, MatTooltipModule, TranslateModule, FormRendererComponent, FormatSpacePipe],
templateUrl: './form.component.html', templateUrl: './form.component.html',
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })

View File

@ -72,7 +72,7 @@
matLine matLine
id="{{ 'file-' + file.id }}" id="{{ 'file-' + file.id }}"
(click)="onAttachFileClicked(file)" (click)="onAttachFileClicked(file)"
[title]="file.name" [matTooltip]="file.name"
(keyup.enter)="onAttachFileClicked(file)" (keyup.enter)="onAttachFileClicked(file)"
tabindex="0" tabindex="0"
role="button" role="button"

View File

@ -33,11 +33,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { MatListModule } from '@angular/material/list'; import { MatListModule } from '@angular/material/list';
import { MatTooltipModule } from '@angular/material/tooltip';
@Component({ @Component({
selector: 'attach-widget', selector: 'attach-widget',
standalone: true, standalone: true,
imports: [CommonModule, TranslateModule, MatIconModule, MatButtonModule, MatMenuModule, MatListModule, ErrorWidgetComponent], imports: [CommonModule, TranslateModule, MatIconModule, MatButtonModule, MatMenuModule, MatListModule, MatTooltipModule, ErrorWidgetComponent],
templateUrl: './attach-file-widget.component.html', templateUrl: './attach-file-widget.component.html',
styleUrls: ['./attach-file-widget.component.scss'], styleUrls: ['./attach-file-widget.component.scss'],
host: { host: {

View File

@ -14,7 +14,9 @@
[placeholder]="field.placeholder" [placeholder]="field.placeholder"
[matAutocomplete]="auto" [matAutocomplete]="auto"
(blur)="markAsTouched()" (blur)="markAsTouched()"
[title]="field.tooltip"> [matTooltip]="field.tooltip"
matTooltipPosition="above"
matTooltipShowDelay="1000">
<mat-autocomplete class="adf-people-widget-list" <mat-autocomplete class="adf-people-widget-list"
#auto="matAutocomplete" #auto="matAutocomplete"
(optionSelected)="onItemSelect($event.option.value)" (optionSelected)="onItemSelect($event.option.value)"

View File

@ -293,7 +293,7 @@ describe('PeopleWidgetComponent', () => {
await fixture.whenStable(); await fixture.whenStable();
const radioButtonsElement: any = element.querySelector('#people-id'); const radioButtonsElement: any = element.querySelector('#people-id');
const tooltip = radioButtonsElement.getAttribute('title'); const tooltip = radioButtonsElement.getAttribute('ng-reflect-message');
expect(tooltip).toEqual(widget.field.tooltip); expect(tooltip).toEqual(widget.field.tooltip);
}); });

View File

@ -29,6 +29,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatTooltipModule } from '@angular/material/tooltip';
@Component({ @Component({
selector: 'people-widget', selector: 'people-widget',
@ -40,6 +41,7 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete';
MatInputModule, MatInputModule,
ReactiveFormsModule, ReactiveFormsModule,
MatAutocompleteModule, MatAutocompleteModule,
MatTooltipModule,
InitialUsernamePipe, InitialUsernamePipe,
ErrorWidgetComponent ErrorWidgetComponent
], ],

View File

@ -4,7 +4,9 @@
<label class="adf-label" [attr.for]="field.id">{{field.name | translate }}<span class="adf-asterisk" *ngIf="isRequired()">*</span></label> <label class="adf-label" [attr.for]="field.id">{{field.name | translate }}<span class="adf-asterisk" *ngIf="isRequired()">*</span></label>
<mat-radio-group class="adf-radio-group" [(ngModel)]="field.value" [disabled]="field.readOnly"> <mat-radio-group class="adf-radio-group" [(ngModel)]="field.value" [disabled]="field.readOnly">
<mat-radio-button <mat-radio-button
[title]="field.tooltip" [matTooltip]="field.tooltip"
matTooltipPosition="above"
matTooltipShowDelay="1000"
[id]="field.id + '-' + opt.id" [id]="field.id + '-' + opt.id"
[name]="field.id" [name]="field.id"
[value]="opt.id" [value]="opt.id"

View File

@ -27,6 +27,7 @@ import { ProcessDefinitionService } from '../../services/process-definition.serv
import { HarnessLoader } from '@angular/cdk/testing'; import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatRadioButtonHarness, MatRadioGroupHarness } from '@angular/material/radio/testing'; import { MatRadioButtonHarness, MatRadioGroupHarness } from '@angular/material/radio/testing';
import { MatTooltipHarness } from '@angular/material/tooltip/testing';
describe('RadioButtonsWidgetComponent', () => { describe('RadioButtonsWidgetComponent', () => {
let formService: FormService; let formService: FormService;
@ -241,9 +242,9 @@ describe('RadioButtonsWidgetComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
const option = await loader.getHarness(MatRadioButtonHarness.with({ selector: '#radio-id-opt-1' })); const tooltip = await loader.getHarness(MatTooltipHarness.with({ selector: '#radio-id-opt-1' }));
const tooltip = await (await option.host()).getAttribute('title'); await tooltip.show();
expect(tooltip).toEqual(radioButtonWidget.field.tooltip); expect(await tooltip.getTooltipText()).toEqual(radioButtonWidget.field.tooltip);
}); });
describe('and radioButton is populated via taskId', () => { describe('and radioButton is populated via taskId', () => {

View File

@ -25,11 +25,12 @@ import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { MatRadioModule } from '@angular/material/radio'; import { MatRadioModule } from '@angular/material/radio';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatTooltipModule } from '@angular/material/tooltip';
@Component({ @Component({
selector: 'radio-buttons-widget', selector: 'radio-buttons-widget',
standalone: true, standalone: true,
imports: [CommonModule, TranslateModule, MatRadioModule, FormsModule, ErrorWidgetComponent], imports: [CommonModule, TranslateModule, MatRadioModule, FormsModule, MatTooltipModule, ErrorWidgetComponent],
templateUrl: './radio-buttons.widget.html', templateUrl: './radio-buttons.widget.html',
styleUrls: ['./radio-buttons.widget.scss'], styleUrls: ['./radio-buttons.widget.scss'],
host: { host: {

View File

@ -5,7 +5,7 @@
</mat-chip-list> </mat-chip-list>
<button mat-icon-button *ngIf="!readOnly" title="Add a checklist" <button mat-icon-button *ngIf="!readOnly" matTooltip="Add a checklist" [matTooltipPosition]="'before'"
id="add-checklist" class="adf-add-to-checklist-button" (click)="showDialog()"> id="add-checklist" class="adf-add-to-checklist-button" (click)="showDialog()">
<mat-icon>add</mat-icon> <mat-icon>add</mat-icon>
</button> </button>

View File

@ -23,6 +23,7 @@ import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { MatChipsModule } from '@angular/material/chips'; import { MatChipsModule } from '@angular/material/chips';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
@ -36,6 +37,7 @@ import { FormsModule } from '@angular/forms';
TranslateModule, TranslateModule,
MatChipsModule, MatChipsModule,
MatButtonModule, MatButtonModule,
MatTooltipModule,
MatIconModule, MatIconModule,
MatDialogModule, MatDialogModule,
MatFormFieldModule, MatFormFieldModule,