parent
d491804416
commit
20a8aa9ed1
@ -0,0 +1,220 @@ |
|||||||
|
<script type="text/jsx"> |
||||||
|
import FormAnchor from "@/component/AbstractForm/FormAnchor" |
||||||
|
import FormValidateInfo from "@/component/AbstractForm/FormValidateInfo" |
||||||
|
|
||||||
|
const renderHeader = (h, title, description, extra, close) => ( |
||||||
|
<div class="detail-page-header"> |
||||||
|
<el-page-header on-back={close} content={title}/> |
||||||
|
|
||||||
|
<el-row> |
||||||
|
<el-row class="detail-page-header-left"> |
||||||
|
{description.map(({label, content}) => ( |
||||||
|
<el-col key={label} xs={24} sm={12}> |
||||||
|
<span class="detail-page-header-description-label">{label}</span> |
||||||
|
<span class="detail-page-header-description-content">{content}</span> |
||||||
|
</el-col> |
||||||
|
))} |
||||||
|
</el-row> |
||||||
|
|
||||||
|
<div class="detail-page-header-extra"> |
||||||
|
<div> |
||||||
|
{extra.map(({title, content}) => ( |
||||||
|
<div key={title}> |
||||||
|
<div class="detail-page-header-extra-title">{title}</div> |
||||||
|
<div class="detail-page-header-extra-content">{content}</div> |
||||||
|
</div> |
||||||
|
))} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</el-row> |
||||||
|
</div> |
||||||
|
) |
||||||
|
|
||||||
|
const renderFooter = (h, form, buttons, close) => ( |
||||||
|
<div class="detail-page-footer"> |
||||||
|
<div class="detail-page-footer-left"> |
||||||
|
<slot name="left"/> |
||||||
|
</div> |
||||||
|
<div class="detail-page-footer-right"> |
||||||
|
<FormValidateInfo form={form}/> |
||||||
|
{renderButtons(h, buttons, close)} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
) |
||||||
|
|
||||||
|
const renderButtons = (h, buttons, close) => { |
||||||
|
const list = buttons.map(({type, content, e}) => |
||||||
|
<el-button size="small" type={type} on-click={e}>{content}</el-button> |
||||||
|
) |
||||||
|
list.unshift(<el-button plain size="small" on-click={close}>关 闭</el-button>) |
||||||
|
return list |
||||||
|
} |
||||||
|
|
||||||
|
export default { |
||||||
|
name: "DetailForm", |
||||||
|
|
||||||
|
functional: true, |
||||||
|
|
||||||
|
props: { |
||||||
|
loading: Boolean, |
||||||
|
reference: Function, |
||||||
|
anchors: {type: Array, default: () => []}, |
||||||
|
title: String, |
||||||
|
description: {type: Array, default: () => []}, |
||||||
|
extra: {type: Array, default: () => []}, |
||||||
|
buttons: {type: Array, default: () => []}, |
||||||
|
}, |
||||||
|
|
||||||
|
render(h, context) { |
||||||
|
const { |
||||||
|
props: {loading, reference, anchors, title, description, extra, buttons}, |
||||||
|
listeners: {close}, |
||||||
|
children |
||||||
|
} = context |
||||||
|
|
||||||
|
const getFormRef = () => { |
||||||
|
if (!reference) return null |
||||||
|
const ref = reference() |
||||||
|
if (!ref) return null |
||||||
|
return ref.form |
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<div v-loading={loading} class="detail-page"> |
||||||
|
{renderHeader(h, title, description, extra, close)} |
||||||
|
<FormAnchor reference={reference} data={anchors}/> |
||||||
|
{children} |
||||||
|
{renderFooter(h, getFormRef, buttons, close)} |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
@import "~@/asset/style/variables.scss"; |
||||||
|
|
||||||
|
.detail-page { |
||||||
|
&.el-loading-parent--relative { |
||||||
|
position: static !important; |
||||||
|
} |
||||||
|
|
||||||
|
&-header { |
||||||
|
margin: -#{$page-view-margin} -#{$page-view-margin} 0 -#{$page-view-margin}; |
||||||
|
padding: 16px 32px 0 32px; |
||||||
|
background: #fff; |
||||||
|
border-bottom: 1px solid #e8eaec; |
||||||
|
|
||||||
|
> .el-page-header { |
||||||
|
padding: 0 0 24px 0; |
||||||
|
|
||||||
|
.el-page-header__left:hover { |
||||||
|
color: $--color-primary; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
> .el-row { |
||||||
|
display: flex; |
||||||
|
width: 100%; |
||||||
|
margin-bottom: 12px; |
||||||
|
|
||||||
|
@media (max-width: 768px) { |
||||||
|
display: block; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&-left { |
||||||
|
width: 100%; |
||||||
|
overflow: hidden; |
||||||
|
|
||||||
|
.el-col { |
||||||
|
margin-bottom: 16px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&-extra { |
||||||
|
min-width: 242px; |
||||||
|
margin-left: 88px; |
||||||
|
|
||||||
|
@media (max-width: 1200px) { |
||||||
|
margin-left: 44px; |
||||||
|
} |
||||||
|
|
||||||
|
@media (max-width: 992px) { |
||||||
|
margin-left: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
@media (max-width: 768px) { |
||||||
|
margin-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
> div { |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
width: 200px; |
||||||
|
} |
||||||
|
|
||||||
|
&-title { |
||||||
|
margin-bottom: 4px; |
||||||
|
color: rgba(0, 0, 0, .45); |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
|
||||||
|
&-content { |
||||||
|
margin-top: 12px; |
||||||
|
color: rgba(0, 0, 0, .85); |
||||||
|
font-size: 24px; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
&-description { |
||||||
|
span { |
||||||
|
display: inline-flex; |
||||||
|
align-items: baseline; |
||||||
|
} |
||||||
|
|
||||||
|
&-label { |
||||||
|
color: rgba(0, 0, 0, .85); |
||||||
|
font-weight: 400; |
||||||
|
font-size: 14px; |
||||||
|
line-height: 1.5715; |
||||||
|
text-align: start; |
||||||
|
} |
||||||
|
|
||||||
|
&-content { |
||||||
|
color: rgba(0, 0, 0, .65); |
||||||
|
font-size: 14px; |
||||||
|
line-height: 1.5715; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
> .el-form > .el-row > .el-card { |
||||||
|
margin-top: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
&-footer { |
||||||
|
@include clearfix; |
||||||
|
position: absolute; |
||||||
|
width: 100%; |
||||||
|
right: 0; |
||||||
|
bottom: 0; |
||||||
|
z-index: 99; |
||||||
|
transition: all 0.3s ease 0s; |
||||||
|
height: 56px; |
||||||
|
padding: 0 24px; |
||||||
|
line-height: 56px; |
||||||
|
border-top: 1px solid #f0f0f0; |
||||||
|
box-shadow: 0 3px 6px -4px rgba(0, 0, 0, .12), 0 6px 16px 0 rgba(0, 0, 0, .08), 0 9px 28px 8px rgba(0, 0, 0, .05); |
||||||
|
backdrop-filter: blur(3px); |
||||||
|
|
||||||
|
&-left { |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
&-right { |
||||||
|
float: right; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
@ -1,16 +0,0 @@ |
|||||||
<template functional> |
|
||||||
<div class="detail-page-footer"> |
|
||||||
<div class="detail-page-footer-left"> |
|
||||||
<slot name="left"/> |
|
||||||
</div> |
|
||||||
<div class="detail-page-footer-right"> |
|
||||||
<slot/> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script> |
|
||||||
export default { |
|
||||||
name: "DocDetailFooter" |
|
||||||
} |
|
||||||
</script> |
|
||||||
@ -1,34 +0,0 @@ |
|||||||
<template functional> |
|
||||||
<div class="detail-page-header"> |
|
||||||
<el-page-header @back="listeners.close" :content="props.title"/> |
|
||||||
|
|
||||||
<el-row> |
|
||||||
<el-row class="detail-page-header-left"> |
|
||||||
<el-col v-for="i in props.description" :key="i.label" :xs="24" :sm="12"> |
|
||||||
<span class="detail-page-header-description-label">{{ i.label }}</span> |
|
||||||
<span class="detail-page-header-description-content">{{ i.content }}</span> |
|
||||||
</el-col> |
|
||||||
</el-row> |
|
||||||
<div class="detail-page-header-extra"> |
|
||||||
<div> |
|
||||||
<div v-for="i in props.extra" :key="i.title"> |
|
||||||
<div class="detail-page-header-extra-title">{{ i.title }}</div> |
|
||||||
<div class="detail-page-header-extra-content">{{ i.content }}</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</el-row> |
|
||||||
</div> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script> |
|
||||||
export default { |
|
||||||
name: "DocDetailHeader", |
|
||||||
|
|
||||||
props: { |
|
||||||
title: String, |
|
||||||
description: {type: Array, default: () => []}, |
|
||||||
extra: {type: Array, default: () => []} |
|
||||||
} |
|
||||||
} |
|
||||||
</script> |
|
||||||
Loading…
Reference in new issue