diff --git a/src/app/topic/indicators.component.html b/src/app/topic/indicators.component.html index 54bf05f..317ea62 100644 --- a/src/app/topic/indicators.component.html +++ b/src/app/topic/indicators.component.html @@ -365,6 +365,14 @@
+
+
+
+
+
+
diff --git a/src/app/utils/indicator-utils.ts b/src/app/utils/indicator-utils.ts index a757dae..5afff2b 100644 --- a/src/app/utils/indicator-utils.ts +++ b/src/app/utils/indicator-utils.ts @@ -244,38 +244,65 @@ export class IndicatorUtils { generateIndicatorByChartUrl(source: SourceType, url: string, type: IndicatorPathType = null, stakeholder:Stakeholder): IndicatorPath { let indicatorPath = new IndicatorPath('other', source, "", "", []); - if (source === 'stats-tool') { - indicatorPath.url = url.split("json=")[0] + "json="; - indicatorPath.url = indicatorPath.url.split("/")[indicatorPath.url.split("/").length - 1]; - indicatorPath.chartObject = decodeURIComponent(url.split("json=")[1]); - let chart = JSON.parse(indicatorPath.chartObject); - indicatorPath.type = this.extractType(chart, indicatorPath); - this.parameterizeDefaultQuery(chart, indicatorPath, stakeholder); - this.extractTitle(chart, indicatorPath); - this.extractSubTitle(chart, indicatorPath); - this.extractXTitle(chart, indicatorPath); - this.extractYTitle(chart, indicatorPath); - this.extractFunder(chart, indicatorPath, stakeholder); - this.extractStartYear(chart, indicatorPath); - this.extractEndYear(chart, indicatorPath); - indicatorPath.chartObject = JSON.stringify(chart); - this.addResultFilters(chart, indicatorPath); - } else if (source === 'old') { - indicatorPath.url = url.split("data=")[0].split("/stats/")[1] + "data="; - indicatorPath.chartObject = decodeURIComponent(url.split("data=")[1].split("&")[0]); - indicatorPath.type = type; - let chart = JSON.parse(indicatorPath.chartObject); - this.extractOldToolTitle(chart, indicatorPath); - this.extractOldToolXTitle(chart, indicatorPath); - this.extractOldToolYTitle(chart, indicatorPath); - indicatorPath.chartObject = JSON.stringify(chart); - } else { + try { + if (source === 'stats-tool') { + indicatorPath.url = url.split("json=")[0] + "json="; + indicatorPath.url = indicatorPath.url.split("/")[indicatorPath.url.split("/").length - 1]; + indicatorPath.chartObject = decodeURIComponent(url.split("json=")[1]); + let chart = JSON.parse(indicatorPath.chartObject); + // console.debug(indicatorPath); + //HighCharts + if (indicatorPath.url == "chart?json=") { + if (chart["library"] && chart["library"] == "HighCharts") { + indicatorPath.type = this.extractType(chart, indicatorPath); + } else { + indicatorPath.type = "column" + } + + this.extractTitle(chart, indicatorPath); + this.extractSubTitle(chart, indicatorPath); + this.extractXTitle(chart, indicatorPath); + this.extractYTitle(chart, indicatorPath); + } + if (indicatorPath.url == "chart?json=" || indicatorPath.url == "table?json=") { + // common for tables and other chart types + this.extractDataTitle(chart, indicatorPath); + this.parameterizeDefaultQuery(chart, indicatorPath, stakeholder); + this.extractStakeHolders(chart, indicatorPath, stakeholder); + this.extractStartYear(chart, indicatorPath); + this.extractEndYear(chart, indicatorPath); + indicatorPath.chartObject = JSON.stringify(chart); + this.addResultFilters(chart, indicatorPath); + } + } else if (source === 'old') { + indicatorPath.url = url.split("data=")[0].split("/stats/")[1] + "data="; + indicatorPath.chartObject = decodeURIComponent(url.split("data=")[1].split("&")[0]); + indicatorPath.type = type; + let chart = JSON.parse(indicatorPath.chartObject); + this.extractOldToolTitle(chart, indicatorPath); + this.extractOldToolXTitle(chart, indicatorPath); + this.extractOldToolYTitle(chart, indicatorPath); + indicatorPath.chartObject = JSON.stringify(chart); + } else { + indicatorPath.url = url; + indicatorPath.type = type; + } + }catch(e){ + console.error(e); indicatorPath.url = url; indicatorPath.type = type; } + // console.debug(indicatorPath.parameters); + // console.debug(indicatorPath.chartObject); return indicatorPath; } - + private getQueryObjectName(obj){ + if(obj["library"] && obj["library"] == "GoogleCharts"){ + return "queriesInfo"; + }else if(obj["library"] && obj["library"] == "HighCharts") { + return "queries"; + } + } private extractType(obj, indicatorPath: IndicatorPath): IndicatorPathType { let defaultTypes = ["column", "bar", "pie"]; let type = obj["chartDescription"]["queries"][0]["type"]; @@ -287,26 +314,73 @@ export class IndicatorUtils { } return type; } - + private extractStakeHolders(obj, indicatorPath: IndicatorPath, stakeholder:Stakeholder) { + this.extractFunder(obj, indicatorPath, stakeholder); + this.extractRI(obj, indicatorPath, stakeholder); + this.extractOrganization(obj, indicatorPath, stakeholder); + } private extractFunder(obj, indicatorPath: IndicatorPath, stakeholder:Stakeholder) { - let funderName; - for (let query of obj["chartDescription"]["queries"]) { + if(stakeholder.type != "funder"){ + return; + } + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { if (!query["query"]["filters"]) { return; } for (let filter of query["query"]["filters"]) { if (filter["groupFilters"][0]["field"].indexOf(".funder") != -1) { - funderName = filter["groupFilters"][0]["values"][0]; filter["groupFilters"][0]["values"][0] = ChartHelper.prefix + "index_name" + ChartHelper.suffix; indicatorPath.parameters["index_name"] = stakeholder.index_name; + }else if (filter["groupFilters"][0]["field"].indexOf(".funder.id") != -1) { + filter["groupFilters"][0]["values"][0] = ChartHelper.prefix + "index_shortName" + ChartHelper.suffix; + indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName; } } } } + private extractRI(obj, indicatorPath: IndicatorPath, stakeholder:Stakeholder) { + if(stakeholder.type != "ri"){ + return; + } + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { + if (!query["query"]["filters"]) { + return; + } + for (let filter of query["query"]["filters"]) { + if (filter["groupFilters"][0]["field"].indexOf(".context.name") != -1) { + filter["groupFilters"][0]["values"][0] = ChartHelper.prefix + "index_name" + ChartHelper.suffix; + indicatorPath.parameters["index_name"] = stakeholder.index_name; + }else if (filter["groupFilters"][0]["field"].indexOf(".context.id") != -1) { + filter["groupFilters"][0]["values"][0] = ChartHelper.prefix + "index_shortName" + ChartHelper.suffix; + indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName; + } + } + } + } + + private extractOrganization(obj, indicatorPath: IndicatorPath, stakeholder:Stakeholder) { + if(stakeholder.type != "organization"){ + return; + } + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { + if (!query["query"]["filters"]) { + return; + } + for (let filter of query["query"]["filters"]) { + if (filter["groupFilters"][0]["field"].indexOf(".organization.name") != -1) { + filter["groupFilters"][0]["values"][0] = ChartHelper.prefix + "index_name" + ChartHelper.suffix; + indicatorPath.parameters["index_name"] = stakeholder.index_name; + }else if (filter["groupFilters"][0]["field"].indexOf(".organization.id") != -1) { + filter["groupFilters"][0]["values"][0] = ChartHelper.prefix + "index_shortName" + ChartHelper.suffix; + indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName; + } + } + } + } private extractStartYear(obj, indicatorPath: IndicatorPath) { let start_year; - for (let query of obj["chartDescription"]["queries"]) { + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { if (!query["query"]["filters"]) { return; } @@ -324,7 +398,7 @@ export class IndicatorUtils { private extractEndYear(obj, indicatorPath: IndicatorPath) { let end_year; - for (let query of obj["chartDescription"]["queries"]) { + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { if (!query["query"]["filters"]) { return; } @@ -342,24 +416,61 @@ export class IndicatorUtils { private parameterizeDefaultQuery(obj, indicatorPath: IndicatorPath, stakeholder:Stakeholder) { let name = ""; - for (let query of obj["chartDescription"]["queries"]) { + + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { + //monitor.{{stakeholderType}}.{{queryname}} + //parameters: stakeholderId*, type if (query["query"]["name"]) { name = query["query"]["name"]; - let stakeholderSN = name.split('.')[1]; - query["query"]["name"] = name.split('.' + stakeholderSN + ".")[0] + "." + ChartHelper.prefix + "index_shortName" + ChartHelper.suffix +"." + name.split('.' + stakeholderSN + ".")[1]; - indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName.toLowerCase(); + let parameters = (query["query"]["parameters"])?query["query"]["parameters"]:[]; + if(name.split('.')[0] == "rcd" && parameters.length > 0 && stakeholder.type=="ri") { + //rcd.{{queryname}} + parameters[0] = ChartHelper.prefix + "index_shortName" + ChartHelper.suffix; + indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName.toLowerCase(); + }else if(name.split('.')[0] == "monitor" && parameters.length == 0 && stakeholder.type=="funder"){ + // old saved queries without params + //monitor.{{funder_shortName}}.{{type}}.{{queryname}} + let stakeholderSN = name.split('.')[1]; + query["query"]["name"] = name.split('.' + stakeholderSN + ".")[0] + "." + ChartHelper.prefix + "index_shortName" + ChartHelper.suffix +"." + name.split('.' + stakeholderSN + ".")[1]; + indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName.toLowerCase(); + }else if(name.split('.')[0] == "monitor" && parameters.length > 0 && name.split('.')[1] == stakeholder.type) { + // new parameterized queries + //monitor.{{type}}.{{queryname}}.{{param1 - id }}.{{param2 result-type}}.{{fl0}} + if( name.split('.').length > 3 && name.split('.')[3] == "id") { + parameters[0] = ChartHelper.prefix + "index_id" + ChartHelper.suffix; + indicatorPath.parameters["index_id"] = stakeholder.index_id; + }else if( name.split('.').length > 3 && name.split('.')[3] == "shortname") { + parameters[0] = ChartHelper.prefix + "index_shortName" + ChartHelper.suffix; + indicatorPath.parameters["index_shortName"] = stakeholder.index_shortName; + }else if( name.split('.').length > 3 && name.split('.')[3] == "name") { + parameters[0] = ChartHelper.prefix + "index_name" + ChartHelper.suffix; + indicatorPath.parameters["index_name"] = stakeholder.index_name; + } + } } } } - + private extractDataTitle(obj, indicatorPath: IndicatorPath) { + let index = 0; + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { + if (query["name"]) { + let name = query["name"]; + query["name"] = ChartHelper.prefix + "data_title_"+index + ChartHelper.suffix; + indicatorPath.parameters["data_title_"+index] = name; + } + index++; + } + } private extractTitle(obj, indicatorPath: IndicatorPath) { let title = ""; - if (obj["chartDescription"]["title"]) { + if (obj["library"] && obj["library"] == "HighCharts" &&obj["chartDescription"]["title"]) { title = obj["chartDescription"]["title"]["text"]; obj["chartDescription"]["title"]["text"] = ChartHelper.prefix + "title" + ChartHelper.suffix; - indicatorPath.parameters["title"] = title ? title : ""; - + }else if (obj["library"] && obj["library"] == "GoogleCharts" && obj["chartDescription"]["options"]["title"]) { + title = obj["chartDescription"]["options"]["title"]; + obj["chartDescription"]["options"]["title"] = ChartHelper.prefix + "title" + ChartHelper.suffix; } + indicatorPath.parameters["title"] = title ? title : ""; } private extractSubTitle(obj, indicatorPath: IndicatorPath) { @@ -373,26 +484,32 @@ export class IndicatorUtils { private extractXTitle(obj, indicatorPath: IndicatorPath) { let title = ""; - if (obj["chartDescription"]["xAxis"]["title"]) { + if (obj["library"] && obj["library"] == "HighCharts" && obj["chartDescription"]["xAxis"]["title"]) { title = obj["chartDescription"]["xAxis"]["title"]["text"]; obj["chartDescription"]["xAxis"]["title"]["text"] = ChartHelper.prefix + "xAxisTitle" + ChartHelper.suffix; - indicatorPath.parameters["xAxisTitle"] = title ? title : "" + }else if (obj["library"] && obj["library"] == "GoogleCharts" && obj["chartDescription"]["options"]["hAxis"]["title"]) { + title = obj["chartDescription"]["options"]["hAxis"]["title"]; + obj["chartDescription"]["options"]["hAxis"]["title"] = ChartHelper.prefix + "xAxisTitle" + ChartHelper.suffix; } + indicatorPath.parameters["xAxisTitle"] = title ? title : ""; } private extractYTitle(obj, indicatorPath: IndicatorPath) { let title = ""; - if (obj["chartDescription"]["yAxis"]["title"]) { + if (obj["library"] && obj["library"] == "HighCharts" && obj["chartDescription"]["yAxis"]["title"]) { title = obj["chartDescription"]["yAxis"]["title"]["text"]; obj["chartDescription"]["yAxis"]["title"]["text"] = ChartHelper.prefix + "yAxisTitle" + ChartHelper.suffix; - indicatorPath.parameters["yAxisTitle"] = title ? title : "" + }else if (obj["library"] && obj["library"] == "GoogleCharts" && obj["chartDescription"]["options"]["vAxis"]["title"]) { + title = obj["chartDescription"]["options"]["vAxis"]["title"]; + obj["chartDescription"]["options"]["vAxis"]["title"] = ChartHelper.prefix + "yAxisTitle" + ChartHelper.suffix; } + indicatorPath.parameters["yAxisTitle"] = title ? title : ""; } private addResultFilters(obj, indicatorPath: IndicatorPath) { let resultTypes = ["publication", "software", "dataset", "other"]; let index = -1; - for (let query of obj["chartDescription"]["queries"]) { + for (let query of obj[(obj["chartDescription"]?"chartDescription":"tableDescription")][this.getQueryObjectName(obj)]) { if (!query["query"]["select"]) { return; }