Config.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <div>
  3. <el-card class="mb-12px" body-class="pr-0px!">
  4. <template #header>
  5. <div class="flex items-center justify-between">
  6. <span>内容</span>
  7. <span class="flex gap-4px">
  8. <LuPlus class="cursor-pointer" @click="handleAdd" size="14px" />
  9. <LuTrash2 class="cursor-pointer" @click="handleClear" size="14px" />
  10. </span>
  11. </div>
  12. </template>
  13. <el-scrollbar height="120px">
  14. <div
  15. v-for="(item, index) in props.values?.value || []"
  16. :key="v4()"
  17. class="flex items-center pr-12px"
  18. @click="handleEdit(item)"
  19. >
  20. <span class="flex-1 truncate text-#00ff00 cursor-pointer">{{ item.text }}</span>
  21. <LuTrash2 class="cursor-pointer shrink-0" @click.stop="handleDelete(index)" size="14px" />
  22. </div>
  23. </el-scrollbar>
  24. </el-card>
  25. <el-dialog v-model="dialogVisible" title="编辑文本" width="440px">
  26. <el-form ref="formRef" :model="formData" label-position="left" label-width="60px">
  27. <el-form-item label="字体颜色">
  28. <ColorPicker
  29. v-model:pureColor="formData.text_color"
  30. format="hex8"
  31. picker-type="chrome"
  32. use-type="pure"
  33. >
  34. <template #trigger>
  35. <BiFontColor size="22px" :style="{ color: formData.text_color }" />
  36. </template>
  37. </ColorPicker>
  38. <span class="text-text-active">{{ formData.text_color }}</span>
  39. </el-form-item>
  40. <el-form-item label="字体" label-width="60px">
  41. <el-select-v2
  42. v-model="formData.font_family"
  43. placeholder="请选择"
  44. :options="fontOptions"
  45. />
  46. </el-form-item>
  47. <el-form-item label="字体大小">
  48. <el-input-number
  49. v-model="formData.font_size"
  50. controls-position="right"
  51. placeholder="请输入"
  52. style="width: 100%"
  53. />
  54. </el-form-item>
  55. <el-form-item label="">
  56. <el-radio-group v-model="formData.text_decor">
  57. <el-radio-button :value="LineEnum.LV_TEXT_DECOR_NONE">
  58. <el-tooltip content="none">
  59. <MdNotInterested size="14px" />
  60. </el-tooltip>
  61. </el-radio-button>
  62. <el-radio-button :value="LineEnum.LV_TEXT_DECOR_UNDERLINE">
  63. <el-tooltip content="underline">
  64. <RxUnderline size="14px" />
  65. </el-tooltip>
  66. </el-radio-button>
  67. <el-radio-button :value="LineEnum.LV_TEXT_DECOR_STRIKETHROUGH">
  68. <el-tooltip content="strikethrough">
  69. <RxStrikethrough size="14px" />
  70. </el-tooltip>
  71. </el-radio-button>
  72. <el-radio-button
  73. :value="LineEnum['LV_TEXT_DECOR_UNDERLINE | LV_TEXT_DECOR_STRIKETHROUGH']"
  74. >
  75. <el-tooltip content="strikethrough and underline">
  76. <GoStrikethrough size="14px" />
  77. </el-tooltip>
  78. </el-radio-button>
  79. </el-radio-group>
  80. </el-form-item>
  81. <el-form-item label="文本">
  82. <el-input type="textarea" v-model="formData.text" placeholder="请输入文本" />
  83. </el-form-item>
  84. </el-form>
  85. <template #footer>
  86. <el-button type="primary" @click="dialogVisible = false">确定</el-button>
  87. </template>
  88. </el-dialog>
  89. </div>
  90. </template>
  91. <script setup lang="ts">
  92. import { type SpanItem, LineEnum } from './data'
  93. import { computed, type Ref, ref } from 'vue'
  94. import { LuPlus, LuTrash2 } from 'vue-icons-plus/lu'
  95. import { v4 } from 'uuid'
  96. import { ColorPicker } from '@/components'
  97. import { BiFontColor } from 'vue-icons-plus/bi'
  98. import { MdNotInterested } from 'vue-icons-plus/md'
  99. import { RxUnderline, RxStrikethrough } from 'vue-icons-plus/rx'
  100. import { GoStrikethrough } from 'vue-icons-plus/go'
  101. import { useProjectStore } from '@/store/modules/project'
  102. const props = defineProps<{
  103. values: Ref<SpanItem[]>
  104. }>()
  105. const dialogVisible = ref(false)
  106. const formData = ref<SpanItem>({
  107. text: '',
  108. text_color: '',
  109. font_family: '',
  110. font_size: 0,
  111. text_decor: LineEnum.LV_TEXT_DECOR_NONE
  112. })
  113. const projectStore = useProjectStore()
  114. // 字体选项
  115. const fontOptions = computed(() => {
  116. const list = (projectStore.project?.resources.fonts || []).map((font) => {
  117. return {
  118. label: font.fileName,
  119. value: font.id
  120. }
  121. })
  122. return [{ label: '默认字体', value: 'xx' }, ...list]
  123. })
  124. /**
  125. * 添加文本项
  126. */
  127. const handleAdd = () => {
  128. props.values?.value?.push({
  129. text: 'hello world',
  130. text_color: '#000000ff',
  131. font_family: 'xx',
  132. font_size: 16,
  133. text_decor: LineEnum.LV_TEXT_DECOR_NONE
  134. })
  135. }
  136. /**
  137. * 删除文本项
  138. */
  139. const handleDelete = (index: number) => {
  140. props.values?.value?.splice(index, 1)
  141. }
  142. /**
  143. * 清除文本项
  144. */
  145. const handleClear = () => {
  146. props.values.value = []
  147. }
  148. const handleEdit = (record: SpanItem) => {
  149. formData.value = record
  150. dialogVisible.value = true
  151. }
  152. </script>
  153. <style scoped></style>