file-manager/app/assets/javascripts/file_manager/file_manager.js

563 lines
20 KiB
JavaScript

var csrf_token = document
.querySelector("meta[name='csrf-token']")
.getAttribute("content");
$.ajaxSetup({
headers: {
// 'Content-Type': 'multipart/form-data',
// 使用 multipart/form-data 在此不需要設定 Content-Type。
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-Token': csrf_token,
}
});
function replace_explorer_section(file_manager_section, exclude_upload_section){
var org_file_manager_section = $('#file_manager_section');
if(org_file_manager_section.find(' > .file-input').length != 0 && file_manager_section.find('> .file-uploader-script').length != 0){
org_file_manager_section.find(' > *').each(function(i,v){
if(!($(v).hasClass('file-input') || $(v).hasClass('file-uploader-script'))){
$(v).replaceWith(file_manager_section.find('>*').eq(i).clone());
}
})
if(!exclude_upload_section){
$("#file-uploader").fileinput('clear');
var fileinput_data = $("#file-uploader").data('fileinput');
fileinput_data.uploadUrl = "/xhr/file_manager_upload/" + window.current_path + (window.explorer_setting_id ? ('?setting_id='+window.explorer_setting_id) : '');
}
}else{
org_file_manager_section.find('#index_table').html(file_manager_section);
}
}
function reload_explorer_section(url, exclude_upload_section, callback,...args){
if(url == undefined){
url = get_path();
}
$.get(url).done(function(data){
var $file_manager_section = $(data);
replace_explorer_section($file_manager_section, exclude_upload_section);
if(window.scroll_top){
$(window).scrollTop(window.scroll_top);
}
if(typeof(callback) == 'function'){
callback.apply( this, args );
}
}).fail(function() {
alert('No such file or directory!');
});
}
function reload_page(url, is_recycle_bin, extra_params){
var tmp_url = url, request_url;
if(url == undefined){
request_url = get_path(undefined,undefined, extra_params);
}else{
request_url = get_path(url,is_recycle_bin, extra_params);
}
$.get(request_url).done(function(data){
var $file_manager_section = $(data);
replace_explorer_section($file_manager_section);
if(!window.only_select_folder){
push_history_url(request_url);
}
if(window.scroll_top){
$(window).scrollTop(window.scroll_top);
}
}).fail(function() {
alert('No such file or directory!');
});
}
function push_history_url(new_url, state){
if(state == undefined)
state = {body: $('body').prop('outerHTML')};
if(history.state == null){
history.replaceState({need_reload: true} ,$('title').text(), window.location.href);
}
window.history.pushState(state ,$('title').text(), new_url);
}
function get_current_url(path, override_recycle_bin, extra_params){
if(override_recycle_bin == undefined){
override_recycle_bin = window.is_recycle_bin;
}
var params = {};
if(override_recycle_bin){
path = '';
params['recycle_bin'] = true
}
if(extra_params){
Object.keys(extra_params).forEach(function(k){
params[k] = extra_params[k];
})
}
var url = '';
if(window.path_mode == 'params'){
params["path"] = path;
url = window.location.pathname
}else{
url = "/xhr/file_manager/" + path;
}
if(window.only_select_folder){
params['select_mode'] = true;
}
return url + params_to_query(params);
}
function get_path(path, override_recycle_bin, extra_params){
var params = get_params();
if(path == undefined){
path = window.location.pathname;
}
if(override_recycle_bin == undefined){
override_recycle_bin = window.is_recycle_bin;
}
if(override_recycle_bin){
path = ""
params["recycle_bin"] = true;
window.is_recycle_bin = true;
}else{
delete params["recycle_bin"];
window.is_recycle_bin = false;
}
if(window.only_select_folder){
params['select_mode'] = true;
}else{
delete params["select_mode"];
}
delete params["page"];
delete params["file_id"];
if(window.explorer_setting_id){
params['setting_id'] = window.explorer_setting_id;
}
if(extra_params){
Object.keys(extra_params).forEach(function(k){
if (extra_params[k] != null)
params[k] = extra_params[k];
})
}
if(window.use_params_request){
params['path'] = path;
path = '';
}else{
delete params['path'];
}
return path + params_to_query(params);
}
function get_basename(file){
var tmp = file.split('/');
return tmp[tmp.length - 1] || '';
}
function pathJoin(parts, sep){
var separator = sep || '/';
var replace = new RegExp(separator+'{1,}', 'g');
if(parts.length > 1){
parts.forEach(function(p, i){
if(p[0] == '/'){
for(var k=0; k<i; k++){
parts[k] = "";
}
}
})
}
parts = parts.filter(function(s){ return s != "" });
var new_path = parts.join(separator).replace(replace, separator).replace(new RegExp(`[^${separator}]+${separator}\\.\\.${separator}`, 'g'),'');
return new_path.replace(/^(http|ftp):\//,'$1://').replace(/file:\//,'file:///').replace(new RegExp(`^.{1,2}${separator}`),'').replace(/^\/\.\.\//,'/').replace(/\.\//g,'');
}
function get_current_path(path, override_recycle_bin){
if(path == undefined){
path = window.current_path;
}
if(override_recycle_bin == undefined){
override_recycle_bin = window.is_recycle_bin;
}
if(override_recycle_bin && window.recycle_bin_text){
return window.recycle_bin_text;
}else{
return path;
}
}
function change_folder(id, folder, is_recycle_bin){
window.scroll_top = $('#file_manager_section thead').scrollTop();
if (!folder) {
folder = window.module_key;
}
var new_path = window.file_manager_path + '/' + folder + '/module';
new_path = get_path(new_path, (is_recycle_bin ? true : false), {"file_id": id});
console.log(new_path, id);
$.get(new_path).done(function(data){
var $file_manager_section = $(data);
replace_explorer_section($file_manager_section);
window.module_key = folder;
if(!window.only_select_folder){
push_history_url(new_path);
}
if(window.scroll_top){
$(window).scrollTop(window.scroll_top);
}
}).fail(function() {
alert('No such file or directory!');
});
}
function get_params(){
var search_split = window.location.search.split("?");
var params = {}
if( search_split.length >= 2 ){
$(search_split[1].split("&")).each(function(i, s){
var tmp = s.split("=");
var k = tmp[0], v = tmp[1];
if(k.search('[]') != -1){
k = k.split('[]')[0];
if(params.hasOwnProperty(k)){
params[k].push(v);
}else{
params[k] = [v];
}
}else{
params[k] = v;
}
})
}
return params;
}
function params_to_query(params){
var query_text = '';
var keys = Object.keys(params);
if(keys.length != 0){
keys.forEach(function(k, i){
if(i == 0){
query_text += '?';
}else{
query_text += '&';
}
var v = params[k];
if(Array.isArray(v)){
v.forEach(function(vv, j){
if(j != 0){
query_text += '&';
}
query_text += `${k}[]=${vv}`;
})
}else{
query_text += `${k}=${v}`;
}
})
}
return query_text;
}
$(document).on("click",".delete",function(){
var that = $(this);
window.scroll_top = $(window).scrollTop();
if( window.confirm(that.data("tmp-confirm")) ){
if( window.confirm(that.data("tmp-confirm")) ){
$.ajax({
url: that.data("link"),
method: 'DELETE',
contentType: false, //required
processData: false, // required
statusCode: {
204: reload_explorer_section,
404: function() {
alert( "Delete failed!\nFile not exist!" );
}
}
})
}
}
})
$(document).on("click",".delete_file",function(){
var that = $(this);
window.scroll_top = $(window).scrollTop();
if( window.confirm(that.data("tmp-confirm")) ){
if( window.confirm(that.data("tmp-confirm")) ){
$.ajax({
url: that.data("link"),
method: 'DELETE',
contentType: false, //required
processData: false, // required
dataType: 'json',
statusCode: {
200: function(data) {
var params = get_params();
var extra_params;
if (data.id) {
extra_params = {"version": data.version, "file_id": data.id};
} else {
extra_params = {};
}
var url = get_path(undefined, undefined, extra_params);
var callback = push_history_url;
reload_explorer_section(url, false, callback, url);
},
404: function() {
alert( "Delete failed!\nFile not exist!" );
}
}
})
}
}
})
$(document).on("click",".edit",function(){
$(this).hide();
var pre_height = $('#file_manager_section pre').height();
$('#file_manager_section textarea.edit-area').html($('#file_manager_section pre').html());
$('#file_manager_section textarea.edit-area').removeClass('hide');
$('#file_manager_section pre').addClass('hide');
$('#file_manager_section textarea.edit-area').height(pre_height);
$(".save").removeClass('hide');
})
$(document).on("click",".save",function(){
$(this).hide();
var data = new FormData();
data.append("content", $('#file_manager_section textarea.edit-area').val());
$.ajax({
url: '/admin/file_managers/' + $(this).data('id') + '/save',
method: 'POST',
data: data,
contentType: false, //required
processData: false, // required
dataType: 'json',
mimeType: 'multipart/form-data',
statusCode: {
200: function(data) {
console.log(data);
var params = get_params(), url;
var callback = push_history_url;
if(params.version){
var new_version = Number(params.version) + 1;
url = get_path(undefined, undefined, {"version": new_version, "file_id": data.id});
params.version = new_version.toString();
} else {
url = get_path(undefined, undefined, {"file_id": data.id});
}
reload_explorer_section(url, false, callback, url);
$(".save").addClass('hide');
$(".edit").removeClass('hide');
},
400: function() {
alert( "Bad Request!\nThere are no content of this file!" );
}
}
})
})
$(document).on("click",".module-key",function(){
change_folder(null, $(this).data("key"));
})
$(document).on("click",".directory, .file",function(){
change_folder($(this).data("id"));
})
$(document).on("click",".breadcrumb-index",function(){
var path = window.current_path[0] == '/' ? window.current_path : ('/' + window.current_path);
$("#breadcrumb-relative-url").addClass('hide');
$("#breadcrumb-editable").text(path).removeClass("hide").focus();
window.tmp_current_path = path;
})
$(document).on("click",'#breadcrumb-relative-url .directory, #breadcrumb-editable',function(e){
e.stopPropagation();
})
$(document).on("blur","#breadcrumb-editable",function(){
if(window.tmp_current_path != $(this).text().trim()){
change_folder($(this).text().trim());
}
$("#breadcrumb-relative-url").removeClass('hide');
$(this).addClass('hide');
})
$(document).on("keydown","#breadcrumb-editable",function(evt){
if(evt.keyCode == 13){
evt.preventDefault();
$(this).trigger("blur");
}
})
$(document).on("click", ".copyButton", function(){
var link = $(this).data('link');
// Copy the link
navigator.clipboard.writeText(link);
if (!($(this).data('org-text')))
$(this).data('org-text', $(this).find('.tooltiptext').text());
$(this).find('.tooltiptext').text($(this).data('prompt') + ': ' + link);
})
$(document).on("mouseout", ".copyButton", function(){
var org_text = $(this).data('org-text');
if (org_text)
$(this).find('.tooltiptext').text(org_text);
})
$(document).on("click", ".redirect_recycle_bin", function(){
change_folder(null, null, true);
})
$(document).on("click", ".recycle_bin", function(){
change_folder(null, $(this).data('key'), true);
})
$(document).on("click", ".recover_all", function(){
var that = $(this);
var prompt_message = that.data("prompt");
$.ajax({
url: '/admin/file_managers/' + window.module_key + '/get_trash_count',
method: 'POST',
contentType: false, //required
processData: false, // required
dataType: 'json',
mimeType: 'multipart/form-data',
statusCode: {
200: function(data) {
var count = data["count"] + that.data('unit');
prompt_message = prompt_message.replace('${num}', count);
if(window.confirm(prompt_message)){
if(window.confirm(prompt_message)){
$.ajax({
url: '/admin/file_managers/' + window.module_key + '/recover_all',
method: 'POST',
contentType: false, //required
processData: false, // required
dataType: 'json',
mimeType: 'multipart/form-data',
statusCode: {
200: function(data) {
var thread_id = data["id"];
var thread_title = data["title"];
reload_explorer_section(get_path(), false, function show_modal(thread_id, thread_title){
$("#threadModal").data('id', thread_id);
$("#threadModal .modal-header h3").text(thread_title);
$("#threadModal").removeClass('hide').modal('show');
}, thread_id, thread_title);
}
}
})
}
}
}
}
})
})
$(document).on("click",".clean_up_recycle_bin", function(){
var that = $(this);
var prompt_message = that.data("prompt");
$.ajax({
url: '/admin/file_managers/' + window.module_key + '/get_trash_count',
method: 'POST',
contentType: false, //required
processData: false, // required
dataType: 'json',
mimeType: 'multipart/form-data',
statusCode: {
200: function(data) {
var count = data["count"] + that.data('unit');
prompt_message = prompt_message.replace('${num}', count);
if(window.confirm(prompt_message)){
if(window.confirm(prompt_message)){
$.ajax({
url: '/admin/file_managers/' + window.module_key + '/clean_trashes',
method: 'POST',
contentType: false, //required
processData: false, // required
dataType: 'json',
mimeType: 'multipart/form-data',
statusCode: {
200: function(data) {
var thread_id = data["id"];
var thread_title = data["title"];
reload_explorer_section(get_path(), false, function show_modal(thread_id, thread_title){
$("#threadModal").data('id', thread_id);
$("#threadModal .modal-header h3").text(thread_title);
$("#threadModal").removeClass('hide').modal('show');
}, thread_id, thread_title);
}
}
})
}
}
}
}
})
})
$(document).on('hidden.bs.modal', "#threadModal", function(){
window.clearTimeout(window.time_out_id);
})
$(document).on('shown.bs.modal', "#threadModal", function(){
var thread_id = $(this).data('id');
window.time_out_id = window.setTimeout(function(){
update_thread(thread_id, reload_page);
}, 1000);
})
$(document).on('click', ".change_version", function(){
var that = $(this);
var version = that.data('version');
var file_id = that.data('id');
reload_page(undefined,undefined,{"version": version, "file_id": file_id});
})
$(document).on('click', ".recover", function(){
var that = $(this);
window.scroll_top = $(window).scrollTop();
if( window.confirm(that.data("tmp-confirm")) ){
$.ajax({
url: that.data("link"),
method: 'POST',
contentType: false, //required
processData: false, // required
statusCode: {
204: reload_explorer_section,
404: function() {
alert( "Recover failed!\nFile not exist!" );
}
}
})
}
})
function update_thread(id, finish_callback, ...args){
var data = new FormData();
data.append('id',id);
$.ajax({
url: "/admin/threads/get_status",
method: 'POST',
data: data,
contentType: false, //required
processData: false, // required
dataType: 'json',
mimeType: 'multipart/form-data',
statusCode: {
200: function(data){
var finish_percent = data["finish_percent"];
var current_count = data["current_count"];
var all_count = data["all_count"];
var is_finish = (data["status"] == "finish");
if(finish_percent){
$("#threadModal .modal-body .thread-status").text(data["status"]);
if(data["status"] != 'Processing'){
$("#threadModal .modal-body .thread-current-count").text(current_count);
$("#threadModal .modal-body .thread-all-count").text(all_count);
}
$("#threadModal .modal-body .thread-finish_percent").text(finish_percent);
}else if(is_finish){
$("#threadModal .modal-body .thread-status").text(data["status"]);
$("#threadModal .modal-body .thread-finish_percent").text(100);
}
var that = this;
if(!is_finish){
var tmp_arguments = arguments;
window.time_out_id = window.setTimeout(function(){
update_thread.apply(that, tmp_arguments);
}, 1000);
}else{
if(window.time_out_id)
window.clearTimeout(window.time_out_id);
var wait_time = 3000;
if(finish_callback)
wait_time = 0;
window.setTimeout(function(){
$("#threadModal").modal("hide");
if(finish_callback){
finish_callback.apply(that, args);
}
alert(data["status"]);
}, wait_time);
return;
}
}
}
});
}
window.onpopstate = function(event) {
var state = event.state;
if(state != null){
if(state.need_reload){
window.location.reload();
}else if(state.body){
var $body = $(state.body);
$('.breadcrumb-index').replaceWith($body.find('.breadcrumb-index'));
$('#file_manager_section').replaceWith($body.find('#file_manager_section'));
}
}
};