97 lines
3.1 KiB
JavaScript
97 lines
3.1 KiB
JavaScript
|
const fs = require('fs');
|
||
|
const rawData = fs.readFileSync("chartData.json",{encoding:"utf-8"})
|
||
|
const restaurantData = JSON.parse(rawData)
|
||
|
const { mockData,response } = require("./data.js");
|
||
|
|
||
|
|
||
|
|
||
|
const R = require("ramda")
|
||
|
let print = R.curry((label, x)=>{console.log("\n"+label);console.log("-----");console.dir(x, {depth:null}); return x});
|
||
|
const transform = (data)=>{
|
||
|
const entries = Object.entries(data)
|
||
|
const groups = data.index
|
||
|
const entriesExceptForIndices = entries.filter(x=>x[0]!='index')
|
||
|
const tableHeader = Object.entries(entriesExceptForIndices.map(x=>x[0]))
|
||
|
const tableRows = entriesExceptForIndices.map(x=>Object.entries(x[1]))
|
||
|
return {headers:tableHeader, rows:tableRows, groups:groups}
|
||
|
}
|
||
|
|
||
|
const transpose = (data)=>{
|
||
|
return {groups:data.groups, headers:data.headers.map(z=>z[1]), rows: data.headers.map(x=>{
|
||
|
const index = x[0]
|
||
|
return data.rows.map(v=>v.find(inner=>inner[0]===index)[1])
|
||
|
})}
|
||
|
}
|
||
|
const mergeIntoOneArray = (data)=>{
|
||
|
return {groups:data.groups,data: [data.headers, ...data.rows]}
|
||
|
}
|
||
|
const getData = R.curry((data)=>data.data)
|
||
|
const transformToDataset = R.compose(mergeIntoOneArray, transpose, transform)
|
||
|
|
||
|
const extractSeriesByName = R.curry((name,data)=>{
|
||
|
const index = R.findIndex((x)=>x.includes(name))(getData(data)[0])
|
||
|
|
||
|
return {groups:data.groups, name:getData(data)[0][index], data:
|
||
|
R.slice(1,Infinity)(
|
||
|
R.map(
|
||
|
R.curry((x)=>x[index]),
|
||
|
)(getData(data)))}
|
||
|
})
|
||
|
const complementShareSeries = R.curry((allKeys, data)=>{
|
||
|
const template = R.fromPairs(
|
||
|
R.map(o=>[o,0])(allKeys)
|
||
|
)
|
||
|
|
||
|
return {groups:data.groups, name:data.name, data: R.map(
|
||
|
(x)=>{
|
||
|
return R.fromPairs()(R.map(
|
||
|
key=>{
|
||
|
const surveyValue = x[key]
|
||
|
if (surveyValue) return [key,surveyValue]
|
||
|
return [key,0]
|
||
|
}
|
||
|
)(R.keys(template))
|
||
|
)
|
||
|
}
|
||
|
)(data.data)}
|
||
|
})
|
||
|
|
||
|
const extractShareSeries = extractSeriesByName("share")
|
||
|
|
||
|
const getChartData = R.compose(complementShareSeries(['1','2','3','4','5']), extractShareSeries,transformToDataset)
|
||
|
const prepareOptions = (chartData)=>{
|
||
|
return {
|
||
|
animation:false,
|
||
|
color: '#3b3b3b',
|
||
|
pxHeight: chartData.groups.length * (120 / 3) + 80,
|
||
|
legend: {
|
||
|
|
||
|
textStyle:{fontSize:11},
|
||
|
},
|
||
|
dataset:{
|
||
|
dimensions:Object.keys(chartData.data[0]),
|
||
|
source:chartData.data
|
||
|
},
|
||
|
grid: {
|
||
|
top:60,
|
||
|
left: '3%',
|
||
|
right: '4%',
|
||
|
bottom: '3%',
|
||
|
containLabel: true
|
||
|
},
|
||
|
xAxis: {type: 'value', show: false, animation: false, max: 100, axisLabel: {formatter: (value, index) => `${value}%`}},
|
||
|
yAxis: {
|
||
|
type: 'category', show: true, data:chartData.groups
|
||
|
},
|
||
|
series: [
|
||
|
{type: 'bar', stack:'total'},
|
||
|
{type: 'bar',stack:'total'},
|
||
|
{type: 'bar',stack:'total'}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
module.exports = {
|
||
|
getMultipleBarsChartDataFromAnkieterDataFormat:getChartData,
|
||
|
prepareOptionsForMultipleBarsChartData:prepareOptions,
|
||
|
rawData:rawData,
|
||
|
}
|