API Sub-pemilihan (pratinjau)
Pemformatan pada objek memungkinkan pengguna untuk dengan cepat dan mudah memodifikasi format visual dengan langsung memilih elemen yang ingin mereka ubah. Saat elemen dipilih, panel format secara otomatis menavigasi dan memperluas pengaturan pemformatan tertentu untuk elemen yang dipilih. Sebagai bagian dari pemformatan pada objek, layanan subbagian digunakan untuk mengirim subbagian dan kerangka ke Power BI.
SubSelection Service menyediakan dua metode:
Mengirim sub-pemilihan untuk digunakan Power BI saat pengguna memilih elemen yang memungkinkan sub-pemilihan.
subSelect(args: visuals.CustomVisualSubSelection | undefined): void
CustomVisualSubSelection
interface CustomVisualSubSelection {
customVisualObjects: CustomVisualObject[];
displayName: string;
subSelectionType: SubSelectionStylesType;
selectionOrigin: SubSelectionOrigin;
/** Whether to show the UI for this sub-selection, like formatting context menus and toolbar */
showUI: boolean;
/** If immediate direct edit should be triggered, the ID of the sub-selection outline to edit */
immediateDirectEdit?: string;
metadata?: unknown;
}
interface CustomVisualObject {
objectName: string;
selectionId: powerbi.visuals.ISelectionId | undefined;
}
Metode ini memiliki parameter berikut:
- customVisualObjects: array yang berisi
customVisualObjects
, objectName objek harus sama dengan yang dideklarasikan dalam capabilities.json, dan selectionId untuk titik data yang dipilih, jika ada. - displayName: nama tampilan harus dilokalkan jika visual mendukung pelokalan.
- subSelectionType: jenis sub-pemilihan (bentuk, teks, atau teks Numerik).
- selectionOrigin: koordinat elemen subpilih.
- showUI: Apakah akan menampilkan UI untuk sub-pemilihan ini, seperti memformat menu konteks dan toolbar.
- immediateDirectEdit: Jika pengeditan langsung langsung harus dipicu, ID kerangka subbagian untuk diedit.
Jika Anda tidak menggunakan HTMLSubSelectionHelper
, Anda perlu mengelola sub-pemilihan.
Dalam contoh ini, kami menambahkan pendengar peristiwa ke elemen host, untuk klik kanan, peristiwa menu konteks.
constructor(options: VisualConstructorOptions) {
this.hostElement = options.element;
this.subSelectionService = options.host.subSelectionService;
….
}
public update(options: VisualUpdateOptions) {
if (options.formatMode) {
// remove event listeners which are irrelevant for format mode.
…
this.hostElement.addEventListener('click', this.handleFormatModeClick);
this.hostElement.addEventListener('contextmenu', this.handleFormatModeContextMenu);
} else {
this.hostElement.removeEventListener('click', this.handleFormatModeClick);
this.hostElement.removeEventListener('contextmenu', this.handleFormatModeContextMenu);
…
// add event listeners which are irrelevant for format mode
}
}
private handleFormatModeClick(event: MouseEvent): void {
this.subSelectFromEvent(event, true /**showUI */);
}
private handleFormatModeContextMenu(event: MouseEvent): void {
this.subSelectFromEvent(event, false);
}
private subSelectFromEvent(event: MouseEvent, showUI: boolean): void {
//find the element which was selected and fill the needed fields
const cVObject: powerbi.visuals.CustomVisualObject = {
objectName: 'myObject',//the object name that is relevant to the clicked element
selectionId: undefined
};
const subSelection: CustomVisualSubSelection = {
customVisualObjects: [cVObject],
displayName: 'myObject',
selectionOrigin: {
x: event.clientX,
y: event.clientY
},
subSelectionType: SubSelectionStylesType.Shape,// choose the relevant type
showUI
};
this.subSelectionService.subSelect(subSelection);
}
Metode ini mengirimkan kerangka ke Power BI untuk dirender. Gunakan dalam update
metode visual karena di situlah Power BI mengirim sub-pemilihan yang dikirim visual sebelumnya. Anda juga dapat menggunakannya saat ingin merender kerangka untuk elemen yang diarahkan.
updateRegionOutlines(outlines: visuals.SubSelectionRegionOutline[]): void
SubSelectionRegionOutline
interface SubSelectionRegionOutline {
id: string;
visibility: SubSelectionOutlineVisibility; // controls visibility for outlines
outline: SubSelectionOutline;
}
Jika Anda tidak menggunakan HTMLSubSelectionHelper
, Anda harus mengelola kerangka dan statusnya secara manual (jika aktif, diarahkan atau tidak terlihat).
Dalam contoh ini kita berasumsi bahwa kita memiliki objek yang disebut myObject
, dan kita ingin merender kerangka persegi ketika elemen yang relevan diarahkan. Kami menggunakan kode dalam contoh sebelumnya untuk subPilih.
Dalam pembaruan, kita juga perlu menambahkan pendengar peristiwa untuk peristiwa tersebut pointerover
.
Kami ingin mengelola kerangka kami menggunakan Rekaman.
private subSelectionRegionOutlines: Record<string, SubSelectionRegionOutline > = {};
public update(options: VisualUpdateOptions) {
if (options.formatMode) {
// remove event listeners which are irrelevant for format mode.
…
this.hostElement.addEventListener('click', this.handleFormatModeClick);
this.hostElement.addEventListener('contextmenu', this.handleFormatModeContextMenu);
this.hostElement.addEventListener('pointerover', this.handleFormatModePointerOver);
} else {
this.hostElement.removeEventListener('click', this.handleFormatModeClick);
this.hostElement.removeEventListener('contextmenu', this.handleFormatModeContextMenu);
this.hostElement.removeEventListener('pointerover', this.handleFormatModePointerOver);
…
// add event listeners which are irrelevant for format mode
}
}
private handleFormatModePointerOver(event: MouseEvent): void {
// use the event to extract the element that was hovered.
// in this example we assume that we found the element and it is related to object called myObject.
// we need to clear previously hovered outlines before rendering
const regionOutlines = getValues(this.subSelectionRegionOutlines);
const hoveredOutline = regionOutlines.find(outline => outline.visibility === SubSelectionOutlineVisibility.Hover);
if (hoveredOutline) {
this.subSelectionRegionOutlines[hoveredOutline.id] = {
...this.subSelectionRegionOutlines[hoveredOutline.id],
visibility: powerbi.visuals.SubSelectionOutlineVisibility.None
};
}
// now we will build the outline for myObject relevant element.
let element: HTMLElement;// assume we found the relevant element.
const domRect = element.getBoundingClientRect();
const { x, y, width, height } = domRect;
const outline: powerbi.visuals.RectangleSubSelectionOutline = {
height,
width,
x,
y,
type: powerbi.visuals.SubSelectionOutlineType.Rectangle,
};
const regionOutline: powerbi.visuals.SubSelectionRegionOutline = {
id: 'myObject',
visibility: powerbi.visuals.SubSelectionOutlineVisibility.Hover,
outline
};
this.subSelectionRegionOutlines[regionOutline.id] = regionOutline;
this.renderOutlines();
// you need to remove the hovered outline when the element is not hovered anymore
}
private renderOutlines(): void {
const regionOutlines = getValues(this.subSelectionRegionOutlines);
this.subSelectionService.updateRegionOutlines(regionOutlines);
}