oms-SalesAnalysis/Controller/Controller.js
2025-04-02 14:15:06 +00:00

80 lines
2.5 KiB
JavaScript

import { jsOMS } from '../../../jsOMS/Utils/oLib.js';
import { Autoloader } from '../../../jsOMS/Autoloader.js';
Autoloader.defineNamespace('omsApp.Modules');
/* global omsApp ChartGeo Chart */
omsApp.Modules.SalesAnalysis = class {
/**
* @constructor
*
* @since 1.0.0
*/
constructor (app)
{
this.app = app;
};
bind (id)
{
const charts = typeof id === 'undefined'
? document.getElementsByTagName('canvas')
: [document.getElementById(id)];
const length = charts.length;
for (let i = 0; i < length; ++i) {
if (charts[i].getAttribute('data-chart') === null
&& charts[i].getAttribute('data-chart') !== 'undefined'
) {
continue;
}
this.bindChart(charts[i]);
}
};
bindChart (chart)
{
if (typeof chart === 'undefined' || !chart) {
jsOMS.Log.Logger.instance.error('Invalid chart: ' + chart, 'ClientManagement');
return;
}
const data = JSON.parse(chart.getAttribute('data-chart'));
if (data.type === 'choropleth') {
const parts = data.mapurl.split('/');
const fileName = parts[parts.length - 1];
const mapName = fileName.replace('.topo.json', '');
fetch(data.mapurl).then((r) => r.json()).then((d) => {
const countries = ChartGeo.topojson.feature(d, d.objects[mapName]).features;
data.data.labels = countries.map((c) => c.properties.name);
const vals = {};
const length = data.data.datasets[0].data.length;
for (let i = 0; i < length; ++i) {
vals[data.data.datasets[0].data[i].id] = data.data.datasets[0].data[i].value;
}
data.data.datasets[0].data = countries.map((c) => (
{ feature: c, value: Object.prototype.hasOwnProperty.call(vals, c.id) ? vals[c.id] : null }
));
// eslint-disable-next-line no-unused-vars
const myChart = new Chart(chart.getContext('2d'), data);
});
} else {
// eslint-disable-next-line no-unused-vars
const myChart = new Chart(chart.getContext('2d'), data);
}
};
};
// @bug We cannot guarantee that this is run after the app is setup. Fix it
// Additionally, this way is extremely ugly!!!
window.omsApp.moduleManager.get('SalesAnalysis').bind();