This repository has been archived on 2024-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
yoshop/web/assets/store/js/file.library.js

501 lines
18 KiB
JavaScript
Raw Permalink Normal View History

2020-04-25 22:20:29 +08:00
;(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);