/** * @fileoverview 二手市场图片上传主题 * @author 紫英(橘子) **/ KISSY.add('gallery/form/1.3/uploader/themes/ershouUploader/index', function (S, Node, Theme, Message, SetMainPic) { var EMPTY = '', $ = Node.all, LOG_PRE = '[Theme-ershou] '; /** * @name ErshouUploader * @class 二手市场图片上传主题 * @constructor * @extends Theme * @requires Theme * @requires ProgressBar * @author 紫英(橘子) */ function ErshouUploader(config) { var self = this; //调用父类构造函数 ErshouUploader.superclass.constructor.call(self, config); } S.extend(ErshouUploader, Theme, /** @lends ErshouUploader.prototype*/ { /** * 在上传组件运行完毕后执行的方法 * 本例主要是用来绑定事件,初始化一些附加模块 * @param {Uploader} uploader */ afterUploaderRender: function(uploader){ var self = this, Plugins = self.get('oPlugin'), queue = uploader.get('queue'), button = uploader.get('button'), auth = uploader.get('auth'), queueTarget = self.get('queueTarget'); // 初始化成功后将默认的input隐藏掉。这个默认的input是用来防止uploader无法初始化成功的fallback方案 var elemButtonTarget = button.get('target'), elemTempFileInput = $('.original-file-input', elemButtonTarget); $(elemTempFileInput).remove(); S.log(LOG_PRE + 'old input removed.'); // 取得最大上传数量 var maxFileAllowed = 5; if(auth){ maxFileAllowed = auth.getRule('max'); }else{ S.log(LOG_PRE + 'Cannot get auth'); } self.set('maxFileAllowed', maxFileAllowed); // 初始化插件+附加模块 var preview = new Plugins.preview(), message = new Message({ 'msgContainer': self.get('msgContainer'), 'successMsgCls': self.get('successMsgCls'), 'hintMsgCls': self.get('hintMsgCls'), 'errorMsgCls': self.get('errorMsgCls') }), setMainPic = new SetMainPic(self.get('mainPicInput'), self.get('queueTarget')); self.set('message', message); self.set('preview', preview); self.set('setMainPic', setMainPic); // 如果是ajax上传模式,添加一个class if(uploader.get('type') == 'ajax'){ S.log(LOG_PRE + 'advance queue'); $(self.get('queueTarget')).addClass('advance-queue'); } // 设置主图 $(queueTarget).delegate('click', '.J_SetMainPic', function(e){ e.preventDefault(); var setMainPicBtn = e.currentTarget, // fileid = $(setMainPicBtn).attr('data-file-id'), // fileIndex = queue.getFileIndex(fileid), // file = queue.getFile(fileIndex), curQueueItem = $(setMainPicBtn).parent('li'); setMainPic.setMainPic(curQueueItem); }); // 删除图片 $(queueTarget).delegate('click', '.J_DeleltePic', function(e){ e.preventDefault(); var delBtn = e.currentTarget, fileid = $(delBtn).attr('data-file-id'); queue.remove(fileid); }); return true; queue.on('restore', function(e){ var curMainPicUrl = setMainPic.getMainPicUrl(), successFiles = queue.getFiles('success'), queueLength = successFiles ? parseInt(successFiles.length, '10') : 0 + parseInt(e.filesData.length, '10'); setMainPic.setMainPic(curMainPicUrl); if(queueLength){ message.send(S.substitute(leftMsg, { 'left': maxFileAllowed[0] - queueLength }), 'hint'); } }); queue.on('add',function(ev){ var elemImg = $('.J_ItemPic', ev.target), successFiles = queue.getFiles('success'); preview.preview(ev.file.input, elemImg); S.log(LOG_PRE + 'preview done for file: ' + ev.file.id); if(successFiles.length + 1){ message.send(S.substitute(leftMsg, { 'left': maxFileAllowed[0] - successFiles.length - 1 }), 'hint'); } }); queue.on('remove', function(e){ var successFiles = queue.getFiles('success'), msg; setMainPic.setMainPic(); if(successFiles.length){ msg = S.substitute(leftMsg, { 'left': maxFileAllowed - successFiles.length }); }else{ msg = S.substitute(defaultMsg, { 'max': maxFileAllowed }); } message.send(msg, 'hint'); }); uploader.on('success', function(e){ // debugger; // var successFiles = queue.getFiles('success'), // successFilesLength = successFiles ? successFiles.length : 0; var file = e.file, curQueueItem = file.target, serverUrl = file.sUrl; $(curQueueItem).attr('data-url', serverUrl); setMainPic.setMainPic(); // message.send(); }); }, /** * 更新文件数目 */ _updateCount: function(){ var self = this, queue = self.get('queue'), successFiles = queue.getFiles('success'), maxFileAllowed = self.get('maxFileAllowed')[0], message = self.get('message'), defaultMsg = self.get('defaultMsg'), leftMsg = self.get('leftMsg'), msg; if(successFiles.length){ msg = S.substitute(leftMsg, { 'left': maxFileAllowed - successFiles.length }); }else{ msg = S.substitute(defaultMsg, { 'max': maxFileAllowed }); } message.send(msg, 'hint'); S.log(LOG_PRE + 'file count updated. Message sent.') // if(successFiles.length + 1){ // var leftNum = maxFileAllowed[0] - successFiles.length - 1; // message.sendLeftMsg(leftNum); // } }, /** * 向队列添加完文件后触发的回调函数(在add事件前触发) * @param {Number} index 文件索引值 * @param {Object} file 文件数据 * @return {Object} file */ _addCallback: function(index, file){ var self = this, queue = self.get('queue'), queueItem = self._appendFileDom(file); //将状态层容器写入到file数据 queue.updateFile(index, { target: queueItem }); //更换文件状态为等待 queue.fileStatus(index, 'waiting'); self.displayFile(true, queueItem); // 更新剩余文件数量 self._updateCount(); return queue.getFile(index); }, /** * 文件处于等待上传状态时触发 * 进行图片预览 */ _waitingHandler:function (ev) { var self = this, preview = self.get('preview'), file = ev.file, queueItem = file.target, elemImg = $('.J_ItemPic', queueItem); preview && preview.preview(file.input, elemImg); S.log(LOG_PRE + 'preview done for file: ' + ev.file.id); // 添加waiting状态 $(queueItem).addClass('upload-waiting'); }, /** * 在完成文件dom插入后执行的方法 * @param {Object} ev 类似{index:0,file:{},target:$target} */ _addHandler: function(ev){ S.log(LOG_PRE + 'add done.'); }, /** * 文件处于开始上传状态时触发 */ _startHandler: function(ev){ var self = this, file = ev.file, queueItem = file.target; $(queueItem).replaceClass('upload-waiting', 'uploading'); S.log(LOG_PRE + 'start upload'); }, /** * 文件处于上传成功状态时触发 */ _successHandler: function(ev){ var self = this, file = ev.file, queueItem = file.target, setMainPic = self.get('setMainPic'); $(queueItem).replaceClass('uploading', 'upload-done').attr('data-url', file.result.data.url); setMainPic.setMainPic(); // 更新剩余文件数量 self._updateCount(); }, /** * 删除图片后触发 */ _removeFileHandler: function(ev){ var self = this, file = ev.file, queueItem = file.target; // 更新剩余文件数量 self._updateCount(); $(queueItem).remove(); S.log(LOG_PRE + 'file deleted.'); } }, { ATTRS: /** @lends ErshouUploader.prototype*/ { /** * 主题名 * @type String * @default "ershouUploader" */ name: { value: 'ershouUploader' }, /** * css模块路径 * @type String * @default "gallery/form/1.3/uploader/themes/ershouUploader/style.css" */ cssUrl: { value: 'gallery/form/1.3/uploader/themes/ershouUploader/style.css' }, /** * 队列使用的模板 * @type String */ fileTpl:{ value: ['
  • ', '
    ', '
    ', '', '
    ', '
    ', '

    上传中,请稍候

    ', '

    上传成功!

    ', '

    上传失败

    请重新尝试!

    ', '
    等待上传,请稍候
    ', '
    ', '
    ', '设为主图', '删除', '
    ', '
    ', '
  • '].join('') }, /** * 需要加载的插件,需要手动实例化 * @type Array */ plugins: { value: [ 'preview', 'progressBar' ] }, /** * 显示错误消息的容器id * @type String */ 'msgContainer': { value: '#J_MsgBoxUpload' }, /** * 默认的提示消息 * @type String */ 'defaultMsg': { value: '最多上传{max}张照片,每张图片小于5M' }, /** * 剩余多少张的消息 * @type String */ 'leftMsg': { value: '还可以上传{left}张图片,每张小于5M。主图将在搜索结果中展示,请认真设置。' }, /** * 成功消息的class * @type String */ 'successMsgCls': { value: 'msg-success' }, /** * 提示消息的class * @type String */ 'hintMsgCls': { value: 'msg-hint' }, /** * 错误消息的class * @type String */ 'errorMsgCls': { value: 'msg-error' }, /** * 设置主图的input,如果不存在,则不初始化设置主图功能 * @type String */ 'mainPicInput': { value: '#J_MainPicUrl' } } }); return ErshouUploader; }, { requires:[ 'node', '../../theme', './message', './setMainPic' ] });