wip: Refactor mixin in seperate functions

This commit is contained in:
Jakub Juszczak
2018-03-20 21:24:11 +01:00
parent 876252173b
commit 8669452651

View File

@@ -1,67 +1,74 @@
/* eslint-disable */
function dataHandler (newData, oldData) { function dataHandler (newData, oldData) {
if (oldData) { if (oldData) {
let chart = this.$data._chart const chart = this.$data._chart
_checkChanges(newData, oldData, chart)
} else {
_destroyAndRenderChart(chart)
}
// Get new and old DataSet Labels function _checkChanges (newData, oldData, chart) {
let newDatasetLabels = newData.datasets.map((dataset) => { // Get new and old DataSet Labels
return dataset.label let newDatasetLabels = newData.datasets.map((dataset) => {
}) return dataset.label
})
let oldDatasetLabels = oldData.datasets.map((dataset) => { let oldDatasetLabels = oldData.datasets.map((dataset) => {
return dataset.label return dataset.label
}) })
// Stringify 'em for easier compare // Stringify 'em for easier compare
const oldLabels = JSON.stringify(oldDatasetLabels) const oldLabels = JSON.stringify(oldDatasetLabels)
const newLabels = JSON.stringify(newDatasetLabels) const newLabels = JSON.stringify(newDatasetLabels)
// Check if Labels are equal and if dataset length is equal // Check if Labels are equal and if dataset length is equal
if (newLabels === oldLabels && oldData.datasets.length === newData.datasets.length) { if (newLabels === oldLabels && oldData.datasets.length === newData.datasets.length) {
newData.datasets.forEach((dataset, i) => { newData.datasets.forEach((dataset, i) => {
// Get new and old dataset keys // Get new and old dataset keys
const oldDatasetKeys = Object.keys(oldData.datasets[i]) const oldDatasetKeys = Object.keys(oldData.datasets[i])
const newDatasetKeys = Object.keys(dataset) const newDatasetKeys = Object.keys(dataset)
// Get keys that aren't present in the new data // Get keys that aren't present in the new data
const deletionKeys = oldDatasetKeys.filter((key) => { const deletionKeys = oldDatasetKeys.filter((key) => {
return key !== '_meta' && newDatasetKeys.indexOf(key) === -1 return key !== '_meta' && newDatasetKeys.indexOf(key) === -1
})
// Remove outdated key-value pairs
deletionKeys.forEach((deletionKey) => {
delete chart.data.datasets[i][deletionKey]
})
// Update attributes individually to avoid re-rendering the entire chart
for (const attribute in dataset) {
if (dataset.hasOwnProperty(attribute)) {
chart.data.datasets[i][attribute] = dataset[attribute]
}
}
}) })
if (newData.hasOwnProperty('labels')) { // Remove outdated key-value pairs
chart.data.labels = newData.labels deletionKeys.forEach((deletionKey) => {
delete chart.data.datasets[i][deletionKey]
})
// Update attributes individually to avoid re-rendering the entire chart
for (const attribute in dataset) {
if (dataset.hasOwnProperty(attribute)) {
chart.data.datasets[i][attribute] = dataset[attribute]
}
} }
if (newData.hasOwnProperty('xLabels')) { })
chart.data.xLabels = newData.xLabels
} if (newData.hasOwnProperty('labels')) {
if (newData.hasOwnProperty('yLabels')) { chart.data.labels = newData.labels
chart.data.yLabels = newData.yLabels
}
chart.update()
} else {
chart.destroy()
this.renderChart(this.chartData, this.options)
} }
if (newData.hasOwnProperty('xLabels')) {
chart.data.xLabels = newData.xLabels
}
if (newData.hasOwnProperty('yLabels')) {
chart.data.yLabels = newData.yLabels
}
chart.update()
} else { } else {
if (this.$data._chart) { _destroyAndRenderChart(chart)
this.$data._chart.destroy()
}
this.renderChart(this.chartData, this.options)
} }
} }
function _destroyAndRenderChart (chart) {
if (chart) {
chart.destroy()
}
this.renderChart(this.chartData, this.options)
}
export const reactiveData = { export const reactiveData = {
data () { data () {
return { return {
@@ -77,7 +84,6 @@ export const reactiveData = {
export const reactiveProp = { export const reactiveProp = {
props: { props: {
chartData: { chartData: {
type: Object,
required: true, required: true,
default: () => {} default: () => {}
} }
@@ -91,3 +97,4 @@ export default {
reactiveData, reactiveData,
reactiveProp reactiveProp
} }