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
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, ")"])]);
|
||
|
}
|
||
|
});
|