193 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
 | |
| 
 | |
| exports.__esModule = true;
 | |
| exports.default = void 0;
 | |
| 
 | |
| var _utils = require("../../utils");
 | |
| 
 | |
| var _constants = require("../constants");
 | |
| 
 | |
| var _stepper = _interopRequireDefault(require("../../stepper"));
 | |
| 
 | |
| var namespace = (0, _utils.createNamespace)('sku-stepper');
 | |
| var createComponent = namespace[0];
 | |
| var t = namespace[2];
 | |
| var QUOTA_LIMIT = _constants.LIMIT_TYPE.QUOTA_LIMIT,
 | |
|     STOCK_LIMIT = _constants.LIMIT_TYPE.STOCK_LIMIT;
 | |
| 
 | |
| var _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.default, {
 | |
|       "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, ")"])]);
 | |
|   }
 | |
| });
 | |
| 
 | |
| exports.default = _default; | 
