Utilitaires sur objet - assistance de sous-sélection (préversion)
La classe HTMLSubSelectionHelper
offre un moyen simple pour votre visuel personnalisé Power BI d’émettre des sous-sélections dans Power BI, ainsi que d’avoir et d’afficher des contours.
HTMLSubSelectionHelper
est une classe d’assistance destinée à faciliter la création et la gestion de contours de sous-sélection. Elle contient des méthodes pour rechercher des éléments sous-sélectionnables.
Les utilitaires exportent des classes et attributs CSS pour faciliter la définition et la maintenance des sous-sélections du visuel.
Remarque
Utilisez la version 6.0.1 ou ultérieure des utilitaires.
Pour définir des éléments sous-sélectionnables, nous devons également ajouter une classe à chaque élément souhaité.
Classe CSS | Objectif | Requis |
---|---|---|
subselectable | Fournir un sélecteur pour que le HTMLSubSelectionHelper trouve des sous-sélections possibles |
Oui |
Pour définir des sous-sélections pour le visuel, quelques attributs doivent être ajoutés aux éléments souhaités.
Nom de l’attribut | Attribut | Objectif | Requis | Type | Exemple |
---|---|---|---|---|---|
SubSelectableDisplayNameAttribute | data-sub-selection-display-name | Fournir une chaîne localisée pour le nom d’affichage de l’élément sous-sélectionné | Oui | string | data-sub-selection-display-name="Nom du visuel" |
SubSelectableObjectNameAttribute | data-sub-selection-object-name | Fournir un nom d’objet à associer aux raccourcis et au style des sous-sélections | Oui | string | data-sub-selection-object-name="nom" |
SubSelectableTypeAttribute | data-sub-selection-type | Fournir le type du style sous-sélectionné | Oui | SubSelectionStylesType | data-sub-selection-type="1" |
SubSelectableDirectEdit | data-sub-selection-direct-edit | Fournir des références directes de modification de texte, notamment CardUID, GroupUID et l’orientation de la zone de texte | non | SubSelectableDirectEdit doit être fourni sous forme de chaîne | data-sub-selection-direct-edit="{"reference":{"cardUid":"Visual-title","groupUid":"title-text","sliceUid":"title-text-text"},"style":0}" |
SubSelectableHideOutlineAttribute | data-sub-selection-hide-outline | Fournir une valeur booléenne pour les éléments sous-sélectionnables qui ne doivent pas avoir de contour visible | non | booléen | data-sub-selection-hide-outline="true" |
SubSelectableRestrictingElementAttribute | data-sub-selection-restricting-element | Utilisé pour indiquer l’élément qui sera restreint, les contours et le type de restriction (ajustement ou masquage) | non | SubSelectionOutlineRestrictionType | data-sub-selection-restricting-element="1" |
SubSelectableSubSelectedAttribute | data-sub-selection-sub-selected | Indiquer si l’élément sous-sélectionnable est sélectionné ou pas | Non, la classe d’assistance l’affecte aux éléments si nécessaire | Boolean | data-subselection-sub-selected="true" |
Mode Mise en forme
Lorsque le visuel entre en mode Mise en forme, vous devez désactiver l’interactivité pour le visuel, car l’utilisateur doit normalement sélectionner le visuel et l’élément visuel pour commencer la mise en forme.
Méthodes publiques HTMLSubSelectionHelper
La classe HTMLSubSelectionHelper
a quelques méthodes publiques que vous pouvez utiliser, mais il y en a deux principales et la classe d’assistance s’occupe du reste.
Les deux méthodes sont setFormatMode
et updateOutlinesFromSubSelections
.
Les méthodes publiques de la classe d’assistance sont les suivantes :
createHtmlSubselectionHelper(args: HtmlSubselectionHelperArgs): HtmlSubSelectionHelper - Il s’agit d’une méthode statique qui prend les arguments de type
HtmlSubselectionHelperArgs
et retourne une instance deHTMLSubSelectionHelper
.setFormatMode(isFormatMode: boolean): void - Cette méthode définit le mode Mise en forme pour HTMLSubSelectionHelper. Si isFormatMode a la valeur true, la classe d’assistance attache les écouteurs d’événements appropriés à l’élément hôte pour activer le mode Mise en forme (sous-sélection, rendu des contours).
getSubSelectionSourceFromEvent(event: PointerEvent): HtmlSubSelectionSource ou undefined - Retourne un objet
HtmlSubSelectionSource
qui est généré en fonction du paramètre d’événement.onVisualScroll(): void - Indique à la classe HTMLSubSelectionHelper que le défilement est en cours. Le défilement doit supprimer les contours jusqu’à ce qu’il se termine.
updateElementOutlines(elements: HTMLElement[], visibility: SubSelectionOutlineVisibility, suppressRender: boolean = false): SubSelectionRegionOutlineId[] - Met à jour les contours (et les émet pour leur rendu dans Power BI) des éléments.
clearHoveredOutline(): void - Cette méthode efface les contours survolés, le cas échéant.
updateRegionOutlines(regionOutlines: HelperSubSelectionRegionOutline[], suppressRender: boolean = false): void - Met à jour et émet les contours donnés pour leur rendu.
getElementsFromSubSelections(subSelections: CustomVisualSubSelection[]): HTMLElement[] - subSelections donnés, cette méthode retourne les HTMLElements appropriés.
updateOutlinesFromSubSelections(subSelections: CustomVisualSubSelection[], clearExistingOutlines?: boolean, suppressRender?: boolean): void - Met à jour et affiche les contours de la subSelection donnée conformément à suppressRender et clearExistingOutlines.
hideAllOutlines(suppressRender: boolean = false): void - Masque tous les contours conformément à suppressRender.
getAllSubSelectables(filterType?: SubSelectionStylesType): CustomVisualSubSelection[] - Retourne tous les éléments subSelectables en fonction du filterType.
createVisualSubSelectionForSingleObject(createVisualSubSelectionArgs: CreateVisualSubSelectionFromObjectArgs): CustomVisualSubSelection - Crée l’objet CustomVisualSubSelection à partir des createVisualSubSelectionArgs.
setDataForElement(el: HTMLElement | SVGElement, data: SubSelectionElementData): void - Méthode statique qui définit les données pour les éléments.
getDataForElement(el: HTMLElement | SVGElement): SubSelectionElementData - Méthode statique qui obtient les éléments précédemment attribués associés en utilisant setDataForElement.
HtmlSubselectionHelperArgs
interface HtmlSubselectionHelperArgs {
/** Element which contains the items that can be sub-selected */
hostElement: HTMLElement; // The host element, the helper will attach the listeners to this element
subSelectionService: powerbi.extensibility.IVisualSubSelectionService;// subSelectionService which is provided in powerbi-visuals-api
selectionIdCallback?: ((e: HTMLElement) => ISelectionId);// a callback that gets the selectionId for the specific element
customOutlineCallback?: ((subSelection: CustomVisualSubSelection) => SubSelectionRegionOutlineFragment[]);// a callback to get custom outline for the specific subSelection
customElementCallback?: ((subSelection: CustomVisualSubSelection) => HTMLElement[]);
subSelectionMetadataCallback?: ((subSelectionElement: HTMLElement) => unknown);// a callback to attatch any meta data to the subSelection.
}
SubSelectionStylesType
const enum SubSelectionStylesType {
None = 0,
Text = 1,
NumericText = 2,
Shape = 3,
}
SubSelectableDirectEdit
interface SubSelectableDirectEdit {
reference: SliceFormattingModelReference;
style: SubSelectableDirectEditStyle;
displayValue?: string;
}
SubSelectionOutlineRestrictionType
const enum SubSelectionOutlineRestrictionType {
/**
* A clamping element will adjust the outline to prevent it from extending beyond
* the restricting element.
*/
Clamp,
/**
* A clipping element will make parts of the outline not visible if the outline extends beyond the
* restricting element's bounds.
*/
Clip
}
Pour ajouter des options de restriction à un élément spécifique, utilisez le HTMLSubSelectionHelper
setDataForElement
type de données avec ce type de données, l’assistance utilise les données pour mettre à jour les contours :
interface SubSelectionElementData {
outlineRestrictionOptions?: SubSelectionOutlineRestrictionOptions;
}
/** Options used to indicate if a restricting element should allow outlines more space to
* generate by adding padding or if the restricting element should constrict the outline more
* by adding a margin.
*/
export interface SubSelectionOutlineRestrictionOptions {
padding?: IOffset;
margin?: IOffset;
}
Exemple
Dans cet exemple, nous implémentons customOutlineCallback
et selectionIdCallback
. Le code suivant est dans Visual Code.
Nous avons un objet dans le visuel appelé arcElement
. Nous voulons afficher le contour lorsque l’élément est survolé ou sous-sélectionné.
import ISelectionId = powerbi.visuals.ISelectionId;
const enum BarChartObjectNames {
ArcElement = 'arcElement',
ColorSelector = 'colorSelector',
…..
}
private ArcOutlines(subSelection: CustomVisualSubSelection): powerbi.visuals.SubSelectionRegionOutlineFragment[] {
const outlines: powerbi.visuals.SubSelectionRegionOutlineFragment[] = []
if (subSelection?.customVisualObjects[0].objectName === BarChartObjectNames.ArcElement) {
const outline: powerbi.visuals.ArcSubSelectionOutline = {
type: powerbi.visuals.SubSelectionOutlineType.Arc,
center: { x: this.arcCenterX, y: this.arcCenterY },
startAngle: this.arcStartAngle,
endAngle: this.arcEndAngle,
innerRadius: this.arcInnerRadius,
outerRadius: this.arcOuterRadius
};
outlines.push({
id: BarChartObjectNames.ArcElement,
outline
});
return outlines;
}
}
public selectionIdCallback(e: Element): ISelectionId {
const elementType: string = d3.select(e).attr(SubSelectableObjectNameAttribute);
switch (elementType) {
case BarChartObjectNames.ColorSelector:
const datum = d3.select<Element, BarChartDataPoint>(e).datum();
return datum.selectionId;
default:
return undefined;
}
}
Importez htmlSubSelectionHelper :
import { HtmlSubSelectionHelper } from 'powerbi-visuals-utils-onobjectutils';
Dans le code du constructeur, créez htmlSubSelectionHelper :
constructor(options: VisualConstructorOptions) {
…….
this.subSelectionHelper = HtmlSubSelectionHelper.createHtmlSubselectionHelper({
hostElement: options.element,
subSelectionService: options.host.subSelectionService,
selectionIdCallback: (e) => this.selectionIdCallback(e),
customOutlineCallback: (e) => this.ArcOutlines(e),
});
….
}
Dans la méthode de mise à jour du visuel, ajoutez le code suivant pour mettre à jour les contours de la subSelection, mettez à jour l’état du mode Mise à jour de la classe HTMLSubSelectionHelper
et désactivez les interactions qui ne sont pas pour le mode Mise en forme si celui-ci est activé :
public update(options: VisualUpdateOptions) {
…
if (this.formatMode) {// disabling interaction with the visual data in format mode
barSelectionMerged.on('click', null);
this.svg.on('click', null);
this.svg.on('contextmenu', null);
} else {
this.handleBarClick(barSelectionMerged);
this.handleClick(barSelectionMerged);
this.handleContextMenu();
}
this.subSelectionHelper.setFormatMode(options.formatMode);
const shouldUpdateSubSelection = options.type & powerbi.VisualUpdateType.Data
|| options.type & powerbi.VisualUpdateType.Resize
|| options.type & powerbi.VisualUpdateType.FormattingSubSelectionChange;
if (this.formatMode && shouldUpdateSubSelection) {
this.subSelectionHelper.updateOutlinesFromSubSelections(options.subSelections, true);
}
…
}