feat(components): 添加表单抽屉Pro组件并重构搜索表单
- 新增 CuteFormDrawerPro 组件,支持 Schema 配置的表单抽屉 - 新增 CuteFormDrawerProDemo 演示页面 - 添加 CuteSearchFormDemo 和 CuteSearchFormProDemo 演示页面 - 移除废弃的 CuteOtherDemo 和 CuteSimpleTableDemo 页面 - 重构 CuteSearchForm 和 CuteSearchFormPro,将 submit 事件改为 search 事件 - 重构 CuteSearchForm 和 CuteSearchFormPro,移除 disabled 属性 - 修正 CuteFormDialogPro 组件名称拼写错误 - 更新组件演示页面索引,添加新的搜索和抽屉组件演示 - 在拖拽表格和简单表格演示中添加刷新数据方法和表单模型
This commit is contained in:
@@ -90,7 +90,7 @@
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CuteFormProDialog',
|
name: 'CuteFormDialogPro',
|
||||||
props: {
|
props: {
|
||||||
/**
|
/**
|
||||||
* 弹窗标题
|
* 弹窗标题
|
||||||
|
|||||||
@@ -0,0 +1,269 @@
|
|||||||
|
<!--
|
||||||
|
* 表单抽屉Pro
|
||||||
|
* @author odboy
|
||||||
|
* @email tianjun@odboy.cn
|
||||||
|
* @created 2026-02-04
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<el-drawer
|
||||||
|
:title="title"
|
||||||
|
:visible.sync="visible"
|
||||||
|
:size="width"
|
||||||
|
:before-close="beforeClose"
|
||||||
|
:append-to-body="true"
|
||||||
|
:close-on-press-escape="false"
|
||||||
|
:wrapper-closable="false"
|
||||||
|
:destroy-on-close="true"
|
||||||
|
:show-close="true"
|
||||||
|
:modal="false"
|
||||||
|
>
|
||||||
|
<div class="container-form">
|
||||||
|
<el-form ref="form" :model="model" :rule="dynamicRules" :inline="false" size="small" label-position="left" label-width="100px">
|
||||||
|
<el-form-item v-for="item in schema" :key="item.name" :prop="item.name" :label="item.title" :required="item.required === true">
|
||||||
|
<!-- 输入框 -->
|
||||||
|
<el-input
|
||||||
|
v-if="item.type === 'input'"
|
||||||
|
v-model="model[item.name]"
|
||||||
|
:placeholder="`请输入${item.title}`"
|
||||||
|
:disabled="model.disabled === true"
|
||||||
|
clearable
|
||||||
|
style="width: 100%"
|
||||||
|
/>
|
||||||
|
<!-- 选择框 -->
|
||||||
|
<el-select
|
||||||
|
v-if="item.type === 'select'"
|
||||||
|
v-model="model[item.name]"
|
||||||
|
clearable
|
||||||
|
:placeholder="`请选择${item.title}`"
|
||||||
|
:disabled="model.disabled === true"
|
||||||
|
style="width: 100%"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="option in (item.dataSource || [])"
|
||||||
|
:key="option.value"
|
||||||
|
:label="option.label"
|
||||||
|
:value="option.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<!-- 日期选择 -->
|
||||||
|
<el-date-picker
|
||||||
|
v-if="item.type === 'date'"
|
||||||
|
v-model="model[item.name]"
|
||||||
|
type="daterange"
|
||||||
|
align="right"
|
||||||
|
unlink-panels
|
||||||
|
:disabled="model.disabled === true"
|
||||||
|
clearable
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
format="yyyy-MM-dd"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
:picker-options="pickerOptions"
|
||||||
|
style="width: 100%"
|
||||||
|
/>
|
||||||
|
<!-- 日期时间选择 -->
|
||||||
|
<el-date-picker
|
||||||
|
v-if="item.type === 'datetime'"
|
||||||
|
v-model="model[item.name]"
|
||||||
|
type="datetimerange"
|
||||||
|
align="right"
|
||||||
|
clearable
|
||||||
|
:disabled="model.disabled === true"
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
:default-time="['00:00:00', '23:59:59']"
|
||||||
|
:picker-options="pickerOptions"
|
||||||
|
style="width: 100%"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button type="danger" @click="hidden">取 消</el-button>
|
||||||
|
<el-button v-if="showReset" @click="resetForm('form')">重 置</el-button>
|
||||||
|
<el-button v-prevent-re-click type="primary" @click="submitForm('form')">提 交</el-button>
|
||||||
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'CuteFormDrawerPro',
|
||||||
|
props: {
|
||||||
|
/**
|
||||||
|
* 弹窗标题
|
||||||
|
*/
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
default: '默认标题'
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 弹窗宽度
|
||||||
|
*/
|
||||||
|
width: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: '40%'
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 表单定义
|
||||||
|
*/
|
||||||
|
schema: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
default: function() {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 绑定值
|
||||||
|
*/
|
||||||
|
model: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
showReset: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
visible: false,
|
||||||
|
rules: {},
|
||||||
|
pickerOptions: {
|
||||||
|
shortcuts: [{
|
||||||
|
text: '最近一周',
|
||||||
|
onClick(picker) {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
||||||
|
picker.$emit('pick', [start, end])
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
text: '最近一个月',
|
||||||
|
onClick(picker) {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
||||||
|
picker.$emit('pick', [start, end])
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
text: '最近三个月',
|
||||||
|
onClick(picker) {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
||||||
|
picker.$emit('pick', [start, end])
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
dynamicRules() {
|
||||||
|
const schema = this.schema
|
||||||
|
const formRules = {}
|
||||||
|
let trigger = 'blur'
|
||||||
|
for (const element of schema) {
|
||||||
|
if (element.type === 'input') {
|
||||||
|
trigger = 'blur'
|
||||||
|
} else {
|
||||||
|
trigger = 'change'
|
||||||
|
}
|
||||||
|
formRules[element.name] = [
|
||||||
|
{ required: element.required === true, message: '请输入' + element.title, trigger: trigger }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return formRules
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
show() {
|
||||||
|
this.visible = true
|
||||||
|
},
|
||||||
|
hidden() {
|
||||||
|
this.resetForm('form')
|
||||||
|
this.visible = false
|
||||||
|
},
|
||||||
|
submitForm(formName) {
|
||||||
|
this.$refs[formName].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.$emit('submit', this.model)
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
resetForm(formName) {
|
||||||
|
// 调用默认的重置
|
||||||
|
this.$refs[formName].resetFields()
|
||||||
|
// 根据schema配置重置顽固选项
|
||||||
|
const schema = this.schema
|
||||||
|
const model = this.model
|
||||||
|
for (const element of schema) {
|
||||||
|
if (element.type === 'input' || element.type === 'select') {
|
||||||
|
model[element.name] = null
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (element.type === 'date' || element.type === 'datetime') {
|
||||||
|
model[element.name] = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.model = { ...model }
|
||||||
|
this.$emit('reset')
|
||||||
|
},
|
||||||
|
beforeClose() {
|
||||||
|
this.hidden()
|
||||||
|
this.$emit('cancel')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.container-form {
|
||||||
|
overflow-y: scroll; /* 启用滚动 */
|
||||||
|
scrollbar-width: none; /* Firefox */
|
||||||
|
padding-right: 20px;
|
||||||
|
-ms-overflow-style: none; /* Internet Explorer 10+ */
|
||||||
|
max-height: calc(100vh - 200px); /* 调整高度以适应页头和底部按钮 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-form::-webkit-scrollbar {
|
||||||
|
display: none; /* Chrome, Safari, Opera*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-content-wrapper {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-footer {
|
||||||
|
text-align: right;
|
||||||
|
border-top: 1px solid #ebeef5;
|
||||||
|
padding: 16px 0 0 0;
|
||||||
|
background-color: white;
|
||||||
|
margin-top: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(.el-dialog__body) {
|
||||||
|
padding: 20px 20px !important;
|
||||||
|
height: 90%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep(.el-divider--horizontal) {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
@@ -11,7 +11,6 @@
|
|||||||
:model.sync="model"
|
:model.sync="model"
|
||||||
label-position="right"
|
label-position="right"
|
||||||
label-width="90px"
|
label-width="90px"
|
||||||
:disabled="disabled"
|
|
||||||
size="small"
|
size="small"
|
||||||
>
|
>
|
||||||
<!-- 通过 <template v-slot:suffix> 插槽前置查询条件 -->
|
<!-- 通过 <template v-slot:suffix> 插槽前置查询条件 -->
|
||||||
@@ -34,11 +33,6 @@ export default {
|
|||||||
model: {
|
model: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
},
|
|
||||||
disabled: {
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -46,7 +40,7 @@ export default {
|
|||||||
const that = this
|
const that = this
|
||||||
that.$refs[formName].validate((valid) => {
|
that.$refs[formName].validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
that.$emit('submit', that.model)
|
that.$emit('search', that.model)
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -56,7 +50,6 @@ export default {
|
|||||||
try {
|
try {
|
||||||
this.$refs[formName].resetFields()
|
this.$refs[formName].resetFields()
|
||||||
this.onFormSubmit(formName)
|
this.onFormSubmit(formName)
|
||||||
// this.$emit('reset')
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
:model.sync="model"
|
:model.sync="model"
|
||||||
label-position="right"
|
label-position="right"
|
||||||
label-width="90px"
|
label-width="90px"
|
||||||
:disabled="disabled"
|
|
||||||
size="small"
|
size="small"
|
||||||
>
|
>
|
||||||
<el-form-item v-for="item in schema" :key="item.name" :prop="item.name" :label="item.title">
|
<el-form-item v-for="item in schema" :key="item.name" :prop="item.name" :label="item.title">
|
||||||
@@ -99,14 +98,6 @@ export default {
|
|||||||
model: {
|
model: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 是否禁用
|
|
||||||
*/
|
|
||||||
disabled: {
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -145,7 +136,7 @@ export default {
|
|||||||
const that = this
|
const that = this
|
||||||
that.$refs[formName].validate((valid) => {
|
that.$refs[formName].validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
that.$emit('submit', that.model)
|
that.$emit('search', that.model)
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -169,7 +160,6 @@ export default {
|
|||||||
}
|
}
|
||||||
this.model = { ...model }
|
this.model = { ...model }
|
||||||
this.onFormSubmit(formName)
|
this.onFormSubmit(formName)
|
||||||
// this.$emit('reset')
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<cute-section-title title="高级搜索 CuteSearchForm" />
|
|
||||||
<cute-search-form :model="searchFormModel" @submit="handleSearchFormSubmit">
|
|
||||||
<template v-slot:suffix>
|
|
||||||
<el-form-item label="模糊查询" prop="blurry">
|
|
||||||
<el-input v-model="searchFormModel.blurry" clearable />
|
|
||||||
</el-form-item>
|
|
||||||
</template>
|
|
||||||
<template v-slot:operation>
|
|
||||||
<el-button type="primary">查询后置按钮</el-button>
|
|
||||||
</template>
|
|
||||||
</cute-search-form>
|
|
||||||
<cute-section-title title="高级搜索Pro版 CuteSearchProForm" />
|
|
||||||
<cute-search-pro-form :model="searchFormProValues" :schema="searchFormProSchema" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
import CuteSearchForm from '@/views/components/advanced/CuteSearchForm.vue'
|
|
||||||
import CuteSectionTitle from '@/views/components/dev/CuteSectionTitle.vue'
|
|
||||||
import CuteSearchFormPro from '@/views/components/advanced/CuteSearchFormPro.vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'CuteOtherDemo',
|
|
||||||
components: {
|
|
||||||
CuteSearchProForm: CuteSearchFormPro,
|
|
||||||
CuteSectionTitle,
|
|
||||||
CuteSearchForm
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
searchFormModel: {},
|
|
||||||
searchFormProSchema: [
|
|
||||||
{ name: 'name', title: '姓名', type: 'input' },
|
|
||||||
{ name: 'sex', title: '性别', type: 'select', dataSource: [{ label: '男', value: 'nn' }, { label: '女', value: 'mm' }] },
|
|
||||||
{ name: 'createDate', title: '创建日期', type: 'date' },
|
|
||||||
{ name: 'createTime', title: '创建时间', type: 'datetime' }
|
|
||||||
],
|
|
||||||
searchFormProValues: { name: '小明', sex: 'mm' }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleSearchFormSubmit(data) {
|
|
||||||
console.log('handleSearchFormSubmit', data)
|
|
||||||
},
|
|
||||||
handleSearchFormReset() {
|
|
||||||
console.log('handleSearchFormReset')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="app-container">
|
|
||||||
<cute-form-drawer
|
|
||||||
ref="drawerFrom"
|
|
||||||
:model="createFormModel"
|
|
||||||
:rules="createFormRules"
|
|
||||||
title="演示:表单抽屉"
|
|
||||||
width="45%"
|
|
||||||
@submit="onDrawerFormSubmit"
|
|
||||||
>
|
|
||||||
<el-form-item label="活动名称" prop="name" label-width="100px">
|
|
||||||
<el-input v-model="createFormModel.name" placeholder="请输入" style="width: 100%" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="活动区域" prop="region" label-width="100px">
|
|
||||||
<el-select v-model="createFormModel.region" placeholder="请选择" style="width: 100%">
|
|
||||||
<el-option label="区域一" value="shanghai" />
|
|
||||||
<el-option label="区域二" value="beijing" />
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="活动模式" prop="modeList" label-width="100px">
|
|
||||||
<cute-transfer v-model="createFormModel.modeList" :data-source="modeDataSource">
|
|
||||||
<el-table-column prop="name" label="姓名" />
|
|
||||||
<el-table-column prop="description" label="备注" />
|
|
||||||
</cute-transfer>
|
|
||||||
</el-form-item>
|
|
||||||
</cute-form-drawer>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import CuteFormDrawer from '@/views/components/advanced/CuteFormDrawer.vue'
|
|
||||||
import CuteTransfer from '@/views/components/dev/CuteTransfer.vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'CuteSimpleTableDemo',
|
|
||||||
components: { CuteTransfer, CuteFormDrawer },
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
modeDataSource: [
|
|
||||||
{ id: 1, name: '小明', description: '小明牛P' },
|
|
||||||
{ id: 4, name: '小绿', description: '小绿牛P' },
|
|
||||||
{ id: 5, name: '小黄', description: '小黄牛P' },
|
|
||||||
{ id: 6, name: '小紫', description: '小紫牛P' },
|
|
||||||
{ id: 17, name: '小郑', description: '小郑牛P' },
|
|
||||||
{ id: 18, name: '小王', description: '小王牛P' }
|
|
||||||
],
|
|
||||||
editTableSchema: [
|
|
||||||
{ name: 'name', title: '姓名', type: 'input' },
|
|
||||||
{ name: 'sex', title: '性别', type: 'select', dataSource: [{ label: '男', value: 'nn' }, { label: '女', value: 'mm' }] },
|
|
||||||
{ name: 'description', title: '描述', type: 'input' }
|
|
||||||
],
|
|
||||||
editTableDataSource: [
|
|
||||||
{ id: 1, name: '小明', sex: 'mm', description: '小明牛P' },
|
|
||||||
{ id: 4, name: '小绿', sex: 'nn', description: '小绿牛P' },
|
|
||||||
{ id: 5, name: '小黄', sex: 'nn', description: '小黄牛P' },
|
|
||||||
{ id: 6, name: '小紫', sex: 'nn', description: '小紫牛P' },
|
|
||||||
{ id: 17, name: '小郑', sex: 'mm', description: '小郑牛P' },
|
|
||||||
{ id: 18, name: '小王', sex: 'nn', description: '小王牛P' }
|
|
||||||
],
|
|
||||||
form: {
|
|
||||||
model: {
|
|
||||||
blurry: ''
|
|
||||||
},
|
|
||||||
rules: {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.initData()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initData() {
|
|
||||||
this.$refs.instance.refresh()
|
|
||||||
},
|
|
||||||
onFormSubmit(formName) {
|
|
||||||
const that = this
|
|
||||||
that.$refs[formName].validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
that.$refs.instance.refresh()
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
onFormReset(formName) {
|
|
||||||
try {
|
|
||||||
this.$refs[formName].resetFields()
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onDialogClick() {
|
|
||||||
this.$refs.dialogForm.show()
|
|
||||||
},
|
|
||||||
onDialogProClick() {
|
|
||||||
this.$refs.dialogProForm.show()
|
|
||||||
},
|
|
||||||
onDrawerClick() {
|
|
||||||
this.$refs.drawerFrom.show()
|
|
||||||
},
|
|
||||||
onDrawerFormSubmit(values) {
|
|
||||||
console.log('onDrawerFormSubmit', values)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@@ -69,6 +69,9 @@ export default {
|
|||||||
components: { CuteDragTable, CuteButton },
|
components: { CuteDragTable, CuteButton },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
form: {
|
||||||
|
model: ''
|
||||||
|
},
|
||||||
curd: {
|
curd: {
|
||||||
paramsTransform: (pageProps) => {
|
paramsTransform: (pageProps) => {
|
||||||
const values = this.form.model
|
const values = this.form.model
|
||||||
@@ -131,10 +134,13 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$refs.instance.refresh()
|
this.refreshData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
FormatRowDateTimeStr,
|
FormatRowDateTimeStr,
|
||||||
|
refreshData() {
|
||||||
|
this.$refs.instance.refresh()
|
||||||
|
},
|
||||||
onTableEditClick(row) {
|
onTableEditClick(row) {
|
||||||
console.log('编辑', row)
|
console.log('编辑', row)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,9 +2,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<h4>何时使用</h4>
|
<h4>何时使用</h4>
|
||||||
<ul class="description">
|
<ul class="description">
|
||||||
<li>不离开当前场景完成增删改操作</li>
|
<li>用于创建一个实体或收集信息</li>
|
||||||
<li>需要确认用户的操作,明确操作会产生的结果,提醒告知用户</li>
|
<li>需要对输入的数据类型进行校验时</li>
|
||||||
<li>作为配置型功能及信息的容器</li>
|
|
||||||
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h4>基础用法</h4>
|
<h4>基础用法</h4>
|
||||||
|
|||||||
@@ -2,9 +2,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<h4>何时使用</h4>
|
<h4>何时使用</h4>
|
||||||
<ul class="description">
|
<ul class="description">
|
||||||
<li>不离开当前场景完成增删改操作</li>
|
<li>用于创建一个实体或收集信息</li>
|
||||||
<li>需要确认用户的操作,明确操作会产生的结果,提醒告知用户</li>
|
<li>需要对输入的数据类型进行校验时</li>
|
||||||
<li>作为配置型功能及信息的容器</li>
|
|
||||||
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h4>基础用法</h4>
|
<h4>基础用法</h4>
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<h4>何时使用</h4>
|
<h4>何时使用</h4>
|
||||||
<ul class="description">
|
<ul class="description">
|
||||||
<li>不离开当前场景完成增删改操作</li>
|
<li>用于创建一个实体或收集信息</li>
|
||||||
<li>作为配置型功能及信息的容器</li>
|
<li>需要对输入的数据类型进行校验时</li>
|
||||||
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h4>基础用法</h4>
|
<h4>基础用法</h4>
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h4>何时使用</h4>
|
||||||
|
<ul class="description">
|
||||||
|
<li>用于创建一个实体或收集信息</li>
|
||||||
|
<li>需要对输入的数据类型进行校验时</li>
|
||||||
|
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
||||||
|
</ul>
|
||||||
|
<h4>基础用法</h4>
|
||||||
|
<cute-button type="primary" @click="showDrawerForm">显示</cute-button>
|
||||||
|
<cute-form-drawer-pro
|
||||||
|
ref="formDrawerPro"
|
||||||
|
:model="model"
|
||||||
|
:schema="schema"
|
||||||
|
title="表单抽屉Pro"
|
||||||
|
@submit="onSubmit"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<h4>API</h4>
|
||||||
|
<el-table :data="apiData">
|
||||||
|
<el-table-column prop="name" label="参数" width="220" />
|
||||||
|
<el-table-column prop="remark" label="说明" width="450" />
|
||||||
|
<el-table-column prop="type" label="类型" />
|
||||||
|
<el-table-column prop="defaultValue" label="默认值" />
|
||||||
|
<el-table-column prop="required" label="是否必填" />
|
||||||
|
</el-table>
|
||||||
|
<h4>Schema属性</h4>
|
||||||
|
<el-table :data="schemaData">
|
||||||
|
<el-table-column prop="name" label="属性名" width="220" />
|
||||||
|
<el-table-column prop="remark" label="说明" width="450" />
|
||||||
|
<el-table-column prop="type" label="类型" />
|
||||||
|
<el-table-column prop="required" label="是否必填" />
|
||||||
|
</el-table>
|
||||||
|
<h4>方法</h4>
|
||||||
|
<el-table :data="methodData">
|
||||||
|
<el-table-column prop="name" label="函数" width="220" />
|
||||||
|
<el-table-column prop="remark" label="说明" width="450" />
|
||||||
|
<el-table-column prop="inputArgs" label="入参" />
|
||||||
|
<el-table-column prop="outArgs" label="出参" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import CuteButton from '@/views/components/dev/CuteButton.vue'
|
||||||
|
import CuteFormDrawerPro from '@/views/components/advanced/CuteFormDrawerPro.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'CuteFormDrawerProDemo',
|
||||||
|
components: { CuteFormDrawerPro, CuteButton },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
model: {},
|
||||||
|
schema: [
|
||||||
|
{ name: 'name', title: '姓名', type: 'input', required: true },
|
||||||
|
{ name: 'sex', title: '性别', type: 'select', required: true, dataSource: [{ label: '男', value: 'nn' }, { label: '女', value: 'mm' }] },
|
||||||
|
{ name: 'createDate', title: '创建日期', type: 'date', required: false },
|
||||||
|
{ name: 'createTime', title: '创建时间', type: 'datetime', required: false }
|
||||||
|
],
|
||||||
|
apiData: [
|
||||||
|
{ name: 'title', remark: '弹窗的标题', type: 'string', defaultValue: '默认标题', required: '否' },
|
||||||
|
{ name: 'width', remark: '弹窗的宽度', type: 'string', defaultValue: '40%', required: '否' },
|
||||||
|
{ name: 'model', remark: '绑定的表单对象', type: 'object', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'schema', remark: '表单定义', type: 'object', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'showReset', remark: '是否显示重置按钮', type: 'boolean', defaultValue: 'false', required: '否' },
|
||||||
|
{ name: 'submit', remark: '提交按钮被点击回调事件', type: '(values) => {}', defaultValue: '-', required: '否' },
|
||||||
|
{ name: 'cancel', remark: '取消按钮被点击回调事件', type: '() => {}', defaultValue: '-', required: '否' },
|
||||||
|
{ name: 'reset', remark: '重置按钮被点击回调事件', type: '() => {}', defaultValue: '-', required: '否' }
|
||||||
|
],
|
||||||
|
schemaData: [
|
||||||
|
{ name: 'name', remark: '表单项名称', type: 'string', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'title', remark: '表单项标题', type: 'string', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'type', remark: '表单项类型。input 输入框 | select 单选框 | date 日期选择框 | datetime 日期时间选择框', type: 'string', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'required', remark: '是否必填', type: 'boolean', defaultValue: 'false', required: '否' },
|
||||||
|
{ name: 'dataSource', remark: '数据源,当type=select时必填', type: 'array', defaultValue: '[]', required: '否' }
|
||||||
|
],
|
||||||
|
methodData: [
|
||||||
|
{ name: 'show', remark: '显示对话框', inputArgs: '-', outArgs: '-' },
|
||||||
|
{ name: 'hidden', remark: '隐藏对话框', inputArgs: '-', outArgs: '-' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
showDrawerForm() {
|
||||||
|
this.$refs.formDrawerPro.show()
|
||||||
|
},
|
||||||
|
onSubmit(values) {
|
||||||
|
console.log('onSubmit', values)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
.description > li{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h4>何时使用</h4>
|
||||||
|
<ul class="description">
|
||||||
|
<li>列表上方的标准筛选栏</li>
|
||||||
|
<li>在点击搜索和重置按钮时会触发 onSearch,参数为当前筛选值</li>
|
||||||
|
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
||||||
|
</ul>
|
||||||
|
<h4>基础用法</h4>
|
||||||
|
<cute-search-form :model="model" @search="handleSearch">
|
||||||
|
<template v-slot:suffix>
|
||||||
|
<el-form-item label="模糊查询" prop="blurry">
|
||||||
|
<el-input v-model="model.blurry" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
<template v-slot:operation>
|
||||||
|
<el-button type="primary">查询后置按钮</el-button>
|
||||||
|
</template>
|
||||||
|
</cute-search-form>
|
||||||
|
<h4>API</h4>
|
||||||
|
<el-table :data="apiData">
|
||||||
|
<el-table-column prop="name" label="参数" width="220" />
|
||||||
|
<el-table-column prop="remark" label="说明" width="450" />
|
||||||
|
<el-table-column prop="type" label="类型" />
|
||||||
|
<el-table-column prop="defaultValue" label="默认值" />
|
||||||
|
<el-table-column prop="required" label="是否必填" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import CuteSearchForm from '@/views/components/advanced/CuteSearchForm.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'CuteSearchFormDemo',
|
||||||
|
components: { CuteSearchForm },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
model: {
|
||||||
|
blurry: ''
|
||||||
|
},
|
||||||
|
apiData: [
|
||||||
|
{ name: 'model', remark: '绑定的表单对象', type: 'object', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'v-slot:suffix', remark: '搜索条件区域', type: 'template', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'v-slot:operation', remark: '后置按钮区域', type: 'template', defaultValue: '-', required: '否' },
|
||||||
|
{ name: 'search', remark: '搜索或重置按钮被点击回调事件', type: '(values) => {}', defaultValue: '-', required: '否' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleSearch(values) {
|
||||||
|
console.log('handleSearch', values)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
.description > li{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h4>何时使用</h4>
|
||||||
|
<ul class="description">
|
||||||
|
<li>列表上方的标准筛选栏</li>
|
||||||
|
<li>在点击搜索和重置按钮时会触发 onSearch,参数为当前筛选值</li>
|
||||||
|
<li>在使用过程中有任何问题,咨询 @Odboy(前端)</li>
|
||||||
|
</ul>
|
||||||
|
<h4>基础用法</h4>
|
||||||
|
<cute-search-form-pro :model="model" :schema="schema" @search="handleSearch" />
|
||||||
|
<h4>API</h4>
|
||||||
|
<el-table :data="apiData">
|
||||||
|
<el-table-column prop="name" label="参数" width="220" />
|
||||||
|
<el-table-column prop="remark" label="说明" width="450" />
|
||||||
|
<el-table-column prop="type" label="类型" />
|
||||||
|
<el-table-column prop="defaultValue" label="默认值" />
|
||||||
|
<el-table-column prop="required" label="是否必填" />
|
||||||
|
</el-table>
|
||||||
|
<h4>Schema属性</h4>
|
||||||
|
<el-table :data="schemaData">
|
||||||
|
<el-table-column prop="name" label="属性名" width="220" />
|
||||||
|
<el-table-column prop="remark" label="说明" width="450" />
|
||||||
|
<el-table-column prop="type" label="类型" />
|
||||||
|
<el-table-column prop="required" label="是否必填" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import CuteSearchFormPro from '@/views/components/advanced/CuteSearchFormPro.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'CuteSearchFormProDemo',
|
||||||
|
components: { CuteSearchFormPro },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
model: {
|
||||||
|
name: '',
|
||||||
|
sex: ''
|
||||||
|
},
|
||||||
|
schema: [
|
||||||
|
{ name: 'name', title: '姓名', type: 'input' },
|
||||||
|
{ name: 'sex', title: '性别', type: 'select', dataSource: [{ label: '男', value: 'nn' }, { label: '女', value: 'mm' }] },
|
||||||
|
{ name: 'createDate', title: '创建日期', type: 'date' },
|
||||||
|
{ name: 'createTime', title: '创建时间', type: 'datetime' }
|
||||||
|
],
|
||||||
|
apiData: [
|
||||||
|
{ name: 'model', remark: '绑定的表单对象', type: 'object', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'schema', remark: '表单定义', type: 'object', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'v-slot:operation', remark: '后置按钮区域', type: 'template', defaultValue: '-', required: '否' },
|
||||||
|
{ name: 'search', remark: '搜索或重置按钮被点击回调事件', type: '(values) => {}', defaultValue: '-', required: '否' }
|
||||||
|
],
|
||||||
|
schemaData: [
|
||||||
|
{ name: 'name', remark: '表单项名称', type: 'string', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'title', remark: '表单项标题', type: 'string', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'type', remark: '表单项类型。input 输入框 | select 单选框 | date 日期选择框 | datetime 日期时间选择框', type: 'string', defaultValue: '-', required: '是' },
|
||||||
|
{ name: 'dataSource', remark: '数据源,当type=select时必填', type: 'array', defaultValue: '[]', required: '否' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleSearch(values) {
|
||||||
|
console.log('handleSearch', values)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
.description > li{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -23,10 +23,10 @@
|
|||||||
show-select
|
show-select
|
||||||
>
|
>
|
||||||
<template v-slot:batchArea>
|
<template v-slot:batchArea>
|
||||||
<cute-button type="primary">批量绑定</cute-button>
|
<cute-button type="primary" @click="refreshData">批量绑定</cute-button>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:toolArea>
|
<template v-slot:toolArea>
|
||||||
<cute-button type="primary">导出</cute-button>
|
<cute-button type="primary" @click="refreshData">导出</cute-button>
|
||||||
</template>
|
</template>
|
||||||
<el-table-column prop="name" label="名称" />
|
<el-table-column prop="name" label="名称" />
|
||||||
<el-table-column prop="description" label="描述" />
|
<el-table-column prop="description" label="描述" />
|
||||||
@@ -69,6 +69,9 @@ export default {
|
|||||||
components: { CuteSimpleTable, CuteButton },
|
components: { CuteSimpleTable, CuteButton },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
form: {
|
||||||
|
model: ''
|
||||||
|
},
|
||||||
curd: {
|
curd: {
|
||||||
paramsTransform: (pageProps) => {
|
paramsTransform: (pageProps) => {
|
||||||
const values = this.form.model
|
const values = this.form.model
|
||||||
@@ -131,10 +134,13 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$refs.instance.refresh()
|
this.refreshData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
FormatRowDateTimeStr,
|
FormatRowDateTimeStr,
|
||||||
|
refreshData() {
|
||||||
|
this.$refs.instance.refresh()
|
||||||
|
},
|
||||||
onTableEditClick(row) {
|
onTableEditClick(row) {
|
||||||
console.log('onTableEditClick', row)
|
console.log('onTableEditClick', row)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -93,6 +93,12 @@
|
|||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="高级组件" name="advanced">
|
<el-tab-pane label="高级组件" name="advanced">
|
||||||
<el-collapse accordion>
|
<el-collapse accordion>
|
||||||
|
<el-collapse-item title="标准搜索区域 CuteSearchForm" name="CuteSearchForm">
|
||||||
|
<CuteSearchFormDemo />
|
||||||
|
</el-collapse-item>
|
||||||
|
<el-collapse-item title="标准搜索区域(Schema版) CuteSearchFormPro" name="CuteSearchFormPro">
|
||||||
|
<CuteSearchFormProDemo />
|
||||||
|
</el-collapse-item>
|
||||||
<el-collapse-item title="简单数据表格 CuteSimpleTable" name="CuteSimpleTable">
|
<el-collapse-item title="简单数据表格 CuteSimpleTable" name="CuteSimpleTable">
|
||||||
<CuteSimpleTableDemo />
|
<CuteSimpleTableDemo />
|
||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
@@ -111,6 +117,9 @@
|
|||||||
<el-collapse-item title="表单抽屉 CuteFormDrawer" name="CuteFormDrawer">
|
<el-collapse-item title="表单抽屉 CuteFormDrawer" name="CuteFormDrawer">
|
||||||
<CuteFormDrawerDemo />
|
<CuteFormDrawerDemo />
|
||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
|
<el-collapse-item title="表单抽屉(Schema版) CuteFormDrawerPro" name="CuteFormDrawerPro">
|
||||||
|
<CuteFormDrawerProDemo />
|
||||||
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
@@ -145,22 +154,28 @@ import CutePreviewDrawerDemo from '@/views/componentsDemo/dev/CutePreviewDrawerD
|
|||||||
import CuteTransferDemo from '@/views/componentsDemo/dev/CuteTransferDemo.vue'
|
import CuteTransferDemo from '@/views/componentsDemo/dev/CuteTransferDemo.vue'
|
||||||
import CuteFileUploadDemo from '@/views/componentsDemo/business/CuteFileUploadDemo.vue'
|
import CuteFileUploadDemo from '@/views/componentsDemo/business/CuteFileUploadDemo.vue'
|
||||||
import CuteFileDragUploadDemo from '@/views/componentsDemo/business/CuteFileDragUploadDemo.vue'
|
import CuteFileDragUploadDemo from '@/views/componentsDemo/business/CuteFileDragUploadDemo.vue'
|
||||||
import CuteSimpleTableDemo from '@/views/componentsDemo/CuteSimpleTableDemo.vue'
|
|
||||||
import CuteDragTableDemo from '@/views/componentsDemo/advanced/CuteDragTableDemo.vue'
|
import CuteDragTableDemo from '@/views/componentsDemo/advanced/CuteDragTableDemo.vue'
|
||||||
import CuteEditTableDemo from '@/views/componentsDemo/advanced/CuteEditTableDemo.vue'
|
import CuteEditTableDemo from '@/views/componentsDemo/advanced/CuteEditTableDemo.vue'
|
||||||
import CuteFormDialogDemo from '@/views/componentsDemo/advanced/CuteFormDialogDemo.vue'
|
import CuteFormDialogDemo from '@/views/componentsDemo/advanced/CuteFormDialogDemo.vue'
|
||||||
import CuteFormDialogProDemo from '@/views/componentsDemo/advanced/CuteFormDialogProDemo.vue'
|
import CuteFormDialogProDemo from '@/views/componentsDemo/advanced/CuteFormDialogProDemo.vue'
|
||||||
import CuteFormDrawerDemo from '@/views/componentsDemo/advanced/CuteFormDrawerDemo.vue'
|
import CuteFormDrawerDemo from '@/views/componentsDemo/advanced/CuteFormDrawerDemo.vue'
|
||||||
|
import CuteFormDrawerProDemo from '@/views/componentsDemo/advanced/CuteFormDrawerProDemo.vue'
|
||||||
|
import CuteSearchFormDemo from '@/views/componentsDemo/advanced/CuteSearchFormDemo.vue'
|
||||||
|
import CuteSearchFormProDemo from '@/views/componentsDemo/advanced/CuteSearchFormProDemo.vue'
|
||||||
|
import CuteSimpleTableDemo from '@/views/componentsDemo/advanced/CuteSimpleTableDemo.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'SystemComponents',
|
name: 'SystemComponents',
|
||||||
components: {
|
components: {
|
||||||
|
CuteSimpleTableDemo,
|
||||||
|
CuteSearchFormProDemo,
|
||||||
|
CuteSearchFormDemo,
|
||||||
|
CuteFormDrawerProDemo,
|
||||||
CuteFormDrawerDemo,
|
CuteFormDrawerDemo,
|
||||||
CuteFormDialogProDemo,
|
CuteFormDialogProDemo,
|
||||||
CuteFormDialogDemo,
|
CuteFormDialogDemo,
|
||||||
CuteEditTableDemo,
|
CuteEditTableDemo,
|
||||||
CuteDragTableDemo,
|
CuteDragTableDemo,
|
||||||
CuteSimpleTableDemo,
|
|
||||||
CuteFileDragUploadDemo,
|
CuteFileDragUploadDemo,
|
||||||
CuteFileUploadDemo,
|
CuteFileUploadDemo,
|
||||||
CuteTransferDemo,
|
CuteTransferDemo,
|
||||||
|
|||||||
Reference in New Issue
Block a user