summaryrefslogtreecommitdiffstats
path: root/js/dav
diff options
context:
space:
mode:
authorDaniel Landau <daniel@landau.fi>2017-01-02 20:22:32 +0200
committerDaniel Landau <daniel@landau.fi>2017-03-16 21:52:14 +0200
commit1df38ad9ab7408fa7b96b2bb397503b081641e68 (patch)
treeb5eae02f5b4b493c9475fd51b1c88973e3365592 /js/dav
parent0575638e44eb89936ad5fde5a5aab1b2f77f4adb (diff)
Get relevant fields for listing and searching
This requires an updated SabreDav in core. The contents of address-data are ignored before https://github.com/fruux/sabre-dav/issues/889 Signed-off-by: Daniel Landau <daniel@landau.fi>
Diffstat (limited to 'js/dav')
-rw-r--r--js/dav/dav.js43
-rw-r--r--js/dav/lib/contacts.js10
-rw-r--r--js/dav/lib/template/address_book_query.js2
-rw-r--r--js/dav/lib/template/prop.js18
4 files changed, 52 insertions, 21 deletions
diff --git a/js/dav/dav.js b/js/dav/dav.js
index 7fd00133..08825227 100644
--- a/js/dav/dav.js
+++ b/js/dav/dav.js
@@ -1749,22 +1749,29 @@ function createCard(addressBook, options) {
* (dav.Sandbox) sandbox - optional request sandbox.
*/
var listVCards = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$0(addressBook, options) {
- var req, responses;
+ var vCardListFields, req, responses;
return regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
debug('Doing REPORT on address book ' + addressBook.url + ' which belongs to\n ' + addressBook.account.credentials.username);
+ vCardListFields = ['EMAIL', 'UID', 'CATEGORIES', 'FN', 'TEL'].map(function (value) {
+ return {
+ name: 'prop',
+ namespace: ns.CARDDAV,
+ attrs: [{ name: 'name', value: value }]
+ };
+ });
req = request.addressBookQuery({
depth: 1,
- props: [{ name: 'getetag', namespace: ns.DAV }, { name: 'address-data', namespace: ns.CARDDAV }]
+ props: [{ name: 'getetag', namespace: ns.DAV }, { name: 'address-data', namespace: ns.CARDDAV, children: vCardListFields }]
});
- context$1$0.next = 4;
+ context$1$0.next = 5;
return options.xhr.send(req, addressBook.url, {
sandbox: options.sandbox
});
- case 4:
+ case 5:
responses = context$1$0.sent;
return context$1$0.abrupt('return', responses.map(function (res) {
debug('Found vcard with url ' + res.href);
@@ -1777,7 +1784,7 @@ var listVCards = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$
});
}));
- case 6:
+ case 7:
case 'end':
return context$1$0.stop();
}
@@ -2818,24 +2825,24 @@ function createSandbox() {
return new Sandbox();
}
},{"./debug":6}],14:[function(require,module,exports){
-'use strict';
+"use strict";
-Object.defineProperty(exports, '__esModule', {
+Object.defineProperty(exports, "__esModule", {
value: true
});
-exports['default'] = addressBookQuery;
+exports["default"] = addressBookQuery;
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var _prop = require('./prop');
var _prop2 = _interopRequireDefault(_prop);
function addressBookQuery(object) {
- return '<card:addressbook-query xmlns:card="urn:ietf:params:xml:ns:carddav"\n xmlns:d="DAV:">\n <d:prop>\n ' + object.props.map(_prop2['default']) + '\n </d:prop>\n <card:limit><card:nresults>10</card:nresults></card:limit>\n <!-- According to http://stackoverflow.com/questions/23742568/google-carddav-api-addressbook-multiget-returns-400-bad-request,\n Google\'s CardDAV server requires a filter element. I don\'t think all addressbook-query calls need a filter in the spec though? -->\n </card:addressbook-query>';
+ return "<card:addressbook-query xmlns:card=\"urn:ietf:params:xml:ns:carddav\"\n xmlns:d=\"DAV:\">\n <d:prop>\n " + object.props.map(_prop2["default"]).join("") + "\n </d:prop>\n <!-- According to http://stackoverflow.com/questions/23742568/google-carddav-api-addressbook-multiget-returns-400-bad-request,\n Google's CardDAV server requires a filter element. I don't think all addressbook-query calls need a filter in the spec though? -->\n </card:addressbook-query>";
}
-module.exports = exports['default'];
+module.exports = exports["default"];
},{"./prop":19}],15:[function(require,module,exports){
'use strict';
@@ -2965,15 +2972,23 @@ var ns = _interopRequireWildcard(_namespace);
*/
function prop(item) {
+ var tagName = xmlnsPrefix(item.namespace) + ':' + item.name;
+ var attrs = (item.attrs || []).map(makeAttr).join(' ');
if (!item.children || !item.children.length) {
if (typeof item.value === "undefined") {
- return '<' + xmlnsPrefix(item.namespace) + ':' + item.name + ' />';
+ return '<' + tagName + ' ' + attrs + '/>';
}
- return '<' + xmlnsPrefix(item.namespace) + ':' + item.name + '>' + item.value + '</' + xmlnsPrefix(item.namespace) + ':' + item.name + '>';
+ return '<' + tagName + ' ' + attrs + '>' + item.value + '</' + tagName + '>';
}
var children = item.children.map(prop);
- return '<' + xmlnsPrefix(item.namespace) + ':' + item.name + '>\n ' + children + '\n </' + xmlnsPrefix(item.namespace) + ':' + item.name + '>';
+ return '<' + tagName + ' ' + attrs + '>\n ' + children.join('') + '\n </' + tagName + '>';
+}
+
+function makeAttr(attr) {
+ if (!attr.name) return '';
+ if (!attr.value) return attr.name;
+ return attr.name + '="' + attr.value + '"';
}
function xmlnsPrefix(namespace) {
diff --git a/js/dav/lib/contacts.js b/js/dav/lib/contacts.js
index 719eb08e..125e1327 100644
--- a/js/dav/lib/contacts.js
+++ b/js/dav/lib/contacts.js
@@ -152,11 +152,19 @@ export let listVCards = co.wrap(function *(addressBook, options) {
debug(`Doing REPORT on address book ${addressBook.url} which belongs to
${addressBook.account.credentials.username}`);
+ var vCardListFields = [ 'EMAIL', 'UID', 'CATEGORIES', 'FN', 'TEL', 'NICKNAME' ]
+ .map(function (value) {
+ return {
+ name: 'prop',
+ namespace: ns.CARDDAV,
+ attrs: [ { name: 'name', value: value } ]
+ };
+ });
var req = request.addressBookQuery({
depth: 1,
props: [
{ name: 'getetag', namespace: ns.DAV },
- { name: 'address-data', namespace: ns.CARDDAV }
+ { name: 'address-data', namespace: ns.CARDDAV, children: vCardListFields }
]
});
diff --git a/js/dav/lib/template/address_book_query.js b/js/dav/lib/template/address_book_query.js
index 3b6e5796..a03bef2d 100644
--- a/js/dav/lib/template/address_book_query.js
+++ b/js/dav/lib/template/address_book_query.js
@@ -4,7 +4,7 @@ export default function addressBookQuery(object) {
return `<card:addressbook-query xmlns:card="urn:ietf:params:xml:ns:carddav"
xmlns:d="DAV:">
<d:prop>
- ${object.props.map(prop)}
+ ${object.props.map(prop).join("")}
</d:prop>
<!-- According to http://stackoverflow.com/questions/23742568/google-carddav-api-addressbook-multiget-returns-400-bad-request,
Google's CardDAV server requires a filter element. I don't think all addressbook-query calls need a filter in the spec though? -->
diff --git a/js/dav/lib/template/prop.js b/js/dav/lib/template/prop.js
index def9e9bc..54c6a5fd 100644
--- a/js/dav/lib/template/prop.js
+++ b/js/dav/lib/template/prop.js
@@ -36,17 +36,25 @@ import * as ns from '../namespace';
* }
*/
export default function prop(item) {
+ var tagName = `${xmlnsPrefix(item.namespace)}:${item.name}`;
+ var attrs = (item.attrs || []).map(makeAttr).join(' ');
if (!item.children || !item.children.length) {
if (typeof item.value === "undefined") {
- return `<${xmlnsPrefix(item.namespace)}:${item.name} />`;
+ return `<${tagName} ${attrs}/>`;
}
- return `<${xmlnsPrefix(item.namespace)}:${item.name}>${item.value}</${xmlnsPrefix(item.namespace)}:${item.name}>`;
+ return `<${tagName} ${attrs}>${item.value}</${tagName}>`;
}
let children = item.children.map(prop);
- return `<${xmlnsPrefix(item.namespace)}:${item.name}>
- ${children}
- </${xmlnsPrefix(item.namespace)}:${item.name}>`;
+ return `<${tagName} ${attrs}>
+ ${children.join('')}
+ </${tagName}>`;
+}
+
+function makeAttr(attr) {
+ if (!attr.name) return '';
+ if (!attr.value) return attr.name;
+ return `${attr.name}="${attr.value}"`;
}
function xmlnsPrefix(namespace) {