Skip to content

Commit efe6ba2

Browse files
authored
Merge pull request #13 from Liberty-liu/feat/logic
Feat/logic
2 parents 2e993fa + cea3f0a commit efe6ba2

File tree

105 files changed

+10624
-566
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+10624
-566
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ node_modules
22
dist
33
external/ckeditor5/node_modules
44
external/ckeditor5/build
5+
external/everright-filter

.eslintrc.cjs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ module.exports = {
2929
'no-case-declarations': 'off',
3030
'no-useless-escape': 'off',
3131
'no-mixed-operators': 'off',
32-
'no-async-promise-executor': 'off',
33-
'quotes': 'off'
32+
'no-async-promise-executor': 'off'
3433
},
3534
overrides: [
3635
// {

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Everright-formEditor is a free and open source javascript visual low-code editor
3030
* 5.Fields and layout separated
3131
* 6.Fields and layout not separated
3232
* 7.The editor, previewer, and configuration panel can all be used separately
33+
* 8.Logical controller (Visible, Required, Read only)
3334

3435
## Docs
3536

@@ -59,6 +60,10 @@ Everright-formEditor is a free and open source javascript visual low-code editor
5960

6061
![image](https://user-images.githubusercontent.com/21301475/231448710-564533a9-62df-4233-a937-41a50ae24056.png)
6162

63+
### Logical controller
64+
65+
![Logical controlle](https://github.com/Liberty-liu/Everright-formEditor/assets/21301475/0c7ab28d-c57f-47fa-aedc-a48e5939d6af)
66+
6267
## Fields adaptation
6368

6469
| Type | Pc | Mobile |
@@ -95,3 +100,32 @@ Everright-formEditor is a free and open source javascript visual low-code editor
95100
| Tabs | :white_check_mark: | :white_check_mark: |
96101
| Collapse | :white_check_mark: | :white_check_mark: |
97102
| Divider | :white_check_mark: | :white_check_mark: |
103+
104+
105+
## Logical controller operator
106+
107+
| Field | Equal | Not equal | Contains | Not contain | Greater than | Greater than or equal to | Less than | Less than or equal to | Between | Equal to one of | Not equal to one of | Belong to one of | Not belong to one of| Empty | Not empty |
108+
| :-------------:| :-------------: |:-------------: | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: |:-------------:| :-------------:| :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: |
109+
| Input | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
110+
| Email | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
111+
| ID number| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
112+
| Cellphone | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
113+
| URL | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
114+
| Textarea | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
115+
| Number | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
116+
| Radio | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
117+
| Checkbox | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
118+
| Select | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
119+
| Time | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
120+
| Date (date) | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
121+
| Date (datetime) | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
122+
| Date (dates) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
123+
| Date (daterange) | :white_check_mark: | :white_check_mark: | | | | | | | | | | | | :white_check_mark: | :white_check_mark: |
124+
| Rate | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
125+
| Switch | :white_check_mark: | :white_check_mark: | | | | | | | | | | | | | |
126+
| Slider | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | |
127+
| Html | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
128+
| Cascader | :white_check_mark: | :white_check_mark:| | | | | | | | | | | | :white_check_mark: | :white_check_mark: |
129+
| File | | | | | | | | | | | | | |:white_check_mark: |:white_check_mark: |
130+
| Signature | | | | | | | | | | | | | |:white_check_mark: |:white_check_mark: |
131+
| Region | | | | | | | | | |:white_check_mark: | :white_check_mark:| :white_check_mark:| :white_check_mark:| :white_check_mark:| :white_check_mark:|

README.zh-cn.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Everright-formEditor是一个免费开源的javascript可视化低代码编辑
3030
* 5.字段与布局分离
3131
* 6.字段与布局不分离
3232
* 7.编辑器、预览器和配置面板都可以单独使用
33+
* 8.逻辑控制器(显隐、必填、只读)
3334

3435
## 文档
3536

@@ -63,6 +64,11 @@ Everright-formEditor是一个免费开源的javascript可视化低代码编辑
6364

6465
![image](https://user-images.githubusercontent.com/21301475/231448710-564533a9-62df-4233-a937-41a50ae24056.png)
6566

67+
### 逻辑控制器
68+
69+
![Logical controlle](https://github.com/Liberty-liu/Everright-formEditor/assets/21301475/0c7ab28d-c57f-47fa-aedc-a48e5939d6af)
70+
71+
6672
## 字段适配
6773

6874
| Field | Pc | Mobile |
@@ -99,3 +105,33 @@ Everright-formEditor是一个免费开源的javascript可视化低代码编辑
99105
| Tabs | :white_check_mark: | :white_check_mark: |
100106
| Collapse | :white_check_mark: | :white_check_mark: |
101107
| Divider | :white_check_mark: | :white_check_mark: |
108+
109+
110+
## 逻辑控制器操作符
111+
112+
| Field | 等于 | 不等于 | 包含 | 不包含 | 大于 | 大于等于 | 小于 | 小于等于 | 区间 | 等于其中之一 | 不等于其中之一 | 属于其中之一 | 不属于其中之一| 为空 | 不为空 |
113+
| :-------------:| :-------------: |:-------------: | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: |:-------------:| :-------------:| :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: |
114+
| Input | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
115+
| Email | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
116+
| ID number| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
117+
| Cellphone | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
118+
| URL | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
119+
| Textarea | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
120+
| Number | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
121+
| Radio | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
122+
| Checkbox | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
123+
| Select | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
124+
| Time | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
125+
| Date (date) | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
126+
| Date (datetime) | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
127+
| Date (dates) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
128+
| Date (daterange) | :white_check_mark: | :white_check_mark: | | | | | | | | | | | | :white_check_mark: | :white_check_mark: |
129+
| Rate | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | :white_check_mark:| :white_check_mark: |
130+
| Switch | :white_check_mark: | :white_check_mark: | | | | | | | | | | | | | |
131+
| Slider | :white_check_mark: | :white_check_mark: | | | :white_check_mark:| :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | |
132+
| Html | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | | | | | :white_check_mark: | :white_check_mark: |
133+
| Cascader | :white_check_mark: | :white_check_mark:| | | | | | | | | | | | :white_check_mark: | :white_check_mark: |
134+
| File | | | | | | | | | | | | | |:white_check_mark: |:white_check_mark: |
135+
| Signature | | | | | | | | | | | | | |:white_check_mark: |:white_check_mark: |
136+
| Region | | | | | | | | | |:white_check_mark: | :white_check_mark:| :white_check_mark:| :white_check_mark:| :white_check_mark:| :white_check_mark:|
137+

examples/views/formEditor/actionEdit.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const getObjData = async () => {
4444
}
4545
}
4646
const handleListener = async ({ type, data }) => {
47+
console.log(type)
4748
if (type === 'submit') {
4849
loading.value = true
4950
try {

examples/views/formEditor/actionList.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ const getAllActions = async () => {
3333
const handleDel = async (id) => {
3434
loading.value = true
3535
try {
36-
await hooks.useFetch(`${uri.obj}/${id}`, {
36+
await hooks.useFetch(`${uri.obj}/${route.params.objid}/action/${id}`, {
3737
method: 'delete'
3838
})
39-
getAllobjs()
39+
getAllActions()
4040
} finally {
4141
loading.value = false
4242
}

examples/views/formEditor/objEdit.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import hooks from '@ER/hooks'
55
import { erFormEditor } from '@ER/formEditor'
66
import uri from '@ER-examples/uri.js'
77
import _ from 'lodash-es'
8-
import { ElMessage } from "element-plus"
8+
import { ElMessage } from 'element-plus'
99
const route = useRoute()
1010
const {
1111
lang
@@ -41,6 +41,7 @@ const getObjData = async () => {
4141
}
4242
}
4343
const handleListener = async ({ type, data }) => {
44+
console.log(type)
4445
switch (type) {
4546
case 'lang':
4647
lang.value = data

examples/views/formEditorConfig.vue

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@ const store = reactive({
1212
layouts: []
1313
})
1414
const fieldData = ref({})
15+
const logicData = ref('{}')
1516
const all = ref([])
1617
watch(lang, (newLang) => {
1718
all.value = []
1819
store.layouts = []
19-
store.fields = [...erComponentsConfig.fieldsConfig[0].list, ...erComponentsConfig.fieldsConfig[1].list].map(e => erGeneratorData(e, true, newLang))
20+
store.fields = [...erComponentsConfig.fieldsConfig[0].list, ...erComponentsConfig.fieldsConfig[1].list].map(e => {
21+
const result = erGeneratorData(e, true, newLang)
22+
if (/^(radio|cascader|checkbox|select)$/.test(e.type)) {
23+
result.columns[0].options.data = utils.generateOptions(3).map((e, i) => {
24+
e.label += i + 1
25+
return e
26+
})
27+
}
28+
return result
29+
})
2030
const layoutNodes = erComponentsConfig.fieldsConfig[2].list.map(e => erGeneratorData(e, true, newLang))
2131
layoutNodes.forEach((node, index) => {
2232
store.layouts.push(node)
@@ -35,8 +45,8 @@ watch(lang, (newLang) => {
3545
})
3646
all.value = [...store.fields, ...store.layouts]
3747
}, { immediate: true })
38-
// const value0 = ref('root')
39-
const value0 = ref(store.layouts[6].id)
48+
const value0 = ref('root')
49+
// const value0 = ref(store.layouts[6].id)
4050
// const value0 = ref(store.fields[17].id)
4151
const sector = computed(() => {
4252
let result = ''
@@ -48,9 +58,13 @@ const sector = computed(() => {
4858
return result
4959
})
5060
const handleListener = async ({ type, data }) => {
61+
console.log(type)
5162
if (type === 'changeParams') {
5263
fieldData.value = JSON.stringify(data, '', 2)
5364
}
65+
if (/^logic:(cancel|confirm)$/.test(type)) {
66+
logicData.value = JSON.stringify(data, '', 2)
67+
}
5468
}
5569
</script>
5670
<template>
@@ -82,13 +96,22 @@ const handleListener = async ({ type, data }) => {
8296
:lang="lang"
8397
@listener="handleListener"
8498
:field="sector"
99+
:fields="store.fields.map(e => e.columns[0])"
85100
ref="EReditorRef"/>
86101
</div>
87102
</el-aside>
88103
<el-main>
89104
<el-input
90105
v-model="fieldData"
91-
:rows="40"
106+
:rows="value0 === 'root' ? 20 : 40"
107+
disabled
108+
type="textarea"
109+
placeholder="Please input"
110+
/>
111+
<el-input
112+
v-if="value0 === 'root'"
113+
v-model="logicData"
114+
:rows="value0 === 'root' ? 20 : 40"
92115
disabled
93116
type="textarea"
94117
placeholder="Please input"
@@ -100,7 +123,7 @@ const handleListener = async ({ type, data }) => {
100123
<style scoped lang="scss">
101124
.customConfig {
102125
padding: 10px;
103-
::v-deep .Everright-formEditor-Config {
126+
:deep(.Everright-formEditor-Config) {
104127
width: 100%;
105128
}
106129
}

package.json

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "everright-formeditor",
3-
"version": "1.0.4",
3+
"version": "1.1.0",
44
"files": [
55
"dist",
66
"packages/formEditor/componentsConfig.js"
@@ -21,9 +21,16 @@
2121
"type": "git",
2222
"url": "https://github.com/Liberty-liu/Everright-formEditor.git"
2323
},
24-
"main": "dist/Everright-formEditor.umd.cjs",
25-
"module": "dist/Everright-formEditor.js",
26-
"style": "dist/style.css",
24+
"main": "./dist/Everright-formEditor.umd.cjs",
25+
"module": "./dist/Everright-formEditor.js",
26+
"style": "./dist/style.css",
27+
"exports": {
28+
".": {
29+
"import": "./dist/Everright-formEditor.js",
30+
"require": "./dist/Everright-formEditor.umd.cjs"
31+
},
32+
"./dist/style.css": "./dist/style.css"
33+
},
2734
"scripts": {
2835
"dev:server": "nodemon server --watch server",
2936
"dev:ckeditor5": "pnpm -C external/ckeditor5 dev",
@@ -34,7 +41,8 @@
3441
"lint": "eslint . --ext .js,.jsx,.vue",
3542
"lint-fix": "eslint --fix . --ext .js,.jsx,.vue",
3643
"prepare": "husky install",
37-
"init": "node ./server/db/generateDatabase.js && mkdir uploads"
44+
"init": "node ./server/db/generateDatabase.js && mkdir uploads",
45+
"test": "vitest"
3846
},
3947
"dependencies": {
4048
"@vant/area-data": "^1.4.0",
@@ -44,8 +52,10 @@
4452
"@vuelidate/validators": "^2.0.0",
4553
"async": "^3.2.4",
4654
"axios": "^1.2.2",
55+
"canvas": "^2.11.2",
4756
"dayjs": "^1.11.7",
4857
"element-plus": "^2.2.28",
58+
"everright-filter": "^0.0.22",
4959
"jss": "^10.9.2",
5060
"jss-preset-default": "^10.9.2",
5161
"lodash-es": "^4.17.21",
@@ -71,6 +81,7 @@
7181
"@vitejs/plugin-vue": "^3.2.0",
7282
"@vitejs/plugin-vue-jsx": "^2.1.1",
7383
"@vue/compiler-sfc": "^3.2.47",
84+
"@vue/test-utils": "^2.3.2",
7485
"better-sqlite3": "^8.2.0",
7586
"connect-multiparty": "^2.2.0",
7687
"cz-git": "^1.5.3",
@@ -82,11 +93,14 @@
8293
"eslint-plugin-vue": "^9.9.0",
8394
"express": "^4.18.2",
8495
"husky": "^8.0.3",
96+
"jsdom": "^22.0.0",
8597
"lint-staged": "^13.1.2",
8698
"nodemon": "^2.0.21",
99+
"resize-observer-polyfill": "^1.5.1",
87100
"sass": "^1.58.3",
88101
"vite": "^3.2.5",
89102
"vite-plugin-eslint": "^1.8.1",
103+
"vitest": "^0.31.0",
90104
"vue-router": "^4.1.6"
91105
},
92106
"peerDependencies": {

packages/formEditor/components/CompleteButton.vue

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,16 @@ const handleClick = async (type) => {
2727
if (props.mode === 'preview') return false
2828
try {
2929
await Promise.resolve(unref(props.handle).validate())
30-
ER.emit('listener', {
31-
type: 'submit',
32-
data: ER.getData()
33-
})
34-
// console.log(JSON.stringify(_.cloneDeep(result)))
30+
// await ER.checkFieldsValidation()
31+
ER.fireEvent('submit', ER.getData())
3532
} catch (e) {
3633
console.log(e)
3734
}
38-
// unref(props.handle).validate().then(() => {
39-
// const result = {}
40-
// ER.state.allFields.forEach(e => {
41-
// result[e.key] = e.options.defaultValue
42-
// })
43-
// console.log(_.cloneDeep(result))
44-
// })
4535
}
36+
const dataset = process.env.NODE_ENV === 'test' ? { 'data-test': 'er-complete-button' } : {}
4637
</script>
4738
<template>
48-
<div>
39+
<div v-bind="dataset">
4940
<div v-if="isPc" style="text-align: center;">
5041
<el-button @click="handleClick" :color="state.config[state.platform].completeButton.backgroundColor" type="primary">
5142
<span :style="{color: state.config[state.platform].completeButton.color }">{{ state.config[state.platform].completeButton.text }}</span>

0 commit comments

Comments
 (0)