| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | <template>  <div class="pane-container">    <component :is="currentType.componentName" :data="chartData" :schema="schema" :chart-style="chartStyle" class="visualize-window" />    <div v-if="isEditMode" class="chart-style-panel">      <el-form label-position="top" size="mini">        <el-form-item :label="$t('chart.chartType')+':'">          <div class="chart-type-list">            <span v-for="item in chartTypeList" :key="item.type" :class="{activedIcon :item.type===chartType, disabledIcon: !isUsable(item)}" @click="switchChartType(item)">              <el-tooltip :content="item.name +': '+item.matchRule.desc" placement="top">                <svg-icon class="icon" :icon-class="isUsable(item)? item.icon : (item.icon + '_disabled')" />              </el-tooltip>            </span>          </div>        </el-form-item>      </el-form>    </div>  </div></template><script>import lineChart from '@/widgets/lineChart'import DataTable from '@/widgets/DataTable'import BarChart from '@/widgets/BarChart'import StackBarChart from '@/widgets/StackBarChart'import HorizontalBar from '@/widgets/horizontalBar'import PieChart from '@/widgets/PieChart'import chartTypeList from '@/utils/chartTypeList'import store from '../store'export default {  components: { lineChart, DataTable, BarChart, StackBarChart, PieChart, HorizontalBar },  props: {    data: {      type: Array,      required: true    },    schema: {      type: Array,      required: true    },    chartStyle: {      require: false,      type: Object    },    chartType: {      type: String,      default: 'table'    },    isEditMode: {      type: Boolean,      default: true    }  },  data() {    return {      chartTypeList    }  },  computed: {    allSelected() {      return store.state.caculCols.concat(store.state.dimensions)    },    chartData() {      return this.currentType.dataTransfer ? this.currentType.dataTransfer(this.data, this.schema) : this.data    },    currentType() {      return chartTypeList.find(item => item.type === this.chartType)    }  },  watch: {    allSelected: {      deep: true,      handler() {        if (!this.currentType.matchRule.isUsable(store.state.dimensions, store.state.caculCols)) {          this.$emit('update:chartType', 'table')        }      }    }  },  methods: {    isUsable(chart) {      return chart.matchRule.isUsable(store.state.dimensions, store.state.caculCols)    },    switchChartType(chart) {      if (!chart.matchRule.isUsable(store.state.dimensions, store.state.caculCols)) {        return      }      this.$emit('update:chartType', chart.type)    }  }}</script> <style lang="scss" scoped> .pane-container {   display: flex;   height: 100%;   .visualize-window {     width: 100%;   }   .chart-style-panel {     width: 200px;     flex-shrink: 0;     padding: 10px;     .chart-type-list {       width: 100%;       display: grid;       justify-items: center;       grid-template-columns: repeat(5, 1fr);       grid-auto-rows: 1fr;       grid-gap: 10px;       span {         line-height: initial;         height: 100%;         font-size: 22px;         cursor: pointer;         text-align: center;         width: 100%;         position: relative;         .icon {           position: absolute;           top: 0;           left: 0;           right: 0;           bottom:0;           margin: auto;         }       }       span::before {          content: '';          width: 100%;          padding-bottom: 100%;          display: block;        }        .disabledIcon {          cursor: not-allowed;        }       .activedIcon {         background: #c9c9c9;       }     }   } } </style>
 |