wangrong
2026-08-30 4c949c0dc9bcae785c281c9d8125295f09810b15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<template>
  <div style="width: 100%">
    <el-col>
      <el-form ref="titleForm" :model="state.titleForm" label-width="80px" size="mini">
        <el-form-item :label="t('chart.show')" class="form-item">
          <el-checkbox v-model="state.titleForm.show" @change="changeTitleStyle('show')">{{
            t('chart.show')
          }}</el-checkbox>
        </el-form-item>
        <div v-show="state.titleForm.show">
          <el-form-item :label="t('chart.text_fontsize')" class="form-item">
            <el-select
              v-model="state.titleForm.fontSize"
              :placeholder="t('chart.text_fontsize')"
              size="mini"
              @change="changeTitleStyle('fontSize')"
            >
              <el-option
                v-for="option in state.fontSize"
                :key="option.value"
                :label="option.name"
                :value="option.value"
              />
            </el-select>
          </el-form-item>
          <el-form-item :label="t('chart.text_color')" class="form-item">
            <el-color-picker
              v-model="state.titleForm.color"
              class="color-picker-style"
              :predefine="state.predefineColors"
              @change="changeTitleStyle('color')"
            />
          </el-form-item>
          <el-form-item :label="t('chart.text_h_position')" class="form-item">
            <el-radio-group
              v-model="state.titleForm.hPosition"
              size="mini"
              @change="changeTitleStyle('hPosition')"
            >
              <el-radio-button label="left">{{ t('chart.text_pos_left') }}</el-radio-button>
              <el-radio-button label="center">{{ t('chart.text_pos_center') }}</el-radio-button>
              <el-radio-button label="right">{{ t('chart.text_pos_right') }}</el-radio-button>
            </el-radio-group>
          </el-form-item>
          <el-form-item :label="t('chart.text_v_position')" class="form-item">
            <el-radio-group
              v-model="state.titleForm.vPosition"
              size="mini"
              @change="changeTitleStyle('vPosition')"
            >
              <el-radio-button label="top">{{ t('chart.text_pos_top') }}</el-radio-button>
              <el-radio-button label="center">{{ t('chart.text_pos_center') }}</el-radio-button>
              <el-radio-button label="bottom">{{ t('chart.text_pos_bottom') }}</el-radio-button>
            </el-radio-group>
          </el-form-item>
          <el-form-item :label="t('chart.text_style')" class="form-item">
            <el-checkbox
              v-model="state.titleForm.isItalic"
              @change="changeTitleStyle('isItalic')"
              >{{ t('chart.italic') }}</el-checkbox
            >
            <el-checkbox
              v-model="state.titleForm.isBolder"
              @change="changeTitleStyle('isBolder')"
              >{{ t('chart.bolder') }}</el-checkbox
            >
          </el-form-item>
        </div>
      </el-form>
    </el-col>
  </div>
</template>
 
<script lang="ts" setup>
import { reactive } from 'vue'
import { COLOR_PANEL } from '@/views/chart/components/editor/util/chart'
import { useI18n } from '@/hooks/web/useI18n'
const { t } = useI18n()
const emits = defineEmits(['onTextChange'])
 
const state = reactive({
  titleForm: {},
  fontSize: [],
  isSetting: false,
  predefineColors: COLOR_PANEL
})
 
const changeTitleStyle = modifyName => {
  state.titleForm['modifyName'] = modifyName
  emits('onTextChange', state.titleForm)
}
</script>
 
<style scoped lang="less">
.shape-item {
  padding: 6px;
  border: none;
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.form-item-slider :deep(.ed-form-item__label) {
  font-size: 12px;
  line-height: 38px;
}
.form-item :deep(.ed-form-item__label) {
  font-size: 12px;
}
.ed-select-dropdown__item {
  padding: 0 20px;
}
span {
  font-size: 12px;
}
.ed-form-item {
  margin-bottom: 6px;
}
 
.switch-style {
  position: absolute;
  right: 10px;
  margin-top: -4px;
}
.color-picker-style {
  cursor: pointer;
  z-index: 1003;
}
</style>