feat(editor,core): 数据源模板改成使用 ES 分隔符

This commit is contained in:
roymondchen 2023-06-26 20:30:38 +08:00
parent c886a4bc40
commit b952e6efd1
6 changed files with 34 additions and 20 deletions

View File

@ -322,15 +322,7 @@ class App extends EventEmitter {
} }
public compiledNode(node: MNode, content: DataSourceManagerData, sourceId?: Id) { public compiledNode(node: MNode, content: DataSourceManagerData, sourceId?: Id) {
return compiledNode( return compiledNode((str: string) => template(str)(content), cloneDeep(node), this.dsl?.dataSourceDeps, sourceId);
(str: string) =>
template(str, {
escape: /\{\{([\s\S]+?)\}\}/g,
})(content),
cloneDeep(node),
this.dsl?.dataSourceDeps,
sourceId,
);
} }
public destroy() { public destroy() {

View File

@ -30,13 +30,15 @@
</div> </div>
</template> </template>
</component> </component>
<div :class="`el-input el-input--${size}`" @mouseup="mouseupHandler" v-else> <div :class="`tmagic-data-source-input-text el-input el-input--${size}`" @mouseup="mouseupHandler" v-else>
<div :class="`el-input__wrapper ${isFocused ? ' is-focus' : ''}`"> <div :class="`tmagic-data-source-input-text-wrapper el-input__wrapper ${isFocused ? ' is-focus' : ''}`">
<div class="el-input__inner"> <div class="el-input__inner">
<template v-for="(item, index) in displayState"> <template v-for="(item, index) in displayState">
<span :key="index" v-if="item.type === 'text'" style="margin-right: 2px">{{ item.value }}</span> <span :key="index" v-if="item.type === 'text'" style="margin-right: 2px">{{ item.value }}</span>
<TMagicTag :key="index" :size="size" v-if="item.type === 'var'">{{ item.value }}</TMagicTag> <TMagicTag :key="index" :size="size" v-if="item.type === 'var'">{{ item.value }}</TMagicTag>
</template> </template>
<Icon class="tmagic-data-source-input-icon" :icon="Coin" />
</div> </div>
</div> </div>
</div> </div>
@ -90,7 +92,7 @@ const dataSources = computed(() => dataSourceService?.get('dataSources') || []);
const setDisplayState = () => { const setDisplayState = () => {
displayState.value = []; displayState.value = [];
const matches = state.value.matchAll(/\{\{([\s\S]+?)\}\}/g); const matches = state.value.matchAll(/\$\{([\s\S]+?)\}/g);
let index = 0; let index = 0;
for (const match of matches) { for (const match of matches) {
if (typeof match.index === 'undefined') break; if (typeof match.index === 'undefined') break;
@ -195,7 +197,7 @@ const getSelectionStart = () => {
* @param leftCurlyBracketIndex {字符索引 * @param leftCurlyBracketIndex {字符索引
*/ */
const curCharIsLeftCurlyBracket = (leftCurlyBracketIndex: number) => const curCharIsLeftCurlyBracket = (leftCurlyBracketIndex: number) =>
leftCurlyBracketIndex > -1 && leftCurlyBracketIndex === getSelectionStart() - 1; leftCurlyBracketIndex > 0 && leftCurlyBracketIndex === getSelectionStart() - 1;
/** /**
* 当前输入的是. * 当前输入的是.
@ -213,7 +215,7 @@ const dsQuerySearch = (queryString: string, leftCurlyBracketIndex: number, cb: (
if (curCharIsLeftCurlyBracket(leftCurlyBracketIndex)) { if (curCharIsLeftCurlyBracket(leftCurlyBracketIndex)) {
// { // {
result = dataSources.value; result = dataSources.value;
} else if (leftCurlyBracketIndex > -1) { } else if (leftCurlyBracketIndex > 0) {
// {xx // {xx
const queryName = queryString.substring(leftCurlyBracketIndex + 1).toLowerCase(); const queryName = queryString.substring(leftCurlyBracketIndex + 1).toLowerCase();
result = dataSources.value.filter((ds) => ds.title?.toLowerCase().includes(queryName) || ds.id.includes(queryName)); result = dataSources.value.filter((ds) => ds.title?.toLowerCase().includes(queryName) || ds.id.includes(queryName));
@ -299,7 +301,7 @@ const querySearch = (queryString: string, cb: (data: { value: string }[]) => voi
const curQueryString = queryString.substring(0, selectionStart); const curQueryString = queryString.substring(0, selectionStart);
const fieldKeyStringLastIndex = curQueryString.lastIndexOf('.'); const fieldKeyStringLastIndex = curQueryString.lastIndexOf('.');
const dsKeyStringLastIndex = curQueryString.lastIndexOf('{'); const dsKeyStringLastIndex = curQueryString.lastIndexOf('${') + 1;
const isFieldTip = fieldKeyStringLastIndex > dsKeyStringLastIndex; const isFieldTip = fieldKeyStringLastIndex > dsKeyStringLastIndex;
@ -321,7 +323,7 @@ const selectHandler = async ({ value, type }: { value: string; type: 'dataSource
let startText = inputText.substring(0, selectionStart); let startText = inputText.substring(0, selectionStart);
const dotIndex = startText.lastIndexOf('.'); const dotIndex = startText.lastIndexOf('.');
const leftCurlyBracketIndex = startText.lastIndexOf('{'); const leftCurlyBracketIndex = startText.lastIndexOf('${') + 1;
const endText = inputText.substring(selectionStart); const endText = inputText.substring(selectionStart);
@ -336,7 +338,6 @@ const selectHandler = async ({ value, type }: { value: string; type: 'dataSource
if (!isRightCurlyBracket(selectionStart + 1)) { if (!isRightCurlyBracket(selectionStart + 1)) {
suggestText = `${suggestText}}`; suggestText = `${suggestText}}`;
} }
suggestText = `{${suggestText}}`;
} else if (!curCharIsDot(dotIndex)) { } else if (!curCharIsDot(dotIndex)) {
startText = startText.substring(0, dotIndex + 1); startText = startText.substring(0, dotIndex + 1);
} }
@ -345,10 +346,10 @@ const selectHandler = async ({ value, type }: { value: string; type: 'dataSource
await nextTick(); await nextTick();
// }}, 2 // }, 2
let newSelectionStart = 0; let newSelectionStart = 0;
if (isDataSource) { if (isDataSource) {
newSelectionStart = leftCurlyBracketIndex + suggestText.length - 1; newSelectionStart = leftCurlyBracketIndex + suggestText.length;
} else { } else {
newSelectionStart = dotIndex + suggestText.length + 1; newSelectionStart = dotIndex + suggestText.length + 1;
} }

View File

@ -0,0 +1,18 @@
.tmagic-data-source-input-text {
.el-input__wrapper.tmagic-data-source-input-text-wrapper {
overflow: hidden;
padding-right: 30px;
}
.el-input__inner {
display: flex;
align-items: center;
overflow: hidden;
white-space: nowrap;
}
.tmagic-data-source-input-icon {
position: absolute;
right: 7px;
}
}

View File

@ -19,4 +19,5 @@
@import "./dep-list.scss"; @import "./dep-list.scss";
@import "./data-source.scss"; @import "./data-source.scss";
@import "./data-source-fields.scss"; @import "./data-source-fields.scss";
@import "./data-source-input.scss";
@import "./key-value.scss"; @import "./key-value.scss";

View File

@ -112,6 +112,7 @@ export const fillConfig = (config: FormConfig = []) => [
{ {
name: 'borderWidth', name: 'borderWidth',
text: '宽度', text: '宽度',
defaultValue: '0',
}, },
{ {
name: 'borderColor', name: 'borderColor',
@ -122,6 +123,7 @@ export const fillConfig = (config: FormConfig = []) => [
name: 'borderStyle', name: 'borderStyle',
text: '样式', text: '样式',
type: 'select', type: 'select',
defaultValue: 'none',
options: [ options: [
{ text: 'none', value: 'none' }, { text: 'none', value: 'none' },
{ text: 'hidden', value: 'hidden' }, { text: 'hidden', value: 'hidden' },

View File

@ -208,7 +208,7 @@ export default {
fontWeight: '', fontWeight: '',
}, },
name: '按钮', name: '按钮',
text: '{{ds_b64c92b5.text}}', text: '${ds_b64c92b5.text}',
multiple: true, multiple: true,
events: [ events: [
{ {