501 lines
18 KiB
JavaScript
501 lines
18 KiB
JavaScript
|
;(function ($, window, document, undefined) {
|
|||
|
|
|||
|
/**
|
|||
|
* 文件库模块
|
|||
|
* @param trigger
|
|||
|
* @param options
|
|||
|
* @constructor
|
|||
|
*/
|
|||
|
function FileLibrary(trigger, options) {
|
|||
|
// 配置项
|
|||
|
var defaults = {
|
|||
|
type: 'image',
|
|||
|
layerId: 'file-library'
|
|||
|
, layerSkin: 'file-library'
|
|||
|
};
|
|||
|
this.options = $.extend({}, defaults, options);
|
|||
|
// 触发对象
|
|||
|
this.$trigger = trigger;
|
|||
|
this.$touch = null; // 当前触发元素
|
|||
|
// 容器元素
|
|||
|
this.$element = null;
|
|||
|
// 初始化对象事件
|
|||
|
this.init();
|
|||
|
}
|
|||
|
|
|||
|
FileLibrary.prototype = {
|
|||
|
|
|||
|
data: {
|
|||
|
selectedList: []
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 初始化
|
|||
|
*/
|
|||
|
init: function () {
|
|||
|
var _this = this;
|
|||
|
// 打开文件库事件
|
|||
|
_this.triggerEvent();
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 打开文件库事件
|
|||
|
*/
|
|||
|
triggerEvent: function () {
|
|||
|
var _this = this;
|
|||
|
if (_this.$trigger !== false) {
|
|||
|
// 点击开启文件库弹窗
|
|||
|
_this.$trigger.unbind().click(function () {
|
|||
|
_this.$touch = $(this);
|
|||
|
_this.showLibraryModal();
|
|||
|
});
|
|||
|
} else {
|
|||
|
_this.showLibraryModal();
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 显示文件库弹窗
|
|||
|
*/
|
|||
|
showLibraryModal: function () {
|
|||
|
var _this = this;
|
|||
|
_this.getJsonData({group_id: -1}, function (data) {
|
|||
|
data.is_default = true;
|
|||
|
// 捕获页
|
|||
|
layer.open({
|
|||
|
type: 1
|
|||
|
, id: _this.options.layerId
|
|||
|
, title: '图片库'
|
|||
|
, skin: _this.options.layerSkin
|
|||
|
, area: '840px'
|
|||
|
, offset: 'auto'
|
|||
|
, anim: 1
|
|||
|
, closeBtn: 1
|
|||
|
, shade: 0.3
|
|||
|
, btn: ['确定', '取消']
|
|||
|
, content: template('tpl-file-library', data)
|
|||
|
, success: function (layero) {
|
|||
|
// 初始化文件库弹窗
|
|||
|
_this.initModal(layero);
|
|||
|
}
|
|||
|
, yes: function (index) {
|
|||
|
// 确认回调
|
|||
|
_this.done();
|
|||
|
layer.close(index);
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 初始化文件库弹窗
|
|||
|
*/
|
|||
|
initModal: function (element) {
|
|||
|
var _this = this;
|
|||
|
_this.$element = element;
|
|||
|
// 清空选中的文件
|
|||
|
_this.onEmptySelected();
|
|||
|
// 注册分组下拉选择组件
|
|||
|
_this.selectDropdown();
|
|||
|
// 注册分类切换事件
|
|||
|
_this.switchClassEvent();
|
|||
|
// 注册文件点击选中事件
|
|||
|
_this.selectFilesEvent();
|
|||
|
// 新增分组事件
|
|||
|
_this.addGroupEvent();
|
|||
|
// 编辑分组事件
|
|||
|
_this.editGroupEvent();
|
|||
|
// 删除分组事件
|
|||
|
_this.deleteGroupEvent();
|
|||
|
// 注册文件上传事件
|
|||
|
_this.uploadImagesEvent();
|
|||
|
// 注册文件删除事件
|
|||
|
_this.deleteFilesEvent();
|
|||
|
// 注册文件移动事件
|
|||
|
_this.moveFilesEvent();
|
|||
|
// 注册文件列表分页事件
|
|||
|
_this.fileListPage();
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 清空选中的文件
|
|||
|
*/
|
|||
|
onEmptySelected: function () {
|
|||
|
this.data.selectedList = [];
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 注册文件列表分页事件
|
|||
|
*/
|
|||
|
fileListPage: function () {
|
|||
|
var _this = this;
|
|||
|
_this.$element.find('#file-list-body').on('click', '.switch-page', function () {
|
|||
|
var page = $(this).data('page');
|
|||
|
_this.renderFileList(page);
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 文件移动事件
|
|||
|
*/
|
|||
|
moveFilesEvent: function () {
|
|||
|
var _this = this
|
|||
|
, $groupSelect = _this.$element.find('.group-select');
|
|||
|
// 绑定文件选中事件
|
|||
|
$groupSelect.on('click', '.move-file-group', function () {
|
|||
|
$groupSelect.dropdown('close');
|
|||
|
var groupId = $(this).data('group-id')
|
|||
|
, fileIds = _this.getSelectedFileIds();
|
|||
|
if (fileIds.length === 0) {
|
|||
|
layer.msg('您还没有选择任何文件~', {offset: 't', anim: 6});
|
|||
|
return false;
|
|||
|
}
|
|||
|
layer.confirm('确定移动选中的文件吗?', {title: '友情提示'}, function (index) {
|
|||
|
var load = layer.load();
|
|||
|
$.post(STORE_URL + '/upload.library/moveFiles', {
|
|||
|
group_id: groupId
|
|||
|
, fileIds: fileIds
|
|||
|
}, function (result) {
|
|||
|
layer.msg(result.msg);
|
|||
|
if (result.code === 1) {
|
|||
|
_this.renderFileList();
|
|||
|
}
|
|||
|
layer.close(load);
|
|||
|
});
|
|||
|
layer.close(index);
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 删除选中的文件
|
|||
|
*/
|
|||
|
deleteFilesEvent: function () {
|
|||
|
var _this = this;
|
|||
|
_this.$element.on('click', '.file-delete', function () {
|
|||
|
var fileIds = _this.getSelectedFileIds();
|
|||
|
if (fileIds.length === 0) {
|
|||
|
layer.msg('您还没有选择任何文件~', {offset: 't', anim: 6});
|
|||
|
return;
|
|||
|
}
|
|||
|
layer.confirm('确定删除选中的文件吗?', {title: '友情提示'}, function (index) {
|
|||
|
var load = layer.load();
|
|||
|
$.post(STORE_URL + '/upload.library/deleteFiles', {
|
|||
|
fileIds: fileIds
|
|||
|
}, function (result) {
|
|||
|
layer.close(load);
|
|||
|
if (result.code === 1) {
|
|||
|
_this.renderFileList();
|
|||
|
}
|
|||
|
});
|
|||
|
layer.close(index);
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 文件上传 (多文件)
|
|||
|
*/
|
|||
|
uploadImagesEvent: function () {
|
|||
|
var _this = this;
|
|||
|
var loadIndex = null;
|
|||
|
// 文件大小
|
|||
|
var maxSize = 2;
|
|||
|
// 初始化Web Uploader
|
|||
|
var uploader = WebUploader.create({
|
|||
|
// 选完文件后,是否自动上传。
|
|||
|
auto: true,
|
|||
|
// 文件接收服务端。
|
|||
|
server: STORE_URL + '/upload/image',
|
|||
|
// 选择文件的按钮。可选。
|
|||
|
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
|
|||
|
pick: {
|
|||
|
id: '.j-upload',
|
|||
|
multiple: true
|
|||
|
},
|
|||
|
// 文件上传域的name
|
|||
|
fileVal: 'iFile',
|
|||
|
// 图片上传前不进行压缩
|
|||
|
compress: false,
|
|||
|
// 允许重复
|
|||
|
duplicate: true,
|
|||
|
// 文件总数量
|
|||
|
// fileNumLimit: 10,
|
|||
|
// 文件大小2m => 2097152
|
|||
|
fileSingleSizeLimit: maxSize * 1024 * 1024,
|
|||
|
// 只允许选择图片文件。
|
|||
|
accept: {
|
|||
|
title: 'Images',
|
|||
|
extensions: 'gif,jpg,jpeg,bmp,png',
|
|||
|
mimeTypes: 'image/*'
|
|||
|
},
|
|||
|
// 文件上传header扩展
|
|||
|
headers: {
|
|||
|
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
|||
|
'X-Requested-With': 'XMLHttpRequest'
|
|||
|
}
|
|||
|
});
|
|||
|
// 验证大小
|
|||
|
uploader.on('error', function (type) {
|
|||
|
if (type === 'F_DUPLICATE') {
|
|||
|
console.log('请不要重复选择文件!');
|
|||
|
} else if (type === 'F_EXCEED_SIZE') {
|
|||
|
alert('文件大小不可超过' + maxSize + 'm 哦!换个小点的文件吧!');
|
|||
|
}
|
|||
|
});
|
|||
|
// 文件上传前触发,添加附带参数
|
|||
|
uploader.on('uploadBeforeSend', function (obj, data) {
|
|||
|
data.group_id = _this.getCurrentGroupId();
|
|||
|
});
|
|||
|
// 文件上传成功,给item添加成功class, 用样式标记上传成功。
|
|||
|
uploader.on('uploadSuccess', function (file, response) {
|
|||
|
if (response.code === 1) {
|
|||
|
var $list = _this.$element.find('ul.file-list-item');
|
|||
|
$list.prepend(template('tpl-file-list-item', [response.data]));
|
|||
|
} else {
|
|||
|
uploader.uploadError(file, response);
|
|||
|
}
|
|||
|
});
|
|||
|
// 监听文件上传失败
|
|||
|
uploader.on('uploadError', function (file, reason) {
|
|||
|
uploader.uploadError(file, reason);
|
|||
|
});
|
|||
|
// 文件上传失败回调函数
|
|||
|
uploader.uploadError = function (file, reason) {
|
|||
|
layer.msg(reason.msg, {anim: 6});
|
|||
|
};
|
|||
|
// 文件开始上传
|
|||
|
uploader.on('startUpload', function () {
|
|||
|
loadIndex = layer.load();
|
|||
|
});
|
|||
|
// 文件上传结束
|
|||
|
uploader.on('uploadFinished', function () {
|
|||
|
layer.close(loadIndex);
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 新增分组事件
|
|||
|
*/
|
|||
|
addGroupEvent: function () {
|
|||
|
var _this = this
|
|||
|
, $groupList = _this.$element.find('.file-group > ul');
|
|||
|
_this.$element.on('click', '.group-add', function () {
|
|||
|
layer.prompt({title: '请输入新分组名称'}, function (value, index) {
|
|||
|
var load = layer.load();
|
|||
|
$.post(STORE_URL + '/upload.library/addGroup', {
|
|||
|
group_name: value,
|
|||
|
group_type: _this.options.type
|
|||
|
}, function (result) {
|
|||
|
layer.msg(result.msg);
|
|||
|
if (result.code === 1) {
|
|||
|
$groupList.append(template('tpl-group-item', result.data));
|
|||
|
var $groupSelectList = _this.$element.find('.group-select > .group-list');
|
|||
|
$groupSelectList.append(
|
|||
|
'<li>' +
|
|||
|
' <a class="move-file-group" data-group-id="' + result.data.group_id + '"' +
|
|||
|
' href="javascript:void(0);">' + result.data.group_name + '</a>' +
|
|||
|
'</li>'
|
|||
|
);
|
|||
|
}
|
|||
|
layer.close(load);
|
|||
|
});
|
|||
|
layer.close(index);
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 编辑分组事件
|
|||
|
*/
|
|||
|
editGroupEvent: function () {
|
|||
|
var _this = this;
|
|||
|
_this.$element.find('.file-group').on('click', '.group-edit', function () {
|
|||
|
var $li = $(this).parent()
|
|||
|
, group_id = $li.data('group-id');
|
|||
|
layer.prompt({title: '修改分组名称', value: $li.attr('title')}, function (value, index) {
|
|||
|
var load = layer.load();
|
|||
|
$.post(STORE_URL + '/upload.library/editGroup', {
|
|||
|
group_id: group_id
|
|||
|
, group_name: value
|
|||
|
}, function (result) {
|
|||
|
layer.msg(result.msg);
|
|||
|
if (result.code === 1) {
|
|||
|
$li.attr('title', value).find('.group-name').text(value);
|
|||
|
var $groupSelectList = _this.$element.find('.group-select > .group-list');
|
|||
|
$groupSelectList.find('[data-group-id="' + group_id + '"]').text(value);
|
|||
|
}
|
|||
|
layer.close(load);
|
|||
|
});
|
|||
|
layer.close(index);
|
|||
|
});
|
|||
|
return false;
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 删除分组事件
|
|||
|
*/
|
|||
|
deleteGroupEvent: function () {
|
|||
|
var _this = this;
|
|||
|
_this.$element.find('.file-group').on('click', '.group-delete', function () {
|
|||
|
var $li = $(this).parent()
|
|||
|
, group_id = $li.data('group-id');
|
|||
|
layer.confirm('确定删除该分组吗?', {title: '友情提示'}, function (index) {
|
|||
|
var load = layer.load();
|
|||
|
$.post(STORE_URL + '/upload.library/deleteGroup', {
|
|||
|
group_id: group_id
|
|||
|
}, function (result) {
|
|||
|
layer.msg(result.msg);
|
|||
|
if (result.code === 1) {
|
|||
|
$li.remove();
|
|||
|
var $groupSelectList = _this.$element.find('.group-select > .group-list');
|
|||
|
$groupSelectList.find('[data-group-id="' + group_id + '"]').remove();
|
|||
|
}
|
|||
|
layer.close(load);
|
|||
|
});
|
|||
|
layer.close(index);
|
|||
|
});
|
|||
|
return false;
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 注册文件选中事件
|
|||
|
*/
|
|||
|
selectFilesEvent: function () {
|
|||
|
var _this = this;
|
|||
|
// 绑定文件选中事件
|
|||
|
_this.$element.find('#file-list-body').on('click', '.file-list-item li', function () {
|
|||
|
var $this = $(this)
|
|||
|
, data = {
|
|||
|
file_id: $this.data('file-id')
|
|||
|
, file_path: $this.data('file-path')
|
|||
|
}
|
|||
|
, selectedList = _this.data.selectedList
|
|||
|
, index = $.arrayFilterMultiple(selectedList, 'file_id', data.file_id);
|
|||
|
index === false ? selectedList.push(data) : selectedList.splice(index, 1);
|
|||
|
// 选中状态
|
|||
|
$this.toggleClass('active');
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 分类切换事件
|
|||
|
*/
|
|||
|
switchClassEvent: function () {
|
|||
|
var _this = this;
|
|||
|
// 注册分类切换事件
|
|||
|
_this.$element.find('.file-group').on('click', 'li', function () {
|
|||
|
var $this = $(this);
|
|||
|
// 切换选中状态
|
|||
|
$this.addClass('active').siblings('.active').removeClass('active');
|
|||
|
// 重新渲染文件列表
|
|||
|
_this.renderFileList();
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 注册分组下拉选择组件
|
|||
|
*/
|
|||
|
selectDropdown: function () {
|
|||
|
this.$element.find('.group-select').dropdown();
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取文件库列表数据
|
|||
|
* @param params
|
|||
|
* @param success
|
|||
|
*/
|
|||
|
getJsonData: function (params, success) {
|
|||
|
var loadIndex = layer.load();
|
|||
|
typeof params === 'function' && (success = params);
|
|||
|
// 获取文件库列表
|
|||
|
$.getJSON(STORE_URL + '/upload.library/fileList', params, function (result) {
|
|||
|
layer.close(loadIndex);
|
|||
|
if (result.code === 1) {
|
|||
|
typeof success === 'function' && success(result.data);
|
|||
|
} else {
|
|||
|
layer.msg(result.msg, {anim: 6});
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 重新渲染文件列表
|
|||
|
* @param page
|
|||
|
*/
|
|||
|
renderFileList: function (page) {
|
|||
|
var _this = this
|
|||
|
, groupId = this.getCurrentGroupId();
|
|||
|
// 重新渲染文件列表
|
|||
|
_this.getJsonData({group_id: groupId, page: page || 1}, function (data) {
|
|||
|
_this.$element.find('#file-list-body').html(template('tpl-file-list', data['file_list']));
|
|||
|
});
|
|||
|
// 清空选中的文件
|
|||
|
_this.onEmptySelected();
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取选中的文件列表
|
|||
|
* @returns {Array}
|
|||
|
*/
|
|||
|
getSelectedFiles: function () {
|
|||
|
// var selectedList = [];
|
|||
|
// this.$element.find('.file-list-item > li.active').each(function (index) {
|
|||
|
// var $this = $(this);
|
|||
|
// selectedList[index] = {
|
|||
|
// file_id: $this.data('file-id')
|
|||
|
// , file_path: $this.data('file-path')
|
|||
|
// };
|
|||
|
// });
|
|||
|
// return selectedList;
|
|||
|
|
|||
|
return this.data.selectedList;
|
|||
|
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取选中的文件的ID集
|
|||
|
* @returns {Array}
|
|||
|
*/
|
|||
|
getSelectedFileIds: function () {
|
|||
|
var fileList = this.getSelectedFiles();
|
|||
|
var data = [];
|
|||
|
fileList.forEach(function (item) {
|
|||
|
data.push(item.file_id);
|
|||
|
});
|
|||
|
return data;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取当前分组id
|
|||
|
* @returns {*}
|
|||
|
*/
|
|||
|
getCurrentGroupId: function () {
|
|||
|
return this.$element.find('.file-group > ul > li.active').data('group-id');
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 确认回调
|
|||
|
*/
|
|||
|
done: function () {
|
|||
|
var selectedList = this.getSelectedFiles();
|
|||
|
selectedList.length > 0 && typeof this.options.done === 'function'
|
|||
|
&& this.options.done(selectedList, this.$touch);
|
|||
|
}
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
// 在Jquery插件中使用FileLibrary对象
|
|||
|
$.fn.fileLibrary = function (options) {
|
|||
|
new FileLibrary(this, options);
|
|||
|
};
|
|||
|
|
|||
|
// 在Jquery插件中使用FileLibrary对象
|
|||
|
$.fileLibrary = function (options) {
|
|||
|
new FileLibrary(false, options);
|
|||
|
};
|
|||
|
|
|||
|
})(jQuery, window, document);
|