On-object-utils - Subselection Helper (Preview)
Die HTMLSubSelectionHelper
bietet eine einfache Möglichkeit für Ihr benutzerdefiniertes visuelles Power BI-Element, um Unterauswahlen an Power BI zu senden, Konturen abzurufen und zu rendern.
HTMLSubSelectionHelper
ist eine Hilfsklasse, welche die Erstellung und nachfolgende Verwaltung von Unterauswahlkonturen erleichtert. Sie enthält Methoden zum Suchen nach unterauswählbaren Elementen.
Die Utils exportiert CSS-Klassen und -Attribute, sodass das visuelle Element Unterauswahlen leichter definieren und verwalten werden kann.
Hinweis
Verwenden Sie Version 6.0.1 oder höher der Hilfprogramme.
Um unterauswählbare Elemente zu definieren, müssen wir jedem gewünschten Element auch eine Klasse hinzufügen.
CSS Klasse | Zweck | Erforderlich |
---|---|---|
unterauswählbar | Stellt eine Auswahl für HTMLSubSelectionHelper bereit, um mögliche Unterauswahlen zu finden |
ja |
Zum Definieren von Unterauswahlen für das visuelle Element gibt es ein paar Attribute, die den gewünschten Elementen hinzugefügt werden müssen.
Attributname | attribute | Zweck | Erforderlich | type | Beispiel |
---|---|---|---|---|---|
SubSelectableDisplayNameAttribute | data-sub-selection-display-name | Bereitstellen einer lokalisierten Zeichenfolge für den Anzeigenamen des untergeordneten Elements | ja | Zeichenfolge | data-sub-selection-display-name="Visual Title" |
SubSelectableObjectNameAttribute | data-sub-selection-object-name | Geben Sie einen Objektnamen an, der Verknüpfungen und Formatvorlagen der Unterauswahl zugeordnet werden soll | ja | Zeichenfolge | data-sub-selection-object-name="title" |
SubSelectableTypeAttribute | data-sub-selection-type | Geben Sie den Typ der unterausgewählten Formatvorlage an | ja | SubSelectionStylesType | data-sub-selection-type="1" |
SubSelectableDirectEdit | data-sub-selection-direct-edit | Bereitstellen von Direkten Textbearbeitungsreferenzen, einschließlich CardUID, GroupUID und Ausrichtung des Textfelds | Nein | SubSelectableDirectEdit sollte als Zeichenfolge bereitgestellt werden | data-sub-selection-direct-edit="{"reference":{"cardUid":"Visual-title","groupUid":"title-text","sliceUid":"title-text-text"},"style":0}" |
SubSelectableHideOutlineAttribute | data-sub-selection-hide-outline | Bereitstellen eines booleschen Werts für unterauswählbare Elemente, die keine Kontur aufweisen sollen | Nein | boolean | data-sub-selection-hide-outline="true" |
SubSelectableRestrictingElementAttribute | data-sub-selection-restricting-element | Wird verwendet, um das Element anzugeben, das eingeschränkt wird, die Konturen und die Art der Einschränkung (Klemme oder Clip) | Nein | SubSelectionOutlineRestrictionType | data-sub-selection-restricting-element="1" |
SubSelectableSubSelectedAttribute | data-sub-selection-sub-selected | Gibt an, ob die Unterauswahl ausgewählt ist oder nicht. | Nein, das Hilfsprogramm weist es den Elementen bei Bedarf zu. | Boolean | data-subselection-sub-selected="true" |
Formatmodus
Wenn das visuelle Element in den Formatmodus wechselt, müssen Sie die Interaktivität für das visuelle Element deaktivieren, da wir erwarten, dass der Benutzer das Visual und das visuelle Element zum Initiieren der Formatierung auswählt.
Öffentliche HTMLSubSelectionHelper-Methoden
Die HTMLSubSelectionHelper
hat einige öffentliche Methoden, die Sie verwenden können, aber es gibt zwei Hauptmethoden, und das Hilfsprogramm erledigt den Rest.
Die beiden Methoden sind setFormatMode
und updateOutlinesFromSubSelections
.
Zu den öffentlichen Methoden des Hilfsprogramms gehören:
createHtmlSubselectionHelper(args: HtmlSubselectionHelperArgs): HtmlSubSelectionHelper - Dies ist eine statische Methode, die Argumente vom Typ
HtmlSubselectionHelperArgs
annimmt und eine Instanz vonHTMLSubSelectionHelper
zurückgibt.setFormatMode(isFormatMode: boolean): void - Diese Methode legt den Formatmodus für die HTMLSubSelectionHelper fest, wenn isFormatMode true ist, fügt das Hilfsprogramm relevante Ereignis-Listener an das Hostelement an, um die Formatmodusfunktionalität zu aktivieren (Unterauswahl, Renderkonturen).
getSubSelectionSourceFromEvent(event: PointerEvent): HtmlSubSelectionSource oder undefined - gibt ein
HtmlSubSelectionSource
-Objekt zurück, das gemäß der Ereignisparameter aufgebaut ist.onVisualScroll(): void - Zeigt dem HTMLSubSelectionHelper an, dass zurzeit ein Bildlauf ausgeführt wird. Beim Scrollen sollten Konturen entfernt werden, bis der Bildlauf abgeschlossen ist.
updateElementOutlines(elements: HTMLElement[], visibility: SubSelectionOutlineVisibility, suppressRender: boolean = false): SubSelectionRegionOutlineId[] – Aktualisieren der Konturen (und Ausgeben an Power BI aus, um gerendert zu werden) der Elemente.
clearHoveredOutline(): void - Diese Methode löscht, wenn vorhanden, schwebende Konturen.
updateRegionOutlines(regionOutlines: HelperSubSelectionRegionOutline[], suppressRender: boolean = false): void - aktualisiert und gibt die angegebenen Konturen zum Rendern aus.
getElementsFromSubSelections(subSelections: CustomVisualSubSelection[]): HTMLElement[] - angegebene subSelections; diese Methode gibt die relevanten HTMLElements zurück.
updateOutlinesFromSubSelections(subSelections: CustomVisualSubSelection[], clearExistingOutlines?: boolean, suppressRender?: void - aktualisiert und rendert die Konturen für die angegebene subSelection hinsichtlich suppressRender und clearExistingOutlines.
hideAllOutlines(suppressRender: boolean = false): void - blendet alle Konturen in Bezug auf suppressRender aus.
getAllSubSelectables(filterType?: SubSelectionStylesType): CustomVisualSubSelection[] - gibt alle subSelectables gemäß dem filterType zurück.
createVisualSubSelectionForSingleObject(createVisualSubSelectionArgs: CreateVisualSubSelectionFromObjectArgs): CustomVisualSubSelection - erstellt ein CustomVisualSubSelection-Objekt aus dem createVisualSubSelectionArgs.
setDataForElement(el: HTMLElement | SVGElement, data: SubSelectionElementData): void - eine statische Methode, die Daten für die Elemente festlegt.
getDataForElement(el: HTMLElement | SVGElement): SubSelectionElementData - eine statische Methode, welche die zuvor mithilfe von setDataForElement zugewiesene zugeordnete Methode abruft.
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
}
Zum Hinzufügen von Einschränkungsoptionen zu einem bestimmten Element, das HTMLSubSelectionHelper
setDataForElement
diesen Datentyp verwendet, verwendet das Hilfsprogramm die Daten, um die Gliederungen zu aktualisieren:
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;
}
Beispiel
In diesem Beispiel implementieren wir customOutlineCallback
und selectionIdCallback
: Der folgende Code befindet sich in Visual Code.
Wir haben ein Objekt im Visual namens arcElement
. Wir möchten die Kontur rendern, wenn der Mauszeiger über dem Element schwebt, oder es unterausgewählt ist.
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;
}
}
HtmlSubSelectionHelper importieren:
import { HtmlSubSelectionHelper } from 'powerbi-visuals-utils-onobjectutils';
Erstellen Sie im Konstruktorcode den 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),
});
….
}
Fügen Sie in der Updatemethode des Visuals den folgenden Code hinzu, um die Konturen der SubSeselection zu aktualisieren, aktualisieren Sie den Status des Formatmodus für die HTMLSubSelectionHelper
und deaktivieren Sie Interaktionen, die nicht für den Formatmodus sind, wenn der Formatmodus aktiviert ist:
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);
}
…
}