|
@@ -17,110 +17,152 @@
|
|
|
</Tabs>
|
|
|
</div>
|
|
|
|
|
|
- <DataConfig v-if="activeTab === '1'" :dataSource="dataSource" @change="handleDataSourceChange"/>
|
|
|
- <CusForm v-if="activeTab === '2'" :columns="formItems" @change="handleFormChange"/>
|
|
|
+ <DataConfig
|
|
|
+ v-if="activeTab === '1'"
|
|
|
+ :dataSource="dataSource"
|
|
|
+ @change="handleDataSourceChange"
|
|
|
+ />
|
|
|
+ <CusForm
|
|
|
+ v-if="activeTab === '2'"
|
|
|
+ :columns="formItems"
|
|
|
+ :formModel="props"
|
|
|
+ @change="handleFormChange"
|
|
|
+ />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { ref, defineProps, defineEmits } from 'vue';
|
|
|
-import { Tabs, TabPane } from 'ant-design-vue';
|
|
|
-import { DatabaseOutlined, SkinOutlined } from '@ant-design/icons-vue';
|
|
|
-import DataConfig from '../../../DataConfig.vue';
|
|
|
-import { CusForm, IFormItem } from '../../../../cusForm';
|
|
|
-import { basicBarProps } from './props';
|
|
|
-import { chartFormItemsMap } from '../../../config/chartFormItemsMap';
|
|
|
+import { ref, defineProps, defineEmits, computed } from "vue";
|
|
|
+import { Tabs, TabPane } from "ant-design-vue";
|
|
|
+import { DatabaseOutlined, SkinOutlined } from "@ant-design/icons-vue";
|
|
|
+import DataConfig from "../../../DataConfig.vue";
|
|
|
+import { CusForm, IFormItem } from "../../../../cusForm";
|
|
|
+import { basicBarProps } from "./props";
|
|
|
+import { chartFormItemsMap } from "../../../config/chartFormItemsMap";
|
|
|
+import { set, cloneDeep } from 'lodash-es';
|
|
|
|
|
|
const props = defineProps(basicBarProps);
|
|
|
-const activeTab = ref('1');
|
|
|
-const emit = defineEmits(['change']);
|
|
|
-const formItems = [
|
|
|
+const activeTab = ref("1");
|
|
|
+const emit = defineEmits(["change"]);
|
|
|
+
|
|
|
+const barSeries: IFormItem[] = [
|
|
|
+ {
|
|
|
+ label: "样式",
|
|
|
+ prop: "",
|
|
|
+ type: "divider",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "固定柱宽",
|
|
|
+ prop: "series.fixedBarWidth",
|
|
|
+ type: "radioGroup",
|
|
|
+ fieldProps: {
|
|
|
+ options: [
|
|
|
+ { label: "是", value: true },
|
|
|
+ { label: "否", value: false },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ defaultValue: false,
|
|
|
+ format: (formatModel, value) => {
|
|
|
+ formatModel.value["series.barWidth"] = value
|
|
|
+ ? formatModel.value?.["series.barWidth"] || 20
|
|
|
+ : "auto";
|
|
|
+ },
|
|
|
+ valueToForm: (value) => {
|
|
|
+ return value !== 'auto'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "",
|
|
|
+ prop: "",
|
|
|
+ type: "dependency",
|
|
|
+ name: ["series.fixedBarWidth"],
|
|
|
+ children: (model) => {
|
|
|
+ return model["series.fixedBarWidth"]
|
|
|
+ ? [
|
|
|
+ {
|
|
|
+ label: "柱宽",
|
|
|
+ prop: "series.barWidth",
|
|
|
+ type: "inputNumber",
|
|
|
+ fieldProps: {
|
|
|
+ addonAfter: "px",
|
|
|
+ },
|
|
|
+ defaultValue: 20,
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ : [];
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "系列间隔",
|
|
|
+ prop: "series.barGap",
|
|
|
+ type: "slider",
|
|
|
+ defaultValue: 20,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "分类间隔",
|
|
|
+ prop: "series.barCategoryGap",
|
|
|
+ type: "slider",
|
|
|
+ defaultValue: 20,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "边框",
|
|
|
+ prop: "",
|
|
|
+ type: "divider",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "线宽",
|
|
|
+ prop: "series.itemStyle.borderWidth",
|
|
|
+ type: "inputNumber",
|
|
|
+ fieldProps: {
|
|
|
+ addonAfter: "px",
|
|
|
+ },
|
|
|
+ defaultValue: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "颜色",
|
|
|
+ prop: "series.itemStyle.borderColor",
|
|
|
+ type: "colorSelect",
|
|
|
+ defaultValue: "#ccc",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "圆角",
|
|
|
+ prop: "series.itemStyle.borderRadius",
|
|
|
+ type: "inputNumber",
|
|
|
+ fieldProps: {
|
|
|
+ addonAfter: "px",
|
|
|
+ },
|
|
|
+ defaultValue: 0,
|
|
|
+ },
|
|
|
+];
|
|
|
+const formItems: IFormItem[] = [
|
|
|
chartFormItemsMap.title,
|
|
|
chartFormItemsMap.legend,
|
|
|
// chartFormItemsMap.label,
|
|
|
{
|
|
|
...chartFormItemsMap.series,
|
|
|
- children: [
|
|
|
- ...(chartFormItemsMap.serie.children as IFormItem[]),
|
|
|
- {
|
|
|
- label: "样式",
|
|
|
- prop: "",
|
|
|
- type: "divider",
|
|
|
- },
|
|
|
- {
|
|
|
- label: "固定柱宽",
|
|
|
- prop: "serieBarFixedWidth",
|
|
|
- type: "radioGroup",
|
|
|
- fieldProps: {
|
|
|
- options: [
|
|
|
- { label: "是", value: true },
|
|
|
- { label: "否", value: false },
|
|
|
- ],
|
|
|
- },
|
|
|
- defaultValue: false,
|
|
|
- },
|
|
|
- {
|
|
|
- label: "系列间隔",
|
|
|
- prop: "serieGap",
|
|
|
- type: "slider",
|
|
|
- defaultValue: 20,
|
|
|
- },
|
|
|
- {
|
|
|
- label: "分类间隔",
|
|
|
- prop: "categoryGap",
|
|
|
- type: "slider",
|
|
|
- defaultValue: 20,
|
|
|
- },
|
|
|
- {
|
|
|
- label: "边框",
|
|
|
- prop: "",
|
|
|
- type: "divider",
|
|
|
- },
|
|
|
- {
|
|
|
- label: "线宽",
|
|
|
- prop: "serieBorderWidth",
|
|
|
- type: "inputNumber",
|
|
|
- fieldProps: {
|
|
|
- addonAfter: "px",
|
|
|
- },
|
|
|
- defaultValue: 0,
|
|
|
- },
|
|
|
- {
|
|
|
- label: "颜色",
|
|
|
- prop: "serieBorderColor",
|
|
|
- type: "colorSelect",
|
|
|
- defaultValue: "#ccc",
|
|
|
- },
|
|
|
- {
|
|
|
- label: "圆角",
|
|
|
- prop: "serieBorderRadius",
|
|
|
- type: "inputNumber",
|
|
|
- fieldProps: {
|
|
|
- addonAfter: "px",
|
|
|
- },
|
|
|
- defaultValue: 0,
|
|
|
- },
|
|
|
- ]
|
|
|
+ children: (chartFormItemsMap.series.children as IFormItem[]).concat(
|
|
|
+ barSeries
|
|
|
+ ),
|
|
|
},
|
|
|
chartFormItemsMap.xAxis,
|
|
|
chartFormItemsMap.yAxis,
|
|
|
chartFormItemsMap.tooltip,
|
|
|
- chartFormItemsMap.background
|
|
|
-]
|
|
|
+];
|
|
|
|
|
|
const handleDataSourceChange = (data: any) => {
|
|
|
- emit('change', {
|
|
|
+ emit("change", {
|
|
|
...props,
|
|
|
dataSource: data,
|
|
|
});
|
|
|
-}
|
|
|
-const handleFormChange = (data: any) => {
|
|
|
- console.log('form change:', data);
|
|
|
- emit('change', {
|
|
|
- ...props,
|
|
|
- ...data
|
|
|
+};
|
|
|
+const handleFormChange = (formatData: any) => {
|
|
|
+ const obj = cloneDeep(props);
|
|
|
+ Object.keys(formatData).forEach((key) => {
|
|
|
+ set(obj, key, formatData[key]);
|
|
|
});
|
|
|
-}
|
|
|
+ console.log("obj:", obj, props, formatData);
|
|
|
+ emit("change", obj);
|
|
|
+};
|
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
@@ -128,4 +170,4 @@ const handleFormChange = (data: any) => {
|
|
|
text-align: center;
|
|
|
margin-bottom: 12px;
|
|
|
}
|
|
|
-</style>
|
|
|
+</style>
|