295 lines
6.6 KiB
Vue
295 lines
6.6 KiB
Vue
<template>
|
|
<div class="md-dialog">
|
|
<md-popup
|
|
:value="value"
|
|
:hasMask="hasMask"
|
|
:maskClosable="maskClosable"
|
|
position="center"
|
|
:transition="transition"
|
|
:preventScroll="preventScroll"
|
|
:preventScrollExclude="preventScrollExclude"
|
|
@input="$_onInput"
|
|
@show="$_onShow"
|
|
@hide="$_onHide"
|
|
>
|
|
<div class="md-dialog-content">
|
|
<slot name="header"></slot>
|
|
<div class="md-dialog-body">
|
|
<a
|
|
role="button"
|
|
v-if="closable"
|
|
class="md-dialog-close"
|
|
@click="close"
|
|
>
|
|
<md-icon name="close" />
|
|
</a>
|
|
<div v-if="icon" class="md-dialog-icon">
|
|
<md-icon :name="icon" :svg="iconSvg"/>
|
|
</div>
|
|
<h2 class="md-dialog-title" v-if="title" v-text="title"></h2>
|
|
<slot>
|
|
<div class="md-dialog-text" v-html="content"></div>
|
|
</slot>
|
|
</div>
|
|
<footer class="md-dialog-actions" :class="{ 'is-column': layout === 'column' }">
|
|
<template v-for="(btn, index) in btns">
|
|
<a
|
|
role="button"
|
|
class="md-dialog-btn"
|
|
:class="{
|
|
disabled: !!btn.disabled,
|
|
warning: !btn.disabled && !!btn.warning
|
|
}"
|
|
:key="index"
|
|
@click="$_onClick(btn)"
|
|
@touchmove.prevent
|
|
>
|
|
<md-activity-indicator-rolling v-if="btn.loading" class="md-dialog-btn-loading"></md-activity-indicator-rolling>
|
|
<md-icon
|
|
v-else-if="btn.icon"
|
|
class="md-dialog-btn-icon"
|
|
:name="btn.icon"
|
|
:svg="btn.iconSvg"
|
|
size="md"
|
|
></md-icon>
|
|
{{ btn.text }}
|
|
</a>
|
|
</template>
|
|
</footer>
|
|
</div>
|
|
</md-popup>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import Popup from '../popup'
|
|
import Icon from '../icon'
|
|
import ActivityIndicatorRolling from '../activity-indicator/roller'
|
|
import {mdDocument} from '../_util'
|
|
|
|
export default {
|
|
name: 'md-dialog',
|
|
|
|
components: {
|
|
[Popup.name]: Popup,
|
|
[Icon.name]: Icon,
|
|
[ActivityIndicatorRolling.name]: ActivityIndicatorRolling,
|
|
},
|
|
|
|
props: {
|
|
value: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
title: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
icon: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
iconSvg: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
closable: {
|
|
type: Boolean,
|
|
default: true,
|
|
},
|
|
content: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
btns: {
|
|
type: Array,
|
|
default() {
|
|
/* istanbul ignore next */
|
|
return []
|
|
},
|
|
},
|
|
layout: {
|
|
type: String,
|
|
default: 'row',
|
|
},
|
|
appendTo: {
|
|
default: () => mdDocument.body,
|
|
},
|
|
hasMask: {
|
|
type: Boolean,
|
|
default: true,
|
|
},
|
|
maskClosable: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
transition: {
|
|
type: String,
|
|
default: 'md-fade',
|
|
},
|
|
preventScroll: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
preventScrollExclude: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
},
|
|
|
|
mounted() {
|
|
if (this.appendTo) {
|
|
this.appendTo.appendChild(this.$el)
|
|
}
|
|
},
|
|
|
|
beforeDestroy() {
|
|
if (this.appendTo) {
|
|
this.appendTo.removeChild(this.$el)
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
// MARK: private methods
|
|
|
|
// MARK: events handler
|
|
$_onInput(val) {
|
|
this.$emit('input', val)
|
|
},
|
|
$_onShow() {
|
|
this.$emit('show')
|
|
},
|
|
$_onHide() {
|
|
this.$emit('hide')
|
|
},
|
|
$_onClick(btn) {
|
|
if (btn.disabled || btn.loading) {
|
|
return
|
|
}
|
|
if (typeof btn.handler === 'function') {
|
|
btn.handler.call(null, btn)
|
|
} else {
|
|
this.close()
|
|
}
|
|
},
|
|
// MARK: public methods
|
|
close() {
|
|
this.$emit('input', false)
|
|
},
|
|
},
|
|
}
|
|
|
|
</script>
|
|
|
|
<style lang="stylus">
|
|
.md-dialog
|
|
.md-popup
|
|
z-index dialog-zindex
|
|
|
|
.md-dialog-content
|
|
width dialog-width
|
|
border-radius dialog-radius
|
|
background-color color-bg-inverse
|
|
overflow hidden
|
|
|
|
.md-dialog-body
|
|
color dialog-text-color
|
|
font-size dialog-text-font-size
|
|
text-align left
|
|
padding dialog-body-padding
|
|
|
|
.md-dialog-icon
|
|
position relative
|
|
display block
|
|
width dialog-icon-size
|
|
height dialog-icon-size
|
|
margin v-gap-md auto 28px
|
|
.md-dialog .md-dialog-icon .md-icon
|
|
.md-dialog .md-dialog-icon .md-icon.icon-svg
|
|
.md-dialog .md-dialog-icon .md-icon.icon-font
|
|
display flex
|
|
align-items center
|
|
justify-content center
|
|
position absolute
|
|
top 0
|
|
left 0
|
|
width dialog-icon-size
|
|
height dialog-icon-size
|
|
fill dialog-icon-fill
|
|
color dialog-icon-fill
|
|
font-size dialog-icon-size
|
|
line-height dialog-icon-size
|
|
|
|
.md-dialog-close
|
|
position absolute
|
|
color dialog-close-color
|
|
top 32px
|
|
right 32px
|
|
z-index 15
|
|
|
|
.md-dialog-title
|
|
color dialog-title-color
|
|
text-align center
|
|
font-size dialog-title-font-size
|
|
font-weight font-weight-normal
|
|
line-height 1.2
|
|
margin 0 0 28px 0
|
|
|
|
.md-dialog-text
|
|
display flex
|
|
justify-content center
|
|
|
|
.md-dialog-actions
|
|
position relative
|
|
display flex
|
|
hairline(top, dialog-action-border-color)
|
|
&.is-column
|
|
flex-direction column
|
|
.md-dialog-btn
|
|
flex 0 0 auto
|
|
remove-hairline(right)
|
|
&:not(:first-child)
|
|
hairline(top, dialog-action-border-color)
|
|
&:last-child
|
|
color color-text-minor
|
|
&:first-child
|
|
color dialog-action-highlight-color
|
|
|
|
.md-dialog-btn
|
|
position relative
|
|
flex 1 1 0%
|
|
display flex
|
|
align-items center
|
|
justify-content center
|
|
height dialog-action-height
|
|
font-size dialog-action-font-size
|
|
font-weight dialog-action-font-weight
|
|
color color-text-minor
|
|
text-align center
|
|
hairline(right, dialog-action-border-color)
|
|
transition background-color .3s
|
|
-webkit-user-select none
|
|
-webkit-tap-highlight-color transparent
|
|
&.warning
|
|
color color-text-error !important
|
|
.md-dialog-btn-loading .md-activity-indicator-svg .circle circle
|
|
stroke color-text-error !important
|
|
&.disabled
|
|
color color-text-disabled !important
|
|
.md-dialog-btn-loading .md-activity-indicator-svg .circle circle
|
|
stroke color-text-disabled !important
|
|
&:last-child
|
|
color dialog-action-highlight-color
|
|
remove-hairline(right)
|
|
.md-dialog-btn-loading .md-activity-indicator-svg .circle circle
|
|
stroke dialog-action-highlight-color
|
|
&:not(.disabled):active
|
|
background-color color-bg-tap
|
|
.md-dialog-btn-loading .md-activity-indicator-svg
|
|
width 32px !important
|
|
height 32px !important
|
|
margin-right 10px
|
|
.circle circle
|
|
stroke color-text-minor
|
|
.md-dialog-btn-icon
|
|
margin-right 10px
|
|
</style>
|