提交 a37c8066 authored 作者: 王鹏飞's avatar 王鹏飞

add components

上级 0c438c6b
差异被折叠。
...@@ -37,33 +37,23 @@ export default { ...@@ -37,33 +37,23 @@ export default {
}, },
computed: { computed: {
currentPage() { currentPage() {
let found = null return this.getDeepItem(this.menus, this.activeId)
for (let i = 0; i < this.menus.length; i++) {
let menu = this.menus[i]
if (menu.group) {
found = this.find(menu.group.submenus, this.activeId)
if (found) {
break
} }
} else if (menu.submenus) { },
found = this.find(menu.submenus, this.activeId) methods: {
if (found) { getDeepItem(arr, id) {
break for (const item of arr) {
if (item.id === id || id === undefined) {
return item
} }
} else { if (item.children) {
found = this.find(this.menus, this.activeId) let found = this.getDeepItem(item.children, id)
if (found) { if (found) {
break return found
}
} }
} }
return found
} }
}, },
methods: {
find(arr, id) {
return arr.find(item => item.id === id)
},
onSelect(id) { onSelect(id) {
this.activeId = id this.activeId = id
} }
......
<template> <template>
<div class="ezj-form-pane"> <div class="ezj-form-pane">
<!-- 多个表单 --> <!-- 多个表单 -->
<template v-if="isMultiple"> <template v-if="form.hasAdd">
<template v-for="(form, index) in form"> <template v-for="(item, index) in formModel">
<ezj-form <ezj-form
:options="form.options" :options="form.options"
:model="form.model" :model="item"
:items="form.items" :items="form.items"
@onSubmit="onSubmit" @onSubmit="onSubmit"
:key="index" :key="index"
...@@ -18,19 +18,14 @@ ...@@ -18,19 +18,14 @@
<!-- 一个表单 --> <!-- 一个表单 -->
<template v-else> <template v-else>
<ezj-form <ezj-form :options="form.options" :model="formModel" :items="form.items" @onSubmit="onSubmit"></ezj-form>
:options="form.options"
:model="form.model"
:items="form.items"
@onSubmit="onSubmit"
></ezj-form>
</template> </template>
</div> </div>
</template> </template>
<script> <script>
import EzjForm from './Form'
import axios from 'axios' import axios from 'axios'
import EzjForm from './Form'
export default { export default {
name: 'EzjFormPane', name: 'EzjFormPane',
...@@ -51,11 +46,19 @@ export default { ...@@ -51,11 +46,19 @@ export default {
}, },
data: Object, data: Object,
headers: Object, headers: Object,
form: [Object, Array] form: Object
},
data() {
return {
model: {}
}
}, },
computed: { computed: {
isMultiple() { isMultiple() {
return Array.isArray(this.form) return Array.isArray(this.model)
},
formModel() {
return this.form.model || this.model
} }
}, },
methods: { methods: {
...@@ -64,23 +67,29 @@ export default { ...@@ -64,23 +67,29 @@ export default {
}, },
// 获取 // 获取
getData() { getData() {
const { action, data = {} } = this.get const { action, data = {}, callback } = this.get
console.log(action, this.get)
axios.get(action, { params: data }).then(res => { axios.get(action, { params: data }).then(res => {
console.log(res) let { data } = res
if (callback) {
data = callback(data)
}
this.model = data
}) })
}, },
// 更新 // 更新
updateData() { updateData(params) {
const { action, data = {}, callback } = this.update const { action, data = {}, callback } = this.update
axios.post(action, { data }).then(res => { params = Object.assign({}, params, data)
console.log(res)
if (callback) { if (callback) {
callback(res.data) params = callback(params)
} }
axios.post(action, params).then(res => {
this.$emit('update')
}) })
}, },
onSubmit() {} onSubmit(data) {
this.updateData(data)
}
}, },
beforeMount() { beforeMount() {
this.init() this.init()
......
...@@ -6,37 +6,30 @@ ...@@ -6,37 +6,30 @@
:key="menu.id" :key="menu.id"
> >
<div class="ezj-menu__title" @click="handleClick(menu.id)">{{menu.title}}</div> <div class="ezj-menu__title" @click="handleClick(menu.id)">{{menu.title}}</div>
<!-- 分组 --> <template v-if="menu.children">
<div class="ezj-menu-group" v-if="menu.group"> <template v-if="menu.isGroup">
<div class="ezj-menu-group__title">{{menu.group.title}}</div> <template v-for="submenu in menu.children">
<div class="ezj-submenu" v-if="menu.group.submenus" :key="menu.group.title"> <div class="ezj-menu-group" :key="submenu.title">
<template v-for="submenu in menu.group.submenus"> <div class="ezj-menu-group__title">{{submenu.title}}</div>
<div <ezj-submenu :menus="submenu.children" @onClick="handleClick"></ezj-submenu>
class="ezj-submenu__item"
:key="submenu.id"
@click="handleClick(submenu.id)"
>{{submenu.title}}</div>
</template>
</div>
</div> </div>
</template>
</template>
<template v-else>
<!-- 子菜单 --> <!-- 子菜单 -->
<div class="ezj-submenu" v-if="menu.submenus" :key="menu.title"> <ezj-submenu :menus="menu.children" @onClick="handleClick"></ezj-submenu>
<template v-for="submenu in menu.submenus"> </template>
<div
class="ezj-submenu__item"
:key="submenu.id"
@click="handleClick(submenu.id)"
>{{submenu.title}}</div>
</template> </template>
</div>
</div> </div>
</template> </template>
</div> </div>
</template> </template>
<script> <script>
import EzjSubmenu from './Submenu'
export default { export default {
name: 'EzjMenu', name: 'EzjMenu',
components: { EzjSubmenu },
props: { props: {
menus: { menus: {
type: Array, type: Array,
......
<template>
<div class="multiple-form"></div>
</template>
<script>
export default {
name: 'MultipleForm',
data() {
return {}
},
methods: {}
}
</script>
<style lang="scss">
</style>
<template>
<div class="ezj-submenu">
<template v-for="submenu in menus">
<div class="ezj-submenu__item" :key="submenu.id" @click="$emit('onClick', submenu.id)">
<span>{{submenu.title}}</span>
<!-- 是否必选 -->
<template v-if="submenu.showRequired">{{submenu.required ? '': '(可选)'}}</template>
<!-- 进度 -->
<template v-if="submenu.showProgress">
<span
:class="submenu.progress ? 'is-success' : 'is-error'"
>{{submenu.progress ? '(已完成)': '(未完成)'}}</span>
</template>
</div>
</template>
</div>
</template>
<script>
export default {
name: 'Submenu',
props: { menus: Array },
data() {
return {}
}
}
</script>
<style lang="scss">
.is-success {
color: #12c44a;
}
.is-error {
color: #c41230;
}
</style>
<template>
<div class="ezj-tab-form">
<div class="ezj-tab-form__title">{{title}}</div>
<el-tabs :tab-position="tabPosition">
<template v-for="(tab, index) in tabs">
<el-tab-pane :key="index" :label="tab.title" :lazy="true">
<template v-slot:label>
<i class="el-icon-user"></i>
<span class="title">{{tab.title}}</span>
<!-- 是否必选 -->
<template v-if="showRequired">{{tab.required ? '': '(可选)'}}</template>
<!-- 进度 -->
<template v-if="showProgress">
<span
:class="tab.progress ? 'is-success' : 'is-error'"
>{{tab.progress ? '(已完成)': '(未完成)'}}</span>
</template>
</template>
<ezj-form-pane v-bind="tab"></ezj-form-pane>
</el-tab-pane>
</template>
</el-tabs>
</div>
</template>
<script>
import EzjFormPane from './FormPane'
export default {
name: 'EzjTabForm',
components: { EzjFormPane },
props: {
title: String,
showProgress: { type: Boolean, default: true },
showRequired: { type: Boolean, default: true },
tabs: {
type: Array,
default() {
return []
}
}
},
data() {
return {
tabPosition: 'left'
}
}
}
</script>
<style lang="scss">
.ezj-tab-form__title {
position: absolute;
left: 0;
top: 0;
width: 295px;
font-size: 18px;
line-height: 60px;
color: #fff;
text-align: center;
background-color: #c41230;
}
.ezj-tab-form {
position: relative;
.el-tabs__header {
margin-top: 60px;
width: 295px;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.08);
}
.el-tabs__active-bar {
display: none;
}
.el-tabs__nav-wrap::after {
display: none;
}
.el-tabs--left .el-tabs__nav-wrap.is-left {
margin-right: 0;
}
.el-tabs--left .el-tabs__item.is-left {
text-align: left;
}
.el-tabs--left,
.el-tabs--right {
overflow: inherit;
}
.el-tabs__item.is-active .title {
color: #c41230;
}
.el-tabs__item {
font-size: 18px;
color: #000;
.is-success {
color: #12c44a;
}
.is-error {
color: #c41230;
}
}
}
</style>
<template>
<div class="ezj-tab-nav__scroll">
<template v-for="(pane, index) in panes">
<div
class="ezj-tab-nav__item"
:key="index"
@click="(e) => $emit('onTabClick', pane, pane.name || pane.index, e)"
>
<span>{{pane.label}}</span>
<span v-if="pane.showRequired">{{pane.required ? '(可选)' : ''}}</span>
<span v-if="pane.showPorgess">{{pane.progress ? '(已完成)' : '(未完成)'}}</span>
</div>
</template>
</div>
</template>
<script>
export default {
name: 'EzjTabNav',
props: {
panes: Array
},
data() {
return {}
},
computed: {},
methods: {}
}
</script>
<style lang="scss">
.ezj-tab-nav__scroll {
overflow-y: auto;
}
.ezj-tab-nav__item {
margin: 20px;
font-size: 18px;
line-height: 20px;
}
</style>
<template>
<div class="ezj-tab-pane">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'EzjTabPane',
props: {
label: String,
name: String,
lazy: Boolean
},
data() {
return {
index: null,
loaded: false
}
},
computed: {
active() {
const active = this.$parent.currentName === (this.name || this.index)
return active
},
paneName() {
return this.name || this.index
}
},
updated() {
this.$parent.$emit('tab-nav-update')
}
}
</script>
<template>
<div class="ezj-tabs">
<div class="ezj-tab-nav">
<div class="ezj-tab-nav__title">{{title}}</div>
<tab-nav :panes="panes" @onTabClick="handleTabClick"></tab-nav>
</div>
<div class="ezj-tab-content">
<slot></slot>
</div>
</div>
</template>
<script>
import TabNav from './TabNav'
export default {
name: 'EzjTabs',
props: {
title: String,
activeName: String,
value: {}
},
components: { TabNav },
data() {
return {
currentName: this.value || this.activeName,
panes: []
}
},
watch: {
activeName(value) {
this.setCurrentName(value)
},
value(value) {
this.setCurrentName(value)
}
},
methods: {
calcPaneInstances() {
if (this.$slots.default) {
const paneSlots = this.$slots.default.filter(
vnode =>
vnode.tag &&
vnode.componentInstance &&
vnode.componentOptions &&
vnode.componentOptions.Ctor.options.name === 'EzjTabPane'
)
this.panes = paneSlots.map(({ componentInstance }) => componentInstance)
} else {
this.panes = []
}
},
handleTabClick(tab, tabName, event) {
this.setCurrentName(tabName)
this.$emit('tab-click', tab, event)
},
setCurrentName(value) {
this.currentName = value
this.$emit('input', value)
}
},
mounted() {
this.calcPaneInstances()
},
update() {
this.calcPaneInstances()
}
}
</script>
<style lang="scss">
.ezj-tabs {
display: flex;
align-items: flex-start;
}
.ezj-tab-nav {
width: 295px;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.08);
}
.ezj-tab-nav__title {
font-size: 18px;
line-height: 60px;
color: #fff;
text-align: center;
background-color: #c41230;
}
.ezj-tab-content {
flex: 1;
overflow: hidden;
}
</style>
...@@ -24,12 +24,9 @@ import { ...@@ -24,12 +24,9 @@ import {
} from 'element-ui' } from 'element-ui'
import EzjForm from './Form' import EzjForm from './Form'
import EzjTabs from './Tabs'
import EzjTabPane from './TabPane'
import EzjTabForm from './TabForm'
import EzjContainer from './Container' import EzjContainer from './Container'
const components = [EzjForm, EzjTabs, EzjTabPane, EzjTabForm, EzjContainer] const components = [EzjForm, EzjContainer]
const install = function(Vue) { const install = function(Vue) {
if (install.installed) return if (install.installed) return
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论