|
|
@@ -3,11 +3,7 @@ import {defineProps, defineEmits, ref, onMounted, nextTick} from 'vue'
|
|
|
import {componentType} from "@/components/query-components/page-help-type";
|
|
|
import {useVModels} from "@vueuse/core";
|
|
|
import * as monaco from "monaco-editor";
|
|
|
-import sleep from "@/utils/sleep";
|
|
|
-import {editor} from "monaco-editor";
|
|
|
-import IStandaloneCodeEditor = editor.IStandaloneCodeEditor;
|
|
|
import * as el from 'element-plus'
|
|
|
-import {ElTag} from "element-plus";
|
|
|
import PageHelpColumns from "@/views/utilities/page-editor-help/components/PageHelpColumns.vue";
|
|
|
|
|
|
const props = defineProps<{
|
|
|
@@ -16,99 +12,6 @@ const props = defineProps<{
|
|
|
|
|
|
const emits = defineEmits(['update:pageJson'])
|
|
|
const {pageJson} = useVModels(props, emits)
|
|
|
-let currentIndex = -1
|
|
|
-const editClick = (scope, index) => {
|
|
|
- currentIndex = index
|
|
|
- dialog.value = true
|
|
|
-}
|
|
|
-
|
|
|
-const dialog = ref(false)
|
|
|
-const jsonEditRef = ref(null)
|
|
|
-const renderEditRef = ref(null)
|
|
|
-let jsonEditorMonaco: IStandaloneCodeEditor, renderMonaco: IStandaloneCodeEditor
|
|
|
-
|
|
|
-const jsonEdit = async () => {
|
|
|
- jsonEditorMonaco = monaco.editor.create(jsonEditRef.value, {
|
|
|
- // 初始化的dom节点
|
|
|
- value: JSON.stringify(pageJson.value.columns[currentIndex]), // 初始化值
|
|
|
- language: 'json', // 语言支持自行查阅demo
|
|
|
- automaticLayout: true, // 自适应布局
|
|
|
- theme: 'vs-dark', // 官方自带三种主题vs, hc-black, or vs-dark
|
|
|
- foldingStrategy: 'indentation',
|
|
|
- renderLineHighlight: 'all', // 行亮
|
|
|
- selectOnLineNumbers: true, // 显示行号
|
|
|
- minimap: {
|
|
|
- enabled: false,
|
|
|
- },
|
|
|
- readOnly: false, // 只读
|
|
|
- fontSize: 16, // 字体大小
|
|
|
- scrollBeyondLastLine: false, // 取消代码后面一大段空白
|
|
|
- overviewRulerBorder: true,
|
|
|
- });
|
|
|
-
|
|
|
- await sleep(200)
|
|
|
- jsonEditorMonaco.focus()
|
|
|
- jsonEditorMonaco.trigger("anything", "editor.action.formatDocument", "")
|
|
|
-}
|
|
|
-
|
|
|
-const renderEdit = async () => {
|
|
|
- renderMonaco = monaco.editor.create(renderEditRef.value, {
|
|
|
- // 初始化的dom节点
|
|
|
- value: pageJson.value.columns[currentIndex].render, // 初始化值
|
|
|
- language: 'javascript', // 语言支持自行查阅demo
|
|
|
- automaticLayout: true, // 自适应布局
|
|
|
- theme: 'vs-dark', // 官方自带三种主题vs, hc-black, or vs-dark
|
|
|
- foldingStrategy: 'indentation',
|
|
|
- renderLineHighlight: 'all', // 行亮
|
|
|
- selectOnLineNumbers: true, // 显示行号
|
|
|
- minimap: {
|
|
|
- enabled: false,
|
|
|
- },
|
|
|
- readOnly: false, // 只读
|
|
|
- fontSize: 16, // 字体大小
|
|
|
- scrollBeyondLastLine: false, // 取消代码后面一大段空白
|
|
|
- overviewRulerBorder: true,
|
|
|
- });
|
|
|
-
|
|
|
- await sleep(200)
|
|
|
-}
|
|
|
-
|
|
|
-const addRender = () => {
|
|
|
- let str = `/**
|
|
|
- * @param {h} h 创建 html 标签
|
|
|
- * @param {scope} scope row表格数据, $index 下标
|
|
|
- * return 一定要写返回值 返回一个虚拟dom
|
|
|
- */\nfunction render(h, {row,$index}){\n return \n}`
|
|
|
- pageJson.value.columns[currentIndex].render = str
|
|
|
- renderMonaco.setValue(str)
|
|
|
-}
|
|
|
-
|
|
|
-function render(h, {row, $index}) {
|
|
|
- let {sex, name} = row
|
|
|
- // 判断如果性别是 1 就显示男性
|
|
|
- if (sex === 1) {
|
|
|
- // 这里用的是 element-plus 的 tag标签
|
|
|
- return h(ElTag, {type: 'success'}, () => '男')
|
|
|
- } else if (sex === 2) {
|
|
|
- // 判断如果性别是 2 就显示女性,并且字体标红
|
|
|
- // 这里用的是浏览器自带的标签需要带上 单引号
|
|
|
- return h('span', {style: {color: 'red'}}, () => '女')
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const open = async () => {
|
|
|
- await nextTick()
|
|
|
- await jsonEdit()
|
|
|
- await renderEdit()
|
|
|
- setScopeType()
|
|
|
-}
|
|
|
-
|
|
|
-const closed = () => {
|
|
|
- pageJson.value.columns[currentIndex] = JSON.parse(jsonEditorMonaco.getValue());
|
|
|
- pageJson.value.columns[currentIndex].render = renderMonaco.getValue();
|
|
|
- jsonEditorMonaco.dispose()
|
|
|
- renderMonaco.dispose()
|
|
|
-}
|
|
|
|
|
|
/**
|
|
|
* 用来设置 Render 函数的类型,作用代码提示
|
|
|
@@ -130,28 +33,6 @@ const setRenderFuncType = () => {
|
|
|
.addExtraLib(hType)
|
|
|
}
|
|
|
|
|
|
-const setScopeType = () => {
|
|
|
- let columns = []
|
|
|
- pageJson.value.columns.forEach(item => {
|
|
|
- if (item.bind.prop) {
|
|
|
- columns.push(`${item.bind.prop}:string`);
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- let scopeType = `
|
|
|
- interface scope{
|
|
|
- row: {${columns.join(',')}},
|
|
|
- // 行号
|
|
|
- $index: number
|
|
|
- }
|
|
|
- `
|
|
|
- monaco
|
|
|
- .languages
|
|
|
- .typescript
|
|
|
- .javascriptDefaults
|
|
|
- .addExtraLib(scopeType)
|
|
|
-}
|
|
|
-
|
|
|
let elComp = ''
|
|
|
const elPlus = () => {
|
|
|
let str = []
|
|
|
@@ -181,58 +62,6 @@ onMounted(() => {
|
|
|
v-model="columnsDialog"
|
|
|
v-if="columnsDialog"/>
|
|
|
|
|
|
- <el-dialog v-model="dialog"
|
|
|
- fullscreen
|
|
|
- title="表格属性编辑"
|
|
|
- @opened="open"
|
|
|
- @closed="closed">
|
|
|
- <div style="height: 400px">
|
|
|
- <div style="display: flex; height: 100%; width: 100%">
|
|
|
- <div style="height: 100%; width: 30%">
|
|
|
- <a href="https://element-plus.gitee.io/zh-CN/component/table.html#table-column-%E5%B1%9E%E6%80%A7"
|
|
|
- target="_blank">element-plus官网</a>
|
|
|
- <pre>其他bind 属性可以去看
|
|
|
-bind: {
|
|
|
- prop: 字段名,
|
|
|
- label: 字段中文名,
|
|
|
- type?: 'selection' = 多选 | 'index' = 下标,不支持展开行
|
|
|
- fixed?: 'left' = 左固定 | 'right' = 右固定 | boolean,
|
|
|
- showOverflowTooltip?: boolean,内容过多省略并显示
|
|
|
- align?: 'left' | 'center' | 'right',
|
|
|
- width?: number,
|
|
|
- reserveSelection?: boolean,
|
|
|
-}
|
|
|
-render:用于渲染表格中的数据
|
|
|
-</pre>
|
|
|
- </div>
|
|
|
- <div ref="jsonEditRef" style="height: 100%; flex: 1"/>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="height: 400px">
|
|
|
- <div style="display: flex; height: 100%; width: 100%">
|
|
|
- <div style="height: 100%; width: 30%">
|
|
|
- <el-button @click="addRender" type="primary">添加render</el-button>
|
|
|
- <pre>
|
|
|
-实例:function render(h, {row, $index}) {
|
|
|
- let {sex, name} = scope.row
|
|
|
- // 判断如果性别是 1 就显示男性
|
|
|
- if (sex === 1) {
|
|
|
- // 这里用的是 element-plus 的 tag标签
|
|
|
- return h(ElTag, {type: 'success'}, () => '男')
|
|
|
- } else if (sex === 2) {
|
|
|
- // 判断如果性别是 2 就显示女性,并且字体标红
|
|
|
- // 这里用的是浏览器自带的标签需要带上 单引号
|
|
|
- return h('span', {style: {color: 'red'}}, () => '女')
|
|
|
- }
|
|
|
-}
|
|
|
- </pre>
|
|
|
- </div>
|
|
|
- <div style="height: 100%; flex: 1" ref="renderEditRef"/>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
<el-button @click="addTableColumn">添加</el-button>
|
|
|
<el-table :data="pageJson.columns">
|
|
|
<el-table-column prop="bind.prop" label="字段"/>
|