Files
DzzOffice/dzz/system/scripts/explorer.js
2022-11-02 23:21:46 +08:00

582 lines
20 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
/*
* @copyright Leyun internet Technology(Shanghai)Co.,Ltd
* @license http://www.dzzoffice.com/licenses/license.txt
* @package DzzOffice
* @link http://www.dzzoffice.com
* @author zyx(zyx@dzz.cc)
*/
var _explorer = {};
_explorer = function (json) {
_explorer.space = json.space; //用户信息
_explorer.myuid = json.myuid;
_explorer.formhash = json.formhash; //FORMHASH
_explorer.extopen = json.extopen || {}; //打开方式信息
_explorer.sourcedata = json.sourcedata || []; //所有文件信息
_explorer.type = json.fileselectiontype || 0;//文件选择类型0为选择文件,1为保存文件2选择位置
_explorer.defaultselect = json.defaultselect;
_explorer.allowcreate = json.allowcreate;
_explorer.mulitype = json.mulitype || 0;//是否允许多选,默认不允许
_explorer.permfilter = json.permfilter || '';//文件检索写入权限过滤
//如果是保存文件并且未带入权限过滤参数,强制过滤写入权限
if(_explorer.type == 1){
_explorer.permfilter = (json.permfilter) ? json.permfilter:'write';
}
//如果是选择位置
if (_explorer.type == 2) {
_explorer.allowselecttype = {'folder': ['文件夹', ['folder'], 'selected']};
} else {
_explorer.allowselecttype = json.allowselecttype || '';//允许筛选文件类型
}
//默认筛选文件类型
if (json.allowselecttype) {
for (var o in json.allowselecttype) {
if (json.allowselecttype[o][2] == 'selected') {
_explorer.defaultexttype = json.allowselecttype[o][1].join(',').toLowerCase();
}
}
} else {
_explorer.defaultexttype = '';
}
_explorer.defaultfilename = json.defaultfilename || '';
_explorer.thame = json.thame || {};
_explorer.infoRequest = 0;
_explorer.deletefinally = json.deletefinally || 0;
_explorer.cut = json.cut || {
iscut: 0,
icos: []
};
};
_explorer.appUrl = 'index.php?mod=system&op=fileselection';
_explorer.hash = '';
_explorer.getConfig = function (url, callback) {
$.getJSON(url + '&t=' + new Date().getTime(), function (json) {
new _explorer(json);
_explorer.hashHandler();
_explorer.initEvents();
if (typeof callback === "function") {
callback(json);
}
});
};
_explorer.initEvents = function () { //初始化页面事件
//hashchange事件
$(window).on('hashchange', function () {
_explorer.hashHandler();
});
//左侧列表页事件
$(document).off('click.document-data').on('click.document-data', '.document-data', function () {
//var el=$(this);
location.hash = jQuery(this).data('hash');
});
//右侧加载完成事件
$(document).off('ajaxLoad.middleContent').on('ajaxLoad.middleContent', function () {
var hash = location.hash.replace(/^#/i, '');
var op = hash.replace(/&(.+?)$/ig, ''); //(hash,'op');
_explorer.topNav_init();
_explorer.address_resize();
_explorer.setHeight($('.height-100'));
if ($('.scroll-100').length) {
_explorer.scroll_100 = new PerfectScrollbar('.scroll-100');
}
});
};
_explorer.createMenuSwidth = function (fid) {
//判断新建和上传图标显示
var folderperm = false;//文件夹权限
var uploadperm = false;//上传权限
if(_explorer.allowcreate){
//文件夹权限(判断是否有文件夹权限如果没有隐藏文件夹相关新建上传),如果是选择位置隐藏新建文件
if (!_explorer.Permission_Container('upload', fid) || _explorer.type == 2) {
$('#createmenu').find('li').not('.folderPermMust').addClass('hide');
} else {
$('#createmenu').find('li').not('.folderPermMust').removeClass('hide');
folderperm = true;
}
if (!_explorer.Permission_Container('folder', fid)) { //其它类型新建权限,如果无权限,隐藏文件相关权限
jQuery('#createmenu').find('li.folderPermMust').addClass('hide');
} else {
jQuery('#createmenu').find('li.folderPermMust').removeClass('hide');
uploadperm = true;
}
if (folderperm || uploadperm) { //如果没有文件夹权限和文件权限,隐藏新建上传菜单
$('#createmenu').removeClass('hide');
$('#exampleColorDropdown2').removeClass('hide');
} else {
$('#createmenu').addClass('hide');
$('#exampleColorDropdown2').addClass('hide');
}
//去掉多余的分割线
$('.divider').each(function(){
if($(this).prev('li:visible').length < 1){
$(this).remove();
}
})
}
}
_explorer.set_address = function (path) {
var pathstr = path;
$('.select-address input.inputaddress').val(pathstr);
var patharr = pathstr.split('\\');
var address_html = '';
for (var o in patharr) {
address_html += ' <li class="routes"> <a href="javascript:;">' + patharr[o] + '</a> <span class="dzz dzz-chevron-right"></span></li>';
}
$('.select-address div.address-field').html(address_html);
}
_explorer.address_resize = function (dir) {
var container = jQuery('.address-container');
var address = jQuery('.address-field');
var cwidth = container.width();
var speed = cwidth;
var awidth = 0;
address.find('li').each(function () {
awidth += jQuery(this).outerWidth(true);
});
var left = isNaN(parseInt(address.css('left'))) ? (cwidth - awidth) : parseInt(address.css('left'));
if (dir === 'left') {
left += speed;
if (left >= 0) {
left = 0;
container.removeClass('arrow-left');
}
if (left > (cwidth - awidth)) {
container.addClass('arrow-right');
} else {
container.removeClass('arrow-right');
}
if (left < 0) {
container.addClass('arrow-left');
} else {
container.removeClass('arrow-left');
}
address.animate({
'left': left,
'right': 'auto'
}, 500);
} else if (dir === 'right') {
left -= speed;
if (left <= (cwidth - awidth)) {
left = (cwidth - awidth);
container.removeClass('arrow-right');
}
if (left > (cwidth - awidth)) {
container.addClass('arrow-right');
} else {
container.removeClass('arrow-right');
}
if (left < 0) {
container.addClass('arrow-left');
} else {
container.removeClass('arrow-left');
}
address.animate({
'left': left,
'right': 'auto'
}, 500);
} else {
if (awidth > cwidth + 21) {
container.removeClass('arrow-right').addClass('arrow-left');
} else {
container.removeClass('arrow-right').removeClass('arrow-left');
}
address.css({
'left': 'auto',
'right': 0
});
}
};
_explorer.topNav_init = function () {
/*页面地址栏相关事件*/
$(document).off('click.address-left-arrow').on('click.address-left-arrow', '.address-left-arrow', function () {
_explorer.address_resize('left');
return false;
});
$(document).off('click.address-right-arrow').on('click.address-right-arrow', '.address-right-arrow', function () {
_explorer.address_resize('right');
return false;
});
//点击路径切栏切换位置
$(document).off('click.routes').on('click.routes', '.address-container .routes', function () {
var path = '';
var text = $(this).text().replace(/(^\s*)|(\s*$)/g, '');
var textprefix = /[:]/;
var prefix = '';
var textarr = [];
if (textprefix.test(text)) {
textarr = text.split(/[:]/);
prefix = textarr[0];
text = textarr[1];
}
$(this).closest('li').prevAll().find('a').each(function () {
path += $(this).text().replace(/(^\s*)|(\s*$)/g, '') + '/';
});
path += text;
//path = path.replace(/>/g,'/');
if (path.charAt(path.length - 1) !== '/') {
path = path + '/';
}
_explorer.routerule(path, prefix);
return false;
});
//输入地址栏实现切换
$(document).off('keyup.referer_path').on('keyup.referer_path', '.address-container .referer_path', function (e) {
if (e.keyCode === 13) {
var path = $(this).val();
path = path.replace(/\\/g, '/', path);
var hash = false;
switch (path) {
case '我的网盘':
_explorer.routerule(path);
break;
case '动态':
hash = 'dynamic';
break;
case '回收站':
hash = 'recycle';
break;
case '分享':
hash = 'share';
break;
case '收藏':
hash = 'collection';
break;
case '最近使用':
hash = 'recent';
break;
case '文件夹权限':
hash = 'perm';
break;
case '功能管理':
hash = 'app';
break;
case '图片':
case '文档':
path = '类型:' + path;
break;
}
var textprefix = /[:]/;
var patharr = [];
var prefix = '';
if (textprefix.test(path)) {
patharr = path.split(/[:]/);
prefix = patharr[0];
path = patharr[1];
if (path.charAt(path.length - 1) !== '/') {
path = path + '/';
}
_explorer.routerule(path, prefix);
return false;
}
if (hash) {
location.hash = hash;
return false;
}
if (path.charAt(path.length - 1) !== '/') {
path = path + '/';
}
_explorer.routerule(path);
return false;
}
});
};
_explorer.routerule = function (path, prefix) {
var queryobj = {
'name': path
};
//获取前缀
if (prefix) {
switch (prefix) {
case '群组':
queryobj.prefix = 'g';
break;
case '机构':
queryobj.prefix = 'o';
break;
case '类型':
queryobj.prefix = 'c';
break;
}
}
$.post(_explorer.appUrl + '&do=ajax&operation=getfid', queryobj, function (data) {
if (data.success) {
var hash = '';
if (!isNaN(parseInt(data.success['gid']))) {
hash = 'group&gid=' + data.success['gid'] + (data.success['fid'] ? '&fid=' + data.success['fid'] : '');
} else {
hash = 'home&fid=' + data.success['fid'];
}
location.hash = hash;
}
}, 'json');
return false;
};
_explorer.hashHandler = function () { //处理页面hash变化
var hash = location.hash;
hash = hash.replace(/^#/i, '');
if (!hash) {
hash = _explorer.defaultselect;
_explorer.jstree_select(hash);
}
if (hash === _explorer.hash) {
return false;
}
if (hash !== _explorer.hash) {
_explorer.getRightContent(hash, $('#middleconMenu'));
_explorer.hash = hash;
} else {
_explorer.hash = hash;
}
//_explorer.topMenu(hash);
return false;
};
_explorer.loading = function (container, flag) { //右侧加载效果
if (flag === 'hide') {
container.find('.rightLoading').remove();
} else {
container.append('<div class="rightLoading"></div>');
}
};
_explorer.getRightContent = function (hash, container) { //处理右侧页面加载
_explorer.loading(container);
_explorer.rightLoading = 1;
$('.document-data').removeClass('actives');
$('[data-hash="' + hash + '"]').addClass('actives');
var url = _explorer.appUrl + '&do=file&' + hash;
jQuery('#middleconMenu').load(url, function () {
$(document).trigger('ajaxLoad.middleContent', [hash]);
});
};
//通过hash值来设置左侧树的选择指示
_explorer.jstree_select = function (hash) {
if (!hash) {
hash = location.hash.replace('#', '');
}
if (!hash) {
hash = $('#position').find("li[flag='home']").attr('hashs');
}
var op = hash.replace(/&(.+?)$/ig, ''); //(hash,'op');
var fid = _explorer.getUrlParam(hash, 'fid');
if (op === 'group') {
var gid = _explorer.getUrlParam(hash, 'gid');
_explorer.open_node_by_id(fid, gid);
} else if (op === 'home') {
_explorer.open_node_by_id(fid);
} /*else if (op === 'mygroup') {
$('#position').jstree(true).select_node('#group');
}*/ else {
if ($('#position').length > 0) {
$('#position').jstree(true).deselect_all();
}
}
};
_explorer.open_node_by_id = function (fid, gid) {
var inst = $('#position').jstree(true);
var node = null;
if (fid) {
node = inst.get_node('#f_' + fid) || inst.get_node('#u_' + fid);
} else if (gid) {
node = inst.get_node('#g_' + gid) || inst.get_node('#gid_' + gid);
} else {
inst.deselect_all();
return;
}
if (node) {
inst.deselect_all();
var selects = inst.get_selected();
for (var i = 0; i < selects.length; i++) {
if (selects[i] === node.id) {
continue;
}
inst.deselect_node('#' + selects[i]);
}
inst.select_node(node);
} else {
$.post(_explorer.appUrl + '&op=filelist&do=getParentsArr', {
'fid': fid,
'gid': gid
}, function (data) {
var node = inst.get_node('#' + data[0]);
_explorer.open_node_bg(inst, node, data);
}, 'json');
}
};
_explorer.open_node_bg = function (inst, node, arr) {
inst.open_node(node, function (node) {
var i = jQuery.inArray(node.id, arr);
if (i < arr.length && i > -1 && document.getElementById(arr[i + 1])) {
_explorer.open_node_bg(inst, document.getElementById(arr[i + 1]), arr);
} else {
inst.deselect_all();
inst.select_node(node);
}
});
};
_explorer.getUrlParam = function (url, name) {
if (!name) {
return url;
}
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
if (!url) {
return '';
}
var r = url.match(reg);
if (r !== null) {
return decodeURIComponent(r[2]);
}
};
//设定层高度
_explorer.setHeight = function (els) {
var clientHeight = document.documentElement.clientHeight;
els.each(function () {
var el = $(this);
var pos = el.offset();
var height = clientHeight - pos.top;
el.css('height', height);
});
};
//带有.scroll-y的层设置滚动条
_explorer.Scroll = function (els) {
var clientHeight = document.documentElement.clientHeight;
if (!els) {
els = $('.scroll-y');
}
els.each(function () {
var el = $(this);
var pos = el.offset();
var height = clientHeight - pos.top;
if (el.data('subtractor')) {
height = height - el.data('subtractor');
}
el.css({
'overflow': 'auto',
'height': height,
'position': 'relative'
});
new PerfectScrollbar(this);
});
};
_explorer.image_resize = function (img, width, height) {
width = !width ? jQuery(img).parent().width() : width;
height = !height ? jQuery(img).parents('.icoimgContainer').parent().height() : height;
imgReady(img.src, function () {
var w = this.width;
var h = this.height;
var realw = 0,
realh = 0;
if (w > 0 && h > 0) {
if ((w / h) > 1) {
realw = (w > width) ? parseInt(width) : w;
realh = (w > width) ? parseInt(height) : (realw * h / w);
img.style.width = realw + 'px';
img.style.height = realh + 'px';
} else {
realh = (h > height) ? parseInt(height) : h;
realw = (h > height) ? parseInt(width) : (realh * w / h);
img.style.width = realw + 'px';
img.style.height = 'auto';
}
if (realw < 32 && realh < 32) {
jQuery(img).addClass('image_tosmall').css({
padding: ((height - realh) / 2 - 1) + 'px ' + ((width - realw) / 2 - 1) + 'px'
});
}
}
jQuery(img).show();
});
};
_explorer.icoimgError = function (img, width, height) {
width = !width ? jQuery(img).parent().width() : width;
height = !height ? jQuery(img).parent().height() : height;
if (jQuery(img).attr('error')) {
imgReady(jQuery(img).attr('error'), function () {
var w = this.width;
var h = this.height;
var realw = 0,
realh = 0;
if (w > 0 && h > 0) {
if ((w / h) > 1) {
realw = (w > width) ? parseInt(width) : w;
realh = realw * h / w;
} else {
realh = (h > height) ? parseInt(height) : h;
realw = realh * w / h;
}
if (realw < 32 && realh < 32) {
jQuery(img).addClass('image_tosmall').css({
padding: ((height - realh) / 2 - 1) + 'px ' + ((width - realw) / 2 - 1) + 'px'
});
}
try {
img.style.width = realw + 'px';
img.style.height = realh + 'px';
} catch (e) {
}
img.src = jQuery(img).attr('error');
jQuery(img).show();
}
},
function () {
},
function () {
img.onerror = null;
img.src = 'dzz/images/default/icodefault.png';
jQuery(img).show();
}
);
}
};
jQuery(window).resize(function () {
_explorer.Scroll();
});
function checkAll(type, form, value, checkall, changestyle) {
checkall = checkall ? checkall : 'chkall';
for (var i = 0; i < form.elements.length; i++) {
var e = form.elements[i];
if (type === 'option' && e.type === 'radio' && e.value === value && e.disabled !== true) {
e.checked = true;
} else if (type === 'value' && e.type === 'checkbox' && e.getAttribute('chkvalue') === value) {
e.checked = form.elements[checkall].checked;
} else if (type === 'prefix' && e.name && e.name !== checkall && (!value || (value && e.name.match(value)))) {
e.checked = form.elements[checkall].checked;
if (changestyle) {
if (e.parentNode && e.parentNode.tagName.toLowerCase() === 'li') {
e.parentNode.className = e.checked ? 'checked' : '';
}
if (e.parentNode.parentNode && e.parentNode.parentNode.tagName.toLowerCase() === 'div') {
e.parentNode.parentNode.className = e.checked ? 'item checked' : 'item';
}
}
}
}
}
function dfire(e) {
jQuery(document).trigger(e);
}