diff --git a/core/js/oc-backbone-webdav.js b/core/js/oc-backbone-webdav.js index 1c1b5c71d8..4e3f11ce09 100644 --- a/core/js/oc-backbone-webdav.js +++ b/core/js/oc-backbone-webdav.js @@ -120,7 +120,15 @@ } var parts = url.split('/'); - return parts[parts.length - 1]; + var result; + do { + result = parts[parts.length - 1]; + parts.pop(); + // note: first result can be empty when there is a trailing slash, + // so we take the part before that + } while (!result && parts.length > 0); + + return result; } function isSuccessStatus(status) { @@ -190,6 +198,25 @@ } + function callMkCol(client, options, model, headers) { + // call MKCOL without data, followed by PROPPATCH + return client.request( + options.type, + options.url, + headers, + null + ).then(function(result) { + if (!isSuccessStatus(result.status)) { + if (_.isFunction(options.error)) { + options.error(result); + } + return; + } + + callPropPatch(client, options, model, headers); + }); + } + function callMethod(client, options, model, headers) { headers['Content-Type'] = 'application/json'; return client.request( @@ -206,7 +233,7 @@ } if (_.isFunction(options.success)) { - if (options.type === 'PUT' || options.type === 'POST') { + if (options.type === 'PUT' || options.type === 'POST' || options.type === 'MKCOL') { // pass the object's own values because the server // does not return anything var responseJson = result.body || model.toJSON(); @@ -247,6 +274,8 @@ return callPropFind(client, options, model, headers); } else if (options.type === 'PROPPATCH') { return callPropPatch(client, options, model, headers); + } else if (options.type === 'MKCOL') { + return callMkCol(client, options, model, headers); } else { return callMethod(client, options, model, headers); } @@ -259,9 +288,16 @@ var params = {type: methodMap[method] || method}; var isCollection = (model instanceof Backbone.Collection); - if (method === 'update' && (model.usePUT || (model.collection && model.collection.usePUT))) { - // use PUT instead of PROPPATCH - params.type = 'PUT'; + if (method === 'update') { + // if a model has an inner collection, it must define an + // attribute "hasInnerCollection" that evaluates to true + if (model.hasInnerCollection) { + // if the model itself is a Webdav collection, use MKCOL + params.type = 'MKCOL'; + } else if (model.usePUT || (model.collection && model.collection.usePUT)) { + // use PUT instead of PROPPATCH + params.type = 'PUT'; + } } // Ensure that we have a URL.