feat: move group

This commit is contained in:
avwo
2022-06-08 16:58:21 +08:00
parent 23c273b082
commit 862e461d54
14 changed files with 85 additions and 41 deletions
+1
View File
@@ -0,0 +1 @@
biz/webui/htdocs/js/index.js diff=nodiff
+2 -1
View File
@@ -1,10 +1,11 @@
var rules = require('../../../../lib/rules/util').rules;
var recycleBin = require('../../../../lib/rules/util').rules.recycleBin;
var isGroup = require('../../../../lib/util/common').isGroup;
module.exports = function(req, res) {
var body = req.body;
var list;
if (rules.add(body.name, body.value, body.clientId) && body.name[0] !== '\r') {
if (rules.add(body.name, body.value, body.clientId) && isGroup(body.name)) {
if (body.addToTop) {
rules.moveToTop(body.name, body.clientId);
} else {
+1 -1
View File
@@ -2,6 +2,6 @@ var rules = require('../../../../lib/rules/util').rules;
module.exports = function(req, res) {
var body = req.body;
var result = rules.moveTo(body.from, body.to, body.clientId);
var result = rules.moveTo(body.from, body.to, body.clientId, body.group);
res.json({ec: result ? 0 : 2, em: 'success'});
};
+2 -1
View File
@@ -1,10 +1,11 @@
var values = require('../../../../lib/rules/util').values;
var recycleBin = require('../../../../lib/rules/util').values.recycleBin;
var isGroup = require('../../../../lib/util/common').isGroup;
module.exports = function(req, res) {
var body = req.body;
var list;
if (values.add(body.name, body.value, body.clientId) && body.name[0] !== '\r') {
if (values.add(body.name, body.value, body.clientId) && isGroup(body)) {
var group = values.getFirstGroup();
group && values.moveTo(body.name, group.name, body.clientId);
}
+1 -1
View File
@@ -2,6 +2,6 @@ var values = require('../../../../lib/rules/util').values;
module.exports = function(req, res) {
var body = req.body;
var result = values.moveTo(body.from, body.to, body.clientId);
var result = values.moveTo(body.from, body.to, body.clientId, body.group);
res.json({ec: result ? 0 : 2, em: 'success'});
};
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -2689,7 +2689,7 @@ var Index = React.createClass({
var activeItem = item || modal.getActive();
if (activeItem && !activeItem.isDefault) {
var name = activeItem.name;
win.confirm('Are you sure to delete \'' + name + '\'.', function (sure) {
win.confirm('Are you sure to delete ' + (util.isGroup(name) ? 'group ' : '') + '\'' + name + '\'.', function (sure) {
if (!sure) {
return;
}
@@ -2719,7 +2719,7 @@ var Index = React.createClass({
var activeItem = item || modal.getActive();
if (activeItem && !activeItem.isDefault) {
var name = activeItem.name;
win.confirm('Are you sure to delete \'' + name + '\'.', function (sure) {
win.confirm('Are you sure to delete ' + (util.isGroup(name) ? 'group ' : '') + '\'' + name + '\'.', function (sure) {
if (!sure) {
return;
}
+21 -5
View File
@@ -76,9 +76,9 @@ proto.exists = function (name) {
};
function push(list, name) {
if (name[0] !== '\r') {
if (!util.isGroup(name)) {
for (var i = 0, len = list.length; i < len; i++) {
if (list[i][0] === '\r') {
if (util.isGroup(list[i])) {
return list.splice(i, 0, name);
}
}
@@ -146,13 +146,29 @@ proto.setSelected = function (name, selected) {
return this._setBoolProp(name, 'selected', selected);
};
proto.moveTo = function (fromName, toName) {
proto.moveTo = function (fromName, toName, group) {
var list = this.list;
var fromIndex = list.indexOf(fromName);
var toIndex = list.indexOf(toName);
if (fromIndex !== -1 && toIndex !== -1) {
list.splice(fromIndex, 1);
list.splice(toIndex, 0, fromName);
group = group && util.isGroup(fromName);
if (group) {
var data = this.data;
var children = [fromName];
for (var i = fromIndex + 1, len = list.length; i < len; i++) {
var name = data[list[i]].name;
if (util.isGroup(name)) {
break;
}
children.push(name);
}
list.splice(fromIndex, children.length);
children.unshift(toIndex, 0);
list.splice.apply(list, children);
} else {
list.splice(fromIndex, 1);
list.splice(toIndex, 0, fromName);
}
return true;
}
};
+4 -4
View File
@@ -133,7 +133,7 @@ var List = React.createClass({
getInitialState: function() {
var nodes = util.parseJSON(storage.get('collapseNodes'));
this.collapseNodes = Array.isArray(nodes) ? nodes.filter(function(name) {
return typeof name === 'string' && name[0] === '\r' && name[1];
return util.isGroup(name) && name[1];
}) : [];
return {};
},
@@ -319,7 +319,7 @@ var List = React.createClass({
if (info) {
var fromName = getName(e.dataTransfer.getData('-' + NAME_PREFIX));
info.target.style.background = '';
if (this.props.modal.moveTo(fromName, info.toName)) {
if (this.props.modal.moveTo(fromName, info.toName, this.collapseNodes.indexOf(fromName) !== -1)) {
var name = this.props.name === 'rules' ? 'rules' : 'values';
dataCenter[name].moveTo(
{
@@ -484,7 +484,7 @@ var List = React.createClass({
isRules ? 7 : 8
);
if (!isRules) {
valuesCtxMenuList[0].list[0].name = name && name[0] === '\r' ? 'Name' : 'Key';
valuesCtxMenuList[0].list[0].name = name && util.isGroup(name) ? 'Name' : 'Key';
}
var height = (isRules ? 280 : 310) - (pluginItem.hide ? 30 : 0);
pluginItem.maxHeight = height + 30;
@@ -563,7 +563,7 @@ var List = React.createClass({
};
list.forEach(function(name, i) {
var item = data[name];
if (item.name[0] === '\r') {
if (util.isGroup(item.name)) {
setStatus();
item.isGroup = true;
group = item;
+4
View File
@@ -2296,3 +2296,7 @@ var PROTO_RE = /^((?:http|ws)s?:\/\/)[^/?]*/;
exports.getRawUrl = function (item) {
return item.fwdHost && item.url.replace(PROTO_RE, '$1' + item.fwdHost);
};
exports.isGroup = function(name) {
return name && name[0] === '\r';
};
+19 -3
View File
@@ -2,6 +2,7 @@ var fs = require('fs');
var fse = require('fs-extra2');
var path = require('path');
var logger = require('../util/logger');
var isGroup = require('../util/common').isGroup;
var RecycleBin = require('./recycle-bin');
var ENCODING = { encoding: 'utf8' };
@@ -372,7 +373,7 @@ proto.renameFile = function (file, newFile) {
return true;
};
proto.moveTo = function (fromName, toName) {
proto.moveTo = function (fromName, toName, group) {
var filesOrder = this._cache.properties.filesOrder;
var fromIndex = filesOrder.indexOf(fromName);
if (this._disabled || fromIndex === -1) {
@@ -382,8 +383,23 @@ proto.moveTo = function (fromName, toName) {
if (toIndex === -1 || fromIndex === toIndex) {
return false;
}
filesOrder.splice(fromIndex, 1);
filesOrder.splice(toIndex, 0, fromName);
if (group && isGroup(fromName)) {
var files = this._cache.files;
var children = [fromName];
for (var i = fromIndex + 1, len = filesOrder.length; i < len; i++) {
var name = files[filesOrder[i]].name;
if (isGroup(name)) {
break;
}
children.push(name);
}
filesOrder.splice(fromIndex, children.length);
children.unshift(toIndex, 0);
filesOrder.splice.apply(filesOrder, children);
} else {
filesOrder.splice(fromIndex, 1);
filesOrder.splice(toIndex, 0, fromName);
}
this._writeProperties();
return true;
};
+5 -5
View File
@@ -310,7 +310,7 @@ function getAllRulesFile() {
function getFirstGroup(storage) {
var list = storage.getFileList();
for (var i = 0, len = list.length; i < len; i++) {
if (list[i].name[0] === '\r') {
if (util.isGroup(list[i].name)) {
return list[i];
}
}
@@ -327,8 +327,8 @@ function resetRulesIfResort(fromName, toName) {
parseRules();
}
function moveRulesTo(fromName, toName, clientId) {
if (rulesStorage.moveTo(fromName, toName)) {
function moveRulesTo(fromName, toName, clientId, group) {
if (rulesStorage.moveTo(fromName, toName, group)) {
resetRulesIfResort(fromName, toName);
config.setModified(clientId, true);
proxy.emit('rulesDataChange', 'move', fromName, toName);
@@ -494,8 +494,8 @@ exports.values = {
callback(err);
});
},
moveTo: function (fromName, toName, clientId) {
if (valuesStorage.moveTo(fromName, toName)) {
moveTo: function (fromName, toName, clientId, group) {
if (valuesStorage.moveTo(fromName, toName, group)) {
config.setModified(clientId);
proxy.emit('valuesDataChange', 'move', fromName, toName);
return true;
+4
View File
@@ -320,3 +320,7 @@ exports.wrapRuleValue = function(key, value, size, policy) {
var sep = typeof '`'.repeat === 'function' ? '`'.repeat(count) : '```````````';
return '\n' + sep + ' ' + key + '\n' + value + '\n' + sep + '\n';
};
exports.isGroup = function(name) {
return name && name[0] === '\r';
};
+1
View File
@@ -259,6 +259,7 @@ function getLatestVersion(registry, cb) {
exports.getRegistry = getRegistry;
exports.getLatestVersion = getLatestVersion;
exports.isEmptyObject = common.isEmptyObject;
exports.isGroup = common.isGroup;
exports.addTrailerNames = common.addTrailerNames;
exports.removeIllegalTrailers = common.removeIllegalTrailers;
exports.isHead = common.isHead;