Files
dvcp_v2_webapp/packages/bigscreen/designer/components/datasourcePicker.vue
2024-04-12 18:19:49 +08:00

120 lines
4.1 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="设置数据" topLabel>
<json-editor v-model="options.staticData" mainMenuBar/>
</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 CodeEditor from 'bin-ace-editor'
import 'brace/mode/json'
import 'brace/snippets/json';
import 'brace/theme/github';
import 'brace/theme/monokai';
import JsonEditor from "./jsonEditor.vue";
import {DvCompData} from "@dui/dv";
export default {
name: "datasourcePicker",
components: {JsonEditor, 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,
}
},
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
}
},
staticDataOps() {
const columnProp = "name", ops = {colConfigs: [], tableData: []}
if (Array.isArray(this.options.staticData)) {
const columns = []
ops.colConfigs = []
this.options.staticData.map((row, i) => {
const prop = `c${i || ""}`
ops.colConfigs.push({label: row[columnProp] || row.key, prop})
Object.entries(row).map(([k, v]) => {
if (/^v/.test(k) && k != "value") {
const item = ops.tableData[k.substring(1) || 0] || {}
item[prop] = v
ops.tableData[k.substring(1) || 0] = item
} else if (![columnProp, 'key'].includes(k)) {
const index = columns.findIndex(e => k == e)
if (index > -1) {
const item = ops.tableData[index] || {}
item[prop] = v
ops.tableData[index] = item
} else {
columns.push(k)
const newIndex = columns.length - 1
const item = ops.tableData[newIndex] || {}
item[prop] = v
ops.tableData[newIndex] = item
}
}
})
})
ops.tableData = ops.tableData.map(e => ({...e, $cellEdit: false}))
}
return ops
}
},
methods: {
changeData(sdata) {
this.source.dataType == 'staticData' ? this.source.staticData = sdata :
new DvCompData(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;
}
}
</style>