You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
5.0 KiB

4 years ago
import { createNamespace } from '../../utils';
import { LIMIT_TYPE } from '../constants';
import Stepper from '../../stepper';
var namespace = createNamespace('sku-stepper');
var createComponent = namespace[0];
var t = namespace[2];
var QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT,
STOCK_LIMIT = LIMIT_TYPE.STOCK_LIMIT;
export default createComponent({
props: {
stock: Number,
skuEventBus: Object,
skuStockNum: Number,
selectedNum: Number,
stepperTitle: String,
disableStepperInput: Boolean,
customStepperConfig: Object,
hideQuotaText: Boolean,
quota: {
type: Number,
default: 0
},
quotaUsed: {
type: Number,
default: 0
},
startSaleNum: {
type: Number,
default: 1
}
},
data: function data() {
return {
currentNum: this.selectedNum,
// 购买限制类型: 限购/库存
limitType: STOCK_LIMIT
};
},
watch: {
currentNum: function currentNum(num) {
var intValue = parseInt(num, 10);
if (intValue >= this.stepperMinLimit && intValue <= this.stepperLimit) {
this.skuEventBus.$emit('sku:numChange', intValue);
}
},
stepperLimit: function stepperLimit(limit) {
if (limit < this.currentNum && this.stepperMinLimit <= limit) {
this.currentNum = limit;
}
this.checkState(this.stepperMinLimit, limit);
},
stepperMinLimit: function stepperMinLimit(start) {
if (start > this.currentNum || start > this.stepperLimit) {
this.currentNum = start;
}
this.checkState(start, this.stepperLimit);
}
},
computed: {
stepperLimit: function stepperLimit() {
var quotaLimit = this.quota - this.quotaUsed;
var limit; // 无限购时直接取库存,有限购时取限购数和库存数中小的那个
if (this.quota > 0 && quotaLimit <= this.stock) {
// 修正负的limit
limit = quotaLimit < 0 ? 0 : quotaLimit;
this.limitType = QUOTA_LIMIT;
} else {
limit = this.stock;
this.limitType = STOCK_LIMIT;
}
return limit;
},
stepperMinLimit: function stepperMinLimit() {
return this.startSaleNum < 1 ? 1 : this.startSaleNum;
},
quotaText: function quotaText() {
var _this$customStepperCo = this.customStepperConfig,
quotaText = _this$customStepperCo.quotaText,
hideQuotaText = _this$customStepperCo.hideQuotaText;
if (hideQuotaText) return '';
var text = '';
if (quotaText) {
text = quotaText;
} else {
var textArr = [];
if (this.startSaleNum > 1) {
textArr.push(t('quotaStart', this.startSaleNum));
}
if (this.quota > 0) {
textArr.push(t('quotaLimit', this.quota));
}
text = textArr.join(t('comma'));
}
return text;
}
},
created: function created() {
this.checkState(this.stepperMinLimit, this.stepperLimit);
},
methods: {
setCurrentNum: function setCurrentNum(num) {
this.currentNum = num;
this.checkState(this.stepperMinLimit, this.stepperLimit);
},
onOverLimit: function onOverLimit(action) {
this.skuEventBus.$emit('sku:overLimit', {
action: action,
limitType: this.limitType,
quota: this.quota,
quotaUsed: this.quotaUsed,
startSaleNum: this.startSaleNum
});
},
onChange: function onChange(currentValue) {
var intValue = parseInt(currentValue, 10);
var handleStepperChange = this.customStepperConfig.handleStepperChange;
handleStepperChange && handleStepperChange(intValue);
this.$emit('change', intValue);
},
checkState: function checkState(min, max) {
// 如果选择小于起售,则强制变为起售
if (this.currentNum < min || min > max) {
this.currentNum = min;
} else if (this.currentNum > max) {
// 当前选择数量大于最大可选时,需要重置已选数量
this.currentNum = max;
}
this.skuEventBus.$emit('sku:stepperState', {
valid: min <= max,
min: min,
max: max,
limitType: this.limitType,
quota: this.quota,
quotaUsed: this.quotaUsed,
startSaleNum: this.startSaleNum
});
}
},
render: function render() {
var _this = this;
var h = arguments[0];
return h("div", {
"class": "van-sku-stepper-stock"
}, [h("div", {
"class": "van-sku__stepper-title"
}, [this.stepperTitle || t('num')]), h(Stepper, {
"attrs": {
"integer": true,
"min": this.stepperMinLimit,
"max": this.stepperLimit,
"disableInput": this.disableStepperInput
},
"class": "van-sku__stepper",
"on": {
"overlimit": this.onOverLimit,
"change": this.onChange
},
"model": {
value: _this.currentNum,
callback: function callback($$v) {
_this.currentNum = $$v;
}
}
}), !this.hideQuotaText && this.quotaText && h("span", {
"class": "van-sku__stepper-quota"
}, ["(", this.quotaText, ")"])]);
}
});