97 lines
3.3 KiB
Vue
97 lines
3.3 KiB
Vue
<template>
|
|
<section class="datasourcePicker">
|
|
<config-item label="数据类型">
|
|
<ai-select v-model="source.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/>
|
|
</config-item>
|
|
<div class="codeEditor" v-if="['htmlData'].includes(source.dataType)">
|
|
<ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false"
|
|
@confirm="changeData(JSON.parse(content))" @open="content=contentstr">
|
|
<code-editor slot="btn" readonly :value="contentstr" :lang="dataLang" theme="github" width="100%" height="250"/>
|
|
<code-editor v-model="content" :lang="dataLang" theme="github" width="100%" height="440" wrap/>
|
|
</ai-dialog-btn>
|
|
</div>
|
|
<template v-else-if="source.dataType === 'staticData'">
|
|
<config-item label="设置列" class="tableStyle">
|
|
<div class="fill">
|
|
<table-editor v-model="colConfigs" :configs="[{field:'field',headerName:'属性',width:100},{field:'headerName',headerName:'名称',width:100}]"/>
|
|
</div>
|
|
</config-item>
|
|
<config-item label="设置数据" class="tableStyle" v-if="colConfigs.length>0">
|
|
<table-editor v-model="content" :configs="colConfigs"/>
|
|
</config-item>
|
|
</template>
|
|
<config-item v-else-if="source.dataType === 'dynamicData'" label="数据源">
|
|
<ai-select v-model="source.sourceDataId" placeholder="请选择数据源" :instance="instance"
|
|
:prop="{label:'description'}" @change="changeData"
|
|
action="/app/appdiylargescreen/allDatasourceByPage"/>
|
|
</config-item>
|
|
<config-item label="接口地址" v-else-if="source.dataType === 'apiData'">
|
|
<el-input size="small" v-model="source.api" @change="changeData" placeholder="请输入数据接口URL"/>
|
|
</config-item>
|
|
</section>
|
|
</template>
|
|
<script>
|
|
import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue";
|
|
import ConfigItem from "./configItem.vue";
|
|
import {DvCompData} from "../config";
|
|
import CodeEditor from 'bin-ace-editor'
|
|
import 'brace/mode/json'
|
|
import 'brace/snippets/json';
|
|
import 'brace/theme/github';
|
|
import 'brace/theme/monokai';
|
|
import TableEditor from "./tableEditor.vue";
|
|
|
|
export default {
|
|
name: "datasourcePicker",
|
|
components: {TableEditor, ConfigItem, AiDialogBtn, CodeEditor},
|
|
model: {
|
|
event: "input",
|
|
prop: "options"
|
|
},
|
|
props: {
|
|
options: Object,
|
|
instance: Function
|
|
},
|
|
data() {
|
|
return {
|
|
dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})),
|
|
content: "",
|
|
loading: false,
|
|
colConfigs: []
|
|
}
|
|
},
|
|
computed: {
|
|
contentstr: v => JSON.stringify(v.options.staticData),
|
|
dataLang: v => v.options.dataType == 'htmlData' ? 'html' : 'json',
|
|
source: {
|
|
set(v) {
|
|
this.$emit("input", v)
|
|
},
|
|
get() {
|
|
return this.options
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
changeData(sdata) {
|
|
this.source.dataType == 'staticData' ? this.source.staticData = sdata :
|
|
new DvCompData(this.source.dataType, this.source, this.instance).getData().then(data => {
|
|
this.source[this.source.dataType] = data
|
|
})
|
|
}
|
|
},
|
|
}
|
|
</script>
|
|
<style scoped lang="scss">
|
|
.datasourcePicker {
|
|
.codeEditor {
|
|
position: relative;
|
|
padding-left: 10px;
|
|
}
|
|
|
|
.tableStyle {
|
|
align-items: normal;
|
|
}
|
|
}
|
|
</style>
|