dvCapsuleChart.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <div class="dv-capsule-chart">
  3. <template v-if="mergedConfig">
  4. <div class="label-column">
  5. <div v-for="item in mergedConfig.data" :key="item.name" style="cursor: pointer" @click="getEventList(item)">
  6. {{ item.name }}
  7. </div>
  8. <div>&nbsp;</div>
  9. </div>
  10. <div class="capsule-container">
  11. <div class="capsule-item" v-for="(capsule, index) in capsuleLength" :key="index">
  12. <div
  13. @click="getEventList(capsule)"
  14. class="capsule-item-column"
  15. :style="`cursor: pointer;width: ${capsule * 100}%; background-color: ${mergedConfig.colors[index % mergedConfig.colors.length]};`"
  16. >
  17. <div
  18. style="cursor: pointer" @click="getEventList(capsule)"
  19. v-if="mergedConfig.showValue"
  20. class="capsule-item-value"
  21. >{{ capsuleValue[index] }}
  22. </div>
  23. </div>
  24. </div>
  25. <div class="unit-label">
  26. <div
  27. v-for="(label, index) in labelData"
  28. :key="label + index"
  29. >{{ label }}
  30. </div>
  31. </div>
  32. </div>
  33. <div class="unit-text" v-if="mergedConfig.unit">{{ mergedConfig.unit }}</div>
  34. </template>
  35. </div>
  36. </template>
  37. <script>
  38. import {deepMerge} from '@jiaminghi/charts/lib/util/index'
  39. import {deepClone} from '@jiaminghi/c-render/lib/plugin/util'
  40. export default {
  41. name: 'DvCapsuleChart',
  42. props: {
  43. config: {
  44. type: Object,
  45. default: () => ({})
  46. }
  47. },
  48. data() {
  49. return {
  50. defaultConfig: {
  51. /**
  52. * @description Capsule chart data
  53. * @type {Array<Object>}
  54. * @default data = []
  55. * @example data = [{ name: 'foo1', value: 100 }, { name: 'foo2', value: 100 }]
  56. */
  57. data: [],
  58. /**
  59. * @description Colors (hex|rgb|rgba|color keywords)
  60. * @type {Array<String>}
  61. * @default color = ['#37a2da', '#32c5e9', '#67e0e3', '#9fe6b8', '#ffdb5c', '#ff9f7f', '#fb7293']
  62. * @example color = ['#000', 'rgb(0, 0, 0)', 'rgba(0, 0, 0, 1)', 'red']
  63. */
  64. colors: [
  65. '#37a2da',
  66. '#32c5e9',
  67. '#67e0e3',
  68. '#9fe6b8',
  69. '#ffdb5c',
  70. '#ff9f7f',
  71. '#fb7293'
  72. ],
  73. /**
  74. * @description Chart unit
  75. * @type {String}
  76. * @default unit = ''
  77. */
  78. unit: '',
  79. /**
  80. * @description Show item value
  81. * @type {Boolean}
  82. * @default showValue = false
  83. */
  84. showValue: false
  85. },
  86. mergedConfig: null,
  87. capsuleLength: [],
  88. capsuleValue: [],
  89. labelData: [],
  90. labelDataLength: []
  91. }
  92. },
  93. watch: {
  94. config() {
  95. const {calcData} = this
  96. calcData()
  97. }
  98. },
  99. methods: {
  100. getEventList(val) {
  101. debugger
  102. let args = {eventTypeIdDl: [], eventTypeId: []}
  103. if (val.id != '0') {
  104. args.eventTypeIdDl.push(-1)
  105. args.eventTypeId.push(val.id)
  106. } else {
  107. args.eventTypeIdDl.push(val.parentId)
  108. args.eventTypeId.push(-1)
  109. }
  110. this.$emit('setEventTypeId', args)
  111. },
  112. calcData() {
  113. const {mergeConfig, calcCapsuleLengthAndLabelData} = this
  114. mergeConfig()
  115. calcCapsuleLengthAndLabelData()
  116. },
  117. mergeConfig() {
  118. let {config, defaultConfig} = this
  119. this.mergedConfig = deepMerge(
  120. deepClone(defaultConfig, true),
  121. config || {}
  122. )
  123. },
  124. calcCapsuleLengthAndLabelData() {
  125. const {data} = this.mergedConfig
  126. if (!data.length) return
  127. const capsuleValue = data.map(({value}) => value)
  128. const maxValue = Math.max(...capsuleValue)
  129. this.capsuleValue = capsuleValue
  130. this.capsuleLength = capsuleValue.map(v => (maxValue ? v / maxValue : 0))
  131. const oneFifth = maxValue / 5
  132. const labelData = Array.from(
  133. new Set(new Array(6).fill(0).map((v, i) => Math.ceil(i * oneFifth)))
  134. )
  135. this.labelData = labelData
  136. this.labelDataLength = Array.from(labelData).map(v =>
  137. maxValue ? v / maxValue : 0
  138. )
  139. }
  140. },
  141. mounted() {
  142. const {calcData} = this
  143. calcData()
  144. }
  145. }
  146. </script>