Skip to content

Commit

Permalink
[Core] [DataSet] [Chart] Support grouped histograms (close #612)
Browse files Browse the repository at this point in the history
  • Loading branch information
qianmoQ committed Feb 4, 2024
1 parent 0898bae commit 593cf98
Show file tree
Hide file tree
Showing 9 changed files with 189 additions and 2 deletions.
1 change: 1 addition & 0 deletions core/datacap-web/src/components/visual/Type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ export enum Type
BAR = ('BAR'),
AREA = ('AREA'),
PIE = ('PIE'),
HISTOGRAM = ('HISTOGRAM'),
}
7 changes: 6 additions & 1 deletion core/datacap-web/src/components/visual/VisualEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@
:configuration="configuration"
@commitOptions="handlerCommit">
</VisualPie>
<VisualHistogram v-else-if="configuration.type === Type.HISTOGRAM"
:configuration="configuration"
@commitOptions="handlerCommit">
</VisualHistogram>
</div>
</div>
</template>
Expand All @@ -44,6 +48,7 @@ import {Type} from "@/components/visual/Type";
import VisualBar from "@/components/visual/components/VisualBar.vue";
import VisualArea from "@/components/visual/components/VisualArea.vue";
import VisualPie from "@/components/visual/components/VisualPie.vue";
import VisualHistogram from "@/components/visual/components/VisualHistogram.vue";
export default {
name: 'VisualEditor',
Expand All @@ -53,7 +58,7 @@ export default {
return Type
}
},
components: {VisualPie, VisualArea, VisualBar, VisualLine, VisualTable},
components: {VisualHistogram, VisualPie, VisualArea, VisualBar, VisualLine, VisualTable},
props: {
configuration: {
type: Configuration
Expand Down
9 changes: 8 additions & 1 deletion core/datacap-web/src/components/visual/VisualView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
:width="width"
:height="height">
</VisualPie>
<VisualHistogram v-else-if="configuration.type === Type.HISTOGRAM"
:configuration="localConfiguration"
:submitted="false"
:width="width"
:height="height">
</VisualHistogram>
</div>
</div>
</template>
Expand All @@ -48,6 +54,7 @@ import {cloneDeep} from "lodash";
import CircularLoading from "@/components/loading/CircularLoading.vue";
import VisualArea from "@/components/visual/components/VisualArea.vue";
import VisualPie from "@/components/visual/components/VisualPie.vue";
import VisualHistogram from "@/components/visual/components/VisualHistogram.vue";
export default {
name: 'VisualView',
Expand All @@ -57,7 +64,7 @@ export default {
return Type
}
},
components: {VisualPie, VisualArea, CircularLoading, VisualBar, VisualLine, VisualTable},
components: {VisualHistogram, VisualPie, VisualArea, CircularLoading, VisualBar, VisualLine, VisualTable},
props: {
configuration: {
type: Configuration
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<template>
<div>
<div ref="content"
:style="{width: width, height: height}">
</div>
</div>
</template>
<script lang="ts">
import {Configuration} from "@/components/visual/Configuration"
import VChart from '@visactor/vchart'
import {cloneDeep} from "lodash";
let instance: VChart
export default {
name: 'VisualHistogram',
props: {
configuration: {
type: Configuration
},
submitted: {
type: Boolean,
default: true
},
width: {
type: String,
default: () => '100%'
},
height: {
type: String,
default: () => '400px'
}
},
watch: {
configuration: {
handler: 'handlerReset',
deep: true
}
},
created()
{
this.handlerInitialize(false)
},
methods: {
handlerInitialize(reset: boolean)
{
setTimeout(() => {
try {
const options = {
type: 'histogram',
data: [{values: this.configuration.columns}],
xField: this.configuration.chartConfigure.xAxis,
x2Field: this.configuration.chartConfigure?.x2Axis,
yField: this.configuration.chartConfigure.yAxis
}
if (!reset) {
instance = new VChart(options, {dom: this.$refs.content})
instance.renderAsync()
}
else {
instance.updateSpec(options, true)
}
if (this.submitted) {
const cloneOptions = cloneDeep(this.configuration)
cloneOptions.headers = []
cloneOptions.columns = []
this.$emit('commitOptions', cloneOptions)
}
}
catch (e) {
console.warn(e)
}
})
},
handlerReset()
{
this.handlerInitialize(true)
}
}
}
</script>
2 changes: 2 additions & 0 deletions core/datacap-web/src/fontawesome.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import {
faTriangleExclamation,
faUpload
} from '@fortawesome/free-solid-svg-icons'
import {faChartSimple} from "@fortawesome/free-solid-svg-icons/faChartSimple";

/**
* Creates icons for the given app.
Expand All @@ -64,6 +65,7 @@ import {
const createIcons = (app: any) => {
library.add(faArrowRight,
faPen,
faChartSimple,
faCirclePlus,
faCirclePlay,
faTriangleExclamation,
Expand Down
3 changes: 3 additions & 0 deletions core/datacap-web/src/i18n/langs/en/dataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,14 @@ export default {
visualTypeBar: 'Bar',
visualTypeArea: 'Area',
visualTypePie: 'Pie',
visualTypeHistogram: 'Histogram',
visualConfigure: 'Visual Configure',
visualConfigureNotSpecified: 'No configuration items are available',
visualConfigureXAxis: 'X Axis',
visualConfigureYAxis: 'Y Axis',
visualConfigureCategoryField: 'Category',
visualConfigureCategoryLeftField: 'Left Category',
visualConfigureCategoryRightField: 'Right Category',
visualConfigureValueField: 'Value',
visualConfigureSeriesField: 'Series',
visualConfigureOuterRadius: 'Outer Radius',
Expand Down
3 changes: 3 additions & 0 deletions core/datacap-web/src/i18n/langs/zhCn/dataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,14 @@ export default {
visualTypeBar: '柱状图',
visualTypeArea: '面积图',
visualTypePie: '饼图',
visualTypeHistogram: '直方图',
visualConfigure: '可视化配置',
visualConfigureNotSpecified: '暂无可用配置项',
visualConfigureXAxis: 'X轴',
visualConfigureYAxis: 'Y轴',
visualConfigureCategoryField: '类别',
visualConfigureCategoryLeftField: '左类别',
visualConfigureCategoryRightField: '右类别',
visualConfigureValueField: '值',
visualConfigureSeriesField: '系列',
visualConfigureOuterRadius: '外半径',
Expand Down
14 changes: 14 additions & 0 deletions core/datacap-web/src/views/admin/dataset/DatasetAdhoc.vue
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,14 @@
</FontAwesomeIcon>
</Tooltip>
</Radio>
<Radio :label="Type.HISTOGRAM">
<Tooltip transfer
:content="$t('dataset.visualTypeHistogram')">
<FontAwesomeIcon icon="chart-simple"
size="2x">
</FontAwesomeIcon>
</Tooltip>
</Radio>
</Row>
</RadioGroup>
<Divider orientation="left"
Expand All @@ -236,6 +244,10 @@
:columns="configuration.headers"
@commit="handlerCommit">
</DatasetVisualConfigurePie>
<DatasetVisualConfigureHistogram v-else-if="configuration.type === Type.HISTOGRAM"
:columns="configuration.headers"
@commit="handlerCommit">
</DatasetVisualConfigureHistogram>
<Result v-else>
<template #desc>
{{ $t('dataset.visualConfigureNotSpecified') }}
Expand Down Expand Up @@ -298,6 +310,7 @@ import DatasetColumnMetric from "@/views/admin/dataset/components/adhoc/DatasetC
import ReportService from "@/services/admin/ReportService";
import DatasetVisualConfigureArea from "@/views/admin/dataset/components/adhoc/DatasetVisualConfigureArea.vue";
import DatasetVisualConfigurePie from "@/views/admin/dataset/components/adhoc/DatasetVisualConfigurePie.vue";
import DatasetVisualConfigureHistogram from "@/views/admin/dataset/components/adhoc/DatasetVisualConfigureHistogram.vue";
export default {
name: 'DatasetAdhoc',
Expand All @@ -312,6 +325,7 @@ export default {
}
},
components: {
DatasetVisualConfigureHistogram,
DatasetVisualConfigurePie,
DatasetVisualConfigureArea,
DatasetColumnMetric,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<template>
<div>
<Form :model="formState"
:label-width="60">
<FormItem prop="xAxis"
:label="$t('dataset.visualConfigureCategoryLeftField')">
<Select v-model="formState.xAxis">
<Option v-for="item in columns"
:key="item"
:value="item">
{{ item }}
</Option>
</Select>
</FormItem>
<FormItem prop="x2Axis"
:label="$t('dataset.visualConfigureCategoryRightField')">
<Select v-model="formState.x2Axis">
<Option v-for="item in columns"
:key="item"
:value="item">
{{ item }}
</Option>
</Select>
</FormItem>
<FormItem prop="yAxis"
:label="$t('dataset.visualConfigureValueField')">
<Select v-model="formState.yAxis">
<Option v-for="item in columns"
:key="item"
:value="item">
{{ item }}
</Option>
</Select>
</FormItem>
</Form>
</div>
</template>
<script lang="ts">
export default {
name: 'DatasetVisualConfigureHistogram',
props: {
columns: {
type: Array,
default: () => []
}
},
watch: {
formState: {
handler: 'handlerCommit',
deep: true
}
},
data()
{
return {
formState: {
xAxis: null,
x2Axis: null,
yAxis: null
}
}
},
methods: {
handlerCommit()
{
this.$emit('commit', this.formState)
}
}
};
</script>

0 comments on commit 593cf98

Please sign in to comment.