123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <template>
- <div class="dv-capsule-chart">
- <template v-if="mergedConfig">
- <div class="label-column">
- <div v-for="item in mergedConfig.data" :key="item.name" style="cursor: pointer" @click="getEventList(item)">
- {{ item.name }}
- </div>
- <div> </div>
- </div>
- <div class="capsule-container">
- <div class="capsule-item" v-for="(capsule, index) in capsuleLength" :key="index" style="cursor: pointer" @click="getEventList(mergedConfig.data[index])">
- <div
- class="capsule-item-column"
- :style="`width: ${capsule * 100}%; background-color: ${mergedConfig.colors[index % mergedConfig.colors.length]};`"
- >
- <div
- v-if="mergedConfig.showValue"
- class="capsule-item-value"
- >{{ capsuleValue[index] }}
- </div>
- </div>
- </div>
- <div class="unit-label">
- <div
- v-for="(label, index) in labelData"
- :key="label + index"
- >{{ label }}
- </div>
- </div>
- </div>
- <div class="unit-text" v-if="mergedConfig.unit">{{ mergedConfig.unit }}</div>
- </template>
- </div>
- </template>
- <script>
- import {deepMerge} from '@jiaminghi/charts/lib/util/index'
- import {deepClone} from '@jiaminghi/c-render/lib/plugin/util'
- export default {
- name: 'DvCapsuleChart',
- props: {
- config: {
- type: Object,
- default: () => ({})
- }
- },
- data() {
- return {
- defaultConfig: {
- /**
- * @description Capsule chart data
- * @type {Array<Object>}
- * @default data = []
- * @example data = [{ name: 'foo1', value: 100 }, { name: 'foo2', value: 100 }]
- */
- data: [],
- /**
- * @description Colors (hex|rgb|rgba|color keywords)
- * @type {Array<String>}
- * @default color = ['#37a2da', '#32c5e9', '#67e0e3', '#9fe6b8', '#ffdb5c', '#ff9f7f', '#fb7293']
- * @example color = ['#000', 'rgb(0, 0, 0)', 'rgba(0, 0, 0, 1)', 'red']
- */
- colors: [
- '#37a2da',
- '#32c5e9',
- '#67e0e3',
- '#9fe6b8',
- '#ffdb5c',
- '#ff9f7f',
- '#fb7293'
- ],
- /**
- * @description Chart unit
- * @type {String}
- * @default unit = ''
- */
- unit: '',
- /**
- * @description Show item value
- * @type {Boolean}
- * @default showValue = false
- */
- showValue: false
- },
- mergedConfig: null,
- capsuleLength: [],
- capsuleValue: [],
- labelData: [],
- labelDataLength: []
- }
- },
- watch: {
- config() {
- const {calcData} = this
- calcData()
- }
- },
- methods: {
- getEventList(val) {
- debugger
- let args = {eventTypeIdDl: [], eventTypeId: []}
- if (val.id != '0') {
- args.eventTypeIdDl.push(-1)
- args.eventTypeId.push(val.id)
- } else {
- args.eventTypeIdDl.push(val.parentId)
- args.eventTypeId.push(-1)
- }
- this.$emit('setEventTypeId', args)
- },
- calcData() {
- const {mergeConfig, calcCapsuleLengthAndLabelData} = this
- mergeConfig()
- calcCapsuleLengthAndLabelData()
- },
- mergeConfig() {
- let {config, defaultConfig} = this
- this.mergedConfig = deepMerge(
- deepClone(defaultConfig, true),
- config || {}
- )
- },
- calcCapsuleLengthAndLabelData() {
- const {data} = this.mergedConfig
- if (!data.length) return
- const capsuleValue = data.map(({value}) => value)
- const maxValue = Math.max(...capsuleValue)
- this.capsuleValue = capsuleValue
- this.capsuleLength = capsuleValue.map(v => (maxValue ? v / maxValue : 0))
- const oneFifth = maxValue / 5
- const labelData = Array.from(
- new Set(new Array(6).fill(0).map((v, i) => Math.ceil(i * oneFifth)))
- )
- this.labelData = labelData
- this.labelDataLength = Array.from(labelData).map(v =>
- maxValue ? v / maxValue : 0
- )
- }
- },
- mounted() {
- const {calcData} = this
- calcData()
- }
- }
- </script>
|