2015-09-11 16:25:45 +02:00
|
|
|
var _ = require('lodash');
|
|
|
|
var actions = require('../actions');
|
2015-11-03 17:45:37 +01:00
|
|
|
var Tree = require('../../util/tree');
|
2015-09-04 12:10:08 +02:00
|
|
|
|
|
|
|
module.exports = function(oldProfile, action) {
|
|
|
|
|
2015-10-16 15:12:49 +02:00
|
|
|
var newProfile = oldProfile || { items: [] };
|
|
|
|
|
2015-09-04 12:10:08 +02:00
|
|
|
switch(action.type) {
|
|
|
|
|
2015-09-17 17:29:59 +02:00
|
|
|
case actions.common.LOAD_PROFILE_SUCCESS:
|
2015-10-16 15:12:49 +02:00
|
|
|
newProfile = _.cloneDeep(action.profile);
|
|
|
|
break;
|
2015-09-11 16:25:45 +02:00
|
|
|
|
|
|
|
case actions.edit.MOVE_PROFILE_ITEM:
|
2015-10-16 15:12:49 +02:00
|
|
|
newProfile = moveProfileItem(oldProfile, action.movedItem, action.targetItem);
|
|
|
|
break;
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-10-10 18:44:31 +02:00
|
|
|
case actions.edit.REMOVE_PROFILE_ITEM:
|
2015-10-16 15:12:49 +02:00
|
|
|
newProfile = removeProfileItem(oldProfile, action.removedItem);
|
|
|
|
break;
|
2015-10-10 18:44:31 +02:00
|
|
|
|
2015-09-11 16:25:45 +02:00
|
|
|
case actions.edit.ADD_PROFILE_ITEM:
|
2015-10-16 15:12:49 +02:00
|
|
|
newProfile = addProfileItem(oldProfile, action.newItem, action.targetItem);
|
|
|
|
break;
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-09-16 17:26:56 +02:00
|
|
|
case actions.edit.UPDATE_PROFILE_ITEM:
|
2015-10-16 15:12:49 +02:00
|
|
|
newProfile = updateProfileItem(oldProfile, action.item, action.key, action.value);
|
|
|
|
break;
|
2015-09-16 17:26:56 +02:00
|
|
|
|
2015-09-04 12:10:08 +02:00
|
|
|
}
|
|
|
|
|
2015-10-16 15:12:49 +02:00
|
|
|
return newProfile;
|
|
|
|
|
2015-09-11 16:25:45 +02:00
|
|
|
};
|
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
function updateProfileItem(profile, targetItem, key, value) {
|
|
|
|
var tree = new Tree(profile);
|
|
|
|
var result = tree.find(targetItem);
|
|
|
|
var itemPath = result.path;
|
|
|
|
tree.update(itemPath.concat(key), {$set: value});
|
|
|
|
return tree.getState();
|
2015-09-16 17:26:56 +02:00
|
|
|
}
|
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
function removeProfileItem(profile, removedItem) {
|
|
|
|
var tree = new Tree(profile);
|
|
|
|
var result = tree.find(removedItem);
|
|
|
|
tree.del(result.path);
|
|
|
|
return tree.getState();
|
2015-09-16 17:26:56 +02:00
|
|
|
}
|
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
function moveProfileItem(profile, movedItem, targetItem) {
|
2015-10-10 18:44:31 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
var tree = new Tree(profile);
|
2015-10-10 18:44:31 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
var movedResult = tree.find(movedItem);
|
|
|
|
var targetResult = tree.find(targetItem);
|
2015-10-10 18:44:31 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
// Remove item from current location
|
|
|
|
tree.del(movedResult.path);
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
var targetPath = targetResult ? targetResult.path : [];
|
|
|
|
var targetItemsPath = targetPath.concat('items');
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
// Create "items" collection if not defined on target item
|
|
|
|
if( !('items' in targetItem) ) {
|
|
|
|
tree.update(targetItemsPath, {
|
|
|
|
"$set": []
|
|
|
|
});
|
|
|
|
}
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
// Add moved item to target
|
|
|
|
tree.update(targetItemsPath, {
|
|
|
|
"$push": [movedItem]
|
2015-09-11 16:25:45 +02:00
|
|
|
});
|
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
return tree.getState();
|
2015-09-04 12:10:08 +02:00
|
|
|
|
2015-09-11 16:25:45 +02:00
|
|
|
}
|
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
function addProfileItem(profile, newItem, targetItem) {
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
var tree = new Tree(profile);
|
2015-09-11 16:25:45 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
var targetResult = tree.find(targetItem);
|
|
|
|
var targetPath = targetResult ? targetResult.path : [];
|
|
|
|
var targetItemsPath = targetPath.concat('items');
|
2015-09-16 17:26:56 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
// Create "items" collection if not defined on target item
|
|
|
|
if( !('items' in targetItem) ) {
|
|
|
|
tree.update(targetItemsPath, {
|
|
|
|
"$set": []
|
|
|
|
});
|
|
|
|
}
|
2015-09-16 17:26:56 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
// Add moved item to target
|
|
|
|
tree.update(targetItemsPath, {
|
|
|
|
"$push": [newItem]
|
|
|
|
});
|
2015-09-16 17:26:56 +02:00
|
|
|
|
2015-11-03 17:45:37 +01:00
|
|
|
return tree.getState();
|
2015-09-16 17:26:56 +02:00
|
|
|
|
2015-09-11 16:25:45 +02:00
|
|
|
}
|