265 lines
6.6 KiB
JavaScript
265 lines
6.6 KiB
JavaScript
// Utils
|
|
import { createNamespace } from '../utils'; // Components
|
|
|
|
import Tab from '../tab';
|
|
import Tabs from '../tabs';
|
|
import Field from '../field';
|
|
import Button from '../button';
|
|
import Coupon from '../coupon';
|
|
|
|
var _createNamespace = createNamespace('coupon-list'),
|
|
createComponent = _createNamespace[0],
|
|
bem = _createNamespace[1],
|
|
t = _createNamespace[2];
|
|
|
|
var EMPTY_IMAGE = 'https://img01.yzcdn.cn/vant/coupon-empty.png';
|
|
export default createComponent({
|
|
model: {
|
|
prop: 'code'
|
|
},
|
|
props: {
|
|
code: String,
|
|
closeButtonText: String,
|
|
inputPlaceholder: String,
|
|
enabledTitle: String,
|
|
disabledTitle: String,
|
|
exchangeButtonText: String,
|
|
exchangeButtonLoading: Boolean,
|
|
exchangeButtonDisabled: Boolean,
|
|
exchangeMinLength: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
chosenCoupon: {
|
|
type: Number,
|
|
default: -1
|
|
},
|
|
coupons: {
|
|
type: Array,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
disabledCoupons: {
|
|
type: Array,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
displayedCouponIndex: {
|
|
type: Number,
|
|
default: -1
|
|
},
|
|
showExchangeBar: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
showCloseButton: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
showCount: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
currency: {
|
|
type: String,
|
|
default: '¥'
|
|
},
|
|
emptyImage: {
|
|
type: String,
|
|
default: EMPTY_IMAGE
|
|
}
|
|
},
|
|
data: function data() {
|
|
return {
|
|
tab: 0,
|
|
winHeight: window.innerHeight,
|
|
currentCode: this.code || ''
|
|
};
|
|
},
|
|
computed: {
|
|
buttonDisabled: function buttonDisabled() {
|
|
return !this.exchangeButtonLoading && (this.exchangeButtonDisabled || !this.currentCode || this.currentCode.length < this.exchangeMinLength);
|
|
},
|
|
listStyle: function listStyle() {
|
|
return {
|
|
height: this.winHeight - (this.showExchangeBar ? 140 : 94) + 'px'
|
|
};
|
|
}
|
|
},
|
|
watch: {
|
|
code: function code(_code) {
|
|
this.currentCode = _code;
|
|
},
|
|
currentCode: function currentCode(code) {
|
|
this.$emit('input', code);
|
|
},
|
|
displayedCouponIndex: 'scrollToShowCoupon'
|
|
},
|
|
mounted: function mounted() {
|
|
this.scrollToShowCoupon(this.displayedCouponIndex);
|
|
},
|
|
methods: {
|
|
onClickExchangeButton: function onClickExchangeButton() {
|
|
this.$emit('exchange', this.currentCode); // auto clear currentCode when not use vModel
|
|
|
|
if (!this.code) {
|
|
this.currentCode = '';
|
|
}
|
|
},
|
|
// scroll to show specific coupon
|
|
scrollToShowCoupon: function scrollToShowCoupon(index) {
|
|
var _this = this;
|
|
|
|
if (index === -1) {
|
|
return;
|
|
}
|
|
|
|
this.$nextTick(function () {
|
|
var _this$$refs = _this.$refs,
|
|
card = _this$$refs.card,
|
|
list = _this$$refs.list;
|
|
/* istanbul ignore next */
|
|
|
|
if (list && card && card[index]) {
|
|
list.scrollTop = card[index].$el.offsetTop - 100;
|
|
}
|
|
});
|
|
},
|
|
genEmpty: function genEmpty() {
|
|
var h = this.$createElement;
|
|
return h("div", {
|
|
"class": bem('empty')
|
|
}, [h("img", {
|
|
"attrs": {
|
|
"src": this.emptyImage
|
|
}
|
|
}), h("p", [t('empty')])]);
|
|
},
|
|
genExchangeButton: function genExchangeButton() {
|
|
var h = this.$createElement;
|
|
return h(Button, {
|
|
"attrs": {
|
|
"plain": true,
|
|
"type": "danger",
|
|
"text": this.exchangeButtonText || t('exchange'),
|
|
"loading": this.exchangeButtonLoading,
|
|
"disabled": this.buttonDisabled
|
|
},
|
|
"class": bem('exchange'),
|
|
"on": {
|
|
"click": this.onClickExchangeButton
|
|
}
|
|
});
|
|
}
|
|
},
|
|
render: function render() {
|
|
var _this2 = this;
|
|
|
|
var h = arguments[0];
|
|
var coupons = this.coupons,
|
|
disabledCoupons = this.disabledCoupons;
|
|
var count = this.showCount ? " (" + coupons.length + ")" : '';
|
|
var title = (this.enabledTitle || t('enable')) + count;
|
|
var disabledCount = this.showCount ? " (" + disabledCoupons.length + ")" : '';
|
|
var disabledTitle = (this.disabledTitle || t('disabled')) + disabledCount;
|
|
var ExchangeBar = this.showExchangeBar && h("div", {
|
|
"class": bem('exchange-bar')
|
|
}, [h(Field, {
|
|
"attrs": {
|
|
"clearable": true,
|
|
"border": false,
|
|
"placeholder": this.inputPlaceholder || t('placeholder'),
|
|
"maxlength": "20"
|
|
},
|
|
"class": bem('field'),
|
|
"model": {
|
|
value: _this2.currentCode,
|
|
callback: function callback($$v) {
|
|
_this2.currentCode = $$v;
|
|
}
|
|
}
|
|
}), this.genExchangeButton()]);
|
|
|
|
var onChange = function onChange(index) {
|
|
return function () {
|
|
return _this2.$emit('change', index);
|
|
};
|
|
};
|
|
|
|
var CouponTab = h(Tab, {
|
|
"attrs": {
|
|
"title": title
|
|
}
|
|
}, [h("div", {
|
|
"class": bem('list', {
|
|
'with-bottom': this.showCloseButton
|
|
}),
|
|
"style": this.listStyle
|
|
}, [coupons.map(function (coupon, index) {
|
|
return h(Coupon, {
|
|
"ref": "card",
|
|
"key": coupon.id,
|
|
"attrs": {
|
|
"coupon": coupon,
|
|
"currency": _this2.currency,
|
|
"chosen": index === _this2.chosenCoupon
|
|
},
|
|
"nativeOn": {
|
|
"click": onChange(index)
|
|
}
|
|
});
|
|
}), !coupons.length && this.genEmpty(), this.slots('list-footer')])]);
|
|
var DisabledCouponTab = h(Tab, {
|
|
"attrs": {
|
|
"title": disabledTitle
|
|
}
|
|
}, [h("div", {
|
|
"class": bem('list', {
|
|
'with-bottom': this.showCloseButton
|
|
}),
|
|
"style": this.listStyle
|
|
}, [disabledCoupons.map(function (coupon) {
|
|
return h(Coupon, {
|
|
"attrs": {
|
|
"disabled": true,
|
|
"coupon": coupon,
|
|
"currency": _this2.currency
|
|
},
|
|
"key": coupon.id
|
|
});
|
|
}), !disabledCoupons.length && this.genEmpty(), this.slots('disabled-list-footer')])]);
|
|
return h("div", {
|
|
"class": bem()
|
|
}, [ExchangeBar, h(Tabs, {
|
|
"class": bem('tab'),
|
|
"attrs": {
|
|
"border": false
|
|
},
|
|
"model": {
|
|
value: _this2.tab,
|
|
callback: function callback($$v) {
|
|
_this2.tab = $$v;
|
|
}
|
|
}
|
|
}, [CouponTab, DisabledCouponTab]), h("div", {
|
|
"class": bem('bottom')
|
|
}, [h(Button, {
|
|
"directives": [{
|
|
name: "show",
|
|
value: this.showCloseButton
|
|
}],
|
|
"attrs": {
|
|
"round": true,
|
|
"type": "danger",
|
|
"block": true,
|
|
"text": this.closeButtonText || t('close')
|
|
},
|
|
"class": bem('close'),
|
|
"on": {
|
|
"click": onChange(-1)
|
|
}
|
|
})])]);
|
|
}
|
|
}); |