123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- // 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)
- }
- })])]);
- }
- });
|