/* SuperX-VIZ Modul (c) 2023 Daniel Quathamer */
function chartModel(id,name,renderer,datasources)
{
this.version="0.2b";
this.id=id;
this.name=name;
this.renderer=renderer;
this.dataSources=datasources;
//this.globalProperties=globalproperties;
this.targetDiv=""; //only for d3
this.chartElements=new Array();
this.chartPropertiesUsed=new Array();
this.dataTransformation=new Array();
}
function possibleVizType(elemID,value,name,explanation,isDefault )
{
this.elemID=elemID;
this.value=value;
this.name=name;
this.explanation=explanation;
this.isDefault=isDefault;
}
function usedVizType(elemID,vizTypeUniquename,caption,datasource )
{
this.elemID=elemID;
this.vizTypeUniquename=vizTypeUniquename;
this.caption=caption;
this.datasource=datasource;
this.elementTypeProperties=new Array();
}
function usedVizProperty(name,vizPropertyVariablename,propertyValue,propUnit )
{
this.name=name;
this.vizPropertyVariablename=vizPropertyVariablename;
this.propertyValue=propertyValue;
this.propUnit=propUnit;
}
function usedVizTypeProperty(nr,vizTypePropertyUniquename,caption,propertyValue,propertyType )
{
this.nr=nr;
this.vizTypePropertyUniquename=vizTypePropertyUniquename;
this.caption=caption;
this.propertyValue=propertyValue;
this.propertyType=propertyType;
}
function dataTransformationCol(tableId,colname,colfunction)
{
this.tableId=tableId;
this.colname=colname;
this.colfunction=colfunction;
}
function selectionRowMetaData(nr,targetColumn,colname,colcaption,coltype,colfunction)
{
this.nr=nr;
this.targetColumn=targetColumn;
this.colname=colname;
this.colcaption=colcaption;
this.coltype=coltype;
this.colfunction=colfunction;
}
function selectionPropertyValue(nr,name,value,isDefault )
{
this.nr=nr;
this.name=name;
this.value=value;
this.isDefault=isDefault;
}
function dimFunction(nr,name,value,isDefault )
{
this.nr=nr;
this.name=name;
this.value=value;
this.isDefault=isDefault;
}
function dimensionProperty(name,caption,explanation,isMeasure,isMandatory,datasource)
{
this.name=name;
this.caption=caption;
this.isMeasure=isMeasure;
this.isMandatory=isMandatory;
this.explanation=explanation;
this.datasource=datasource;
this.getValueResultset = function () {
var valueOptions=[];
var optionCounter=0;
//selectionRsMetaData=fillSelectionResultMetaData();
//console.log("felder"+selectionRsMetaData.length);
var isDefault=false;
for(var j=0;j < rsColumnMetaData[datasource].length;j++)
{
if(rsColumnMetaData[datasource][j].colcaption.trim() !=""
//&& (
// isMeasure==false || rsColumnMetaData[datasource][j].coltype == 4 || rsColumnMetaData[datasource][j].coltype == 3)
//
)
{
//console.log("feld "+rsColumnMetaData[j].nr+selectionRsMetaData[j].targetColumn);
var o=new selectionPropertyValue(rsColumnMetaData[datasource][j].nr,rsColumnMetaData[datasource][j].colcaption,rsColumnMetaData[datasource][j].colname,isDefault);
valueOptions[optionCounter]=o;
optionCounter++;
if(isDefault)
isDefault=false;
}
}
return valueOptions;
}
}
function selectionProperty(name,caption,isDynamic,isMeasure,isMandatory,staticValues,defaultValue,optionalFunction)
{
/*OBSOLETE*/
this.name=name;
this.caption=caption;
this.isDynamic=isDynamic;
this.isMeasure=isMeasure;
this.staticValues=staticValues;
this.isMandatory=isMandatory;
this.defaultValue=defaultValue;
this.optionalFunction=optionalFunction;
this.getValueResultset = function () {
var valueOptions=[];
var optionCounter=0;
if(isDynamic)
{
for(var j=0;j < rsMetaData.length;j++)
{
var isDefault=false;
if(rsMetaData[j].colcaption.trim() !="" &&
(isMeasure==false || rsMetaData[j].coltype == 4 || rsMetaData[j].coltype == 3)
)
{
if(rsMetaData[j].colcaption==defaultValue)
isDefault=true;
var o=new selectionPropertyValue(rsMetaData[j].nr,rsMetaData[j].colcaption,rsMetaData[j].colname,isDefault);
valueOptions[optionCounter]=o;
optionCounter++;
}
}
}
else
{
var staticValuesArray = staticValues.split(/\|/);
for(var k=0;k < staticValuesArray.length;k++)
{
var isDefault=false;
if(rsMetaData[j].colcaption==defaultValue)
isDefault=true;
var o=new selectionPropertyValue(k,staticValuesArray[k],staticValuesArray[k],isDefault);
valueOptions[k]=o;
}
}
return valueOptions;
}
}
/*Transfer form to model: */
function updateChartModel()
{
var myChartPropertiesUsed=new Array();
//first empty properties:
/*for(var k=0;k< myChartModel.chartPropertiesUsed.length;k++)
{
myChartModel.chartPropertiesUsed[k].pop();
}*/
if(document.getElementById("chartName").value=="")
document.getElementById("chartName").value=vizInitialName;
var chartName=document.getElementById("chartName").value;
//myChartModel.options.caption=chartName;
if(myChartModel.renderer=="")
myChartModel.renderer=document.getElementById("fldVizRenderer").value;
var myCaption=new usedVizProperty("caption","caption",chartName);
myChartPropertiesUsed.push(myCaption);
//var myForm=document.forms["chartPropertiesForm"];
for(var k=0;k < commonChartProperties.length;k++)
{
if(getCommonChartProperty(commonChartProperties[k].name)!="")
{
var myProp=new usedVizProperty(commonChartProperties[k].name,commonChartProperties[k].variableName,getCommonChartProperty(commonChartProperties[k].name),commonChartProperties[k].propUnit);
myChartPropertiesUsed.push(myProp);
}
}
//first Collect all groups:
myChartModel.chartPropertiesUsed=myChartPropertiesUsed;
//Update the source Code TEXTAREA:
updateChartModelCode(myChartModel);
return myChartModel;
}
function renderChart(chartDiv,currentChartModel,datasource,title)
{
if(!datasource)
var datasource=0;
if(!title)
var title=document.getElementById("chartName").value;
/*if(document.getElementById("chartName").value=="")
document.getElementById("chartName").value=vizInitialName;*/
if(currentChartModel.chartElements.length>0 && currentChartModel.chartElements[0])
{
renderChartSVGFromModel(currentChartModel,chartDiv,datasource,title);
}
else
document.getElementById(chartDiv).innerHTML="";
//
}
function prepareSelectionForm()
{
var selectionProperties=[];
var myProp= new selectionProperty("dimension1","Dimension 1",true,false,true,null,null,true);
selectionProperties[0]=myProp;
var myProp= new selectionProperty("dimension2","Dimension 2",true,false,false,null,null,true);
selectionProperties[1]=myProp;
var myProp= new selectionProperty("measure1","Maß",true,true,true,null,null,true);
selectionProperties[2]=myProp;
return selectionProperties;
}
function generateFormFieldHtml(labelText,fieldname,tooltiptext,inputElem)
{
var zs="
";
zs+="
"+labelText+"
";
zs+="
";
zs+="
";
//zs+="";
zs+=getOuterHTML(inputElem);
zs+="
"; //Ende field body
zs+="
";//Ende field
return zs;
}
function getOuterHTML(element) {
var container = document.createElement("div");
container.appendChild(element.cloneNode(true));
return container.innerHTML;
}
function createChartElementConfig1Form(renderer,elemID)
{
//first empty form:
var formChartElementConfig1=document.getElementById("ChartElementConfig1Div");
while (formChartElementConfig1.firstChild) {
formChartElementConfig1.removeChild(formChartElementConfig1.firstChild);
}
var formChartElementConfig2=document.getElementById("ChartElementConfig2Div");
while (formChartElementConfig2.firstChild) {
formChartElementConfig2.removeChild(formChartElementConfig2.firstChild);
}
//reset ElemID:
document.getElementById("chartElementID").value=elemID;
//any previous values?
var myChartElem=null;
if(myChartModel.chartElements && elemID !="")
{
var filtered=myChartModel.chartElements.filter(obj => obj.elemID == elemID);
var myChartElem=filtered[0];
}
//First Datasource:
//const elementDatasourceDiv=document.createElement("div");
/*
const fieldDatasourceElem = document.createElement("div");
fieldDatasourceElem.classList.add("field");
fieldDatasourceElem.classList.add("is-horizontal");
//label:
const labelDatasourceElem = document.createElement("div");
labelDatasourceElem.classList.add("field-label");
labelDatasourceElem.classList.add("is-small");
const labelDatasource = document.createElement("label");
labelDatasource.classList.add("label");
labelDatasource.classList.add("is-required");
labelDatasource.classList.add("is-small");
labelDatasource.classList.add("has-tooltip-right");
labelDatasource.setAttribute("data-tooltip","Datenquelle für das Diagrammelement");
const textnode = document.createTextNode("Datenquelle");
labelDatasource.appendChild(textnode);
labelDatasourceElem.appendChild(labelDatasource);
fieldDatasourceElem.appendChild(labelDatasourceElem);
const selDatasourceFbodyElem = document.createElement("div");
selDatasourceFbodyElem.classList.add("field-body");
const selDatasourceElem = document.createElement("select");
selDatasourceElem.name="chartElementDatasource";
selDatasourceElem.id="chartElementDatasource";
selDatasourceElem.classList.add("select");
selDatasourceElem.classList.add("is-small");
selDatasourceElem.style.width="100px";
selDatasourceElem.onchange= function () {
createChartElementsConfig2Form(renderer);
};
fillSelectOptions(selDatasourceElem,rsTableMetaData,true,(myChartElem!=null?myChartElem.datasource:null));
selDatasourceFbodyElem.appendChild(selDatasourceElem);
fieldDatasourceElem.appendChild(selDatasourceFbodyElem);
formChartElementConfig1.appendChild(fieldDatasourceElem);*/
const selDatasourceElem = document.createElement("select");
selDatasourceElem.name="chartElementDatasource";
selDatasourceElem.id="chartElementDatasource";
selDatasourceElem.classList.add("select");
selDatasourceElem.classList.add("is-small");
//selDatasourceElem.style.width="100px";
fillSelectOptions(selDatasourceElem,rsTableMetaData,true,(myChartElem!=null?myChartElem.datasource:null));
var datasourceFieldHtml=generateFormFieldHtml("Datenquelle","chartElementDatasource","Datenquelle für das Diagrammelement, bei Makroberichten wählen Sie die Tabellennnummer",selDatasourceElem);
const selVizTypeElem = document.createElement("select");
selVizTypeElem.name="chartElementVizType";
selVizTypeElem.id="chartElementVizType";
selVizTypeElem.classList.add("select");
selVizTypeElem.classList.add("is-small");
//selVizTypeElem.style.width="100px";
fillSelectOptions(selVizTypeElem,getPossibleVizTypes(renderer),false,(myChartElem!=null?myChartElem.vizTypeUniquename:null));
var vizTypeFieldHtml=generateFormFieldHtml("Grafikelement-Typ","chartElementVizType","Art des Grafikelements",selVizTypeElem);
formChartElementConfig1.innerHTML=datasourceFieldHtml+vizTypeFieldHtml;
//add onchange:
document.getElementById("chartElementDatasource").addEventListener(
'change',
function() { createChartElementsConfig2Form(renderer); },
false
);
document.getElementById("chartElementVizType").addEventListener(
'change',
function() { createChartElementsConfig2Form(renderer); },
false
);
//Then vizType:
/*
const fieldVizTypeElem = document.createElement("div");
fieldVizTypeElem.classList.add("field");
fieldVizTypeElem.classList.add("is-horizontal");
//label:
const labelVizTypeElem = document.createElement("div");
labelVizTypeElem.classList.add("field-label");
labelVizTypeElem.classList.add("is-small");
const labelVizType = document.createElement("label");
labelVizType.classList.add("label");
labelVizType.classList.add("is-required");
labelVizType.classList.add("is-small");
labelVizType.classList.add("has-tooltip-right");
labelVizType.setAttribute("data-tooltip","Art des Grafikelements");
const textnodeVizType = document.createTextNode("Grafikelement-Typ");
labelVizType.appendChild(textnodeVizType);
labelVizTypeElem.appendChild(labelVizType);
fieldVizTypeElem.appendChild(labelVizTypeElem);
const selVizTypeFbodyElem = document.createElement("div");
selVizTypeFbodyElem.classList.add("field-body");
const selVizTypeElem = document.createElement("select");
selVizTypeElem.name="chartElementVizType";
selVizTypeElem.id="chartElementVizType";
selVizTypeElem.classList.add("select");
selVizTypeElem.classList.add("is-small");
selVizTypeElem.style.width="100px";
selVizTypeElem.onchange= function () {
createChartElementsConfig2Form(renderer);
};
fillSelectOptions(selVizTypeElem,getPossibleVizTypes(renderer),false,(myChartElem!=null?myChartElem.vizTypeUniquename:null));
selVizTypeFbodyElem.appendChild(selVizTypeElem);
fieldVizTypeElem.appendChild(selVizTypeFbodyElem);
formChartElementConfig1.appendChild(fieldVizTypeElem);
*/
//display Element if already saved:
if(elemID!="")
createChartElementsConfig2Form(renderer,elemID);
}
function createChartElementsConfig2Form(renderer,elemID)
{
var dataSource=document.getElementById("chartElementDatasource").value;
var vizType=document.getElementById("chartElementVizType").value;
//now Elements:
var formChartElementConfig2Div=document.getElementById("ChartElementConfig2Div");
while (formChartElementConfig2Div.firstChild) {
formChartElementConfig2Div.removeChild(formChartElementConfig2Div.firstChild);
}
//any previous values?
//reset general properties:
//renderGeneralChartPropertiesForm("generalChartPropertiesFormDiv",myCommonChartProperties,renderer);
const elementDivBox = document.createElement("div");
//first only Dimensions and measures:
var elementDivBoxHtml="";
for(var k=0;k < vizTypeProperties.length;k++)
{
if(vizType==vizTypeProperties[k].typeUniquename &&
(vizTypeProperties[k].groupUniquename=="CATEGORY"
|| vizTypeProperties[k].groupUniquename=="MEASURE"
)
)
{
var selectedValue=getChartElementPropertyValue(elemID,vizTypeProperties[k].propUniquename);
elementDivBoxHtml+=renderDimensionField(vizTypeProperties[k],dataSource,selectedValue);
//elementDivBox.appendChild(renderDimensionField(vizTypeProperties[k],dataSource,selectedValue));
}
}
elementDivBox.innerHTML=elementDivBoxHtml;
//chartElement-specific properties:
//without Dimensions and measures:
/*for(var k=0;k < vizTypeProperties.length;k++)
{
if(vizType==vizTypeProperties[k].typeUniquename
&& vizTypeProperties[k].groupUniquename!="CATEGORY"
&& vizTypeProperties[k].groupUniquename!="MEASURE"
){
var currentCommonChartProperties=commonChartProperties.filter(obj => obj.name == vizTypeProperties[k].propUniquename);
if(currentCommonChartProperties.length >0)
{
elementDivBox.appendChild(renderChartPropertyField(elemID,currentCommonChartProperties[0],false));
}
else
{
const unknownFieldDiv = document.createElement("div");
const unknownField=document.createTextNode("Unbekanntes Feld "+vizTypeProperties[k].propUniquename);
unknownFieldDiv.appendChild(unknownField);
elementDivBox.appendChild(unknownFieldDiv);
}
}
}*/
const saveBtnDiv = document.createElement("div");
const saveBtn = document.createElement("input");
saveBtn.type="BUTTON";
saveBtn.value="Übernehmen";
saveBtn.classList.add("button");
saveBtn.classList.add("is-small");
saveBtn.onclick =function() {
saveChartElementConfig()
}
saveBtnDiv.appendChild(saveBtn);
elementDivBox.appendChild(saveBtnDiv);
formChartElementConfig2Div.appendChild(elementDivBox);
}
function getChartElementPropertyValue(elemID,propUniquename)
{
var retVal=null;
var myChartElem=null;
if(myChartModel.chartElements && elemID !=null)
{
var filtered=myChartModel.chartElements.filter(obj => obj.elemID == elemID);
var myChartElem=filtered[0];
if(myChartElem.elementTypeProperties && myChartElem.elementTypeProperties.length)
{
for(var k=0;k < myChartElem.elementTypeProperties.length;k++)
{
myVizTypeProperty=myChartElem.elementTypeProperties[k];
if(myVizTypeProperty.vizTypePropertyUniquename==propUniquename)
{
retVal=myVizTypeProperty.propertyValue;
}
}
}
}
return retVal;
}
function loadChartElementConfig(myElem)
{
var elemID=myElem.value;
if(elemID=="")
alert("Kein Grafikelement gefunden");
else
{
var renderer=document.getElementById("fldVizRenderer").value;
var myVizType=myChartModel.chartElements.filter(obj => obj.elemID == elemID);
//var myVizType=myChartModel.chartElements[elemID];
createChartElementConfig1Form(renderer,elemID);
//document.getElementById("chartElementVizType").value=myVizType.vizTypeUniquename;
//document.getElementById("chartElementDatasource").value=myVizType.datasource;
}
}
function saveChartElementConfig()
{
var elemID=document.getElementById("chartElementID").value;
var vizTypeUniquename=document.getElementById("chartElementVizType").value;
var datasource=document.getElementById("chartElementDatasource").value;
var title=document.getElementById("chartName").value;
var nextElemID=parseInt(document.getElementById("vizElementCounter").value) +1;
var mode="update";
if(elemID=="")
{
//insert mode:
mode="insert";
if(myChartModel.chartElements)
elemID=myChartModel.chartElements.length +1;
else
elemID="0";
}
var myVizType=new usedVizType(elemID,vizTypeUniquename,vizTypeUniquename,datasource); //nr,vizTypeUniquename,caption,datasource
var propertyCounter=0;
for(var k=0;k < vizTypeProperties.length;k++)
{
if(vizTypeUniquename==vizTypeProperties[k].typeUniquename
&& document.getElementById(vizTypeProperties[k].propUniquename)
&& document.getElementById(vizTypeProperties[k].propUniquename).value !="")
{
var myUsedVizTypeProperty=new usedVizTypeProperty(elemID,vizTypeProperties[k].propUniquename, vizTypeProperties[k].caption,document.getElementById(vizTypeProperties[k].propUniquename).value,vizTypeProperties[k].propertyType); //))nr,vizTypePropertyUniquename,caption,propertyValue )
myVizType.elementTypeProperties.push(myUsedVizTypeProperty);
}
}
//myVizType.elementTypeProperties=null;
//TODO: Existenz abfangen, hier wird einfach hinzugefügt:
if(mode=="update")
{
for(var k=0;k obj.elemID != elemID);
myChartModel.chartElements=filtered;
//myChartModel.chartElements.pop();
//elemID--;
//if(document.getElementById("chartElementID"))
// document.getElementById("chartElementID").value=elemID;
document.getElementById("vizElementCounter").value=myChartModel.chartElements.length;
const chartElementListSelect=document.getElementById("chartElementID");
fillChartElementListSelect(chartElementListSelect);
createChartElementConfig1Form(renderer,null);
renderChart('chartDiv',myChartModel);
}
}
function fillChartElementListSelect(mySelectElem,selectedValue)
{
var chartElementListSelectOptionArray=new Array();
if(myChartModel.chartElements.length>0)
{
for(var k=0;k < myChartModel.chartElements.length;k++)
{
var myOptionValue=new possibleVizType(myChartModel.chartElements[k].elemID,
myChartModel.chartElements[k].elemID,
myChartModel.chartElements[k].vizTypeUniquename + "-"+myChartModel.chartElements[k].datasource,
"", //explanation
(myChartModel.chartElements[k].elemID==selectedValue ? true:false) //isDefault
);
chartElementListSelectOptionArray.push(myOptionValue);
}
}
fillSelectOptions(mySelectElem,chartElementListSelectOptionArray,false,selectedValue);
}
function showChartElementsBodyForm(elemID)
{
//Reset Elements Form
//elemID++;
var filtered=myChartModel.chartElements.filter(obj => obj.elemID == elemID);
document.getElementById("chartElementID").value=elemID;
document.getElementById("chartElementVizType").value=filtered[0].vizTypeUniquename;
var formChartElementConfig2Div=document.getElementById("ChartElementConfig2Div");
while (formChartElementConfig2Div.firstChild) {
formChartElementConfig2Div.removeChild(formChartElementConfig2Div.firstChild);
}
}
function resetChartPropertiesForm(chosenRenderer)
{
myChartModel=new chartModel(1,"",document.getElementById("fldVizRenderer").value,rsTableMetaData);
renderChart('chartDiv',myChartModel);
//Show Plot Code if renderer =plot:
var myDiv=document.getElementById("chartCodeDiv");
if(chosenRenderer=="plot" || chosenRenderer=="echarts")
myDiv.style.display="block";
else
myDiv.style.display="none";
createChartElementConfig1Form(chosenRenderer,null);
return true;
}
function getPossibleVizTypes(renderer)
{
var possibleVizTypes=new Array();
for(var k=0;k < vizTypes.length;k++)
{
if(vizTypes[k].rendererUniquename==renderer)
{
var newVizType = new possibleVizType( //nr,value,name,explanation,isDefault
k,vizTypes[k].uniquename,vizTypes[k].caption,'',false);
possibleVizTypes.push(newVizType);
}
}
return possibleVizTypes;
}
function fillDimensionProperty(vizTypeProperty,datasource)
{
var isMeasure=(vizTypeProperty.groupUniquename=="MEASURE")?true:false;
var myProp= new dimensionProperty(vizTypeProperty.propUniquename,vizTypeProperty.caption,vizTypeProperty.explanation,isMeasure,vizTypeProperty.isMandatory,datasource);
return myProp;
}
function showChartPropertiesFormDiv(formDiv,formElementsDiv,renderer)
{
if(myChartModel != null)
{
var myDiv=document.getElementById(formDiv);
switch (formDiv)
{
case "generalChartPropertiesFormDiv":
renderGeneralChartPropertiesForm(formElementsDiv,commonChartProperties,myChartModel);
break;
case "ChartElementsDiv":
createChartElementConfig1Form(myChartModel.renderer,null);
break;
default:
//do nothing
break;
}
if(myDiv.style.display=="block")
myDiv.style.display="none";
else
myDiv.style.display="block";
}
}
function showSaveChartFormDiv(formDiv,renderer)
{
var myDiv=document.getElementById(formDiv);
if(myDiv.style.display=="block")
myDiv.style.display="none";
else
myDiv.style.display="block";
}
function prepareForm(vizTypeUniquename,vizTypeProperties)
{
var chartProperties=[];
var propertyCounter=0;
for(var k=0;k < vizTypeProperties.length;k++)
{
if(vizTypeUniquename==vizTypeProperties[k].typeUniquename)
{
var isMeasure=(vizTypeProperties[k].groupUniquename=="MEASURE")?true:false;
var myProp= new dimensionProperty(vizTypeProperties[k].propUniquename,vizTypeProperties[k].caption,vizTypeProperties[k].explanation,isMeasure,vizTypeProperties[k].isMandatory);
chartProperties.push(myProp);
propertyCounter++;
}
}
return chartProperties;
}
/*
function prepareBarXForm()
{
var chartProperties=[];
var propertyCounter=0;
var myProp= new dimensionProperty("viz_dimension1","Kategorie-Dimension",false,true);
chartProperties[0]=myProp;
var myProp= new dimensionProperty("viz_measure1","Maß",true,true);
chartProperties[1]=myProp;
return chartProperties;
}
function prepareBarYForm()
{
var chartProperties=[];
var propertyCounter=0;
var myProp= new dimensionProperty("viz_dimension1","Kategorie-Dimension",true,false,true,null,null,true);
chartProperties[0]=myProp;
var myProp= new dimensionProperty("viz_dimension2","Serien-Dimension",true,false,false,null,null,true);
chartProperties[1]=myProp;
var myProp= new dimensionProperty("viz_measure1","Maß",true,true,true,null,null,true);
chartProperties[2]=myProp;
return chartProperties;
}
function prepareLineForm()
{
var chartProperties=[];
var propertyCounter=0;
var myProp= new dimensionProperty("viz_dimension1","Kategorie-Dimension",true,false,true,null,null,true);
chartProperties[0]=myProp;
var myProp= new dimensionProperty("viz_dimension2","Serien-Dimension",true,false,false,null,null,true);
chartProperties[1]=myProp;
var myProp= new dimensionProperty("viz_measure1","Maß",true,true,true,null,null,true);
chartProperties[2]=myProp;
return chartProperties;
}
function prepareLineForm_alt()
{
var chartProperties=[];
var propertyCounter=0;
var myProp= new dimensionProperty("dimension1","X-Achse",true,false,true,null,null,true);
chartProperties[0]=myProp;
var myProp= new dimensionProperty("measure1","Y-Achse",true,true,true,null,null,true);
chartProperties[1]=myProp;
return chartProperties;
}
*/
function selectionResultPreview(myDiv)
{
myDivElem=document.getElementById(myDiv);
if(myDivElem.style.display=="none")
{
var selectionRs=[];
var selectionRsMetaData=[];
var rowcount=rs.length;
var maxLenCategoryDim=0;
var maxMeasure=0;
selectionRsMetaData=fillSelectionResultMetaData();
//alert(selectionRsMetaData[0].colname);
selectionRs=fillSelectionResult(selectionRsMetaData);
showSelectionTable("selectionResultPreviewTable",selectionRs,selectionRsMetaData,10);
myDivElem.style.display="block";
}
else
myDivElem.style.display="none";
}
function fillSelectionResultMetaData()
{
var selectionRsMetaData=[];
var dimension1=document.getElementById("dimension1").value;
var dimension2=document.getElementById("dimension2").value;
var measure=document.getElementById("measure1").value;
var functionOfDimension1=document.getElementById("dimension1_fn").value;
var functionOfDimension2=document.getElementById("dimension2_fn").value;
var functionOfMeasureDim=document.getElementById("measure1_fn").value;
//first fill metadata:
var counter=1;
selectionRsMetaData.push(new selectionRowMetaData(counter,"dimension1",dimension1,getColumnCaption(dimension1),0,functionOfDimension1));
if(dimension2!="")
{
counter++;
var dim2=new selectionRowMetaData(counter,"dimension2",dimension2,getColumnCaption(dimension2),0,functionOfDimension2);
selectionRsMetaData.push(dim2 );
}
counter++;
selectionRsMetaData.push(new selectionRowMetaData(counter,"measure",measure,getColumnCaption(measure),0),functionOfMeasureDim);
return selectionRsMetaData;
}
function renderDimensionField(vizTypeProperty,datasource,selectedValue)
{
const selElem = document.createElement("select");
selElem.name=vizTypeProperty.propUniquename;
selElem.id=vizTypeProperty.propUniquename;
var dimensionProperty=fillDimensionProperty(vizTypeProperty,datasource);
fillSelectOptions(selElem,dimensionProperty.getValueResultset(),dimensionProperty.isMandatory,selectedValue);
var zs=generateFormFieldHtml(vizTypeProperty.caption,vizTypeProperty.propUniquename,"Je nach Grafikelement Festlegung der Achsen oder Dimensionen und Maße.",selElem); //TODO tooltip
return zs;
}
function renderDimensionFieldAlt(vizTypeProperty,datasource,selectedValue)
{
const fieldElem = document.createElement("div");
fieldElem.classList.add("field");
fieldElem.classList.add("is-horizontal");
//label:
const labelElem = document.createElement("div");
labelElem.classList.add("field-label"); // is-normal
labelElem.classList.add("is-small");
const label = document.createElement("label");
label.classList.add("label");
label.classList.add("is-required");
label.classList.add("is-small");
label.classList.add("has-tooltip-right");
//label.setAttribute("data-tooltip",dimensionProperty.explanation);
const textnode = document.createTextNode(vizTypeProperty.caption);
label.appendChild(textnode);
labelElem.appendChild(label);
fieldElem.appendChild(labelElem);
//field body:
const fbodyElem = document.createElement("div");
fbodyElem.classList.add("field-body");
//input:
const inputFieldElem = document.createElement("div");
inputFieldElem.classList.add("field");
inputFieldElem.classList.add("is-active");
inputFieldElem.style.width="100px";
const inputSelectElem = document.createElement("div");
inputSelectElem.classList.add("select");
inputSelectElem.classList.add("is-small");
//inputSelectElem.classList.add("is-fullwidth");
const selElem = document.createElement("select");
selElem.name=vizTypeProperty.propUniquename;
selElem.id=vizTypeProperty.propUniquename;
/* vermutlich unnötig: selElem.onchange= function () {
renderChart('chartDiv');
};*/
var dimensionProperty=fillDimensionProperty(vizTypeProperty,datasource);
fillSelectOptions(selElem,dimensionProperty.getValueResultset(),dimensionProperty.isMandatory,selectedValue);
inputSelectElem.appendChild(selElem);
inputFieldElem.appendChild(inputSelectElem);
fbodyElem.appendChild(inputFieldElem);
fieldElem.appendChild(fbodyElem);
return fieldElem;
}
function renderGeneralChartPropertiesForm(formDiv,myCommonChartProperties,currentChartModel)
{
//first empty form:
var myForm=document.getElementById(formDiv);
while (myForm.firstChild) {
myForm.removeChild(myForm.firstChild);
}
//first Collect all groups:
var commonChartPropertyGroups=[];
var previousGroup="";
for(var k=0;k < myCommonChartProperties.length;k++)
{
if(myCommonChartProperties[k].rendererUniquename==currentChartModel.renderer || myCommonChartProperties[k].isGeneric==1)
{
var groupUniquename=myCommonChartProperties[k].groupUniquename;
if(groupUniquename!=""
&& groupUniquename != previousGroup
&& myCommonChartProperties[k].groupVariableName !=""
)
{
var newcommonChartPropertyGroup = new commonChartPropertyGroup(myCommonChartProperties[k].groupCaption,groupUniquename,"");
commonChartPropertyGroups.push(newcommonChartPropertyGroup);
previousGroup=groupUniquename;
}
}
}
const columnDiv = document.createElement("div");
for(var i=0;i < commonChartPropertyGroups.length;i++)
{
const columnGroupDiv = document.createElement("div");
columnGroupDiv.id=commonChartPropertyGroups[i].groupUniquename;
columnGroupDiv.classList.add("block");
const columnGroupHeaderDiv = document.createElement("div");
const colHeader = document.createTextNode(commonChartPropertyGroups[i].caption);
const colHeaderBold = document.createElement("strong");
colHeaderBold.appendChild(colHeader);
const colHeaderParagraph = document.createElement("label");
colHeaderParagraph.classList.add("label");
colHeaderParagraph.classList.add("is-small");
colHeaderParagraph.appendChild(colHeaderBold);
//Toggle visibility:
const colHeaderToggleBtn = document.createElement("a");
colHeaderToggleBtn.id="openBody"+commonChartPropertyGroups[i].groupUniquename;
//colHeaderToggleBtn.classList.add("is-small");
colHeaderToggleBtn.onclick =function() {
toggleGroupBodyDiv(this.id)
}
const colHeaderToggleBtnText = document.createTextNode(" ...");
colHeaderToggleBtn.appendChild(colHeaderToggleBtnText);
colHeaderParagraph.appendChild(colHeaderToggleBtn);
columnGroupHeaderDiv.appendChild(colHeaderParagraph);
//columnGroupHeaderDiv.appendChild(colHeaderToggleBtn);
columnGroupDiv.appendChild(columnGroupHeaderDiv);
const columnGroupBodyDiv = document.createElement("div");
columnGroupBodyDiv.id="Body"+commonChartPropertyGroups[i].groupUniquename;
columnGroupBodyDiv.style.display="none";
for(var k=0;k < myCommonChartProperties.length;k++)
{
if(myCommonChartProperties[k].groupUniquename==commonChartPropertyGroups[i].groupUniquename
&& myCommonChartProperties[k].variableName!=""
//&& !isChartPropertyValidForChartelements(myCommonChartProperties[k],currentChartModel)
&& (myCommonChartProperties[k].rendererUniquename==currentChartModel.renderer
//|| myCommonChartProperties[k].isGeneric==1
)
)
{
columnGroupBodyDiv.appendChild(renderChartPropertyField(null,myCommonChartProperties[k],true));
}
}
columnGroupDiv.appendChild(columnGroupBodyDiv);
columnDiv.appendChild(columnGroupDiv);
}
myForm.appendChild(columnDiv);
}
function toggleGroupBodyDiv(groupBodyDiv)
{
var bodyDiv=groupBodyDiv.substr(4); //remove "open" Prefix
var myDiv=document.getElementById(bodyDiv);
if(myDiv.style.display=="block")
myDiv.style.display="none";
else
myDiv.style.display="block";
}
function renderChartPropertyField(elemID,chartProperty,isCommon)
{
//Wenn im chartModel schon ein Wert vorhanden ist, wird er vorbelegt: if(chartProperty)
var propValue="";
if(myChartModel && isCommon && myChartModel.chartPropertiesUsed.length>0)
{
propValue=getChartPropertyFromModel(myChartModel.chartPropertiesUsed,chartProperty.name,isCommon );
}
if(myChartModel && !isCommon && myChartModel.chartElements.length >0)
{
var filtered=myChartModel.chartElements.filter(obj => obj.elemID == elemID);
var myChartElem=filtered[0];
if(myChartElem && myChartElem.elementTypeProperties && myChartElem.elementTypeProperties.length)
{
propValue=getChartPropertyFromModel(myChartElem.elementTypeProperties,chartProperty.name,isCommon );
}
}
const fieldElem = document.createElement("div");
fieldElem.classList.add("field");
fieldElem.classList.add("is-grouped");
//label:
const labelElem = document.createElement("div");
labelElem.classList.add("label-container");
const label = document.createElement("label");
label.classList.add("label");
label.classList.add("is-required");
label.classList.add("is-small");
label.classList.add("has-tooltip-bottom");
label.setAttribute("data-tooltip",chartProperty.explanation);
const textnode = document.createTextNode(chartProperty.caption);
label.appendChild(textnode);
labelElem.appendChild(label);
fieldElem.appendChild(labelElem);
//input:
const inputControlElem = document.createElement("div");
inputControlElem.classList.add("control");
const inputFieldElem = document.createElement("div");
inputFieldElem.classList.add("field");
const inputElem = document.createElement("div");
inputElem.classList.add("is-small");
//inputElem.classList.add("is-fullwidth");
switch (chartProperty.inputType) {
case "SELECT":
//select input:
inputElem.classList.add("select");
inputElem.classList.add("is-small");
inputElem.style.width="100px";
const selElem = document.createElement("select");
selElem.name=chartProperty.name;
selElem.id=chartProperty.name;
//selElem.style="width:50px";
if(chartProperty.variableName=="")
{
selElem.disabled="disabled";
selElem.readonly="readonly";
}
selElem.onchange= function () {
updateChartModel();
renderChart('chartDiv',myChartModel);
};
fillSelectOptions(selElem,chartProperty.getValueResultset(),chartProperty.isMandatory,propValue);
selElem.value= (propValue=="")?chartProperty.defaultValue:propValue;
inputElem.appendChild(selElem);
inputFieldElem.appendChild(inputElem);
break;
case "TEXTAREA":
//großes Texteingabefeld:
const textAreaElem = document.createElement("textarea");
textAreaElem.cols="20";
textAreaElem.rows=3;
if(chartProperty.variableName=="")
{
textAreaElem.disabled="disabled";
textAreaElem.readonly="readonly";
}
textAreaElem.name=chartProperty.name;
textAreaElem.id=chartProperty.name;
textAreaElem.value= (propValue=="")?chartProperty.defaultValue:propValue;
textAreaElem.onchange= function () {
updateChartModel();
renderChart('chartDiv',myChartModel);
};
inputElem.appendChild(textAreaElem);
inputFieldElem.appendChild(inputElem);
break;
case "RANGE":
//Schieberegler:
const rangeElem = document.createElement("input");
rangeElem.type="NUMBER";
rangeElem.size=5;
if(chartProperty.variableName=="")
{
rangeElem.disabled="disabled";
rangeElem.readonly="readonly";
}
/* klappt noch nicht:
rangeElem.type="RANGE";
rangeElem.min=chartProperty.range_from;
rangeElem.max=chartProperty.range_to;
rangeElem.step=50;
*/
rangeElem.name=chartProperty.name;
rangeElem.id=chartProperty.name;
rangeElem.value= (propValue=="")?chartProperty.defaultValue:propValue;
rangeElem.onchange= function () {
updateChartModel();
renderChart('chartDiv',myChartModel);
};
inputElem.appendChild(rangeElem);
inputFieldElem.appendChild(inputElem);
break;
case "CHECKBOX2": //klappt noch nicht
const checkboxElem = document.createElement("input");
checkboxElem.type="CHECKBOX";
//checkboxElem.value="1";
if(chartProperty.variableName=="")
{
checkboxElem.disabled="disabled";
checkboxElem.readonly="readonly";
}
checkboxElem.name=chartProperty.name;
checkboxElem.id=chartProperty.name;
checkboxElem.value= (propValue=="")?chartProperty.defaultValue:propValue;
checkboxElem.onchange= function () {
updateChartModel();
renderChart('chartDiv',myChartModel);
};
inputElem.appendChild(checkboxElem);
inputFieldElem.appendChild(inputElem);
break;
default:
//Einfaches Texteingabefeld:
const inpElem = document.createElement("input");
inpElem.type="TEXT";
if(chartProperty.propValueType=="integer")
inpElem.type="NUMBER";
if(chartProperty.inputType=="COLOR")
inpElem.type="color";
inpElem.size=5;
if(chartProperty.variableName=="")
{
inpElem.disabled="disabled";
inpElem.readonly="readonly";
}
inpElem.name=chartProperty.name;
inpElem.id=chartProperty.name;
inpElem.value= (propValue=="")?chartProperty.defaultValue:propValue;
inpElem.onchange= function () {
updateChartModel();
renderChart('chartDiv',myChartModel);
};
inputElem.appendChild(inpElem);
inputFieldElem.appendChild(inputElem);
break;
}
inputControlElem.appendChild(inputFieldElem);
fieldElem.appendChild(inputControlElem);
return fieldElem;
}
function fillSelectOptions(myCombo,myValues,isMandatory,selectedValue)
{
var optionCounter=0;
var selectedOption=null;
while (myCombo.firstChild) {
myCombo.removeChild(myCombo.firstChild);
}
var optionCounter=0;
if(!isMandatory)
{
//add an empty option:
var o=new Option("","");
myCombo.options[optionCounter]=o;
selectedOption=optionCounter;
optionCounter++;
}
for(var j=0;j < myValues.length;j++)
{
var defaultSelected=false;
if(myValues[j].value==selectedValue)
{
selectedOption=j+(isMandatory?0:1);
defaultSelected=true;
}
if(selectedOption==null && myValues[j].isDefault)
{
selectedOption=j+(isMandatory?0:1);
defaultSelected=true;
}
var o=new Option(myValues[j].name,myValues[j].value,defaultSelected,null);
myCombo.options[optionCounter]=o;
optionCounter++;
}
if(selectedOption!=null)
myCombo.selectedIndex=selectedOption;
}
function showDataTable(myTableDiv,tableId,mydata,metadata,maxRows)
{
tableDiv=document.getElementById(myTableDiv);
if(tableDiv.innerHTML=="")
{
var rowcount=mydata.length;
if(rowcount > maxRows)
rowcount=maxRows;
const tabContainer= document.createElement("div");
tabContainer.classList.add("table-container");
const tabElem = document.createElement("table");
tabElem.classList.add("table");
tabElem.classList.add("is-bordered");
tabElem.classList.add("is-narrow");
tabElem.border="1";
tabElem.width="70%";
const rowElem = document.createElement("tr");
const thCap = document.createElement("th");
const textnode = document.createTextNode("Zeilennr.");
thCap.appendChild(textnode);
rowElem.appendChild(thCap);
for(var col=0;col < metadata.length;col++)
{
if(metadata[col].nr)
{
const thCap = document.createElement("th");
const textnode = document.createTextNode(metadata[col].colcaption);
thCap.appendChild(textnode);
rowElem.appendChild(thCap);
}
}
tabElem.appendChild(rowElem);
//Variablennamen in Subheader
const rowElemSubHeader = document.createElement("tr");
const tdCap = document.createElement("td");
tdCap.style="font-family:monospace;font-size:smaller";
const textnodeSubHeader = document.createTextNode("(rownr)");
tdCap.appendChild(textnodeSubHeader);
rowElemSubHeader.appendChild(tdCap);
for(var col=0;col < metadata.length;col++)
{
if(metadata[col].nr)
{
const thCap = document.createElement("td");
thCap.style="font-family:monospace;font-size:smaller";
const textnode = document.createTextNode("("+metadata[col].colname+")");
thCap.appendChild(textnode);
rowElemSubHeader.appendChild(thCap);
}
}
tabElem.appendChild(rowElemSubHeader);
for(row=0;row0)
{
switch (renderer) {
case "plot":
for (var i=0;i0)
{
myNode=myParentNode.childNodes[0];
if(myNode.nodeName=="svg")
{
// Extract the data as SVG text string
svg_xml = (new XMLSerializer).serializeToString(myNode);
}
}
break;
default:
document.getElementById("chartSrc").innerHTML="Unbekannter Renderer";
break;
}
document.getElementById("chartSrc").innerHTML=svg_xml;
}
else
{
document.getElementById("chartSrc").innerHTML="Kein Quellcode gefunden";
}
//document.getElementById("chartSVGsrc").style.visibility="visible";
/*
const selection = window.getSelection();
const range = document.createRange();
range.selectNodeContents(ergtabelle);
selection.removeAllRanges();
selection.addRange(range);
document.execCommand('copy');
selection.removeAllRanges();
alert("Angezeigte Tabelle wurde in die Zwischenablage kopiert.");
*/
}
function showChartModelCode()
{
var mySrcDiv=document.getElementById("chartModelsrc");
if(mySrcDiv.style.display=="block")
mySrcDiv.style.display="none";
else
mySrcDiv.style.display="block";
updateChartModelCode(myChartModel);
}
function showChartCode()
{
var mySrcDiv=document.getElementById("chartCodeTextAreaDiv");
if(mySrcDiv.style.display=="block")
mySrcDiv.style.display="none";
else
mySrcDiv.style.display="block";
}
function updateChartModelCode(myChartModel)
{
var myCodeDiv= document.getElementById("chartModelSrcCode");
var myJson ="";
var myPrettyJason="";
if(myChartModel)
{
myJson=JSON.stringify(myChartModel);
myPrettyJson=prettifyJson(myJson);
myCodeDiv.innerHTML=myPrettyJson;
myCodeDiv.value=myPrettyJson;
}
else
{
myCodeDiv.innerHTML="Kein Quellcode gefunden";
}
}
function loadChartModelCode(chartModelSrcCodeTextarea,chartDiv)
{
var mySrc=document.getElementById(chartModelSrcCodeTextarea);
var myJsonString =mySrc.value;
if(myJsonString!="")
{
myChartModel=JSON.parse(myJsonString);
if(myChartModel)
{
document.getElementById("vizElementCounter").value=myChartModel.chartElements.length;
renderChart(chartDiv,myChartModel);
fillChartElementListSelect(document.getElementById("chartElementID"),null);
}
}
}
function loadNativeCode(nativeSrcCodeTextarea,chartDiv)
{
var mySrc=document.getElementById(nativeSrcCodeTextarea);
var chartDivElem=document.getElementById(chartDiv);
var myJsonString =mySrc.value;
if(myJsonString!="")
{
myOption=JSON.parse(myJsonString);
var myChart = echarts.init(chartDivElem,null, { renderer: 'svg', locale: 'DE'});
myChart.setOption(myOption);
}
}
function copySrcCode(mydiv)
{
var ergtabelle=document.getElementById(mydiv);
const selection = window.getSelection();
const range = document.createRange();
range.selectNodeContents(ergtabelle);
selection.removeAllRanges();
selection.addRange(range);
document.execCommand('copy');
selection.removeAllRanges();
}
function showVizNavTab(nr)
{
for (let i = 1; i < 4; i++) {
var divName="tab-"+i;
//alert(divName);
tabDivElem=document.getElementById(divName);
if(i==nr)
tabDivElem.style.display="block";
else
tabDivElem.style.display="none";
}
}
function makeSunburstD3(myCommonChartProperties,svg,data,metaData,chartElem)
{
var sorted = d3.sort(data, d => d.dimension1,d => d.dimension2, d => d.measure1);
//var group = d3.group(sorted, d => d.sos_stg_aggr_sem_rueck_beur_ein_str);
//console.log(group);
var group = d3.group(sorted, d => d.dimension1,d => d.dimension2, d => d.measure1 );
var hierarchy = d3.hierarchy(group);
var level1count=hierarchy.children.length;
console.log("level1count:"+level1count);
var data_str = "{\"name\":\"root\",\"children\":[";
for(var i=0; i < level1count ; i++){
console.log("Zeile "+i+ ":" + hierarchy.children[i].data[0]);
data_str+="{\"name\":\""+hierarchy.children[i].data[0]+"\",\"children\":[";
var level2count=hierarchy.children[i].children.length;
for(var j=0; j < level2count ; j++){
console.log("unterZeile "+j+ ":" + hierarchy.children[i].children[j].data[0]);
data_str+="{\"name\":\""+hierarchy.children[i].children[j].data[0]+"\",\"children\":[";
/*var level3count=hierarchy.children[i].children[j].children.length;
console.log("level3count: "+level3count);
for(var k=0; k < level3count ; k++){
console.log("unterUnterZeile "+k+ ":" + hierarchy.children[i].children[j].children[k].data[0]);
data_str+="{\"name\":\""+hierarchy.children[i].children[j].children[k].data[0]+"\",\"value\":"+hierarchy.children[i].children[j].children[k].children[0].data[0] +"}";
if(k < level3count -1)
data_str+=",";
}
*/
data_str+="]}";
if(j < level2count -1)
data_str+=",";
}
data_str+="]}";
if(i < level1count -1)
data_str+=",";
//console.log("Zeile "+i+ ":" + hierarchy.children[i].children[0].data);
}
data_str+="]}"
console.log(data_str);
var dataHierarchy=JSON.parse(data_str);
return renderSunburst(dataHierarchy,svg);
}
function renderSunburst(data,svg) {
// Specify the chart’s dimensions.
const width = 928;
const height = width;
const radius = width / 6;
// Create the color scale.
const color = d3.scaleOrdinal(d3.quantize(d3.interpolateRainbow, data.children.length + 1));
// Compute the layout.
const hierarchy = d3.hierarchy(data)
.sum(d => d.value)
.sort((a, b) => b.value - a.value);
const root = d3.partition()
.size([2 * Math.PI, hierarchy.height + 1])
(hierarchy);
root.each(d => d.current = d);
// Create the arc generator.
const arc = d3.arc()
.startAngle(d => d.x0)
.endAngle(d => d.x1)
.padAngle(d => Math.min((d.x1 - d.x0) / 2, 0.005))
.padRadius(radius * 1.5)
.innerRadius(d => d.y0 * radius)
.outerRadius(d => Math.max(d.y0 * radius, d.y1 * radius - 1))
// Create the SVG container.
// Append the arcs.
const path = svg.append("g")
.selectAll("path")
.data(root.descendants().slice(1))
.join("path")
.attr("fill", d => { while (d.depth > 1) d = d.parent; return color(d.data.name); })
.attr("fill-opacity", d => arcVisible(d.current) ? (d.children ? 0.6 : 0.4) : 0)
.attr("pointer-events", d => arcVisible(d.current) ? "auto" : "none")
.attr("d", d => arc(d.current));
// Make them clickable if they have children.
path.filter(d => d.children)
.style("cursor", "pointer")
.on("click", clicked);
const format = d3.format(",d");
path.append("title")
.text(d => `${d.ancestors().map(d => d.data.name).reverse().join("/")}\n${format(d.value)}`);
const label = svg.append("g")
.attr("pointer-events", "none")
.attr("text-anchor", "middle")
.style("user-select", "none")
.selectAll("text")
.data(root.descendants().slice(1))
.join("text")
.attr("dy", "0.35em")
.attr("fill-opacity", d => +labelVisible(d.current))
.attr("transform", d => labelTransform(d.current))
.text(d => d.data.name);
const parent = svg.append("circle")
.datum(root)
.attr("r", radius)
.attr("fill", "none")
.attr("pointer-events", "all")
.on("click", clicked);
// Handle zoom on click.
function clicked(event, p) {
parent.datum(p.parent || root);
root.each(d => d.target = {
x0: Math.max(0, Math.min(1, (d.x0 - p.x0) / (p.x1 - p.x0))) * 2 * Math.PI,
x1: Math.max(0, Math.min(1, (d.x1 - p.x0) / (p.x1 - p.x0))) * 2 * Math.PI,
y0: Math.max(0, d.y0 - p.depth),
y1: Math.max(0, d.y1 - p.depth)
});
const t = svg.transition().duration(750);
// Transition the data on all arcs, even the ones that aren’t visible,
// so that if this transition is interrupted, entering arcs will start
// the next transition from the desired position.
path.transition(t)
.tween("data", d => {
const i = d3.interpolate(d.current, d.target);
return t => d.current = i(t);
})
.filter(function(d) {
return +this.getAttribute("fill-opacity") || arcVisible(d.target);
})
.attr("fill-opacity", d => arcVisible(d.target) ? (d.children ? 0.6 : 0.4) : 0)
.attr("pointer-events", d => arcVisible(d.target) ? "auto" : "none")
.attrTween("d", d => () => arc(d.current));
label.filter(function(d) {
return +this.getAttribute("fill-opacity") || labelVisible(d.target);
}).transition(t)
.attr("fill-opacity", d => +labelVisible(d.target))
.attrTween("transform", d => () => labelTransform(d.current));
}
function arcVisible(d) {
return d.y1 <= 3 && d.y0 >= 1 && d.x1 > d.x0;
}
function labelVisible(d) {
return d.y1 <= 3 && d.y0 >= 1 && (d.y1 - d.y0) * (d.x1 - d.x0) > 0.03;
}
function labelTransform(d) {
const x = (d.x0 + d.x1) / 2 * 180 / Math.PI;
const y = (d.y0 + d.y1) / 2 * radius;
return `rotate(${x - 90}) translate(${y},0) rotate(${x < 180 ? 0 : 180})`;
}
return svg.node();
}
function openModalImage(ergebniselementOrdnr)
{
var myModalCard=document.getElementById("modalCard"+ergebniselementOrdnr);
myModalCard.classList.add('is-active');
}
function closeModalImage(ergebniselementOrdnr)
{
var myModalCard=document.getElementById("modalCard"+ergebniselementOrdnr);
myModalCard.classList.remove('is-active');
}
function exportDataTable(rs,rsMetaData)
{
myRs=fillEchartsDataSetSimpleCopy(rs,rsMetaData);
console.log(JSON.stringify(myRs));
}