UNPKG

vant

Version:

A Vue.js 2.0 Mobile UI at YouZan

343 lines (288 loc) 11.9 kB
'use strict'; exports.__esModule = true; var _extends4 = require('babel-runtime/helpers/extends'); var _extends5 = _interopRequireDefault(_extends4); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _vue = require('vue'); var _vue2 = _interopRequireDefault(_vue); var _popup = require('../popup'); var _popup2 = _interopRequireDefault(_popup); var _toast = require('../toast'); var _toast2 = _interopRequireDefault(_toast); var _SkuHeader = require('./components/SkuHeader'); var _SkuHeader2 = _interopRequireDefault(_SkuHeader); var _SkuRow = require('./components/SkuRow'); var _SkuRow2 = _interopRequireDefault(_SkuRow); var _SkuRowItem = require('./components/SkuRowItem'); var _SkuRowItem2 = _interopRequireDefault(_SkuRowItem); var _SkuStepper = require('./components/SkuStepper'); var _SkuStepper2 = _interopRequireDefault(_SkuStepper); var _SkuMessages = require('./components/SkuMessages'); var _SkuMessages2 = _interopRequireDefault(_SkuMessages); var _SkuActions = require('./components/SkuActions'); var _SkuActions2 = _interopRequireDefault(_SkuActions); var _skuHelper = require('./utils/skuHelper'); var _constants = require('./constants'); var _utils = require('../utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable camelcase */ var QUOTA_LIMIT = _constants.LIMIT_TYPE.QUOTA_LIMIT; exports.default = (0, _utils.create)({ render: function render() { var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return !_vm.isSkuEmpty ? _c('popup', { staticClass: "van-sku-container", attrs: { "position": "bottom", "close-on-click-overlay": _vm.closeOnClickOverlay, "get-container": _vm.getContainer }, model: { value: _vm.show, callback: function callback($$v) { _vm.show = $$v; }, expression: "show" } }, [_vm._t("sku-header", [_c('sku-header', { attrs: { "sku-event-bus": _vm.skuEventBus, "selected-sku": _vm.selectedSku, "goods": _vm.goods, "sku": _vm.sku } }, [_vm._t("sku-header-price", [_c('div', { staticClass: "van-sku__goods-price" }, [_c('span', { staticClass: "van-sku__price-symbol" }, [_vm._v("¥")]), _c('span', { staticClass: "van-sku__price-num" }, [_vm._v(_vm._s(_vm.price))])])], { price: _vm.price, selectedSkuComb: _vm.selectedSkuComb })], 2)], { skuEventBus: _vm.skuEventBus, selectedSku: _vm.selectedSku, selectedSkuComb: _vm.selectedSkuComb }), _c('div', { staticClass: "van-sku-body", style: _vm.bodyStyle }, [_vm._t("sku-body-top", null, { selectedSku: _vm.selectedSku, skuEventBus: _vm.skuEventBus }), _vm._t("sku-group", [_vm.hasSku ? _c('div', { staticClass: "van-sku-group-container van-hairline--bottom" }, _vm._l(_vm.skuTree, function (skuTreeItem, index) { return _c('sku-row', { key: index, attrs: { "sku-row": skuTreeItem } }, _vm._l(skuTreeItem.v, function (skuValue, index) { return _c('sku-row-item', { key: index, attrs: { "sku-key-str": skuTreeItem.k_s, "sku-value": skuValue, "sku-event-bus": _vm.skuEventBus, "selected-sku": _vm.selectedSku, "sku-list": _vm.sku.list } }); })); })) : _vm._e()], { selectedSku: _vm.selectedSku, skuEventBus: _vm.skuEventBus }), _vm._t("extra-sku-group", null, { skuEventBus: _vm.skuEventBus }), _vm._t("sku-stepper", [_c('sku-stepper', { ref: "skuStepper", attrs: { "sku-event-bus": _vm.skuEventBus, "selected-sku": _vm.selectedSku, "selected-sku-comb": _vm.selectedSkuComb, "selected-num": _vm.selectedNum, "stepper-title": _vm.stepperTitle, "sku-stock-num": _vm.sku.stock_num, "quota": _vm.quota, "quota-used": _vm.quotaUsed, "disable-stepper-input": _vm.disableStepperInput, "hide-stock": _vm.hideStock, "custom-stepper-config": _vm.customStepperConfig } })], { skuEventBus: _vm.skuEventBus, selectedSku: _vm.selectedSku, selectedSkuComb: _vm.selectedSkuComb, selectedNum: _vm.selectedNum }), _vm._t("sku-messages", [_c('sku-messages', { ref: "skuMessages", attrs: { "goods-id": _vm.goodsId, "message-config": _vm.messageConfig, "messages": _vm.sku.messages } })])], 2), _vm._t("sku-actions", [_c('sku-actions', { attrs: { "sku-event-bus": _vm.skuEventBus, "buy-text": _vm.buyText, "show-add-cart-btn": _vm.showAddCartBtn } })], { skuEventBus: _vm.skuEventBus })], 2) : _vm._e(); }, name: 'sku', components: { Popup: _popup2.default, SkuHeader: _SkuHeader2.default, SkuRow: _SkuRow2.default, SkuRowItem: _SkuRowItem2.default, SkuStepper: _SkuStepper2.default, SkuMessages: _SkuMessages2.default, SkuActions: _SkuActions2.default }, props: { sku: Object, goods: Object, value: Boolean, buyText: String, goodsId: [Number, String], stepperTitle: String, hideStock: Boolean, getContainer: Function, resetStepperOnHide: Boolean, resetSelectedSkuOnHide: Boolean, disableStepperInput: Boolean, closeOnClickOverlay: Boolean, initialSku: { type: Object, default: function _default() { return {}; } }, quota: { type: Number, default: 0 }, quotaUsed: { type: Number, default: 0 }, showAddCartBtn: { type: Boolean, default: true }, bodyOffsetTop: { type: Number, default: 200 }, messageConfig: { type: Object, default: function _default() { return { placeholderMap: {}, uploadImg: function uploadImg() { return _promise2.default.resolve(); }, uploadMaxSize: 5 }; } }, customStepperConfig: { type: Object, default: function _default() { return {}; } } }, data: function data() { return { selectedSku: {}, selectedNum: 1, show: this.value }; }, watch: { show: function show(val) { this.$emit('input', val); if (!val) { var selectedSkuValues = (0, _skuHelper.getSelectedSkuValues)(this.sku.tree, this.selectedSku); this.$emit('sku-close', { selectedSkuValues: selectedSkuValues, selectedNum: this.selectedNum, selectedSkuComb: this.selectedSkuComb }); if (this.resetStepperOnHide) { this.$refs.skuStepper && this.$refs.skuStepper.setCurrentNum(1); } if (this.resetSelectedSkuOnHide) { this.resetSelectedSku(this.skuTree); } } }, value: function value(val) { this.show = val; }, skuTree: function skuTree(val) { this.resetSelectedSku(val); } }, computed: { bodyStyle: function bodyStyle() { if (this.$isServer) { return; } // header高度82px, sku actions高度50px,如果改动了样式自己传下bodyOffsetTop调整下 var maxHeight = window.innerHeight - this.bodyOffsetTop; return { maxHeight: maxHeight + 'px' }; }, isSkuCombSelected: function isSkuCombSelected() { return (0, _skuHelper.isAllSelected)(this.sku.tree, this.selectedSku); }, isSkuEmpty: function isSkuEmpty() { return (0, _keys2.default)(this.sku).length === 0; }, hasSku: function hasSku() { return !this.sku.none_sku; }, selectedSkuComb: function selectedSkuComb() { if (!this.hasSku) { return { id: this.sku.collection_id, price: Math.round(this.sku.price * 100), stock_num: this.sku.stock_num }; } else if (this.isSkuCombSelected) { return (0, _skuHelper.getSkuComb)(this.sku.list, this.selectedSku); } return null; }, price: function price() { if (this.selectedSkuComb) { return (this.selectedSkuComb.price / 100).toFixed(2); } // sku.price是一个格式化好的价格区间 return this.sku.price; }, skuTree: function skuTree() { return this.sku.tree || []; } }, created: function created() { var skuEventBus = new _vue2.default(); this.skuEventBus = skuEventBus; skuEventBus.$on('sku:close', this.onClose); skuEventBus.$on('sku:select', this.onSelect); skuEventBus.$on('sku:numChange', this.onNumChange); skuEventBus.$on('sku:overLimit', this.onOverLimit); skuEventBus.$on('sku:addCart', this.onAddCart); skuEventBus.$on('sku:buy', this.onBuy); this.resetSelectedSku(this.skuTree); // 组件初始化后的钩子,抛出skuEventBus this.$emit('after-sku-create', skuEventBus); }, methods: { resetSelectedSku: function resetSelectedSku(skuTree) { var _this = this; this.selectedSku = {}; skuTree.forEach(function (item) { // 只有一个sku规格值时默认选中 if (item.v.length === 1) { _this.selectedSku[item.k_s] = item.v[0].id; } else { _this.selectedSku[item.k_s] = _this.initialSku[item.k_s] || ''; } }); }, getSkuMessages: function getSkuMessages() { return this.$refs.skuMessages ? this.$refs.skuMessages.getMessages() : {}; }, getSkuCartMessages: function getSkuCartMessages() { return this.$refs.skuMessages ? this.$refs.skuMessages.getCartMessages() : {}; }, validateSkuMessages: function validateSkuMessages() { return this.$refs.skuMessages ? this.$refs.skuMessages.validateMessages() : ''; }, validateSku: function validateSku() { if (this.selectedNum === 0) { return this.$t('unavailable'); } if (this.isSkuCombSelected) { return this.validateSkuMessages(); } return this.$t('spec'); }, onClose: function onClose() { this.show = false; }, onSelect: function onSelect(skuValue) { var _extends2, _extends3; // 点击已选中的sku时则取消选中 this.selectedSku = this.selectedSku[skuValue.skuKeyStr] === skuValue.id ? (0, _extends5.default)({}, this.selectedSku, (_extends2 = {}, _extends2[skuValue.skuKeyStr] = '', _extends2)) : (0, _extends5.default)({}, this.selectedSku, (_extends3 = {}, _extends3[skuValue.skuKeyStr] = skuValue.id, _extends3)); this.$emit('sku-selected', { skuValue: skuValue, selectedSku: this.selectedSku, selectedSkuComb: this.selectedSkuComb }); }, onNumChange: function onNumChange(num) { this.selectedNum = num; }, onOverLimit: function onOverLimit(data) { var action = data.action, limitType = data.limitType, quota = data.quota, quotaUsed = data.quotaUsed; var handleOverLimit = this.customStepperConfig.handleOverLimit; if (handleOverLimit) { handleOverLimit(data); return; } if (action === 'minus') { (0, _toast2.default)(this.$t('least')); } else if (action === 'plus') { if (limitType === QUOTA_LIMIT) { var msg = this.$t('quota', quota); if (quotaUsed > 0) msg += '\uFF0C' + this.$t('purchase', quotaUsed); (0, _toast2.default)(msg); } else { (0, _toast2.default)(this.$t('inventory')); } } }, onAddCart: function onAddCart() { this.onBuyOrAddCart('add-cart'); }, onBuy: function onBuy() { this.onBuyOrAddCart('buy-clicked'); }, onBuyOrAddCart: function onBuyOrAddCart(type) { var error = this.validateSku(); if (error) { (0, _toast2.default)(error); } else { this.$emit(type, this.getSkuData()); } }, getSkuData: function getSkuData() { return { goodsId: this.goodsId, selectedNum: this.selectedNum, selectedSkuComb: this.selectedSkuComb, messages: this.getSkuMessages(), cartMessages: this.getSkuCartMessages() }; } } });