Markiewicz_praca/optionsGenerator.js

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,
}