UNPKG

ten-design-vue

Version:

ten-vue

913 lines (794 loc) 26.9 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 = 4); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { module.exports = require("./request"); /***/ }), /* 1 */ /***/ (function(module, exports) { module.exports = require("../button"); /***/ }), /* 2 */ /***/ (function(module, exports) { module.exports = require("../icon"); /***/ }), /* 3 */ /***/ (function(module, exports) { module.exports = require("./file-list"); /***/ }), /* 4 */ /***/ (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!./src/components/upload/upload.vue?vue&type=template&id=7ccd37c3& var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:_vm._class},[_c('input',{ref:"inputFile",staticClass:"ten-upload__input",attrs:{"type":"file","name":_vm.inputName,"multiple":_vm.multiple,"accept":_vm.accept},on:{"change":_vm.onInputFileChange}}),_c('div',_vm._g({class:_vm._uploadContanerClass},this._uploadContanerEvents),[_vm._t("default",function(){return [(_vm.listType==='text')?_c('ten-button',{staticClass:"ten-upload__trigger",attrs:{"icon":"upload"}},[_vm._v("\n 上传文件\n ")]):_vm._e(),_c('div',{staticClass:"ten-upload__trigger--picture-card"},[_c('ten-icon',{attrs:{"icon":"add"}})],1)]},{"dragOver":_vm.dragOver})],2),_vm._t("fileList",function(){return [(_vm.showFileList)?_c('ten-file-list',{staticClass:"ten-upload__file-list",attrs:{"list":_vm.fileList},on:{"remove":_vm.onRemoveFile,"preview":_vm.onPreviewFile}}):_vm._e()]},{"fileList":_vm.fileList})],2)} var staticRenderFns = [] // CONCATENATED MODULE: ./src/components/upload/upload.vue?vue&type=template&id=7ccd37c3& // EXTERNAL MODULE: external "./request" var external_request_ = __webpack_require__(0); var external_request_default = /*#__PURE__*/__webpack_require__.n(external_request_); // EXTERNAL MODULE: external "../button" var external_button_ = __webpack_require__(1); var external_button_default = /*#__PURE__*/__webpack_require__.n(external_button_); // EXTERNAL MODULE: external "../icon" var external_icon_ = __webpack_require__(2); var external_icon_default = /*#__PURE__*/__webpack_require__.n(external_icon_); // EXTERNAL MODULE: external "./file-list" var external_file_list_ = __webpack_require__(3); var external_file_list_default = /*#__PURE__*/__webpack_require__.n(external_file_list_); // CONCATENATED MODULE: ./node_modules/babel-loader/lib??ref--1!./node_modules/vue-loader/lib??vue-loader-options!./src/components/upload/upload.vue?vue&type=script&lang=js& function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // var uploadvue_type_script_lang_js_name = 'ten-upload'; var FILE_STATUS = { READY: 'ready', DONE: 'done', LOADING: 'loading', ERROR: 'error' }; /* harmony default export */ var uploadvue_type_script_lang_js_ = ({ name: uploadvue_type_script_lang_js_name, components: { TenButton: external_button_default.a, TenIcon: external_icon_default.a, TenFileList: external_file_list_default.a }, props: { /** * @model 文件列表 */ fileList: { type: Array, default: function _default() { return []; } }, /** * 是否禁用 */ disabled: Boolean, /** * 上传列表样式 * @member text | picture-card */ listType: { type: String, default: 'text' }, /** * 服务器接收到的文件名 */ inputName: { type: String, default: 'file' }, /** * 接收文件的服务器地址 */ url: { type: String }, /** * 限制上传的文件类型 */ accept: { type: String }, /** * 限制上传文件数,建议使用受控的形式传入 fileList 灵活控制 */ limit: { type: Number }, /** * 使用拖拽模式 */ drag: { type: Boolean, default: false }, /** * 拖拽模式下,只使用拖拽触发上传,点击不触发 */ onlyDrag: Boolean, /** * 是否多选 */ multiple: { type: Boolean, default: false }, /** * 设置请求头信息 */ headers: { type: Object, default: function _default() { return {}; } }, /** * 带 cookie 凭证信息 */ withCredentials: Boolean, /** * 设置请求的其他参数 */ formData: { type: Object, default: function _default() { return {}; } }, /** * 自定义上传方法 */ request: Function, /** * 是否显示 fileList */ showFileList: { type: Boolean, default: true }, /** * 上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传。 * 支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传, * resolve 时开始上传( resolve 传入 File 或 Blob 对象则上传 resolve 传入对象) */ beforeUpload: Function, /** * 删除回调,如果回调返回,如果提供此参数且回调返回假值则不删除 * 如不提供此参数或回调返回真值则删除 */ onRemove: Function, /** * 文件列表点击回调可用于实现预览或者下载 */ onPreview: Function, // will be discard /** * @ignore */ onStart: Function, /** * @ignore */ onProgress: Function, /** * @ignore */ onSuccess: Function, /** * @ignore */ onError: Function, /** * @ignore */ onChange: Function, /** * 是否自动上传 */ autoUpload: { type: Boolean, default: true }, /** * 上传请求的 http method */ method: { type: String, default: 'POST' } }, data: function data() { return { dragOver: false }; }, computed: { _class: function _class() { return ['ten-upload', { 'ten-upload--disabled': this.disabled, 'ten-upload--drag': this.drag, 'ten-upload--picture-card': this.listType === 'picture-card' }]; }, _uploadContanerClass: function _uploadContanerClass() { return ['ten-upload__select-container', { 'ten-upload__select-container--dragover': this.dragOver }]; }, _uploadContanerEvents: function _uploadContanerEvents() { var events = {}; if (this.disabled) { return events; } if (this.drag) { events.dragover = this.onDragOver; events.dragleave = this.onDragLeave; events.drop = this.onDrop; if (!this.onlyDrag) { events.click = this.onSelectFile; } } else { events.click = this.onSelectFile; } return events; } }, watch: { fileList: { handler: function handler(fileList) { var _this = this; this.updateUploadList(); fileList.forEach(function (fileObj) { if (_this.autoUpload && fileObj.key && fileObj.status === FILE_STATUS.READY && !_this.uploadList.find(function (uploadItem) { return uploadItem.key === fileObj.key; })) { _this.uploadFile(fileObj); } }); } } }, created: function created() { this.uploadList = []; }, methods: { addFiles: function addFiles(files) { var accept = this.accept, beforeUpload = this.beforeUpload; var newFiles = this.checkAccepts(accept, files); if (this.limit) { var surplus = Math.max(this.limit - this.uploadList.length, 0); if (surplus < newFiles.length) { var exceedFiles = newFiles.slice(surplus); newFiles = newFiles.slice(0, surplus); /** * 设置 limit 之后,文件超出限制事件,文件超出拒绝添加到 fileList * 如需实现先进先出等个性效果,建议通过自行控制 fileList 实现(不设置 limit) * @param {Array} exceedFiles */ this.$emit('exceed', exceedFiles); } } if (newFiles.length === 0) return; this.uploadFiles(newFiles.map(function (file) { return { file: file, result: beforeUpload ? beforeUpload(file) : undefined }; })); }, checkAccepts: function checkAccepts(accept, files) { if (!accept) return Array.from(files); var newFiles = []; var rejectedFiles = []; var acceptList = accept.split(','); for (var i = 0; i < files.length; i++) { var file = files[i]; var accepted = false; for (var _i = 0; _i < acceptList.length; _i++) { var type = acceptList[_i]; var reg = new RegExp("".concat(type.trim().replace('.', '\\.').replace('*', '.+'), "$"), 'i'); if (reg.test(file.type) || reg.test(file.name)) { newFiles.push(file); accepted = true; break; } } !accepted && rejectedFiles.push(file); } if (rejectedFiles.length > 0) { /** * 未通过 accept 检查事件 * @param { Array } rejectedFiles */ this.$emit('unaccepted', rejectedFiles); } return newFiles; }, uploadFiles: function uploadFiles(files) { var _this2 = this; var newFileObjs = []; var _loop = function _loop(i) { var file = files[i].file; var r = files[i].result; if (_typeof(r) === 'object' && typeof r.then === 'function') { var then = r.then; if (typeof then === 'function') { then.call(r, function (resolveFile) { setTimeout(function () { if (!resolveFile) return; var isFile = resolveFile instanceof File; _this2.updateFilelist([{ key: _this2.getNewFileKey(), name: file.name, status: FILE_STATUS.READY, file: isFile ? resolveFile : file }]); }); }).catch(function () {}); } } else if (r || typeof r === 'undefined') { var fileObj = { key: _this2.getNewFileKey(), name: file.name, status: FILE_STATUS.READY, file: file }; newFileObjs.push(fileObj); } }; for (var i = 0; i < files.length; i++) { _loop(i); } if (newFileObjs.length > 0) { this.updateFilelist(newFileObjs); } }, uploadFile: function uploadFile(fileObj) { var inputName = this.inputName, url = this.url, headers = this.headers, withCredentials = this.withCredentials, formData = this.formData, method = this.method; var key = fileObj.key; var requestProps = { key: key, method: method, file: fileObj.file, name: inputName, url: url, headers: headers, withCredentials: withCredentials, formData: formData, onStart: this.onUploadStart, onError: this.onUploadError, onSuccess: this.onUploadSuccess, onProgress: this.onUploadProgress }; var xhr = this.request ? this.request(requestProps) : external_request_default()(requestProps); this.uploadList.push({ key: key, xhr: xhr }); }, getNewFileKey: function () { var count = 0; return function () { var key = "".concat(uploadvue_type_script_lang_js_name, "-new-").concat(count); count += 1; return key; }; }(), getFileObjByKey: function getFileObjByKey(key) { return this.fileList.find(function (item) { return item.key === key; }); }, fireChange: function fireChange(fileList) { this.onChange && this.onChange(fileList); /** * 文件列表更新事件 * @param {Array} fileList */ this.$emit('change', fileList); }, updateFilelist: function updateFilelist(fileObjsToUpdate) { var _this3 = this; var newFileList = _toConsumableArray(this.fileList); fileObjsToUpdate.forEach(function (fileObj) { var existFileObj = _this3.fileList.find(function (item) { return item.key === fileObj.key; }); if (existFileObj) { var index = _this3.fileList.indexOf(existFileObj); newFileList.splice(index, 1, fileObj); } else { newFileList.push(fileObj); } }); this.fireChange(newFileList); return newFileList; }, updateUploadList: function updateUploadList() { var _this4 = this; var _loop2 = function _loop2(i) { var _this4$uploadList$i = _this4.uploadList[i], key = _this4$uploadList$i.key, xhr = _this4$uploadList$i.xhr; if (!_this4.fileList.find(function (fileObj) { return fileObj.key === key; })) { xhr && xhr.abort && xhr.abort(); _this4.uploadList.splice(i, 1); } }; for (var i = this.uploadList.length - 1; i >= 0; i--) { _loop2(i); } }, onInputFileChange: function onInputFileChange(e) { var target = e.target; this.addFiles(target.files); target.value = ''; }, onSelectFile: function onSelectFile() { this.$refs.inputFile.click(); }, onDragOver: function onDragOver(e) { e.preventDefault(); this.dragOver = true; }, onDragLeave: function onDragLeave(e) { e.preventDefault(); this.dragOver = false; }, onDrop: function onDrop(e) { e.preventDefault(); this.dragOver = false; this.addFiles(e.dataTransfer.files); }, onRemoveFile: function onRemoveFile(fileObj, idx) { if (this.disabled) return; if (this.onRemove && !this.onRemove(fileObj)) return; var newFileList = _toConsumableArray(this.fileList); newFileList.splice(idx, 1); this.fireChange(newFileList); }, onPreviewFile: function onPreviewFile(fileObj) { /** * 用户点击文件事件,可用于处理预览或者下载 * @param {Object} fileObj */ this.$emit('preview', fileObj); }, onUploadStart: function onUploadStart(key, event) { var fileObj = this.getFileObjByKey(key); if (!fileObj) return; var newFileObj = _objectSpread(_objectSpread({}, fileObj), {}, { status: FILE_STATUS.LOADING, progress: 0, event: event }); var newFileList = this.updateFilelist([newFileObj]); /** * 开始上传事件 * @param {Object} fileObj * @param {Array} fileList */ this.$emit('start', newFileObj, newFileList); this.onStart && this.onStart(newFileObj, newFileList); }, onUploadError: function onUploadError(key, event) { var fileObj = this.getFileObjByKey(key); if (!fileObj) return; var newFileObj = _objectSpread(_objectSpread({}, fileObj), {}, { status: FILE_STATUS.ERROR, progress: 0, event: event }); var newFileList = this.updateFilelist([newFileObj]); /** * 上传出错事件 * @param {Object} fileObj * @param {Array} fileList */ this.$emit('error', newFileObj, newFileList); this.onError && this.onError(newFileObj, newFileList); }, onUploadSuccess: function onUploadSuccess(key, event) { var fileObj = this.getFileObjByKey(key); if (!fileObj) return; var responseText = event.target.response || event.target.responseText; var response = responseText; if (responseText) { try { response = JSON.parse(responseText); } catch (e) {} } var newFileObj = _objectSpread(_objectSpread({}, fileObj), {}, { status: FILE_STATUS.DONE, progress: 1, response: response, event: event }); var newFileList = this.updateFilelist([newFileObj]); /** * 上传成功事件 * @param {Object} fileObj * @param {Array} fileList */ this.$emit('success', newFileObj, newFileList); this.onSuccess && this.onSuccess(newFileObj, newFileList); }, onUploadProgress: function onUploadProgress(key, event) { var progress = event.loaded / event.total || 0; var fileObj = this.getFileObjByKey(key); if (!fileObj) return; var newFileObj = _objectSpread(_objectSpread({}, fileObj), {}, { status: FILE_STATUS.LOADING, progress: progress, event: event }); var newFileList = this.updateFilelist([newFileObj]); /** * 上传进度更新事件 * @param {Object} fileObj * @param {Array} fileList */ this.$emit('progress', newFileObj, newFileList); this.onProgress && this.onProgress(newFileObj, newFileList); } } }); // CONCATENATED MODULE: ./src/components/upload/upload.vue?vue&type=script&lang=js& /* harmony default export */ var upload_uploadvue_type_script_lang_js_ = (uploadvue_type_script_lang_js_); // CONCATENATED MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js /* 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 } } // CONCATENATED MODULE: ./src/components/upload/upload.vue /* normalize component */ var component = normalizeComponent( upload_uploadvue_type_script_lang_js_, render, staticRenderFns, false, null, null, null ) /* harmony default export */ var upload = __webpack_exports__["default"] = (component.exports); /***/ }) /******/ ]);