var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }, __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; Annotator.Plugin.Store = (function(_super) { __extends(Store, _super); Store.prototype.events = { 'annotationCreated': 'annotationCreated', 'annotationDeleted': 'annotationDeleted', 'annotationUpdated': 'annotationUpdated' }; Store.prototype.options = { prefix: '/api', autoFetch: true, annotationData: {}, loadFromSearch: false, urls: { create: '/annotations', read: '/annotations/:id', update: '/annotations/:id', destroy: '/annotations/:id', search: '/search' } }; function Store(element, options) { this._onError = __bind(this._onError, this); this._onLoadAnnotationsFromSearch = __bind(this._onLoadAnnotationsFromSearch, this); this._onLoadAnnotations = __bind(this._onLoadAnnotations, this); this._getAnnotations = __bind(this._getAnnotations, this); Store.__super__.constructor.apply(this, arguments); this.annotations = []; } Store.prototype.pluginInit = function() { if (!Annotator.supported()) return; if (this.annotator.plugins.Auth) { return this.annotator.plugins.Auth.withToken(this._getAnnotations); } else { return this._getAnnotations(); } }; Store.prototype._getAnnotations = function() { if (this.options.loadFromSearch) { return this.loadAnnotationsFromSearch(this.options.loadFromSearch); } else { return this.loadAnnotations(); } }; Store.prototype.annotationCreated = function(annotation) { var _this = this; if (__indexOf.call(this.annotations, annotation) < 0) { this.registerAnnotation(annotation); return this._apiRequest('create', annotation, function(data) { if (!(data.id != null)) { console.warn(Annotator._t("Warning: No ID returned from server for annotation "), annotation); } return _this.updateAnnotation(annotation, data); }); } else { return this.updateAnnotation(annotation, {}); } }; Store.prototype.annotationUpdated = function(annotation) { var _this = this; if (__indexOf.call(this.annotations, annotation) >= 0) { return this._apiRequest('update', annotation, (function(data) { return _this.updateAnnotation(annotation, data); })); } }; Store.prototype.annotationDeleted = function(annotation) { var _this = this; if (__indexOf.call(this.annotations, annotation) >= 0) { return this._apiRequest('destroy', annotation, (function() { return _this.unregisterAnnotation(annotation); })); } }; Store.prototype.registerAnnotation = function(annotation) { return this.annotations.push(annotation); }; Store.prototype.unregisterAnnotation = function(annotation) { return this.annotations.splice(this.annotations.indexOf(annotation), 1); }; Store.prototype.updateAnnotation = function(annotation, data) { if (__indexOf.call(this.annotations, annotation) < 0) { console.error(Annotator._t("Trying to update unregistered annotation!")); } else { $.extend(annotation, data); } return $(annotation.highlights).data('annotation', annotation); }; Store.prototype.loadAnnotations = function() { return this._apiRequest('read', null, this._onLoadAnnotations); }; Store.prototype._onLoadAnnotations = function(data) { if (data == null) data = []; this.annotations = data; return this.annotator.loadAnnotations(data.slice()); }; Store.prototype.loadAnnotationsFromSearch = function(searchOptions) { return this._apiRequest('search', searchOptions, this._onLoadAnnotationsFromSearch); }; Store.prototype._onLoadAnnotationsFromSearch = function(data) { if (data == null) data = {}; return this._onLoadAnnotations(data.rows || []); }; Store.prototype.dumpAnnotations = function() { var ann, _i, _len, _ref, _results; _ref = this.annotations; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { ann = _ref[_i]; _results.push(JSON.parse(this._dataFor(ann))); } return _results; }; Store.prototype._apiRequest = function(action, obj, onSuccess) { var id, options, request, url; id = obj && obj.id; url = this._urlFor(action, id); options = this._apiRequestOptions(action, obj, onSuccess); request = $.ajax(url, options); request._id = id; request._action = action; return request; }; Store.prototype._apiRequestOptions = function(action, obj, onSuccess) { var opts; opts = { type: this._methodFor(action), headers: this.element.data('annotator:headers'), dataType: "json", success: onSuccess || function() {}, error: this._onError }; if (action === "search") { opts = $.extend(opts, { data: obj }); } else { opts = $.extend(opts, { data: obj && this._dataFor(obj), contentType: "application/json; charset=utf-8" }); } return opts; }; Store.prototype._urlFor = function(action, id) { var replaceWith, url; replaceWith = id != null ? '/' + id : ''; url = this.options.prefix || '/'; url += this.options.urls[action]; url = url.replace(/\/:id/, replaceWith); return url; }; Store.prototype._methodFor = function(action) { var table; table = { 'create': 'POST', 'read': 'GET', 'update': 'PUT', 'destroy': 'DELETE', 'search': 'GET' }; return table[action]; }; Store.prototype._dataFor = function(annotation) { var data, highlights; highlights = annotation.highlights; delete annotation.highlights; $.extend(annotation, this.options.annotationData); data = JSON.stringify(annotation); if (highlights) annotation.highlights = highlights; return data; }; Store.prototype._onError = function(xhr) { var action, message; action = xhr._action; message = Annotator._t("Sorry we could not ") + action + Annotator._t(" this annotation"); if (xhr._action === 'search') { message = Annotator._t("Sorry we could not search the store for annotations"); } else if (xhr._action === 'read' && !xhr._id) { message = Annotator._t("Sorry we could not ") + action + Annotator._t(" the annotations from the store"); } switch (xhr.status) { case 401: message = Annotator._t("Sorry you are not allowed to ") + action + Annotator._t(" this annotation"); break; case 404: message = Annotator._t("Sorry we could not connect to the annotations store"); break; case 500: message = Annotator._t("Sorry something went wrong with the annotation store"); } Annotator.showNotification(message, Annotator.Notification.ERROR); return console.error(Annotator._t("API request failed:") + (" '" + xhr.status + "'")); }; return Store; })(Annotator.Plugin);