UNPKG

zcloud-ui

Version:

A Component Library for Vue.js.

647 lines (583 loc) 18.5 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 82); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; }); /* globals __VUE_SSR_CONTEXT__ */ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules). // This module is a runtime utility for cleaner component module output and will // be included in the final webpack user bundle. function normalizeComponent ( scriptExports, render, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier, /* server only */ shadowMode /* vue-cli only */ ) { // Vue.extend constructor export interop var options = typeof scriptExports === 'function' ? scriptExports.options : scriptExports // render functions if (render) { options.render = render options.staticRenderFns = staticRenderFns options._compiled = true } // functional template if (functionalTemplate) { options.functional = true } // scopedId if (scopeId) { options._scopeId = 'data-v-' + scopeId } var hook if (moduleIdentifier) { // server build hook = function (context) { // 2.3 injection context = context || // cached call (this.$vnode && this.$vnode.ssrContext) || // stateful (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__ } // inject component styles if (injectStyles) { injectStyles.call(this, context) } // register component module identifier for async chunk inferrence if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier) } } // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook } else if (injectStyles) { hook = shadowMode ? function () { injectStyles.call( this, (options.functional ? this.parent : this).$root.$options.shadowRoot ) } : injectStyles } if (hook) { if (options.functional) { // for template-only hot-reload because in that case the render fn doesn't // go through the normalizer options._injectStyles = hook // register for functional component in vue file var originalRender = options.render options.render = function renderWithStyleInjection (h, context) { hook.call(context) return originalRender(h, context) } } else { // inject component registration as beforeCreate hook var existing = options.beforeCreate options.beforeCreate = existing ? [].concat(existing, hook) : [hook] } } return { exports: scriptExports, options: options } } /***/ }), /***/ 82: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/sku/src/main.vue?vue&type=template&id=22929cfa& var render = function() { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c( "div", { staticClass: "zl-sku" }, [ _vm._t( "default", _vm._l(_vm.collection, function(item, key) { return _c( "dl", _vm._b( { key: key, staticClass: "zl-sku-dl" }, "dl", _vm.$attrs, false ), [ _c("dt", [_vm._v(_vm._s(key) + ":")]), _c( "dd", _vm._l(item, function(value) { return _c( "button", { key: value.name, staticClass: "button", class: { active: value.active, disabled: !value.active && value.disabled }, on: { click: function($event) { return _vm.handleActive(key, value) } } }, [_vm._v(" " + _vm._s(value.name) + " ")] ) }), 0 ) ] ) }) ) ], 2 ) } var staticRenderFns = [] render._withStripped = true // CONCATENATED MODULE: ./packages/sku/src/main.vue?vue&type=template&id=22929cfa& // CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/sku/src/main.vue?vue&type=script&lang=js& // // // // // // // // // // // // // /* harmony default export */ var mainvue_type_script_lang_js_ = ({ name: 'ZlSku', data: function data() { return { sequenceMap: {}, // 格式化的数据(幂集) spliter: '\u2299', // 分隔符 attrNames: [], // 属性类别名称 ['颜色','尺寸','大小'] selectSkuId: '', // 选中的skuId simplifyData: [], // 简化后的data [{path:'红⊙大⊙A',sku:'3158055'}] collection: {}, // 显示归集,用于展示使用 message: '' }; }, props: { data: { type: Array, required: true }, skuName: { type: String, default: 'skuId' }, value: { type: [String, Number], default: '' } }, watch: { data: { handler: function handler(val) { if (val.length) { this.initData(); } }, deep: true, immediate: true } }, methods: { /** * 初始化数据 * @return */ initData: function initData() { this.sequenceMap = {}; this.selectSkuId = this.value || this.data[0][this.skuName]; // 默认选中第一条 this.attrNames = this.getAllAttrs(); // 得到属性 var _combineAttr = this.combineAttr(this.data, this.attrNames), simplifyData = _combineAttr.simplifyData, collection = _combineAttr.collection; // 得到简化后的data数据,和归类 this.collection = collection; this.simplifyData = simplifyData; this.selectSkuId && this.initSeleted(this.selectSkuId); // 初始化选中 this.buildResult(simplifyData); // 生成所有子集 this.updateStatus(this.getSelectedItem()); // 获取选中信息,更新状态 this.showResult(); }, /** * 获取所有属性 * @return {[type]} [description] */ getAllAttrs: function getAllAttrs() { var arrKeys = []; for (var attribute in this.data[0]) { if (!this.data[0].hasOwnProperty(attribute)) { continue; } if (attribute !== this.skuName) { arrKeys.push(attribute); } } return arrKeys; }, /** * 计算属性 * @param {[type]} data [description] * @param {[type]} keys [description] * @return {[type]} [description] */ combineAttr: function combineAttr(data, keys) { var allKeys = []; var result = {}; for (var i = 0; i < data.length; i++) { var item = data[i]; var values = []; for (var j = 0; j < keys.length; j++) { var key = keys[j]; if (!result[key]) { result[key] = {}; } if (!result[key][item[key]]) { result[key][item[key]] = { name: item[key], active: false, disabled: true }; } values.push(item[key]); } allKeys.push({ // 将数据格式化成简单数据 path: values.join(this.spliter), sku: item.skuId }); // {path: "红⊙大⊙A", sku: "3158055"} } return { collection: result, simplifyData: allKeys }; }, /** * 初始化选中 * @param mixed|Int|String skuId 需要选中的skuId * @return {[type]} [description] */ initSeleted: function initSeleted(skuId) { var _this = this; var _loop = function _loop(item) { if (item[_this.skuName] === skuId) { Object.keys(item).forEach(function (subItem) { if (subItem !== _this.skuName) { _this.collection[subItem][item[subItem]].active = true; } }); return 'break'; } }; for (var _iterator = this.data, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var item = _ref; var _ret = _loop(item); if (_ret === 'break') break; } }, /** * 生成所有子集是否可选、库存状态 map */ buildResult: function buildResult(items) { var allKeys = this.getAttruites(items); for (var i = 0; i < allKeys.length; i++) { var curr = allKeys[i]; var sku = items[i].sku; var values = curr.split(this.spliter); var allSets = this.powerset(values); // 每个组合的子集 for (var j = 0; j < allSets.length; j++) { var set = allSets[j]; var key = set.join(this.spliter); if (this.sequenceMap[key]) { this.sequenceMap[key].skus.push(sku); } else { this.sequenceMap[key] = { skus: [sku] }; } } } }, // 幂集 powerset: function powerset(arr) { var ps = [[]]; for (var i = 0; i < arr.length; i++) { for (var j = 0, len = ps.length; j < len; j++) { ps.push(ps[j].concat(arr[i])); } } return ps; }, getAttruites: function getAttruites(arr) { var result = []; for (var i = 0; i < arr.length; i++) { result.push(arr[i].path); } return result; }, /** * 获取选中的信息 * @return Array */ getSelectedItem: function getSelectedItem() { var result = []; for (var attr in this.collection) { var attributeName = ''; for (var attribute in this.collection[attr]) { if (this.collection[attr][attribute].active === true) { attributeName = attribute; } } result.push(attributeName); } return result; }, /** * 更新所有属性状态 */ updateStatus: function updateStatus(selected) { for (var i = 0; i < this.attrNames.length; i++) { var key = this.attrNames[i], data = this.collection[key], copy = selected.slice(); for (var j in data) { var item = data[j].name; if (selected[i] === item) { continue; } copy[i] = item; var curr = this.trimSpliter(copy.join(this.spliter), this.spliter); this.collection[key][j].disabled = !this.sequenceMap[curr]; } } }, trimSpliter: function trimSpliter(str, spliter) { // ⊙abc⊙ => abc // ⊙a⊙⊙b⊙c⊙ => a⊙b⊙c var reLeft = new RegExp('^' + spliter + '+', 'g'); var reRight = new RegExp(spliter + '+$', 'g'); var reSpliter = new RegExp(spliter + '+', 'g'); return str.replace(reLeft, '').replace(reRight, '').replace(reSpliter, spliter); }, /** * 显示选中的信息 * @return */ showResult: function showResult() { var result = this.getSelectedItem(); var s = []; for (var i = 0; i < result.length; i++) { var item = result[i]; if (item) { s.push(item); } } if (s.length === this.attrNames.length) { var curr = this.sequenceMap[s.join(this.spliter)]; if (curr) { s = s.concat(curr.skus); this.selectSkuId = curr.skus[0]; this.$emit('input', this.selectSkuId); this.$emit('update', this.selectSkuId); } // this.message = s.join('\u3000-\u3000'); } }, /** * 点击事件处理 * @param key 点击的行 * @param value 点击的按钮的数据 */ handleActive: function handleActive(key, value) { if (value.active) { return false; } this.handleNormalClick(key, value); if (value.disabled === true) { this.handleDisableClick(key, value); } this.updateStatus(this.getSelectedItem()); this.showResult(); }, /** * 正常属性点击 * 同组其他置成activefalse */ handleNormalClick: function handleNormalClick(key, value) { for (var i in this.collection[key]) { if (i !== value.name) { this.collection[key][i].active = false; } else { this.collection[key][i].active = true; } } }, /** * 无效属性点击 * 其他组全部置成activefalse */ handleDisableClick: function handleDisableClick(key, value) { this.collection[key][value.name].disabled = false; // 清空高亮行的已选属性状态(因为更新的时候默认会跳过已选状态) for (var i in this.collection) { if (i !== key) { for (var x in this.collection[i]) { this.collection[i][x].active = false; } } } this.updateStatus(this.getSelectedItem()); } } }); // CONCATENATED MODULE: ./packages/sku/src/main.vue?vue&type=script&lang=js& /* harmony default export */ var src_mainvue_type_script_lang_js_ = (mainvue_type_script_lang_js_); // EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js var componentNormalizer = __webpack_require__(0); // CONCATENATED MODULE: ./packages/sku/src/main.vue /* normalize component */ var component = Object(componentNormalizer["a" /* default */])( src_mainvue_type_script_lang_js_, render, staticRenderFns, false, null, null, null ) /* hot reload */ if (false) { var api; } component.options.__file = "packages/sku/src/main.vue" /* harmony default export */ var main = (component.exports); // CONCATENATED MODULE: ./packages/sku/index.js /* istanbul ignore next */ main.install = function (Vue) { Vue.component(main.name, main); }; /* harmony default export */ var sku = __webpack_exports__["default"] = (main); /***/ }) /******/ });