diff --git a/src/components/Widgets/CryptoPriceChart.vue b/src/components/Widgets/CryptoPriceChart.vue
index 33531e28..b5702353 100644
--- a/src/components/Widgets/CryptoPriceChart.vue
+++ b/src/components/Widgets/CryptoPriceChart.vue
@@ -6,10 +6,11 @@
import { Chart } from 'frappe-charts/dist/frappe-charts.min.esm';
import axios from 'axios';
import WidgetMixin from '@/mixins/WidgetMixin';
+import ChartingMixin from '@/mixins/ChartingMixin';
import { widgetApiEndpoints } from '@/utils/defaults';
export default {
- mixins: [WidgetMixin],
+ mixins: [WidgetMixin, ChartingMixin],
components: {},
data() {
return {
@@ -58,10 +59,6 @@ export default {
chartId() {
return `crypto-price-chart-${Math.round(Math.random() * 10000)}`;
},
- getChartColor() {
- const cssVars = getComputedStyle(document.documentElement);
- return cssVars.getPropertyValue('--widget-text-color').trim() || '#7cd6fd';
- },
},
methods: {
/* Extends mixin, and updates data. Called by parent component */
@@ -76,7 +73,7 @@ export default {
data: this.chartData,
type: 'axis-mixed',
height: 200,
- colors: [this.getChartColor, '#743ee2'],
+ colors: this.chartColors,
truncateLegends: true,
lineOptions: {
regionFill: 1,
diff --git a/src/components/Widgets/NdCpuHistory.vue b/src/components/Widgets/NdCpuHistory.vue
index 9d967d3f..e989f5ce 100644
--- a/src/components/Widgets/NdCpuHistory.vue
+++ b/src/components/Widgets/NdCpuHistory.vue
@@ -4,11 +4,11 @@
diff --git a/src/components/Widgets/NdLoadHistory.vue b/src/components/Widgets/NdLoadHistory.vue
index af8c9f5d..86d9505c 100644
--- a/src/components/Widgets/NdLoadHistory.vue
+++ b/src/components/Widgets/NdLoadHistory.vue
@@ -4,11 +4,11 @@
diff --git a/src/components/Widgets/StockPriceChart.vue b/src/components/Widgets/StockPriceChart.vue
index 58f5c2c9..33c2ad30 100644
--- a/src/components/Widgets/StockPriceChart.vue
+++ b/src/components/Widgets/StockPriceChart.vue
@@ -6,10 +6,11 @@
import { Chart } from 'frappe-charts/dist/frappe-charts.min.esm';
import axios from 'axios';
import WidgetMixin from '@/mixins/WidgetMixin';
+import ChartingMixin from '@/mixins/ChartingMixin';
import { widgetApiEndpoints } from '@/utils/defaults';
export default {
- mixins: [WidgetMixin],
+ mixins: [WidgetMixin, ChartingMixin],
components: {},
data() {
return {
@@ -51,12 +52,6 @@ export default {
chartId() {
return `stock-price-chart-${Math.round(Math.random() * 10000)}`;
},
- /* Get color hex code for chart, from CSS variable, or user choice */
- getChartColor() {
- if (this.options.chartColor) return this.options.chartColor;
- const cssVars = getComputedStyle(document.documentElement);
- return cssVars.getPropertyValue('--widget-text-color').trim() || '#7cd6fd';
- },
/* Which price for each interval should be used (API requires in stupid format) */
priceTime() {
const usersChoice = this.options.priceTime || 'high';
@@ -83,7 +78,7 @@ export default {
data: this.chartData,
type: 'axis-mixed',
height: 200,
- colors: [this.getChartColor, '#743ee2'],
+ colors: this.chartColors,
truncateLegends: true,
lineOptions: {
regionFill: 1,
diff --git a/src/mixins/ChartingMixin.js b/src/mixins/ChartingMixin.js
new file mode 100644
index 00000000..ce27d22c
--- /dev/null
+++ b/src/mixins/ChartingMixin.js
@@ -0,0 +1,49 @@
+/**
+ * Mixin for helper functions, used for making chart widgets
+ */
+// import ErrorHandler from '@/utils/ErrorHandler';
+import { Chart } from 'frappe-charts/dist/frappe-charts.min.esm';
+
+const WidgetMixin = {
+ props: {},
+ computed: {
+ chartHeight() {
+ return this.options.chartHeight || 300;
+ },
+ chartColors() {
+ const ops = this.options;
+ if (ops.chartColor && typeof ops.chartColor === 'string') return [ops.chartColor];
+ if (ops.chartColors && Array.isArray(ops.chartColors)) return ops.chartColors;
+ const cssVars = getComputedStyle(document.documentElement);
+ return [cssVars.getPropertyValue('--widget-text-color').trim() || '#7cd6fd'];
+ },
+ chartId() {
+ return `widget-chart-${Math.round(Math.random() * 10000)}`;
+ },
+ },
+ data: () => ({
+ Chart,
+ }),
+ methods: {
+ /* Format the date for a given time stamp */
+ formatDate(timestamp) {
+ const localFormat = navigator.language;
+ const dateFormat = { weekday: 'short', day: 'numeric', month: 'short' };
+ const date = new Date(timestamp).toLocaleDateString(localFormat, dateFormat);
+ return date;
+ },
+ /* Format the time for a given time stamp */
+ formatTime(timestamp) {
+ const localFormat = navigator.language;
+ const timeFormat = { hour: 'numeric', minute: 'numeric', second: 'numeric' };
+ const time = Intl.DateTimeFormat(localFormat, timeFormat).format(timestamp);
+ return time;
+ },
+ /* Given an array of numbers, returns the average of all */
+ average(array) {
+ return array.reduce((a, b) => a + b) / array.length;
+ },
+ },
+};
+
+export default WidgetMixin;