mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-08-17 20:52:14 +01:00
make No Project white in chart fixes ST-360
This commit is contained in:
committed by
Constantin Graf
parent
a4d6ba3cdb
commit
b990387775
@@ -1,7 +1,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import VChart, { THEME_KEY } from 'vue-echarts';
|
import VChart, { THEME_KEY } from 'vue-echarts';
|
||||||
import { computed, provide, ref } from 'vue';
|
import { computed, provide, ref } from 'vue';
|
||||||
import LinearGradient from 'zrender/lib/graphic/LinearGradient';
|
|
||||||
import { use } from 'echarts/core';
|
import { use } from 'echarts/core';
|
||||||
import { CanvasRenderer } from 'echarts/renderers';
|
import { CanvasRenderer } from 'echarts/renderers';
|
||||||
import { PieChart } from 'echarts/charts';
|
import { PieChart } from 'echarts/charts';
|
||||||
@@ -15,6 +14,7 @@ import { formatHumanReadableDuration } from '@/packages/ui/src/utils/time';
|
|||||||
import { getRandomColorWithSeed } from '@/packages/ui/src/utils/color';
|
import { getRandomColorWithSeed } from '@/packages/ui/src/utils/color';
|
||||||
import type { GroupedDataEntries } from '@/packages/api/src';
|
import type { GroupedDataEntries } from '@/packages/api/src';
|
||||||
import { useReportingStore } from '@/utils/useReporting';
|
import { useReportingStore } from '@/utils/useReporting';
|
||||||
|
import { useProjectsStore } from '@/utils/useProjects';
|
||||||
|
|
||||||
use([
|
use([
|
||||||
CanvasRenderer,
|
CanvasRenderer,
|
||||||
@@ -27,41 +27,29 @@ use([
|
|||||||
|
|
||||||
provide(THEME_KEY, 'dark');
|
provide(THEME_KEY, 'dark');
|
||||||
|
|
||||||
function hexToRGBA(hex: string, opacity = 1) {
|
|
||||||
// Remove the hash at the start if it's there
|
|
||||||
hex = hex.replace(/^#/, '');
|
|
||||||
|
|
||||||
// Parse the hex color
|
|
||||||
let r, g, b;
|
|
||||||
if (hex.length === 3) {
|
|
||||||
r = parseInt(hex.charAt(0) + hex.charAt(0), 16);
|
|
||||||
g = parseInt(hex.charAt(1) + hex.charAt(1), 16);
|
|
||||||
b = parseInt(hex.charAt(2) + hex.charAt(2), 16);
|
|
||||||
} else if (hex.length === 6) {
|
|
||||||
r = parseInt(hex.substring(0, 2), 16);
|
|
||||||
g = parseInt(hex.substring(2, 4), 16);
|
|
||||||
b = parseInt(hex.substring(4, 6), 16);
|
|
||||||
} else {
|
|
||||||
throw new Error('Invalid HEX color.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the RGBA color string
|
|
||||||
return `rgba(${r}, ${g}, ${b}, ${opacity})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
data: GroupedDataEntries | null;
|
data: GroupedDataEntries | null;
|
||||||
type: string | null;
|
type: string | null;
|
||||||
}>();
|
}>();
|
||||||
const { getNameForReportingRowEntry } = useReportingStore();
|
const { getNameForReportingRowEntry, emptyPlaceholder } = useReportingStore();
|
||||||
|
const { projects } = useProjectsStore();
|
||||||
|
|
||||||
const groupChartData = computed(() => {
|
const groupChartData = computed(() => {
|
||||||
return (
|
return (
|
||||||
props?.data?.map((entry) => {
|
props?.data?.map((entry) => {
|
||||||
|
const name = getNameForReportingRowEntry(entry.key, props.type);
|
||||||
|
let color = getRandomColorWithSeed(entry.key ?? 'none');
|
||||||
|
if (name && props.type && emptyPlaceholder[props.type] === name) {
|
||||||
|
color = '#CCC';
|
||||||
|
} else if (props.type === 'project') {
|
||||||
|
color =
|
||||||
|
projects.find((project) => project.id === entry.key)
|
||||||
|
?.color ?? '#CCC';
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
value: entry.seconds,
|
value: entry.seconds,
|
||||||
name: getNameForReportingRowEntry(entry.key, props.type),
|
name: getNameForReportingRowEntry(entry.key, props.type),
|
||||||
color: getRandomColorWithSeed(entry.key ?? 'none'),
|
color: color,
|
||||||
};
|
};
|
||||||
}) ?? []
|
}) ?? []
|
||||||
);
|
);
|
||||||
@@ -73,8 +61,7 @@ const seriesData = computed(() => {
|
|||||||
...el,
|
...el,
|
||||||
...{
|
...{
|
||||||
itemStyle: {
|
itemStyle: {
|
||||||
color: el.color
|
color: el.color,
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -86,7 +73,7 @@ const option = ref({
|
|||||||
},
|
},
|
||||||
legend: {
|
legend: {
|
||||||
show: true,
|
show: true,
|
||||||
top: '250px'
|
top: '250px',
|
||||||
},
|
},
|
||||||
backgroundColor: 'transparent',
|
backgroundColor: 'transparent',
|
||||||
series: [
|
series: [
|
||||||
@@ -109,8 +96,10 @@ const option = ref({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<v-chart class="background-transparent h-[450px]" :autoresize="true" :option="option" />
|
<v-chart
|
||||||
|
class="background-transparent h-[450px]"
|
||||||
|
:autoresize="true"
|
||||||
|
:option="option" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped></style>
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -79,6 +79,14 @@ export const useReportingStore = defineStore('reporting', () => {
|
|||||||
return reportingTableResponse.value?.data as AggregatedTimeEntries;
|
return reportingTableResponse.value?.data as AggregatedTimeEntries;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const emptyPlaceholder = {
|
||||||
|
user: 'No User',
|
||||||
|
project: 'No Project',
|
||||||
|
task: 'No Task',
|
||||||
|
billable: 'Non-Billable',
|
||||||
|
client: 'No Client',
|
||||||
|
} as Record<string, string>;
|
||||||
|
|
||||||
function getNameForReportingRowEntry(
|
function getNameForReportingRowEntry(
|
||||||
key: string | null,
|
key: string | null,
|
||||||
type: string | null
|
type: string | null
|
||||||
@@ -87,14 +95,6 @@ export const useReportingStore = defineStore('reporting', () => {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (key === null) {
|
if (key === null) {
|
||||||
const emptyPlaceholder = {
|
|
||||||
user: 'No User',
|
|
||||||
project: 'No Project',
|
|
||||||
task: 'No Task',
|
|
||||||
billable: 'Non-Billable',
|
|
||||||
client: 'No Client',
|
|
||||||
};
|
|
||||||
|
|
||||||
return emptyPlaceholder[type as keyof typeof emptyPlaceholder];
|
return emptyPlaceholder[type as keyof typeof emptyPlaceholder];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,5 +167,6 @@ export const useReportingStore = defineStore('reporting', () => {
|
|||||||
aggregatedTableTimeEntries,
|
aggregatedTableTimeEntries,
|
||||||
getNameForReportingRowEntry,
|
getNameForReportingRowEntry,
|
||||||
groupByOptions,
|
groupByOptions,
|
||||||
|
emptyPlaceholder,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user