function replaceArticleWith()

in public/src/js/utils/drag-dispatcher.js [101:145]


function replaceArticleWith (id, sourceItem, oldItem, targetGroup) {
    var newItems = newItemsConstructor({id}, targetGroup);

    if (!newItems[0]) {
        alert('Sorry, but you can\'t use that item.');
    } else {
        var newItem = newItems[0];
        var targetContext = targetGroup.front;
        var returnValue;

        _.chain(oldItem.meta)
            .keys()
            .each(key => {
                if (_.isFunction(oldItem.meta[key])) {
                    newItem.meta[key](oldItem.meta[key]());
                } else {
                    newItem.meta[key] = oldItem.meta[key];
                }
            });

        var sourceGroup = oldItem.group;
        var update = {
            collection: sourceGroup.parent,
            item: newItem.id(),
            position: oldItem.id(),
            after: false,
            mode: targetContext.mode(),
            itemMeta: serializeArticleMeta(newItem)
        };
        var remove = remover(targetContext, sourceGroup, oldItem.id());

        returnValue = authedAjax.updateCollections({ update })
        .then(() => {
            return authedAjax.updateCollections({ remove });
        })
        .catch(() => {});

        if (sourceGroup && !sourceGroup.keepCopy) {
            var insertAt = sourceGroup.items().indexOf(oldItem);
            sourceGroup.items.splice(insertAt, 1, newItem); // for immediate UI effect
        }

        return returnValue;
    }
}