forked from 0x2620/pandora
handle undo/redo for (partially or fully) unsuccessful copy/paste/move operations
This commit is contained in:
parent
b1a8d76e83
commit
ba5f39bac5
1 changed files with 65 additions and 40 deletions
|
@ -290,18 +290,6 @@ pandora.createLinks = function($element) {
|
||||||
pandora.doHistory = function(action, items, targets, callback) {
|
pandora.doHistory = function(action, items, targets, callback) {
|
||||||
items = Ox.makeArray(items);
|
items = Ox.makeArray(items);
|
||||||
targets = Ox.makeArray(targets);
|
targets = Ox.makeArray(targets);
|
||||||
var actions = {
|
|
||||||
copy: 'Copying',
|
|
||||||
cut: 'Cutting',
|
|
||||||
'delete': 'Deleting',
|
|
||||||
move: 'Moving',
|
|
||||||
paste: 'Pasting'
|
|
||||||
},
|
|
||||||
type = getType(items),
|
|
||||||
text = Ox._(actions[action]) + ' ' + (
|
|
||||||
items.length == 1 ? Ox._(type == 'item' ? pandora.site.itemName.singular : 'Clip')
|
|
||||||
: items.length + ' ' + Ox._(type == 'item' ? pandora.site.itemName.plural : 'Clips')
|
|
||||||
);
|
|
||||||
if (action == 'copy' || action == 'paste') {
|
if (action == 'copy' || action == 'paste') {
|
||||||
addItems(items, targets[0], addToHistory);
|
addItems(items, targets[0], addToHistory);
|
||||||
} else if (action == 'cut' || action == 'delete') {
|
} else if (action == 'cut' || action == 'delete') {
|
||||||
|
@ -312,10 +300,24 @@ pandora.createLinks = function($element) {
|
||||||
addItems(items, targets[1], addToHistory)
|
addItems(items, targets[1], addToHistory)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
function addToHistory(result) {
|
function addToHistory(result, addedItems) {
|
||||||
|
var actions = {
|
||||||
|
copy: 'Copying',
|
||||||
|
cut: 'Cutting',
|
||||||
|
'delete': 'Deleting',
|
||||||
|
move: 'Moving',
|
||||||
|
paste: 'Pasting'
|
||||||
|
},
|
||||||
|
type = getType(items),
|
||||||
|
text = Ox._(actions[action]) + ' ' + (
|
||||||
|
items.length == 1 ? Ox._(type == 'item' ? pandora.site.itemName.singular : 'Clip')
|
||||||
|
: items.length + ' ' + Ox._(type == 'item' ? pandora.site.itemName.plural : 'Clips')
|
||||||
|
);
|
||||||
pandora.history.add({
|
pandora.history.add({
|
||||||
action: action,
|
action: action,
|
||||||
items: items,
|
items: action == 'cut' || action == 'delete' ? items
|
||||||
|
: action == 'copy' || action == 'paste' ? addedItems
|
||||||
|
: [items, addedItems],
|
||||||
targets: targets,
|
targets: targets,
|
||||||
text: text
|
text: text
|
||||||
});
|
});
|
||||||
|
@ -327,46 +329,69 @@ pandora.createLinks = function($element) {
|
||||||
pandora.redoHistory = function(callback) {
|
pandora.redoHistory = function(callback) {
|
||||||
var object = pandora.history.redo();
|
var object = pandora.history.redo();
|
||||||
if (object) {
|
if (object) {
|
||||||
if (object.action == 'copy' || object.action == 'paste') {
|
|
||||||
addItems(object.items, object.targets[0], done(object, callback));
|
|
||||||
} else if (object.action == 'cut' || object.action == 'delete') {
|
|
||||||
removeItems(object.items, object.targets[0], done(object, callback));
|
|
||||||
} else if (object.action == 'move') {
|
|
||||||
removeItems(
|
|
||||||
object.items, object.targets[0],
|
|
||||||
addItems(object.items, object.targets[1], done(object, callback))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
pandora.$ui.mainMenu.replaceItemMenu();
|
pandora.$ui.mainMenu.replaceItemMenu();
|
||||||
|
if (object.action == 'copy' || object.action == 'paste') {
|
||||||
|
addItems(object.items, object.targets[0], done);
|
||||||
|
} else if (object.action == 'cut' || object.action == 'delete') {
|
||||||
|
removeItems(object.items, object.targets[0], done);
|
||||||
|
} else if (object.action == 'move') {
|
||||||
|
removeItems(object.items[0], object.targets[0], function() {
|
||||||
|
addItems(object.items[1], object.targets[1], done);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function done() {
|
||||||
|
doneHistory(object, callback);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pandora.undoHistory = function(callback) {
|
pandora.undoHistory = function(callback) {
|
||||||
var object = pandora.history.undo();
|
var object = pandora.history.undo();
|
||||||
if (object) {
|
if (object) {
|
||||||
if (object.action == 'copy' || object.action == 'paste') {
|
|
||||||
removeItems(object.items, object.targets[0], done(object, callback));
|
|
||||||
} else if (object.action == 'cut' || object.action == 'delete') {
|
|
||||||
addItems(object.items, object.targets[0], done(object, callback));
|
|
||||||
} else if (object.action == 'move') {
|
|
||||||
removeItems(
|
|
||||||
object.items, object.targets[1],
|
|
||||||
addItems(object.items, object.targets[0], done(object, callback))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
pandora.$ui.mainMenu.replaceItemMenu();
|
pandora.$ui.mainMenu.replaceItemMenu();
|
||||||
|
if (object.action == 'copy' || object.action == 'paste') {
|
||||||
|
removeItems(object.items, object.targets[0], done);
|
||||||
|
} else if (object.action == 'cut' || object.action == 'delete') {
|
||||||
|
addItems(object.removedItems, object.targets[0], done);
|
||||||
|
} else if (object.action == 'move') {
|
||||||
|
removeItems(object.items[1], object.targets[1], function() {
|
||||||
|
addItems(object.items[0], object.targets[0], done);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function done() {
|
||||||
|
doneHistory(object, callback);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function addItems(items, target, callback) {
|
function addItems(items, target, callback) {
|
||||||
var type = getType(items);
|
var type = getType(items);
|
||||||
pandora.api[type == 'item' ? 'addListItems' : 'addClips'](
|
if (type == 'item') {
|
||||||
Ox.extend({items: items}, type == 'item' ? 'list' : 'edit', target),
|
pandora.api.find({
|
||||||
callback
|
query: {
|
||||||
);
|
conditions: [{key: 'list', operator: '==', value: target}],
|
||||||
|
operator: '&'
|
||||||
|
},
|
||||||
|
positions: items
|
||||||
|
}, function(result) {
|
||||||
|
var existingItems = Object.keys(result.data.positions),
|
||||||
|
addedItems = items.filter(function(item) {
|
||||||
|
return !Ox.contains(existingItems, item);
|
||||||
|
});
|
||||||
|
if (addedItems.length) {
|
||||||
|
pandora.api.addListItems({items: addedItems, list: target}, function(result) {
|
||||||
|
callback(result, addedItems);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback(null, []);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
pandora.api.addClips({items: items, edit: target}, callback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function done(object, callback) {
|
function doneHistory(object, callback) {
|
||||||
var list, listData,
|
var list, listData,
|
||||||
type = getType(object.items),
|
type = getType(object.items),
|
||||||
ui = pandora.user.ui;
|
ui = pandora.user.ui;
|
||||||
|
@ -398,7 +423,7 @@ pandora.createLinks = function($element) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getType(items) {
|
function getType(items) {
|
||||||
return Ox.contains(items[0], '/') ? 'clip' : 'item';
|
return items[0] && Ox.contains(items[0], '/') ? 'clip' : 'item';
|
||||||
};
|
};
|
||||||
|
|
||||||
function removeItems(items, target, callback) {
|
function removeItems(items, target, callback) {
|
||||||
|
|
Loading…
Reference in a new issue