Config.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <template>
  2. <div class="chart-config">
  3. <div class="config-tab">
  4. <Tabs v-model:activeKey="activeTab" size="small" centered>
  5. <TabPane key="1">
  6. <template #tab>
  7. <DatabaseOutlined />
  8. <span>数据设置</span>
  9. </template>
  10. </TabPane>
  11. <TabPane key="2">
  12. <template #tab>
  13. <SkinOutlined />
  14. <span>样式设置</span>
  15. </template>
  16. </TabPane>
  17. </Tabs>
  18. </div>
  19. <DataConfig
  20. v-if="activeTab === '1'"
  21. :dataSource="dataSource"
  22. @change="handleDataSourceChange"
  23. />
  24. <CusForm
  25. v-if="activeTab === '2'"
  26. :columns="formItems"
  27. :formModel="props"
  28. @change="handleFormChange"
  29. />
  30. </div>
  31. </template>
  32. <script setup lang="ts">
  33. import { ref, defineProps, defineEmits, computed } from "vue";
  34. import { Tabs, TabPane } from "ant-design-vue";
  35. import { DatabaseOutlined, SkinOutlined } from "@ant-design/icons-vue";
  36. import DataConfig from "../../../DataConfig.vue";
  37. import { CusForm, IFormItem } from "../../../../cusForm";
  38. import { basicBarProps } from "./props";
  39. import { chartFormItemsMap } from "../../../config/chartFormItemsMap";
  40. import { set, cloneDeep } from "lodash-es";
  41. const props = defineProps(basicBarProps);
  42. const activeTab = ref("1");
  43. const emit = defineEmits(["change"]);
  44. const baseSeries: IFormItem[] = [
  45. {
  46. label: "样式",
  47. prop: "",
  48. type: "divider",
  49. },
  50. {
  51. label: "固定柱宽",
  52. prop: "series.bar.fixedBarWidth",
  53. type: "radioGroup",
  54. fieldProps: {
  55. options: [
  56. { label: "是", value: true },
  57. { label: "否", value: false },
  58. ],
  59. },
  60. defaultValue: false,
  61. format: (formatModel, value) => {
  62. formatModel.value["series.bar.barWidth"] =
  63. value && formatModel.value?.["series.bar.barWidth"] !== "auto"
  64. ? formatModel.value?.["series.bar.barWidth"] || 20
  65. : "auto";
  66. },
  67. },
  68. {
  69. label: "",
  70. prop: "",
  71. type: "dependency",
  72. name: ["series.bar.fixedBarWidth"],
  73. children: (model) => {
  74. return model["series.bar.fixedBarWidth"]
  75. ? [
  76. {
  77. label: "柱宽",
  78. prop: "series.bar.barWidth",
  79. type: "inputNumber",
  80. fieldProps: {
  81. addonAfter: "px",
  82. },
  83. defaultValue: 20,
  84. },
  85. ]
  86. : [];
  87. },
  88. },
  89. {
  90. label: "系列间隔",
  91. prop: "series.bar.barGap",
  92. type: "slider",
  93. defaultValue: 30,
  94. format: (formatFormatModel, value) => {
  95. formatFormatModel.value['series.bar.barGap'] = value + "%";
  96. },
  97. valueToForm: (value) => {
  98. return +(value?.replace("%", "") || 0);
  99. },
  100. },
  101. {
  102. label: "分类间隔",
  103. prop: "series.bar.barCategoryGap",
  104. type: "slider",
  105. defaultValue: 20,
  106. format: (formatFormatModel, value) => {
  107. formatFormatModel.value['series.bar.barCategoryGap'] = value + "%";
  108. },
  109. valueToForm: (value) => {
  110. return +(value?.replace("%", "") || 0);
  111. },
  112. },
  113. {
  114. label: "边框",
  115. prop: "",
  116. type: "divider",
  117. },
  118. {
  119. label: "线宽",
  120. prop: "series.bar.itemStyle.borderWidth",
  121. type: "inputNumber",
  122. fieldProps: {
  123. addonAfter: "px",
  124. },
  125. defaultValue: 0,
  126. },
  127. {
  128. label: "颜色",
  129. prop: "series.bar.itemStyle.borderColor",
  130. type: "colorSelect",
  131. defaultValue: "#ccc",
  132. },
  133. {
  134. label: "圆角",
  135. prop: "series.bar.itemStyle.borderRadius",
  136. type: "inputNumber",
  137. fieldProps: {
  138. addonAfter: "px",
  139. },
  140. defaultValue: 0,
  141. },
  142. ];
  143. const formItems: IFormItem[] = [
  144. chartFormItemsMap.title,
  145. chartFormItemsMap.legend,
  146. chartFormItemsMap.label,
  147. {
  148. ...chartFormItemsMap.series,
  149. children: (chartFormItemsMap.series.children as IFormItem[]).concat(
  150. baseSeries
  151. ),
  152. },
  153. chartFormItemsMap.xAxis,
  154. chartFormItemsMap.yAxis,
  155. chartFormItemsMap.tooltip,
  156. ];
  157. const handleDataSourceChange = (data: any) => {
  158. emit("change", {
  159. ...props,
  160. dataSource: data,
  161. });
  162. };
  163. const handleFormChange = (formatData: any) => {
  164. const obj = cloneDeep(props);
  165. Object.keys(formatData).forEach((key) => {
  166. set(obj, key, formatData[key]);
  167. });
  168. emit("change", obj);
  169. };
  170. </script>
  171. <style lang="less" scoped>
  172. .config-tab {
  173. text-align: center;
  174. margin-bottom: 12px;
  175. }
  176. </style>