Ein Aufruf der Funktion looker.plugins.visualizations.add ist der Einstiegspunkt in die Visualization API. Diese Funktion akzeptiert ein Visualisierungsobjekt , das Ihre benutzerdefinierte Visualisierung vollständig definiert.
Hier ist ein Beispiel für eine Visualisierung:
looker.plugins.visualizations.add({
create: function(element, config){
element.innerHTML = "<h1>Ready to render!</h1>";
},
updateAsync: function(data, element, config, queryResponse, details, doneRendering){
var html = "";
for(var row of data) {
var cell = row[queryResponse.fields.dimensions[0].name];
html += LookerCharts.Utils.htmlForCell(cell);
}
element.innerHTML = html;
doneRendering()
}
});
Umgebung
Da die Visualization API reines JavaScript ist, können Sie beliebige JavaScript-Bibliotheken verwenden, um Ihre Daten zu visualisieren.
Ihr JavaScript-Code wird in einem Sandboxed-iFrame ausgeführt, getrennt von Ihrer Looker-Instanz. Dennoch sind die Autoren benutzerdefinierter Visualisierungen dafür verantwortlich, dass der von ihnen geschriebene Code sicher ist.
Wie bei der gesamten Webentwicklung kann die Unterstützung verschiedener Webbrowser (Chrome, Edge, Firefox) gelegentlich ein Problem darstellen. Die Visualization API funktioniert in allen von Looker unterstützten Browsern. Sie müssen jedoch dafür sorgen, dass Ihr benutzerdefinierter Code vom Browser unterstützt wird. Beispielsweise funktionieren ES6-Verwendungen wie let oder ()=> in den meisten Browsern, können aber in IE11 oder beim Rendern von PDFs mit PhantomJS zu Fehlern führen.
Installation
Sie installieren benutzerdefinierte Visualisierungen, indem Sie ein Manifest mit dem Formular „Admin“ > „Plattform“ > „Visualisierungen“ definieren. Ein Manifest besteht aus einer eindeutigen String-ID, einem menschenlesbaren Label, der URI Ihrer Visualisierung und Links zu allen erforderlichen Abhängigkeiten (z. B. d3, jQuery, underscore).
Benutzerdefinierte Visualisierungen sollten extern von Looker als HTTPS-Inhalte bereitgestellt werden. Wenn Sie von der ersten Version der benutzerdefinierten Visualization API migrieren, haben Sie möglicherweise Dateien im Verzeichnis looker/plugins/visualizations. Dieser Speicherort ist weiterhin zugänglich und es kann ein relativer Pfad zu Ihrer Visualisierung angegeben werden. Wir empfehlen jedoch, Ihre Inhalte an einen anderen Speicherort zu migrieren. Da sich das Verzeichnis /plugins nicht im freigegebenen Dateisystem befindet, haben Clusterumgebungen nicht auf allen Knoten Zugriff auf Ihre Visualisierungsdateien.
Das Visualisierungsobjekt
Das Visualisierungsobjekt verwendet die folgenden erforderlichen, optionalen und hinzugefügten Eigenschaften.
Erforderliche Attribute
createFunktionDiese Funktion wird einmal aufgerufen, wenn Ihre Visualisierung zum ersten Mal auf der Seite gezeichnet wird. Sie sollte alles einrichten, was Ihre Visualisierung immer verfügbar haben soll. Sie können eine Bibliothek laden oder eine Reihe von Elementen und Steuerelementen erstellen, die Sie später verwenden.
updateAsync/updateFunktionDiese Funktion wird jedes Mal aufgerufen, wenn sich der Status Ihrer Visualisierung ändern muss. Sie wird immer nach
createaufgerufen und kann viele Male aufgerufen werden. Daher sollte sie so schnell wie möglich sein.Diese Funktion kann aus vielen Gründen aufgerufen werden, in der Regel jedoch, wenn die zu visualisierende Abfrage geändert wurde, eine Konfigurationsoption geändert wurde oder die Größe der Visualisierung geändert wurde.
Diese Funktion hat eine synchrone und eine asynchrone Version. Sie müssen nur eine angeben. Es ist ein Fehler, beide zu definieren. Die asynchrone Methode ist aufgrund der Beschaffenheit von iFrames zuverlässiger für das Rendern von PDFs.
Optionale Attribute
optionsObjektEin Objekt mit Details zu den Optionen, die Nutzer für Ihre Visualisierung festlegen können.
destroyFunktion Noch nicht in API V2 implementiertEine Funktion, die aufgerufen wird, kurz bevor die Visualisierung von der Seite entfernt wird. Verwenden Sie diese Funktion, um Event-Listener oder andere Status zu bereinigen. Sie wird möglicherweise nie aufgerufen, wenn der Nutzer beispielsweise das Fenster schließt.
Zusätzliche Attribute
Looker fügt Ihrem Objekt automatisch die folgenden Eigenschaften hinzu, nachdem die Visualisierung an looker.plugins.visualizations.add übergeben wurde. Sie können mit this im Kontext der Funktionen create, update, updateAsync und destroy darauf verweisen.
addErrorFunktionEine Funktion, die von Ihrem Visualisierungscode aufgerufen werden kann, um der UI mitzuteilen, dass anstelle der Visualisierung eine Fehlermeldung angezeigt werden soll. Sie verwendet ein
error-Objekt.Sobald ein Fehler hinzugefügt wurde, bleibt er sichtbar, bis
clearErrorsaufgerufen wird.Beispiel :
this.addError({ title: "Two Dimensions Required", message: "This really great visualization requires two dimensions." });clearErrorsFunktionEine Funktion, die von Ihrem Visualisierungscode aufgerufen werden kann, um alle Fehler zu löschen, die mit
addErrorhinzugefügt wurden.Beispiel :
this.clearErrors();triggerFunktionEine Funktion, die aufgerufen werden kann, um ein Ereignis außerhalb der Visualisierung auszulösen.
Details zu Ereignissen ansehen →
Beispiel :
this.trigger("limit", [20]);
Die Funktion create
An die Funktion create werden zwei Parameter übergeben: element und config.
create: function(element, config){
// Your update code here.
},
Parameter
elementDOMElementEin DOM-Element, das einen Container darstellt, in dem Ihre Visualisierung gerendert werden soll.
configObjektEin Objekt, das die Werte aller Konfigurationsoptionen darstellt, die der Nutzer für dieses Diagramm festgelegt hat.
Beispiel:
{my_configuration_option: "User Value"}
Die updateAsync und update Funktionen
Die bevorzugte Methode zum Aktualisieren Ihrer Visualisierung ist die Methode updateAsync. Mit dieser Methode kann Ihre Visualisierung eine asynchrone Aktion ausführen, z. B. eine Datei laden oder eine Webanfrage senden.
Diese Version der Funktion hat einen zusätzlichen Parameter, nämlich einen Callback, der aufgerufen wird, wenn das Rendering abgeschlossen ist:
updateAsync: function(data, element, config, queryResponse, details, done){
// An example of an asynchronous update, fetching a file.
d3.request("https://example.com/fun-file.docx").response(function(xhr) {
// Your update code here that uses this file.
done();
});
}
Wenn Looker benachrichtigt wird, wenn das Rendering der Visualisierung abgeschlossen ist, kann Looker das Rendern von PDFs optimieren und dafür sorgen, dass Bilder von Visualisierungen richtig erfasst werden.
Einige ältere Visualisierungen verwenden die Funktion update. Diese Funktion funktioniert zwar weiterhin, ist aber nicht die bevorzugte Methode, da Looker nicht benachrichtigt wird, wenn eine Visualisierung vollständig gerendert wurde. An die Funktion update werden fünf Parameter übergeben:
update: function(data, element, config, queryResponse, details){
// Your update code here.
}
Parameter
dataArrayEin Array von Zeilen, die die aktuellen Daten in der Abfrage darstellen. Kann
nullsein.Jede Zeile ist ein Objekt mit den Schlüsseln, die Feldnamen darstellen, und dem Wert, der ein „Zellenobjekt“ darstellt. Hier finden Sie Details zum Umgang mit dem Zellenobjekt.
elementDOMElementEin DOM-Element, das einen Container darstellt, in dem Ihre Visualisierung gerendert werden soll.
configObjektEin Objekt, das die Werte aller Konfigurationsoptionen darstellt, die der Nutzer für dieses Diagramm festgelegt hat.
Beispiel:
{my_configuration_option: "User Value"}queryResponseObjektEin Objekt, das Metadaten zur aktuellen Abfrage darstellt, z. B. Metadaten zu Feldern. Kann
nullsein.detailsObjektDetails zum aktuellen Renderingkontext. Enthält Informationen dazu, warum das Diagramm gerendert wird und was sich geändert hat. Diese Informationen werden in der Regel nur in erweiterten Fällen verwendet.
Für Crossfilter in Looker-Dashboards, die die neue Dashboard-Erfahrung verwenden, sind die zulässigen Attribute
crossfilterEnabledundcrossfilters.Das Attribut
printkann in Verbindung mit der Funktiondoneverwendet werden, um das Rendern von PDFs für benutzerdefinierte Visualisierungen zu verbessern, insbesondere für solche mit Animationen. Beispiel:if (details.print) { done(); }doneFunktionEin Callback, um anzugeben, dass die Visualisierung vollständig gerendert wurde. Diese Funktion muss unbedingt aufgerufen werden, wenn Ihre Visualisierung asynchrone Aufrufe ausführen oder als PDF gerendert werden muss.
Daten rendern
Looker bietet in LookML eine Vielzahl von Tools zur Datenformatierung, mit denen Sie das Erscheinungsbild und das Verhalten von Datenpunkten anpassen können. Zu diesen Tools gehören LookML-Einstellungen auf Feldebene wie benutzerdefinierte Wertformate, HTML, Drill-Links und Datenaktionen.
Zellen haben eine value-Eigenschaft, die die einzige Eigenschaft ist, die in allen Fällen vorhanden ist. Diese Eigenschaft ist ein JavaScript-Typ, der dem Typ des Felds entspricht, zu dem die Zelle gehört. Es ist jedoch nicht sicher, eine value-Eigenschaft direkt in HTML oder SVG einzufügen, da keine HTML-Escapes durchgeführt wurden. Einige Feldwerte sind komplexe JavaScript-Objekte oder -Arrays, die auf unerwünschte oder verwirrende Weise gerendert werden.
Damit alle Visualisierungen diese Elemente einheitlich und sicher rendern, gibt es eine Reihe von Dienstfunktionen, mit denen die Zellenmetadaten, die in data an Ihr Diagramm übergeben werden, in verschiedene Darstellungen für verschiedene Zwecke umgewandelt werden können. Die Zellenmetadaten können in einigen Fällen bestimmte Felder komprimieren oder auslassen. Mit diesen Hilfsfunktionen können Sie eine einheitliche Nutzererfahrung bieten.
Alle diese Hilfsfunktionen sind im globalen LookerCharts.Utils-Objekt verfügbar.
LookerCharts.Utils.textForCell(cell)Diese Funktion akzeptiert eine Zelle und gibt eine Stringdarstellung zurück, die für die Anzeige geeignet ist. Es ist immer ein String. Diese Funktion gibt nie
nulloder einen anderen Typ zurück.LookerCharts.Utils.htmlForCell(cell)Diese Funktion akzeptiert eine Zelle und gibt einen String mit HTML zurück. Es ist immer ein String. Diese Funktion gibt nie
nulloder einen anderen Typ zurück.Die Ausgabe dieser Funktion ist korrekt escaped und kann direkt in das HTML Ihres Elements eingefügt werden. Das Ausgabe-HTML zeigt auch das Drill-Menü korrekt an, wenn es für die Daten geeignet ist.
LookerCharts.Utils.filterableValueForCell(cell)Diese Funktion akzeptiert eine Zelle und gibt einen Looker-String mit erweiterter Filtersyntax zurück, der mit dem Wert dieser Zelle übereinstimmt.
LookerCharts.Utils.toggleCrossfilter({row, pivot, event})Diese Funktion akzeptiert eine Zeile, einen Pivot oder ein Ereignis und wird verwendet, um zu prüfen, ob die Crossfilterung für eine Visualisierung aktiviert ist. Im folgenden Beispiel wird gezeigt, wie einem Element ein Event-Listener hinzugefügt wird, der prüft, ob die Crossfilterung aktiviert ist, wenn das Ereignis eintritt:
d3.select("#myElement") .on("click", function (d) { if (details.crossfilterEnabled) { LookerCharts.Utils.toggleCrossfilter({ row: d.row, event: d3.event, }); } else { // ... handle click when cross-filtering is not enabled } });LookerCharts.Utils.getCrossfilterSelection(row, pivot?)Diese Funktion akzeptiert eine Zeile oder einen Pivot und wird verwendet, um zu prüfen, ob diese Zeile oder dieser Pivot in einer benutzerdefinierten Visualisierung ausgewählt ist. Die Funktion gibt eine Enumeration für
CrossfilterSelection {NONE, SELECTED, UNSELECTED}zurück: 0 fürNONE, 1 fürSELECTEDund 2 fürUNSELECTED.Im folgenden Beispiel wird bedingt eine Füllfarbe auf eine Zeile angewendet, wenn sie crossgefiltert wird. Standardfarben werden angewendet, wenn die Crossfilterung für diese Zeile nicht aktiviert ist:
d3.select("#myElement") .attr("fill", function (d) { const crossfilter = LookerCharts.Utils.getCrossfilterSelection(d.row) if (details.crossfilterEnabled && crossfilter === 1) { return d.color } else { return "#DEE1E5" //Hex used for unselected elements in native visualizations ...LookerCharts.Utils.openDrillMenu(options)Die Ausgabe von
htmlForCellzeigt bei Bedarf automatisch das Drill-Menü an. Das ist jedoch möglicherweise nicht für bestimmte Arten des Renderings geeignet. Beispielsweise kann SVG kein HTML rendern, aber Sie möchten möglicherweise ein Klickereignis erfassen, um einen Drill zu starten.Das Objekt
optionshat die folgenden Parameter:linksErforderlich ArrayEin Array der Objekte, die von der Eigenschaft
linkseiner Zelle zurückgegeben werden. Wenn Sie Links für mehrere Zellen gleichzeitig anzeigen möchten, können Sie diese Arrays zuerst verketten. Geben Sie für benutzerdefinierte Links ein Array von Objekten im folgenden Format an:{ label: string, type: 'drill', type_label: string, url: url }eventHTML-DOM-EreignisDas Klickereignis (oder ein anderes Ereignis), das das Drill-Ereignis verursacht hat. Looker verwendet dies, um festzulegen, wo das Drill-Menü platziert werden soll. Wenn Sie keines haben, übergeben Sie ein Objekt mit den Koordinaten pageX und pageY.
Beispiel :
for (var row of data) { var cell = row[queryResponse.fields.dimensions[0].name]; var cellElement = myBuildElementFunction(cell); cellElement.onclick = function(event) { LookerCharts.Utils.openDrillMenu({ links: cell.links, event: event }); }; // ... more visualization stuff... }
Konfigurations-UI präsentieren
Der Parameter options ist ein Objekt, bei dem die Schlüssel eine beliebige ID für einen Optionsnamen sind und der Wert ein Objekt ist, das Informationen zur Option beschreibt.
Beispiel:
options: {
color_range: {
type: "array",
label: "Color Range",
display: "colors"
},
top_label: {
type: "string",
label: "Label (for top)",
placeholder: "My Great Chart"
},
transport_mode: {
type: "string",
label: "Mode of Transport",
display: "select",
values: [
{"Airplane": "airplane"},
{"Car": "car"},
{"Unicycle": "unicycle"}
],
default: "unicycle"
}
}
Parameter des Optionsobjekts
Das Objekt option hat die folgenden grundlegenden Parameter, anzeigespezifischen Eigenschaften und Organisationsoptionen.
Grundlegende Parameter
typeStringDer Datentyp der Option.
Zulässige Werte:
string(Standard),number,boolean,arraylabelStringDas menschenlesbare Label der Option, das dem Nutzer angezeigt wird.
defaultDer Standardwert der Option. Wenn kein Wert angegeben ist, ist der Wert der Option
null. Dies sollte ein Wert desselben Typs wietypesein.displayStringBestimmte
type-Werte können in der UI auf verschiedene Arten dargestellt werden.wenn
typegleichstringist:Zulässige Werte:
text(Standard),select,radiowenn
typegleichnumberist:Zulässige Werte:
number(Standard),rangewenn
typegleicharrayist:Zulässige Werte:
text(Standard),color,colors
placeholderStringFür
display-Werte, die dies unterstützen, ein Beispielwert oder eine Erklärung, um dem Nutzer einen Hinweis darauf zu geben, was er eingeben soll.
Anzeigespezifische Eigenschaften
valuesArray von ObjektenWenn
displaygleichradiooderselectist, ein Array mit Labels und Werten, die in der Benutzeroberfläche aufgeführt werden.Jedes Element im Array sollte ein Objekt mit einem einzelnen Schlüssel/Wert-Paar sein, das das Label und den Wert der Option darstellt. Das Label wird nur in der UI präsentiert. Zur Renderingzeit erhalten Sie nur den Wert.
Beispiel :
values: [ {"Center": "c"}, {"Left": "l"}, {"Right": "r"} ]Wenn
displaygleichradioist, kann jeder Option zusätzlich einedescriptiongegeben werden:values: [ {"Cool": "c"}, {"Uncool": { value: "unc", description: "Only choose this if the data is very uncool." } } ]maxZahlWenn
displaygleichrangeist, die maximale Zahl, die mit dem Bereichsschieberegler ausgewählt werden kann.minZahlWenn
displaygleichrangeist, die minimale Zahl, die mit dem Bereichsschieberegler ausgewählt werden kann.stepZahlWenn
displaygleichrangeist, der Wert, den jeder Schritt des Bereichsschiebereglers darstellt.
Organisationsoptionen
sectionStringFür Diagramme mit vielen Optionen ein Label für den Abschnitt, in dem eine Option angezeigt werden soll. Die Optionen werden in der UI nach ihren
section-Werten gruppiert. Wenn es nur einen Abschnitt gibt, wird die Abschnitts-UI nicht angezeigt.Wenn Sie
sectionverwenden, muss es für jede Option festgelegt werden.orderZahlEine Zahl, die die Reihenfolge der Optionen für die Präsentation in der UI darstellt. Wenn angegeben, werden die Optionen entsprechend dieser Reihenfolge sortiert.
display_sizeStringEine Größenklasse, die die Breite der Option in der UI darstellt. Wenn Sie beispielsweise eine Option „Minimum“ und eine Option „Maximum“ nebeneinander anzeigen möchten, können Sie die Anzeigegröße für beide auf
halffestlegen.Zulässige Werte:
normal(Standard),half,third
Ereignisse
Ereignisse können vom Diagramm ausgelöst werden (in der Regel als Reaktion auf die Nutzerinteraktion), wodurch Eigenschaften der Visualisierung oder Abfrage aktualisiert werden können.
Sie können ausgelöst werden, indem die Funktion trigger für das Visualisierungsobjekt aufgerufen wird. Der erste Parameter ist immer der Ereignisname und der zweite Parameter ist ein Array von Argumenten.
this.trigger("limit", [20]);
Verfügbare Ereignisse
updateConfigAktualisieren Sie die aktuellen Konfigurationseinstellungen des Diagramms.
Argument:Ein Objekt mit Konfigurationsschlüsseln, die aktualisiert werden sollen. Nicht angegebene Schlüssel werden nicht geändert.
Beispiel :
var vis = this; $(element).find(".axis").click(function(){ vis.trigger("updateConfig", [{axis_hidden: true}]); });limitAktualisieren Sie das Limit der zugrunde liegenden Abfrage:
Argument:Eine Ganzzahl, die ein neues Limit für die Abfrage darstellt.
var vis = this; $(element).find(".show-all").click(function(){ vis.trigger("limit", [500]); });filterAktualisieren Sie den Wert eines Filters für die zugrunde liegende Abfrage:
var vis = this; $(element).find(".show-all-tommys").click(function(){ vis.trigger("filter", [{ field: "users.name", // the name of the field to filter value: "%tommy%", // the "advanced syntax" for the filter run: true, // whether to re-run the query with the new filter }]); });loadingStartMarkieren Sie die Visualisierung als wird geladen. Meistens ist das nicht erforderlich. Wenn Ihre Visualisierung jedoch ein Objekt von einem Remote-Standort lädt oder eine lange Berechnung durchführt, können Sie damit die Ladeanzeige weiterhin anzeigen.
Sie wird als „Wird geladen“ angezeigt, bis
loadingEndausgelöst wird.loadingEndMarkieren Sie die Visualisierung als nicht mehr geladen.
printSize(Looker 26.0+)Ermöglicht es Visualisierungen, die Option „Tabellen für die Anzeige aller Zeilen maximieren“ zu nutzen, wenn Dashboards in PDFs gerendert werden. Mit diesem Ereignis kann die Anwendung die Höhe des gerenderten Inhalts ermitteln und die Dashboard-Kachel entsprechend maximieren, damit alle Informationen für den Druck sichtbar sind.
this.trigger('printSize', { heightExpanded: FULL_HEIGHT_IN_PIXELS });registerOptions(Looker 5.24+)Ermöglicht es Visualisierungen, zusätzliche Optionen zu registrieren, nachdem die Visualisierung registriert wurde:
update: function(data, element, config, queryResponse, details){ options = {} // Create an option for each measure in your query queryResponse.fields.measure_like.forEach(function(field) { id = "color_" + field.name options[id] = { label: field.label_short + " Color", default: "#8B7DA8", section: "Style", type: "string", display: "color" } }) this.trigger('registerOptions', options) // register options with parent page to update visConfig ... } });