325 lines
9.8 KiB
JavaScript
325 lines
9.8 KiB
JavaScript
/**
|
|
* 右键菜单
|
|
*/
|
|
|
|
const Data = require('../data');
|
|
const Form = require('./form');
|
|
const ViewSite = require('../../viewsite/');
|
|
const Terminal = require('../../terminal/');
|
|
const Database = require('../../database/');
|
|
const FileManager = require('../../filemanager/');
|
|
const LANG = antSword['language']['shellmanager'];
|
|
const LANG_T = antSword['language']['toastr'];
|
|
|
|
class ContextMenu {
|
|
/**
|
|
* 初始化函数
|
|
* @param {array} data 选中的数据
|
|
* @param {object} event 右键事件对象
|
|
* @return {[type]} [description]
|
|
*/
|
|
constructor(data, event, id, ids) {
|
|
let selectedData = !id || ids.length !== 1;
|
|
let selectedMultiData = !id;
|
|
|
|
// 解析菜单事件
|
|
let menuItems = [];
|
|
[
|
|
// text, icon, disabled, action, submenu
|
|
['terminal', 'terminal', selectedData, () => {
|
|
new Terminal(data[0])
|
|
}],
|
|
['filemanager', 'folder-o', selectedData, () => {
|
|
new FileManager(data[0]);
|
|
}],
|
|
['database', 'database', selectedData, () => {
|
|
new Database(data[0]);
|
|
}],
|
|
['viewsite', 'chrome', selectedData, () => {
|
|
new ViewSite(data[0]);
|
|
}],
|
|
false,
|
|
['plugin', 'folder-o', selectedMultiData, null, this.parsePlugContextMenu(data)],
|
|
[
|
|
'pluginStore', 'cart-arrow-down', false,
|
|
antSword['menubar'].run.bind(antSword['menubar'], 'plugin-store')
|
|
],
|
|
false,
|
|
['add', 'plus-circle', false, this.addData.bind(this)],
|
|
['edit', 'edit', selectedData, this.editData.bind(this, data[0])],
|
|
['delete', 'remove', selectedMultiData, this.delData.bind(this, ids)],
|
|
false,
|
|
['move', 'share-square', selectedMultiData, null, this.parseMoveCategoryMenu(ids)],
|
|
['search', 'search', true],
|
|
false,
|
|
['clearCache', 'trash-o', selectedData, this.clearCache.bind(this, id)],
|
|
['clearAllCache', 'trash', false, this.clearAllCache.bind(this)]
|
|
].map((menu) => {
|
|
// 分隔符号
|
|
if (!menu) {
|
|
return menuItems.push({
|
|
divider: true
|
|
})
|
|
}
|
|
let menuObj = {
|
|
text: LANG['contextmenu'][menu[0]],
|
|
icon: `fa fa-${menu[1]}`,
|
|
disabled: menu[2]
|
|
}
|
|
// 点击事件
|
|
if (menu[3] instanceof Function) {
|
|
menuObj['action'] = menu[3];
|
|
}
|
|
// 子菜单
|
|
if (Array.isArray(menu[4])) {
|
|
menuObj['subMenu'] = menu[4];
|
|
}
|
|
menuItems.push(menuObj);
|
|
});
|
|
// 弹出菜单
|
|
bmenu(menuItems, event);
|
|
}
|
|
|
|
/**
|
|
* 把插件列表解析成右键菜单所需要的数据
|
|
* @return {array} [description]
|
|
*/
|
|
parsePlugContextMenu(data) {
|
|
let info = data[0];
|
|
let infos = data;
|
|
// 1. 遍历插件分类信息
|
|
let plugins = {
|
|
default: []
|
|
};
|
|
for (let _ in antSword['plugins']) {
|
|
let p = antSword['plugins'][_];
|
|
let c = p['info']['category'] || 'default';
|
|
plugins[c] = plugins[c] || [];
|
|
plugins[c].push(p);
|
|
}
|
|
// 2. 解析分类数据
|
|
let pluginItems = [];
|
|
for (let _ in plugins) {
|
|
// 0x01 添加分类目录
|
|
pluginItems.push({
|
|
text: antSword.noxss(_ === 'default' ? LANG['contextmenu']['pluginDefault'] : _),
|
|
icon: 'fa fa-folder-open-o',
|
|
disabled: plugins[_].length === 0,
|
|
subMenu: ((plugs) => {
|
|
let plugItems = [];
|
|
// 0x02 添加目录数据
|
|
plugs.map((p) => {
|
|
plugItems.push({
|
|
text: antSword.noxss(p['info']['name']),
|
|
icon: `fa fa-${p['info']['icon'] || 'puzzle-piece'}`,
|
|
disabled: infos.length > 1 ? (() => {
|
|
let ret = false;
|
|
// 判断脚本是否支持,不支持则禁止
|
|
if (p['info']['scripts'] && p['info']['scripts'].length > 0) {
|
|
infos.map((_info) => {
|
|
if (p['info']['scripts'].indexOf(_info['type']) === -1) {
|
|
// 如果检测到不支持的脚本,则禁止
|
|
ret = true;
|
|
}
|
|
});
|
|
}
|
|
// 判断是否支持多目标执行
|
|
return ret || !p['info']['multiple'];
|
|
})() : info && (p['info']['scripts'] || []).indexOf(info['type']) === -1,
|
|
action: ((plug) => () => {
|
|
// 如果没有加载到内存,则加载
|
|
if (!antSword['plugins'][plug['_id']]['module']) {
|
|
antSword['plugins'][plug['_id']]['module'] = require(
|
|
path.join(plug['path'], plug['info']['main'] || 'index.js')
|
|
);
|
|
}
|
|
// 执行插件
|
|
new antSword['plugins'][plug['_id']]['module'](
|
|
infos.length === 1 && !plug['info']['multiple'] ? info : infos
|
|
);
|
|
})(p)
|
|
})
|
|
});
|
|
return plugItems;
|
|
})(plugins[_])
|
|
})
|
|
}
|
|
return pluginItems;
|
|
}
|
|
|
|
/**
|
|
* 移动数据右键菜单
|
|
* @return {array} [description]
|
|
*/
|
|
parseMoveCategoryMenu(ids) {
|
|
// 获取分类列表
|
|
const items = antSword.modules.shellmanager.category.sidebar.getAllItems();
|
|
// 当前选中分类
|
|
const category = antSword.modules.shellmanager.category.sidebar.getActiveItem();
|
|
// 移动事件
|
|
const moveHandler = (c) => {
|
|
const ret = antSword['ipcRenderer'].sendSync('shell-move', {
|
|
ids: ids,
|
|
category: c
|
|
});
|
|
if (typeof(ret) === 'number') {
|
|
toastr.success(LANG['list']['move']['success'](ret), LANG_T['success']);
|
|
antSword.modules.shellmanager.reloadData();
|
|
antSword.modules.shellmanager.category.sidebar.callEvent('onSelect', [c])
|
|
}else{
|
|
toastr.error(LANG['list']['move']['error'](ret), LANG_T['error']);
|
|
}
|
|
}
|
|
// 解析菜单
|
|
let ret = [];
|
|
items.map((_) => {
|
|
ret.push({
|
|
text: _ === 'default' ? LANG['category']['default'] : _,
|
|
icon: 'fa fa-folder-o',
|
|
disabled: category === _,
|
|
action: moveHandler.bind(null, _)
|
|
});
|
|
});
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* 添加数据
|
|
*/
|
|
addData() {
|
|
new Form({
|
|
title: LANG['list']['add']['title'],
|
|
icon: 'plus-circle',
|
|
text: LANG['list']['add']['toolbar']['add']
|
|
}, {}, (data) => {
|
|
return new Promise((res, rej) => {
|
|
// 获取当前分类
|
|
data['base']['category'] = antSword.modules.shellmanager.category.sidebar.getActiveItem();
|
|
// 通知后台插入数据
|
|
const ret = antSword.ipcRenderer.sendSync('shell-add', data);
|
|
if (ret instanceof Object) {
|
|
// 重新加载数据
|
|
antSword.modules.shellmanager.reloadData({
|
|
category: data['base']['category']
|
|
});
|
|
return res(LANG['list']['add']['success']);
|
|
} else {
|
|
return rej(LANG['list']['add']['error'](ret.toString()));
|
|
}
|
|
});
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 编辑数据
|
|
* @param {Object} info 当前选中的数据
|
|
* @return {[type]} [description]
|
|
*/
|
|
editData(info) {
|
|
new Form({
|
|
title: LANG['list']['edit']['title'](info.url),
|
|
icon: 'save',
|
|
text: LANG['list']['edit']['toolbar']['save']
|
|
}, info, (data) => {
|
|
return new Promise((res, rej) => {
|
|
// 通知后台更新数据
|
|
const ret = antSword.ipcRenderer.sendSync('shell-edit', {
|
|
old: info,
|
|
new: data
|
|
});
|
|
if (ret === 1) {
|
|
// 重新加载数据
|
|
antSword.modules.shellmanager.reloadData({
|
|
category: info['category']
|
|
});
|
|
return res(LANG['list']['edit']['success']);
|
|
} else {
|
|
return rej(LANG['list']['edit']['error'](ret.toString()));
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 删除数据
|
|
* @param {array} ids [description]
|
|
* @return {[type]} [description]
|
|
*/
|
|
delData(ids) {
|
|
layer.confirm(
|
|
LANG['list']['del']['confirm'](ids.length), {
|
|
icon: 2, shift: 6,
|
|
title: `<i class="fa fa-trash"></i> ${LANG['list']['del']['title']}`
|
|
}, (_) => {
|
|
layer.close(_);
|
|
const ret = antSword['ipcRenderer'].sendSync('shell-del', ids);
|
|
if (typeof(ret) === 'number') {
|
|
toastr.success(LANG['list']['del']['success'](ret), LANG_T['success']);
|
|
// 更新UI
|
|
antSword.modules.shellmanager.reloadData({
|
|
category: antSword.modules.shellmanager.category.sidebar.getActiveItem()
|
|
});
|
|
}else{
|
|
toastr.error(LANG['list']['del']['error'](ret.toString()), LANG_T['error']);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 搜索数据
|
|
* @return {[type]} [description]
|
|
*/
|
|
searchData() {
|
|
|
|
}
|
|
|
|
/**
|
|
* 清空缓存
|
|
* @param {number} id ID
|
|
* @return {[type]} [description]
|
|
*/
|
|
clearCache(id) {
|
|
layer.confirm(
|
|
LANG['list']['clearCache']['confirm'], {
|
|
icon: 2, shift: 6,
|
|
title: `<i class="fa fa-trash"></i> ${LANG['list']['clearCache']['title']}`
|
|
}, (_) => {
|
|
layer.close(_);
|
|
const ret = antSword['ipcRenderer'].sendSync('cache-clear', {
|
|
id: id
|
|
});
|
|
if (ret === true) {
|
|
toastr.success(LANG['list']['clearCache']['success'], LANG_T['success']);
|
|
}else{
|
|
toastr.error(
|
|
LANG['list']['clearCache']['error'](
|
|
ret['errno'] === -2 ? 'Not cache file.' : ret['errno']
|
|
), LANG_T['error']
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 清空所有缓存
|
|
* @return {[type]} [description]
|
|
*/
|
|
clearAllCache() {
|
|
layer.confirm(
|
|
LANG['list']['clearAllCache']['confirm'], {
|
|
icon: 2, shift: 6,
|
|
title: `<i class="fa fa-trash"></i> ${LANG['list']['clearAllCache']['title']}`
|
|
}, (_) => {
|
|
layer.close(_);
|
|
const ret = antSword['ipcRenderer'].sendSync('cache-clearAll');
|
|
if (ret === true) {
|
|
toastr.success(LANG['list']['clearAllCache']['success'], LANG_T['success']);
|
|
}else{
|
|
toastr.error(LANG['list']['clearAllCache']['error'](ret), LANG_T['error']);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = ContextMenu;
|