config.vue 3.84 KB
<template>
  <!-- 默认展开 -->
  <CollapseItem :name="t('charts.chart.progressbar')" :expanded="true">
    <SettingItemBox :name="t('common.contentText')">
      <SettingItem :name="t('common.numericalText')">
        <!-- 与 config.ts 里的 option 对应 --><!-- n-input-number 是 NaiveUI 的控件 -->
        <n-input-number v-model:value="optionData.dataset" size="small" :min="0" placeholder="进度值"></n-input-number>
      </SettingItem>
      <setting-item :name="t('common.unitText')">
        <n-input v-model:value="optionData.unit" size="small"></n-input>
      </setting-item>
    </SettingItemBox>
    <SettingItemBox :name="t('common.rangeText')">
      <SettingItem :name="t('common.minText')">
        <n-input-number :min="0" v-model:value="optionData.value.min" size="small"></n-input-number>
      </SettingItem>
      <setting-item :name="t('common.maxText')">
        <n-input-number v-model:value="optionData.value.max" size="small" :min="100"></n-input-number>
      </setting-item>
    </SettingItemBox>
    <SettingItemBox :name="t('charts.chart.track')">
      <SettingItem :name="t('common.shapeText')">
        <n-select v-model:value="optionData.type" :options="types" placeholder="选择形状" />
      </SettingItem>

      <!-- 颜色粗细等等... -->
      <SettingItem :name="t('charts.chart.progressColor')">
        <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.color"></n-color-picker>
      </SettingItem>
      <SettingItem :name="t('charts.chart.trackColor')">
        <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.railColor"></n-color-picker>
      </SettingItem>
      <setting-item :name="t('charts.chart.offsetAngle')" v-if="optionData.type !== types[0].value">
        <n-input-number v-model:value="optionData.offsetDegree" size="small"></n-input-number>
      </setting-item>
      <SettingItem v-if="optionData.type == types[0].value">
        <n-space>
          <n-switch v-model:value="optionData.processing" size="small" />
          <n-text>{{ t('charts.chart.continAnimation') }}</n-text>
        </n-space>
      </SettingItem>
    </SettingItemBox>

    <SettingItemBox :name="t('charts.chart.index')">
      <SettingItem :name="t('common.positionText')" v-if="optionData.type == types[0].value">
        <n-select v-model:value="optionData.indicatorPlacement" :options="indicatorPlacements" placeholder="选择形状" />
      </SettingItem>
      <SettingItem :name="t('common.textColorText')">
        <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.indicatorTextColor"></n-color-picker>
      </SettingItem>
      <setting-item :name="t('common.textSizeText')">
        <n-input-number v-model:value="optionData.indicatorTextSize" size="small"></n-input-number>
      </setting-item>
    </SettingItemBox>
  </CollapseItem>
</template>

<script setup lang="ts">
import { PropType, watch, ref } from 'vue'
// 以下是封装的设置模块布局组件,具体效果可在官网查看
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'

// 获取 option 的数据,便于使用 typeof 获取类型
// import { option, types, indicatorPlacements } from './config'
import { option, indicatorPlacements } from './config'

const props = defineProps({
  optionData: {
    type: Object as PropType<typeof option>,
    required: true
  }
})

const t = window['$t']

watch(
  () => props.optionData.dataset,
  (newData: number) => {
    if (newData < props.optionData.value.min || newData > props.optionData.value.max) {
      window['$message'].error(t('common.minMaxText'))
    }
  }
)

const types = [
  {
    label: t('common.symbolEnumList.line'),
    value: 'line'
  },
  {
    label: t('common.symbolEnumList.circle'),
    value: 'circle'
  },
  {
    label: t('common.symbolEnumList.dashboard'),
    value: 'dashboard'
  }
]
</script>