WebApps:JavaScript Diagramm: Unterschied zwischen den Versionen

Aus CoPlanner 11
Zur Navigation springenZur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
__TOC__
__TOC__
Verfügbar ab 9.5 HF 4.3
=Systemvoraussetzungen=
=Systemvoraussetzungen=


Zeile 18: Zeile 15:
===Erweiterter Aufruf===
===Erweiterter Aufruf===


:* hideSessionHeader: Definiert, ob der Session-Header angezeigt werden soll oder nicht (true blendet Session-Header aus). Der Default beim Öffnen ist false.
:* hideSessionHeader: Definiert, ob der [[WebApps:Header|Header]] angezeigt werden soll oder nicht (true blendet [[WebApps:Header|Header]] aus). Der Default beim Öffnen ist false.




Zeile 24: Zeile 21:
JavaScript Diagramme können derzeit nur über das BI-Center im Windowsclient erstellt werden.
JavaScript Diagramme können derzeit nur über das BI-Center im Windowsclient erstellt werden.


{| {{Bausteindesign1}}
{{Hinweis|Text=Funktioniert nur im PowerUser Modus}}
|-
| <span style="color: darkblue;">'''Hinweis'''</span> &nbsp;Funktioniert nur im PowerUser Modus
|}
 


=Diagrammdesigner=
=Diagrammdesigner=
Zeile 35: Zeile 28:
Für die JavaScript Diagramme kann man ein bis vier Datenquellen definieren, auf die man zugreifen möchte.
Für die JavaScript Diagramme kann man ein bis vier Datenquellen definieren, auf die man zugreifen möchte.


Als Quellen können bestehende Eingabemasken gewählt werden.
Als Quellen können bestehende Matrixmasken gewählt werden.


==Filter==
==Filter==
Zeile 51: Zeile 44:


===Beispiel===
===Beispiel===
Erstellt man ein neues JavaScript Diagramm, hat man schon folgenden Beispielcode im JavaScript-Bereich:
Erstellt man ein neues JavaScript Diagramm, hat man schon folgenden Beispielcode im JavaScript-Bereich am CoP 10 HF 1.3:


<pre>
<pre>
// This script is provided with the following arguments:
// Further information and samples can be found at:
// - dataSources:
// https://plot.ly/javascript/
//   An object containing the data from each data source.
// https://copsupport.coplanner.com/helpCOP10/index.php/WebApps:JavaScript_Diagramm
//   The key is the name of the data source.


// To prevent script errors, it is advisable to check for undefined and null
// before traversing deeper into the object. Sample for accessing data in the
// object above:
// var inputMaskData = dataSources["NAME_OF_INPUTMASK"];
// var inputMaskData = dataSources["NAME_OF_INPUTMASK"];
// var dataMeasure1 = inputMaskData && inputMaskData["MEASURE_NAME_1"]
// var dataMeasure1 = inputMaskData && inputMaskData["MEASURE_NAME_1"] ? inputMaskData["MEASURE_NAME_1"].values : [];
//  ? inputMaskData["MEASURE_NAME_1"].values
// var dataAxis1 = inputMaskData && inputMaskData["DIMENSION_NAME_1"] ? inputMaskData["DIMENSION_NAME_1"].values : [];
//  : [];
// var dataDimension1 = inputMaskData && inputMaskData["X_AXIS_NAME_1"]
//  ? inputMaskData["X_AXIS_NAME_1"].values
//  : [];
 
// Further information and samples regarding plotly can be found at:
// https://plot.ly/javascript/
// https://plot.ly/javascript/reference/


// Plotly data object (required):
// Plotly data object (required):
var data = [
var data = [
  {
    {
    type: 'bar',
        type: 'bar',
 
        x: ['giraffes', 'orangutans', 'monkeys'],
// x: dataDimension1,
        y: [20, 14, 23]
    x: ['giraffes', 'orangutans', 'monkeys'],
        // x: dataAxis1,
 
        // y: dataMeasure1
// y: dataMeasure1,
    }
    y: [20, 14, 23]
  }
];
];


// Plotly layout object (optional):
// Plotly layout object (optional):
var layout = {
var layout = {
  separators: ',.',
    separators: ',.',
  showlegend: false
    showlegend: false,
    xaxis: { type: "category" }
};
};
// Plotly data click event (optional):
function onPlotClick(data) {
  // if (data.points.length > 0) {
  //  var clickData = data.points[0].data;
  //  console.log(clickData);
  // }
}


// Return processed data to CoPlanner:
// Return processed data to CoPlanner:
return {
return {
  data,
    data,
  layout,
    layout
  onPlotClick
};
};
</pre>
</pre>


Zeile 118: Zeile 88:
Dieses Diagramm hat momentan nur hard-codierte Inhalte. In diesem Beispiel wird gezeigt, wie man das Diagramm abändern muss, damit die Werte dynamisch aus dem CoPlanner kommen.
Dieses Diagramm hat momentan nur hard-codierte Inhalte. In diesem Beispiel wird gezeigt, wie man das Diagramm abändern muss, damit die Werte dynamisch aus dem CoPlanner kommen.


Zuerst muss es die entsprechende Tabelle mit dem Inhalt im CoPlanner geben. Auf diese wird ein CoPlanner-Würfel gebaut und eine Eingabemaske.
====Daten festlegen====


Die Eingabemaske sieht wie folgt aus und hat in diesem Beispiel den Namen MAX_JS_Chart:
Zuerst muss es die entsprechende Tabelle mit dem Inhalt im CoPlanner geben. Auf diese wird ein CoPlanner-Würfel gebaut und eine Matrixmaske.
 
Die Matrixmaske sieht wie folgt aus und hat in diesem Beispiel den Namen MAX_JS_Chart:


[[image:JS_Chart_Quelle1.PNG]]
[[image:JS_Chart_Quelle1.PNG]]
Zeile 132: Zeile 104:
<pre>
<pre>
// var inputMaskData = dataSources["NAME_OF_INPUTMASK"];
// var inputMaskData = dataSources["NAME_OF_INPUTMASK"];
// var dataMeasure1 = inputMaskData && inputMaskData["MEASURE_NAME_1"]
// var dataMeasure1 = inputMaskData && inputMaskData["MEASURE_NAME_1"] ? inputMaskData["MEASURE_NAME_1"].values : [];
//  ? inputMaskData["MEASURE_NAME_1"].values
// var dataAxis1 = inputMaskData && inputMaskData["DIMENSION_NAME_1"] ? inputMaskData["DIMENSION_NAME_1"].values : [];
//  : [];
// var dataDimension1 = inputMaskData && inputMaskData["X_AXIS_NAME_1"]
//  ? inputMaskData["X_AXIS_NAME_1"].values
//  : [];
</pre>
</pre>


Zeile 143: Zeile 111:
<pre>
<pre>
var inputMaskData = dataSources["MAX_JS_Chart"];
var inputMaskData = dataSources["MAX_JS_Chart"];
var dataMeasure1 = inputMaskData && inputMaskData["Wert"]
var dataMeasure1 = inputMaskData && inputMaskData["Wert"] ? inputMaskData["Wert"].values : [];
? inputMaskData["Wert"].values
var dataDimension1 = inputMaskData && inputMaskData["Animals"] ? inputMaskData["Animals"].values : [];
: [];
var dataDimension1 = inputMaskData && inputMaskData["Animals"]
? inputMaskData["Animals"].values
: [];
</pre>
</pre>


Zeile 155: Zeile 119:
Vorher:
Vorher:
<pre>
<pre>
// Plotly data object (required):
var data = [
var data = [
  {
    {
    type: 'bar',
        type: 'bar',
 
        x: ['giraffes', 'orangutans', 'monkeys'],
// x: dataDimension1,
        y: [20, 14, 23]
  x: ['giraffes', 'orangutans', 'monkeys'],
        // x: dataAxis1,
 
        // y: dataMeasure1
 
    }
// y: dataMeasure1,
  y: [20, 14, 23]
  }
];
];
</pre>
</pre>
Zeile 171: Zeile 133:
Anpassen zu:
Anpassen zu:
<pre>
<pre>
// Plotly data object (required):
var data = [
var data = [
  {
    {
    type: 'bar',
        type: 'bar',
 
        // x: ['giraffes', 'orangutans', 'monkeys'],
x: dataDimension1,
        // y: [20, 14, 23]
    // x: ['giraffes', 'orangutans', 'monkeys'],
        x: dataAxis1,
 
        y: dataMeasure1
y: dataMeasure1
    }
    //y: [20, 14, 23]
  }
];
];
</pre>
</pre>
Zeile 188: Zeile 149:


[[image:JS_Chart_Angepasst.PNG]]
[[image:JS_Chart_Angepasst.PNG]]
====Filter hinzufügen====


Wollen wir jetzt noch, dass die Daten nach der Zeit gefiltert werden, können wir als Filter die Zeit auswählen und das mit der Quelle 1 verbinden.
Wollen wir jetzt noch, dass die Daten nach der Zeit gefiltert werden, können wir als Filter die Zeit auswählen und das mit der Quelle 1 verbinden.
====Detailsatzsprung hinzufügen====


Zusätzlich können wir noch einen Detailsatzsprung definieren.
Zusätzlich können wir noch einen Detailsatzsprung definieren.
Zeile 200: Zeile 165:
Über diesen Link wird die Zeilensicht mit dem Namen ZS_JS_Chart aufgerufen und es werden die Filter/Achsenelemente für die Dimensionen Animals und Zeit übergeben.  
Über diesen Link wird die Zeilensicht mit dem Namen ZS_JS_Chart aufgerufen und es werden die Filter/Achsenelemente für die Dimensionen Animals und Zeit übergeben.  


:* Erweitern der Basismaske: Das JavaScript Chart hat als Basis eine Eingabemaske. In dieser Maske muss unser neues Measure hinzugefügt werden.
:* Erweitern der Basismaske: Das JavaScript Chart hat als Basis eine Matrixmaske. In dieser Maske muss unser neues Measure hinzugefügt werden.


:* Erweiterung im JavaScript Code:
:* Erweiterung im JavaScript Code:
Zeile 206: Zeile 171:


<pre>
<pre>
var dataLink1 = inputMaskData && inputMaskData["Link_Detail"]
var dataLink1 = inputMaskData && inputMaskData["Link_Detail"] ? inputMaskData["Link_Detail"].values : [];
? inputMaskData["Link_Detail"].values
: [];
</pre>
</pre>


Zeile 216: Zeile 179:
   {
   {
     type: 'bar',
     type: 'bar',
 
    x: dataDimension1,
x: dataDimension1,
    y: dataMeasure1
     // x: ['giraffes', 'orangutans', 'monkeys'],
     // x: ['giraffes', 'orangutans', 'monkeys'],
y: dataMeasure1
     //y: [20, 14, 23]
     //y: [20, 14, 23]
   }
   }
Zeile 233: Zeile 194:
   {
   {
     type: 'bar',
     type: 'bar',
    x: dataDimension1,
    y: dataMeasure1,
    link: dataLink1


x: dataDimension1,
    // x: ['giraffes', 'orangutans', 'monkeys'],
  // x: ['giraffes', 'orangutans', 'monkeys'],
 
y: dataMeasure1,
     //y: [20, 14, 23]
     //y: [20, 14, 23]
         
        link: dataLink1
   }
   }
];
];
Zeile 247: Zeile 206:




 
Zusätzlich muss folgender Code eingefügt werden:
 
Zusätzlich muss folgender Code angepasst werden:


<pre>
<pre>
function onPlotClick(data) {
function onPlotClick(data) {
  // if (data.points.length > 0) {
  if (data.points.length > 0) {
  //  var clickData = data.points[0].data;
    var index = data.points[0].pointNumber;
  //  console.log(clickData);
    var clickData = data.points[0].data.link[index];
  // }
  window.open(clickData);
  }
}
}
</pre>
</pre>


zu
 
Final hier der daraus entstandene Code im JavaScript Chart:


<pre>
<pre>
var inputMaskData = dataSources["MAX_JS_Chart"];
var dataMeasure1 = inputMaskData && inputMaskData["Wert"] ? inputMaskData["Wert"].values : [];
var dataDimension1 = inputMaskData && inputMaskData["Animals"] ? inputMaskData["Animals"].values : [];
var dataLink1 = inputMaskData && inputMaskData["Link_Detail"] ? inputMaskData["Link_Detail"].values : [];
// Plotly data object (required):
var data = [
  {
    type: 'bar',
    x: dataDimension1,
    y: dataMeasure1,
    link: dataLink1
    // x: ['giraffes', 'orangutans', 'monkeys'],
    //y: [20, 14, 23]               
  }
];
// Plotly layout object (optional):
var layout = {
  separators: ',.',
  showlegend: false,
  xaxis: { type: "category" }
};
// Plotly data click event (optional):
function onPlotClick(data) {
function onPlotClick(data) {
   if (data.points.length > 0) {
   if (data.points.length > 0) {
Zeile 270: Zeile 255:
   }
   }
}
}
// Return processed data to CoPlanner:
return {
  data,
  layout, 
onPlotClick
};
</pre>
====OUT-Filter====
OUT-Filter und Detailsatzsprung schließen sich aus, da beide durch das gleiche Event getriggert werden.
Sofern man keine Anpassungen an den Achsen gemacht hat, kann man einfach im Dashboard bei den Filtereinstellungen den OUT-Filter aktivieren und dieser funktioniert dann auch.
Wenn man allerdings Anpassungen gemacht hat, dann müssen diese auch als "outFilters" übergeben werden.
Dazu braucht man dann die Element-IDs, damit diese übergeben werden können. Diese können über folgenden Code generiert werden und müssen gleich wie die Achse angepasst werden.
<pre>
var elementIdData = dataSourcesElementIds['MAX_JS_Chart'];
var elementIdsDimension1 = elementIdData && elementIdData['Animals'] ? elementIdData['Animals'].values : [];
</pre>
</pre>


Das Return muss dann erweitert werden um die OUT-Filter:
<pre>
return {
  data,
  layout,
  outFilters: {
    'Animals': elementIdsDimension1 // Return element ids in the order they are used in
  }
};
</pre>
Hier ein kleines gesamt Beispiel, in dem die Reihenfolge der Elemente gedreht wurde.
<pre>
// Sample for customized out filters
var inputMaskData = dataSources['MAX_JS_Chart'];
var dataMeasure1 = inputMaskData && inputMaskData['Wert'] ? inputMaskData['Wert'].values : [];
var dataDimension1 = inputMaskData && inputMaskData['Animals'] ? inputMaskData['Animals'].values : [];
var elementIdData = dataSourcesElementIds['MAX_JS_Chart'];
var elementIdsDimension1 = elementIdData && elementIdData['Animals'] ? elementIdData['Animals'].values : [];
dataDimension1 = dataDimension1.slice().reverse(); // Reverse order of elements
elementIdsDimension1 = elementIdsDimension1.slice().reverse(); // Reverse order of element ids
var data = [
  {
    type: 'bar',
    x: dataDimension1,
    y: dataMeasure1
  }
];
var layout = {
  separators: ',.',
  showlegend: false
};
return {
  data,
  layout,
  outFilters: {
    'Animals': elementIdsDimension1 // Return element ids in the order they are used in
  }
};
</pre>


__NOEDITSECTION__
__NOEDITSECTION__

Aktuelle Version vom 7. April 2025, 10:47 Uhr

Systemvoraussetzungen

Die Voraussetzungen finden Sie hier.

Aufruf Diagrammdesigner

@Session_WebAppUrl@/diagram/?charttype=javascript&diagramid=<Diagrammname>


Beispiel:

https://servername:4444/coplanner/diagram/?charttype=javascript&diagramId=Mein erstes JS Diagramm


Erweiterter Aufruf

  • hideSessionHeader: Definiert, ob der Header angezeigt werden soll oder nicht (true blendet Header aus). Der Default beim Öffnen ist false.


Aufruf für das Erstellen eines Diagramms

JavaScript Diagramme können derzeit nur über das BI-Center im Windowsclient erstellt werden.

Hinweis  Funktioniert nur im PowerUser Modus

Diagrammdesigner

Quellen

Für die JavaScript Diagramme kann man ein bis vier Datenquellen definieren, auf die man zugreifen möchte.

Als Quellen können bestehende Matrixmasken gewählt werden.

Filter

Über das + können Filter hinzugefügt werden und über das x wieder gelöscht werden.

  • Dimension: Auswahl der Dimension für den Filter
  • Caption: Anzeigetext des Filters im Diagramm
  • Quelle 1 - 4: Hier kann man Verknüpfungen zwischen Filtern und den einzelnen Datenquellen definieren
  • Standardwert: Hier kann ein Wert vergeben werden, der automatisch beim Öffnen des Diagramms ausgewählt wird

JavaScript

Bei Neuanlage eines JavaScript Diagramms wird ein einfacher Beispielcode bereitgestellt. Sie können sich das Diagramm sofort anzeigen lassen. Beispiele, wie man dieses Diagramm dann generischer machen kann sind ebenfalls auskommentiert im Beispielcode vorhanden.

Unter https://plot.ly/javascript/ finden Sie Codebeispiele und es gibt auch einen Chartgenerator als Hilfestellung zur Erstellung eines Diagramms.

Beispiel

Erstellt man ein neues JavaScript Diagramm, hat man schon folgenden Beispielcode im JavaScript-Bereich am CoP 10 HF 1.3:

// Further information and samples can be found at:
// https://plot.ly/javascript/
// https://copsupport.coplanner.com/helpCOP10/index.php/WebApps:JavaScript_Diagramm

// var inputMaskData = dataSources["NAME_OF_INPUTMASK"];
// var dataMeasure1 = inputMaskData && inputMaskData["MEASURE_NAME_1"] ? inputMaskData["MEASURE_NAME_1"].values : [];
// var dataAxis1 = inputMaskData && inputMaskData["DIMENSION_NAME_1"] ? inputMaskData["DIMENSION_NAME_1"].values : [];

// Plotly data object (required):
var data = [
    {
        type: 'bar',
        x: ['giraffes', 'orangutans', 'monkeys'],
        y: [20, 14, 23]
        // x: dataAxis1,
        // y: dataMeasure1
    }
];

// Plotly layout object (optional):
var layout = {
    separators: ',.',
    showlegend: false,
    xaxis: { type: "category" }
};

// Return processed data to CoPlanner:
return {
    data,
    layout
};

Öffnet man das Diagramm ohne eine Änderung, so sieht man folgendes Diagramm:


Dieses Diagramm hat momentan nur hard-codierte Inhalte. In diesem Beispiel wird gezeigt, wie man das Diagramm abändern muss, damit die Werte dynamisch aus dem CoPlanner kommen.

Daten festlegen

Zuerst muss es die entsprechende Tabelle mit dem Inhalt im CoPlanner geben. Auf diese wird ein CoPlanner-Würfel gebaut und eine Matrixmaske.

Die Matrixmaske sieht wie folgt aus und hat in diesem Beispiel den Namen MAX_JS_Chart:


In dem Custom JavaScript Diagramm wählt man nun bei Quelle 1 die Maske MAX_JS_Chart aus. Wir wollen nun aus der Quelle MAX_JS_Chart das Measure mit dem Namen Wert und die Dimension Animals im Diagramm darstellen.

Im Beispielcode kommentieren wir dazu die folgenden Zeilen nun ein (durch entfernen der //) und passen diese an, damit wir über Variablen auf unsere Datenquelle zugreifen können.

Vorher:

// var inputMaskData = dataSources["NAME_OF_INPUTMASK"];
// var dataMeasure1 = inputMaskData && inputMaskData["MEASURE_NAME_1"] ? inputMaskData["MEASURE_NAME_1"].values : [];
// var dataAxis1 = inputMaskData && inputMaskData["DIMENSION_NAME_1"] ? inputMaskData["DIMENSION_NAME_1"].values : [];

Anpassen zu:

var inputMaskData = dataSources["MAX_JS_Chart"];
var dataMeasure1 = inputMaskData && inputMaskData["Wert"] ? inputMaskData["Wert"].values : [];
var dataDimension1 = inputMaskData && inputMaskData["Animals"] ? inputMaskData["Animals"].values : [];


Nun verändern wir den Teil, wo wir die Daten definieren und greifen auf die gerade angepassten Variablen zu. Vorher:

// Plotly data object (required):
var data = [
    {
        type: 'bar',
        x: ['giraffes', 'orangutans', 'monkeys'],
        y: [20, 14, 23]
        // x: dataAxis1,
        // y: dataMeasure1
    }
];

Anpassen zu:

// Plotly data object (required):
var data = [
    {
        type: 'bar',
        // x: ['giraffes', 'orangutans', 'monkeys'],
        // y: [20, 14, 23]
        x: dataAxis1,
        y: dataMeasure1
    }
];


Wenn wir das Diagramm nun speichern und ansehen, wird uns das Diagramm basierend auf unseren Daten im CoPlanner angezeigt.

Filter hinzufügen

Wollen wir jetzt noch, dass die Daten nach der Zeit gefiltert werden, können wir als Filter die Zeit auswählen und das mit der Quelle 1 verbinden.

Detailsatzsprung hinzufügen

Zusätzlich können wir noch einen Detailsatzsprung definieren.

Dazu sind folgende Schritte notwendig:

  • Erweitern des Basiswürfels: Im CoPlanner Würfel muss ein berechnetes Measure erstellt werden vom Typ Link, welches den Link zum gewünschten Elemente enthält und die Filter entsprechend übergibt.

z.B.: @Session_WebAppUrl@/PivotTable/?tableform=ZS_JS_Chart&contextFilters=Animals mu Attribute(Animals.ID) and Zeit mu Attribute(Zeit.ID)

Über diesen Link wird die Zeilensicht mit dem Namen ZS_JS_Chart aufgerufen und es werden die Filter/Achsenelemente für die Dimensionen Animals und Zeit übergeben.

  • Erweitern der Basismaske: Das JavaScript Chart hat als Basis eine Matrixmaske. In dieser Maske muss unser neues Measure hinzugefügt werden.
  • Erweiterung im JavaScript Code:

Wir definieren zusätzlich unser neues Measure Link_Detail in der obersten Sektion

var dataLink1 = inputMaskData && inputMaskData["Link_Detail"] ? inputMaskData["Link_Detail"].values : [];

Erweitern des data-Bereichs von

var data = [
  {
    type: 'bar',
    x: dataDimension1,
    y: dataMeasure1
    // x: ['giraffes', 'orangutans', 'monkeys'],
    //y: [20, 14, 23]
  }
];


zu

var data = [
  {
    type: 'bar',
    x: dataDimension1,
    y: dataMeasure1,
    link: dataLink1

    // x: ['giraffes', 'orangutans', 'monkeys'],
    //y: [20, 14, 23]
  }
];


Zusätzlich muss folgender Code eingefügt werden:

function onPlotClick(data) {
   if (data.points.length > 0) {
     var index = data.points[0].pointNumber;
     var clickData = data.points[0].data.link[index];
   window.open(clickData);
   }
}


Final hier der daraus entstandene Code im JavaScript Chart:


var inputMaskData = dataSources["MAX_JS_Chart"];
var dataMeasure1 = inputMaskData && inputMaskData["Wert"] ? inputMaskData["Wert"].values : [];
var dataDimension1 = inputMaskData && inputMaskData["Animals"] ? inputMaskData["Animals"].values : [];
var dataLink1 = inputMaskData && inputMaskData["Link_Detail"] ? inputMaskData["Link_Detail"].values : [];

// Plotly data object (required):
var data = [
  {
    type: 'bar',
    x: dataDimension1,
    y: dataMeasure1,
    link: dataLink1
    // x: ['giraffes', 'orangutans', 'monkeys'],
    //y: [20, 14, 23]                
  }
];

// Plotly layout object (optional):
var layout = {
  separators: ',.',
  showlegend: false,
  xaxis: { type: "category" }
};

// Plotly data click event (optional):
function onPlotClick(data) {
   if (data.points.length > 0) {
     var index = data.points[0].pointNumber;
     var clickData = data.points[0].data.link[index];
   window.open(clickData);
   }
}

// Return processed data to CoPlanner:
return {
  data,
  layout,  
onPlotClick
};

OUT-Filter

OUT-Filter und Detailsatzsprung schließen sich aus, da beide durch das gleiche Event getriggert werden.

Sofern man keine Anpassungen an den Achsen gemacht hat, kann man einfach im Dashboard bei den Filtereinstellungen den OUT-Filter aktivieren und dieser funktioniert dann auch.

Wenn man allerdings Anpassungen gemacht hat, dann müssen diese auch als "outFilters" übergeben werden.

Dazu braucht man dann die Element-IDs, damit diese übergeben werden können. Diese können über folgenden Code generiert werden und müssen gleich wie die Achse angepasst werden.

var elementIdData = dataSourcesElementIds['MAX_JS_Chart'];
var elementIdsDimension1 = elementIdData && elementIdData['Animals'] ? elementIdData['Animals'].values : [];

Das Return muss dann erweitert werden um die OUT-Filter:

return {
  data,
  layout,
  outFilters: {
    'Animals': elementIdsDimension1 // Return element ids in the order they are used in
  }
};


Hier ein kleines gesamt Beispiel, in dem die Reihenfolge der Elemente gedreht wurde.

// Sample for customized out filters

var inputMaskData = dataSources['MAX_JS_Chart'];
var dataMeasure1 = inputMaskData && inputMaskData['Wert'] ? inputMaskData['Wert'].values : [];
var dataDimension1 = inputMaskData && inputMaskData['Animals'] ? inputMaskData['Animals'].values : [];

var elementIdData = dataSourcesElementIds['MAX_JS_Chart'];
var elementIdsDimension1 = elementIdData && elementIdData['Animals'] ? elementIdData['Animals'].values : [];

dataDimension1 = dataDimension1.slice().reverse(); // Reverse order of elements
elementIdsDimension1 = elementIdsDimension1.slice().reverse(); // Reverse order of element ids

var data = [
  {
    type: 'bar',
    x: dataDimension1,
    y: dataMeasure1
  }
];

var layout = {
  separators: ',.',
  showlegend: false
};

return {
  data,
  layout,
  outFilters: {
    'Animals': elementIdsDimension1 // Return element ids in the order they are used in
  }
};