97399 Improvements to ContextHelpDirective and ContextHelpWrapperComponent

This commit is contained in:
Koen Pauwels
2022-12-16 16:50:17 +01:00
parent a40d93a941
commit 28a127ca0e
8 changed files with 49 additions and 51 deletions

View File

@@ -1,8 +1,9 @@
<ng-container *ngVar="(communitiesRD$ | async) as communitiesRD"> <ng-container *ngVar="(communitiesRD$ | async) as communitiesRD">
<div *ngIf="communitiesRD?.hasSucceeded "> <div *ngIf="communitiesRD?.hasSucceeded ">
<h2> <h2>
<span *dsContextHelp="'context-help.multi-para.test'" <span *dsContextHelp="{content: 'context-help.multi-para.test',
dsTooltipPlacment="right left"> tooltipPlacement: 'top',
iconPlacement: 'right'}">
{{'home.top-level-communities.head' | translate}}</span> {{'home.top-level-communities.head' | translate}}</span>
</h2> </h2>
<p class="lead">{{'home.top-level-communities.help' | translate}}</p> <p class="lead">{{'home.top-level-communities.help' | translate}}</p>

View File

@@ -1,26 +1,12 @@
<!-- Set tooltip text. -->
<ng-template #help> <ng-template #help>
<div class="preserve-line-breaks ds-context-help-content">{{ content | translate }}</div> <div class="preserve-line-breaks ds-context-help-content">{{ content | translate }}</div>
</ng-template> </ng-template>
<i [ngClass]="{'ds-context-help-icon fas fa-question-circle shadow-sm': true,
<!-- Help icon, add tooltip to help icon. --> 'ds-context-help-icon-right': iconPlacement == 'right',
<i class="ds-context-help-icon fas fa-question-circle shadow-sm" 'ds-context-help-icon-left': iconPlacement == 'left'}"
[ngbTooltip]="help" [ngbTooltip]="help"
[placement]="tooltipPlacement"
container="'body'" container="'body'"
triggers="click:blur"> triggers="click:blur">
</i> </i>
<!-- Indicate where to put the template (that is, the contents of
whatever component the context help directive was used on).
-->
<ng-container *ngTemplateOutlet="templateRef"></ng-container> <ng-container *ngTemplateOutlet="templateRef"></ng-container>
<!-- <i class="ds-context-help-icon fas fa-question-circle shadow-sm"></i> -->
<!-- <ng-container *ngTemplateOutlet="templateRef"></ng-container> -->
<!-- *ngClass="{'ds-context-help-icon-right': tooltipPlacement === 'right', 'ds-context-help-icon-left': tooltipPlacement === 'left'}" -->

View File

@@ -5,19 +5,21 @@
.ds-context-help-icon { .ds-context-help-icon {
position: absolute; position: absolute;
top: 0; top: 0;
} cursor: pointer;
.ds-context-help-icon-left {
left: var(--ds-context-x-offset);
color: var(--bs-info); color: var(--bs-info);
background-color: var(--bs-white); background-color: var(--bs-white);
font-size: (--dscontext-help-icon-size); font-size: 16px; // not relative, because we don't want the icon to resize based on the container
line-height: 1; line-height: 1;
border-radius: 50%; border-radius: 50%;
} }
.ds-context-help-icon-left {
left: var(--ds-context-x-offset);
}
.ds-context-help-icon-right { .ds-context-help-icon-right {
right: var(--ds-context-icon-width); right: calc(-1 * var(--ds-context-help-icon-size));
} }
::ng-deep .tooltip-inner { ::ng-deep .tooltip-inner {

View File

@@ -1,23 +1,20 @@
import { Component, Input, OnInit, TemplateRef } from '@angular/core'; import { Component, Input, OnInit, TemplateRef } from '@angular/core';
import { PlacementArray } from '@ng-bootstrap/ng-bootstrap/util/positioning'; import { PlacementArray } from '@ng-bootstrap/ng-bootstrap/util/positioning';
import { PlacementDir } from './placement-dir.model';
// export type PlacementDir = 'left' | 'right';
export type PlacementDir = 'left' | 'right';
@Component({ @Component({
selector: 'ds-context-help-wrapper', selector: 'ds-context-help-wrapper',
templateUrl: './context-help-wrapper.component.html', templateUrl: './context-help-wrapper.component.html',
styleUrls: ['./context-help-wrapper.component.scss'] styleUrls: ['./context-help-wrapper.component.scss'],
}) })
export class ContextHelpWrapperComponent implements OnInit { export class ContextHelpWrapperComponent {
@Input() templateRef: TemplateRef<any>; @Input() templateRef: TemplateRef<any>;
@Input() content: string; @Input() content: string;
@Input() tooltipPlacement: PlacementArray; // TODO: type @Input() tooltipPlacement: PlacementArray;
// @Input('iconPlacement') iconPlacement: string; @Input() iconPlacement: PlacementDir;
constructor() { } constructor() { }
ngOnInit(): void {
// console.log("In ContextHelpWrapperComponent.ngOnInit:", this.content); // XXX
}
} }

View File

@@ -0,0 +1 @@
export type PlacementDir = 'left' | 'right';

View File

@@ -1,29 +1,39 @@
import { ComponentFactoryResolver, ComponentRef, Directive, Input, OnInit, TemplateRef, ViewContainerRef } from '@angular/core'; import { ComponentFactoryResolver, ComponentRef, Directive, ElementRef, Input, OnChanges, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
import { PlacementArray } from '@ng-bootstrap/ng-bootstrap/util/positioning'; import { PlacementArray } from '@ng-bootstrap/ng-bootstrap/util/positioning';
import { ContextHelpWrapperComponent, PlacementDir } from './context-help-wrapper/context-help-wrapper.component'; import { ContextHelpWrapperComponent } from './context-help-wrapper/context-help-wrapper.component';
import { PlacementDir } from './context-help-wrapper/placement-dir.model';
export type ContextHelpDirectiveInput = {
content: string,
tooltipPlacement?: PlacementArray,
iconPlacement?: PlacementDir
}
@Directive({ @Directive({
selector: '[dsContextHelp]' selector: '[dsContextHelp]',
}) })
export class ContextHelpDirective implements OnInit { export class ContextHelpDirective implements OnChanges {
@Input('dsContextHelp') content: string; @Input() dsContextHelp: string | ContextHelpDirectiveInput;
@Input('dsTooltipPlacement') tooltipPlacement: PlacementArray;
// @Input('iconPlacement') iconPlacement: PlacementDir;
protected wrapper: ComponentRef<ContextHelpWrapperComponent>; protected wrapper: ComponentRef<ContextHelpWrapperComponent>;
constructor( constructor(
private templateRef: TemplateRef<any>, private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef, private viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver private componentFactoryResolver: ComponentFactoryResolver,
){} ){}
ngOnInit() { ngOnChanges() {
const input: ContextHelpDirectiveInput = typeof(this.dsContextHelp) === 'string'
? {content: this.dsContextHelp}
: this.dsContextHelp;
const factory const factory
= this.componentFactoryResolver.resolveComponentFactory(ContextHelpWrapperComponent); = this.componentFactoryResolver.resolveComponentFactory(ContextHelpWrapperComponent);
this.wrapper = this.viewContainerRef.createComponent(factory); this.wrapper = this.viewContainerRef.createComponent(factory);
this.wrapper.instance.templateRef = this.templateRef; this.wrapper.instance.templateRef = this.templateRef;
this.wrapper.instance.content = this.content; this.wrapper.instance.content = input.content;
this.wrapper.instance.tooltipPlacement = this.tooltipPlacement; this.wrapper.instance.tooltipPlacement = input.tooltipPlacement;
this.wrapper.instance.iconPlacement = input.iconPlacement;
} }
} }

View File

@@ -180,6 +180,7 @@ import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'
import { ContextHelpDirective } from './context-help.directive'; import { ContextHelpDirective } from './context-help.directive';
import { ContextHelpWrapperComponent } from './context-help-wrapper/context-help-wrapper.component'; import { ContextHelpWrapperComponent } from './context-help-wrapper/context-help-wrapper.component';
const MODULES = [ const MODULES = [
// Do NOT include UniversalModule, HttpModule, or JsonpModule here // Do NOT include UniversalModule, HttpModule, or JsonpModule here
CommonModule, CommonModule,

View File

@@ -87,5 +87,5 @@
--ds-search-form-scope-max-width: 150px; --ds-search-form-scope-max-width: 150px;
--ds-context-x-offset: -16px; --ds-context-x-offset: -16px;
--dscontext-help-icon-size: 16px; --ds-context-help-icon-size: 16px;
} }