summaryrefslogtreecommitdiffstats
path: root/js/dav
diff options
context:
space:
mode:
authorDaniel Landau <daniel@landau.fi>2017-01-04 20:13:49 +0200
committerDaniel Landau <daniel@landau.fi>2017-03-16 21:53:44 +0200
commit028df62242f9756c043af4faaff0f4359baaf892 (patch)
tree29782fc1648a3c69d56392391f4efd7ec8fdf418 /js/dav
parent1df38ad9ab7408fa7b96b2bb397503b081641e68 (diff)
Get images as needed for visible rows
Signed-off-by: Daniel Landau <daniel@landau.fi>
Diffstat (limited to 'js/dav')
-rw-r--r--js/dav/dav.js134
-rw-r--r--js/dav/lib/accounts.js2
-rw-r--r--js/dav/lib/client.js5
-rw-r--r--js/dav/lib/contacts.js28
-rw-r--r--js/dav/lib/request.js7
-rw-r--r--js/dav/lib/template/address_book_multiget.js15
-rw-r--r--js/dav/lib/template/href.js0
-rw-r--r--js/dav/lib/template/index.js1
8 files changed, 162 insertions, 30 deletions
diff --git a/js/dav/dav.js b/js/dav/dav.js
index 08825227..c01369fb 100644
--- a/js/dav/dav.js
+++ b/js/dav/dav.js
@@ -938,7 +938,7 @@ exports.createAccount = _co2['default'].wrap(regeneratorRuntime.mark(function ca
}));
// http redirect.
-},{"./calendars":2,"./contacts":5,"./debug":6,"./fuzzy_url_equals":7,"./model":9,"./namespace":10,"./request":12,"co":31,"url":30}],2:[function(require,module,exports){
+},{"./calendars":2,"./contacts":5,"./debug":6,"./fuzzy_url_equals":7,"./model":9,"./namespace":10,"./request":12,"co":32,"url":31}],2:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -1329,7 +1329,7 @@ var webdavSync = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$
}
}, callee$0$0, this);
}));
-},{"./debug":6,"./fuzzy_url_equals":7,"./model":9,"./namespace":10,"./request":12,"./webdav":24,"co":31,"url":30}],3:[function(require,module,exports){
+},{"./debug":6,"./fuzzy_url_equals":7,"./model":9,"./namespace":10,"./request":12,"./webdav":25,"co":32,"url":31}],3:[function(require,module,exports){
/**
* @fileoverview Camelcase something.
*/
@@ -1532,6 +1532,14 @@ var Client = (function () {
return contacts.deleteCard(card, options);
}
}, {
+ key: 'getContacts',
+ value: function getContacts(addressBook, options, hrefs) {
+ if (options === undefined) options = {};
+
+ options.xhr = options.xhr || this.xhr;
+ return contacts.getContacts(addressBook, options, hrefs);
+ }
+ }, {
key: 'syncAddressBook',
value: function syncAddressBook(addressBook) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
@@ -1553,7 +1561,7 @@ var Client = (function () {
})();
exports.Client = Client;
-},{"./accounts":1,"./calendars":2,"./contacts":5,"url":30}],5:[function(require,module,exports){
+},{"./accounts":1,"./calendars":2,"./contacts":5,"url":31}],5:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -1743,6 +1751,42 @@ function createCard(addressBook, options) {
return webdav.createObject(objectUrl, options.data, options);
}
+var getFullVcards = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$0(addressBook, options, hrefs) {
+ var 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:
+ req = request.addressBookMultiget({
+ depth: 1,
+ props: [{ name: 'getetag', namespace: ns.DAV }, { name: 'address-data', namespace: ns.CARDDAV }],
+ hrefs: hrefs
+ });
+ context$1$0.next = 3;
+ return options.xhr.send(req, addressBook.url, {
+ sandbox: options.sandbox
+ });
+
+ case 3:
+ responses = context$1$0.sent;
+ return context$1$0.abrupt('return', responses.map(function (res) {
+ debug('Found vcard with url ' + res.href);
+ return new _model.VCard({
+ data: res,
+ addressBook: addressBook,
+ url: _url2['default'].resolve(addressBook.account.rootUrl, res.href),
+ etag: res.props.getetag,
+ addressData: res.props.addressData
+ });
+ }));
+
+ case 5:
+ case 'end':
+ return context$1$0.stop();
+ }
+ }, callee$0$0, this);
+}));
+
+exports.getFullVcards = getFullVcards;
/**
* Options:
*
@@ -1755,7 +1799,7 @@ var listVCards = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$
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) {
+ vCardListFields = ['EMAIL', 'UID', 'CATEGORIES', 'FN', 'TEL', 'NICKNAME'].map(function (value) {
return {
name: 'prop',
namespace: ns.CARDDAV,
@@ -1914,6 +1958,9 @@ var syncCarddavAccount = _co2['default'].wrap(regeneratorRuntime.mark(function c
}));
exports.syncCarddavAccount = syncCarddavAccount;
+var getContacts = getFullVcards;
+
+exports.getContacts = getContacts;
var basicSync = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$0(addressBook, options) {
var sync;
return regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
@@ -1986,7 +2033,7 @@ var webdavSync = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$
}
}, callee$0$0, this);
}));
-},{"./debug":6,"./fuzzy_url_equals":7,"./model":9,"./namespace":10,"./request":12,"./webdav":24,"co":31,"url":30}],6:[function(require,module,exports){
+},{"./debug":6,"./fuzzy_url_equals":7,"./model":9,"./namespace":10,"./request":12,"./webdav":25,"co":32,"url":31}],6:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -2116,7 +2163,7 @@ exports.debug = _debug2['default'];
exports.ns = ns;
exports.request = request;
exports.transport = transport;
-},{"../package":35,"./accounts":1,"./calendars":2,"./client":4,"./contacts":5,"./debug":6,"./model":9,"./namespace":10,"./request":12,"./sandbox":13,"./transport":23}],9:[function(require,module,exports){
+},{"../package":36,"./accounts":1,"./calendars":2,"./client":4,"./contacts":5,"./debug":6,"./model":9,"./namespace":10,"./request":12,"./sandbox":13,"./transport":24}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -2500,13 +2547,14 @@ function children(node, localName) {
function child(node, localName) {
return children(node, localName)[0];
}
-},{"./camelize":3,"./debug":6,"xmldom":32}],12:[function(require,module,exports){
+},{"./camelize":3,"./debug":6,"xmldom":33}],12:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.addressBookQuery = addressBookQuery;
+exports.addressBookMultiget = addressBookMultiget;
exports.basic = basic;
exports.calendarQuery = calendarQuery;
exports.collectionQuery = collectionQuery;
@@ -2539,6 +2587,10 @@ function addressBookQuery(options) {
return collectionQuery(template.addressBookQuery({ props: options.props || [] }), { depth: options.depth });
}
+function addressBookMultiget(options) {
+ return collectionQuery(template.addressBookMultiget({ props: options.props || [], hrefs: options.hrefs || [] }), { depth: options.depth });
+}
+
/**
* Options:
*
@@ -2765,7 +2817,7 @@ function setRequestHeaders(request, options) {
request.setRequestHeader('Overwrite', options.overwrite);
}
}
-},{"./parser":11,"./template":17}],13:[function(require,module,exports){
+},{"./parser":11,"./template":18}],13:[function(require,module,exports){
/**
* @fileoverview Group requests together and then abort as a group.
*
@@ -2830,6 +2882,29 @@ function createSandbox() {
Object.defineProperty(exports, "__esModule", {
value: true
});
+exports["default"] = addressBookMultiget;
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+var _prop = require('./prop');
+
+var _prop2 = _interopRequireDefault(_prop);
+
+function href(href) {
+ return "<d:href>" + href + "</d:href>";
+}
+
+function addressBookMultiget(object) {
+ return "<card:addressbook-multiget 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 " + object.hrefs.map(href).join("") + "\n </card:addressbook-multiget>";
+}
+
+module.exports = exports["default"];
+},{"./prop":20}],15:[function(require,module,exports){
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
exports["default"] = addressBookQuery;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
@@ -2843,7 +2918,7 @@ function addressBookQuery(object) {
}
module.exports = exports["default"];
-},{"./prop":19}],15:[function(require,module,exports){
+},{"./prop":20}],16:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -2866,7 +2941,7 @@ function calendarQuery(object) {
}
module.exports = exports['default'];
-},{"./filter":16,"./prop":19}],16:[function(require,module,exports){
+},{"./filter":17,"./prop":20}],17:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -2893,16 +2968,17 @@ function formatAttrs(attrs) {
}).join(' ');
}
module.exports = exports['default'];
-},{}],17:[function(require,module,exports){
+},{}],18:[function(require,module,exports){
'use strict';
exports.addressBookQuery = require('./address_book_query');
+exports.addressBookMultiget = require('./address_book_multiget');
exports.calendarQuery = require('./calendar_query');
exports.propfind = require('./propfind');
exports.syncCollection = require('./sync_collection');
exports.mkcol = require('./mkcol');
exports.proppatch = require('./proppatch');
-},{"./address_book_query":14,"./calendar_query":15,"./mkcol":18,"./propfind":20,"./proppatch":21,"./sync_collection":22}],18:[function(require,module,exports){
+},{"./address_book_multiget":14,"./address_book_query":15,"./calendar_query":16,"./mkcol":19,"./propfind":21,"./proppatch":22,"./sync_collection":23}],19:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -2921,7 +2997,7 @@ function mkcol(object) {
}
module.exports = exports['default'];
-},{"./prop":19}],19:[function(require,module,exports){
+},{"./prop":20}],20:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3008,7 +3084,7 @@ function xmlnsPrefix(namespace) {
}
}
module.exports = exports['default'];
-},{"../namespace":10}],20:[function(require,module,exports){
+},{"../namespace":10}],21:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3027,7 +3103,7 @@ function propfind(object) {
}
module.exports = exports['default'];
-},{"./prop":19}],21:[function(require,module,exports){
+},{"./prop":20}],22:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3046,7 +3122,7 @@ function proppatch(object) {
}
module.exports = exports['default'];
-},{"./prop":19}],22:[function(require,module,exports){
+},{"./prop":20}],23:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3065,7 +3141,7 @@ function syncCollection(object) {
}
module.exports = exports['default'];
-},{"./prop":19}],23:[function(require,module,exports){
+},{"./prop":20}],24:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3378,7 +3454,7 @@ var refreshAccessToken = _co2['default'].wrap(regeneratorRuntime.mark(function c
}
}, callee$0$0, this);
}));
-},{"./xmlhttprequest":25,"co":31,"querystring":29}],24:[function(require,module,exports){
+},{"./xmlhttprequest":26,"co":32,"querystring":30}],25:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3560,7 +3636,7 @@ var isCollectionDirty = _co2['default'].wrap(regeneratorRuntime.mark(function ca
}, callee$0$0, this);
}));
exports.isCollectionDirty = isCollectionDirty;
-},{"./debug":6,"./fuzzy_url_equals":7,"./namespace":10,"./request":12,"co":31}],25:[function(require,module,exports){
+},{"./debug":6,"./fuzzy_url_equals":7,"./namespace":10,"./request":12,"co":32}],26:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, '__esModule', {
@@ -3684,7 +3760,7 @@ var XMLHttpRequest = (function () {
exports['default'] = XMLHttpRequest;
module.exports = exports['default'];
-},{"./debug":6}],26:[function(require,module,exports){
+},{"./debug":6}],27:[function(require,module,exports){
(function (global){
/*! https://mths.be/punycode v1.4.1 by @mathias */
;(function(root) {
@@ -4221,7 +4297,7 @@ module.exports = exports['default'];
}(this));
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],27:[function(require,module,exports){
+},{}],28:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -4307,7 +4383,7 @@ var isArray = Array.isArray || function (xs) {
return Object.prototype.toString.call(xs) === '[object Array]';
};
-},{}],28:[function(require,module,exports){
+},{}],29:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -4394,13 +4470,13 @@ var objectKeys = Object.keys || function (obj) {
return res;
};
-},{}],29:[function(require,module,exports){
+},{}],30:[function(require,module,exports){
'use strict';
exports.decode = exports.parse = require('./decode');
exports.encode = exports.stringify = require('./encode');
-},{"./decode":27,"./encode":28}],30:[function(require,module,exports){
+},{"./decode":28,"./encode":29}],31:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -5109,7 +5185,7 @@ function isNullOrUndefined(arg) {
return arg == null;
}
-},{"punycode":26,"querystring":29}],31:[function(require,module,exports){
+},{"punycode":27,"querystring":30}],32:[function(require,module,exports){
/**
* slice() reference.
@@ -5348,7 +5424,7 @@ function isObject(val) {
return Object == val.constructor;
}
-},{}],32:[function(require,module,exports){
+},{}],33:[function(require,module,exports){
function DOMParser(options){
this.options = options ||{locator:{}};
@@ -5601,7 +5677,7 @@ function appendElement (hander,node) {
exports.DOMParser = DOMParser;
//}
-},{"./dom":33,"./sax":34}],33:[function(require,module,exports){
+},{"./dom":34,"./sax":35}],34:[function(require,module,exports){
/*
* DOM Level 2
* Object DOMException
@@ -6847,7 +6923,7 @@ try{
exports.XMLSerializer = XMLSerializer;
//}
-},{}],34:[function(require,module,exports){
+},{}],35:[function(require,module,exports){
//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5] Name ::= NameStartChar (NameChar)*
@@ -7482,7 +7558,7 @@ function split(source,start){
exports.XMLReader = XMLReader;
-},{}],35:[function(require,module,exports){
+},{}],36:[function(require,module,exports){
module.exports={
"name": "dav",
"version": "1.8.0",
diff --git a/js/dav/lib/accounts.js b/js/dav/lib/accounts.js
index f471c5b6..61aea17f 100644
--- a/js/dav/lib/accounts.js
+++ b/js/dav/lib/accounts.js
@@ -2,7 +2,7 @@ import co from 'co';
import url from 'url';
import { listCalendars, listCalendarObjects } from './calendars';
-import { listAddressBooks, listVCards } from './contacts';
+import { listAddressBooks, listVCards, getFullVcards } from './contacts';
import fuzzyUrlEquals from './fuzzy_url_equals';
import { Account } from './model';
import * as ns from './namespace';
diff --git a/js/dav/lib/client.js b/js/dav/lib/client.js
index 2846278f..ccec11b6 100644
--- a/js/dav/lib/client.js
+++ b/js/dav/lib/client.js
@@ -108,6 +108,11 @@ export class Client {
return contacts.deleteCard(card, options);
}
+ getContacts(addressBook, options={}, hrefs) {
+ options.xhr = options.xhr || this.xhr;
+ return contacts.getContacts(addressBook, options, hrefs);
+ }
+
syncAddressBook(addressBook, options={}) {
options.xhr = options.xhr || this.xhr;
return contacts.syncAddressBook(addressBook, options);
diff --git a/js/dav/lib/contacts.js b/js/dav/lib/contacts.js
index 125e1327..1c847fb8 100644
--- a/js/dav/lib/contacts.js
+++ b/js/dav/lib/contacts.js
@@ -143,6 +143,32 @@ export function createCard(addressBook, options) {
return webdav.createObject(objectUrl, options.data, options);
}
+export let getFullVcards = co.wrap(function *(addressBook, options, hrefs) {
+ var req = request.addressBookMultiget({
+ depth: 1,
+ props: [
+ { name: 'getetag', namespace: ns.DAV },
+ { name: 'address-data', namespace: ns.CARDDAV }
+ ],
+ hrefs: hrefs
+ });
+
+ let responses = yield options.xhr.send(req, addressBook.url, {
+ sandbox: options.sandbox
+ });
+
+ return responses.map(res => {
+ debug(`Found vcard with url ${res.href}`);
+ return new VCard({
+ data: res,
+ addressBook: addressBook,
+ url: url.resolve(addressBook.account.rootUrl, res.href),
+ etag: res.props.getetag,
+ addressData: res.props.addressData
+ });
+ });
+});
+
/**
* Options:
*
@@ -276,6 +302,8 @@ export let syncCarddavAccount = co.wrap(function *(account, options={}) {
return account;
});
+export let getContacts = getFullVcards;
+
let basicSync = co.wrap(function *(addressBook, options) {
let sync = webdav.isCollectionDirty(addressBook, options)
if (!sync) {
diff --git a/js/dav/lib/request.js b/js/dav/lib/request.js
index 97de3c3e..10d79af5 100644
--- a/js/dav/lib/request.js
+++ b/js/dav/lib/request.js
@@ -14,6 +14,13 @@ export function addressBookQuery(options) {
);
}
+export function addressBookMultiget(options) {
+ return collectionQuery(
+ template.addressBookMultiget({ props: options.props || [], hrefs: options.hrefs || [] }),
+ { depth: options.depth }
+ );
+}
+
/**
* Options:
*
diff --git a/js/dav/lib/template/address_book_multiget.js b/js/dav/lib/template/address_book_multiget.js
new file mode 100644
index 00000000..d13e03d5
--- /dev/null
+++ b/js/dav/lib/template/address_book_multiget.js
@@ -0,0 +1,15 @@
+import prop from './prop';
+
+function href(href) {
+ return `<d:href>${href}</d:href>`;
+}
+
+export default function addressBookMultiget(object) {
+ return `<card:addressbook-multiget xmlns:card="urn:ietf:params:xml:ns:carddav"
+ xmlns:d="DAV:">
+ <d:prop>
+ ${object.props.map(prop).join("")}
+ </d:prop>
+ ${object.hrefs.map(href).join("")}
+ </card:addressbook-multiget>`;
+}
diff --git a/js/dav/lib/template/href.js b/js/dav/lib/template/href.js
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/js/dav/lib/template/href.js
diff --git a/js/dav/lib/template/index.js b/js/dav/lib/template/index.js
index 005a0f82..3258fb1d 100644
--- a/js/dav/lib/template/index.js
+++ b/js/dav/lib/template/index.js
@@ -1,4 +1,5 @@
exports.addressBookQuery = require('./address_book_query');
+exports.addressBookMultiget = require('./address_book_multiget');
exports.calendarQuery = require('./calendar_query');
exports.propfind = require('./propfind');
exports.syncCollection = require('./sync_collection');