Nástroje pro objekty – pomocné rutiny dílčího výběru (Preview)
Poskytuje HTMLSubSelectionHelper
snadný způsob, jak vlastní vizuál Power BI generovat dílčí výběry do Power BI, získat a vykreslit osnovy.
HTMLSubSelectionHelper
je pomocná třída určená k usnadnění vytváření a následné správy osnov dílčího výběru. Obsahuje metody pro vyhledání dílčích prvků, které lze vybrat.
Nástroje exportují třídy a atributy CSS, což vizuálu usnadňuje definování a údržbu dílčích výběrů.
Poznámka:
Použijte verzi 6.0.1 nebo vyšší nástroje.
K definování dílčích prvků, které lze vybrat, musíme také přidat třídu do každého požadovaného prvku.
Třída CSS | Účel | Požaduje se |
---|---|---|
subselectable | Poskytuje selektor pro HTMLSubSelectionHelper vyhledání možných dílčích výběrů. |
ano |
Pokud chcete definovat dílčí výběry vizuálu, je potřeba přidat do požadovaných prvků několik atributů.
Název atributu | Atribut | Účel | Požaduje se | Typ | Příklad |
---|---|---|---|---|---|
SubSelectableDisplayNameAttribute | data-sub-selection-display-name | Zadejte lokalizovaný řetězec pro zobrazovaný název dílčího prvku. | ano | string | data-sub-selection-display-name="Název vizuálu" |
SubSelectableObjectNameAttribute | data-sub-selection-object-name | Zadejte název objektu, který chcete přidružit ke zkratkám a stylům dílčího výběru. | ano | string | data-sub-selection-object-name="title" |
SubSelectableTypeAttribute | data-sub-selection-type | Zadejte typ vybraného stylu. | ano | SubSelectionStylesType | data-sub-selection-type="1" |
SubSelectableDirectEdit | přímé úpravy výběru dat | Zadejte přímé odkazy na úpravy textu, včetně CardUID, GroupUID a orientace textového pole. | ne | Podadresář SubSelectableDirectEdit by se měl poskytnout jako řetězec. | data-sub-selection-direct-edit="{"reference":{"cardUid":"Visual-title","groupUid":"title-text","sliceUid":"title-text-text"},"style":0}" |
SubSelectableHideOutlineAttribute | data-sub-selection-hide-outline | Zadejte logickou hodnotu pro dílčí prvky, které by neměly mít zobrazenou osnovu. | ne | boolean | data-sub-selection-hide-outline="true" |
SubSelectableRestrictingElementAttribute | data-sub-selection-restricting-element | Slouží k označení prvku, který bude omezen, obrysy a typ omezení (upínací nebo klipart) | ne | SubSelectionOutlineRestrictionType | data-sub-selection-restricting-element="1" |
SubSelectableSubSelectedAttribute | vybraná dílčí výběr dat | Určete, jestli je vybraný dílčí výběr, nebo ne. | Ne, pomocník ho v případě potřeby přiřadí k prvkům. | Logická hodnota | data-subselection-sub-selected="true" |
Režim formátování
Když vizuál přejde do režimu formátu, musíte zakázat interaktivitu vizuálu, protože očekáváme, že uživatel vybere vizuál a vizuální prvek, aby zahájil formátování.
Veřejné metody HTMLSubSelectionHelper
Obsahuje HTMLSubSelectionHelper
některé veřejné metody, které můžete použít, ale existují dvě hlavní metody a pomocná rutina provede zbytek.
Dvě metody jsou setFormatMode
a updateOutlinesFromSubSelections
.
Mezi veřejné metody pomocné rutiny patří:
createHtmlSubselectionHelper(args: HtmlSubselectionHelperArgs): HtmlSubSelectionHelper – Jedná se o statickou metodu, která přebírá argumenty typu
HtmlSubselectionHelperArgs
a vrací instanciHTMLSubSelectionHelper
.setFormatMode(isFormatMode: boolean): void – Tato metoda nastaví režim formátu pro HTMLSubSelectionHelper, If isFormatMode je true, pomocník připojí relevantní naslouchací procesy událostí k prvku hostitele, aby povolil funkce režimu formátu (dílčí výběr, vykreslování osnov).
getSubSelectionSourceFromEvent(event: PointerEvent): HtmlSubSelectionSource nebo undefined – vrátí
HtmlSubSelectionSource
objekt vytvořený podle parametru události.onVisualScroll(): void – označuje htmlSubSelectionHelper, ke kterému aktuálně dochází k posouvání. Posouvání by mělo odebrat obrysy, dokud se posouvání nedokončí.
updateElementOutlines(elements: HTMLElement[], visibility: SubSelectionOutlineVisibility, suppressRender: boolean = false): SubSelectionRegionOutlineId[] – aktualizujte osnovy (a vygeneruje je do Power BI, aby se vykreslovaly) prvků.
clearHoveredOutline(): void – tato metoda vymaže najeté obrysy, pokud existují.
updateRegionOutlines(regionOutlines: HelperSubSelectionRegionOutline[], suppressRender: boolean = false): void – update a vygeneruje dané osnovy pro vykreslení.
getElementsFromSubSelections(subSelections: CustomVisualSubSelection[]): HTMLElement[] – daná subSelections, tato metoda vrátí relevantní hodnoty HTMLElements.
updateOutlinesFromSubSelections(subSelections: CustomVisualSubSelection[], clearExistingOutlines?: boolean, suppressRender?: boolean): void – updates and renders the outlines for the given subSelection with suppressRender and clearExistingOutlines.
hideAllOutlines(suppressRender: boolean = false): void – skryje všechny osnovy s ohledem na suppressRender.
getAllSubSelectables(filterType?: SubSelectionStylesType): CustomVisualSubSelection[] – vrátí všechny dílčí možnostiSelectables podle filterType.
createVisualSubSelectionForSingleObject(createVisualSubSelectionArgs: CreateVisualSubSelectionFromObjectArgs): CustomVisualSubSelection – vytvoření objektu CustomVisualSubSelection z createVisualSubSelectionArgs.
setDataForElement(el: HTMLElement | SVGElement, data: SubSelectionElementData): void – statická metoda, která nastavuje data pro prvky.
getDataForElement(el: HTMLElement | SVGElement): SubSelectionElementData – statická metoda, která získá přidružené dříve přiřazené pomocí 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
}
Chcete-li přidat možnosti omezení ke konkrétnímu HTMLSubSelectionHelper
setDataForElement
prvku, který používá tento datový typ, pomocník pomocí dat aktualizuje osnovy:
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;
}
Příklad
V tomto příkladu implementujeme customOutlineCallback
a selectionIdCallback
: Následující kód je ve Visual Code.
Ve vizuálu máme objekt s názvem arcElement
. Chceme vykreslit osnovu, když je prvek najet myší nebo je vybrán.
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;
}
}
Importujte HtmlSubSelectionHelper:
import { HtmlSubSelectionHelper } from 'powerbi-visuals-utils-onobjectutils';
V kódu konstruktoru vytvořte 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),
});
….
}
V metodě aktualizace vizuálu přidejte následující kód, který aktualizuje osnovy dílčího výběru, aktualizujte stav režimu formátu pro HTMLSubSelectionHelper
režim formátování a zakažte interakce, které nejsou pro režim formátu, pokud je režim formátu zapnutý:
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);
}
…
}