X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/0fd55a38c4873d5916a3553d7510b9308f4eee6d..03c5ba6e50339d7bc470eb6d7f051483eff1e96b:/platforma/static/js/wiki/wikiapi.js?ds=sidebyside diff --git a/platforma/static/js/wiki/wikiapi.js b/platforma/static/js/wiki/wikiapi.js new file mode 100644 index 00000000..d151f9e5 --- /dev/null +++ b/platforma/static/js/wiki/wikiapi.js @@ -0,0 +1,211 @@ +(function($) { + + $.wikiapi = {}; + + var noop = function() {}; + var noops = {'success': noop, 'failure': noop}; + + /* + * Return absolute reverse path of given named view. + * (at least he have it hard-coded in one place) + * + * TODO: think of a way, not to hard-code it here ;) + * + */ + function reverse() { + var vname = arguments[0]; + + if(vname == "ajax_document_text") { + var path = "/" + arguments[1] + "/text"; + if (arguments[2] !== undefined) + path += "/" + arguments[2]; + return path; + } + + if (vname == "ajax_document_history") { + return "/" + arguments[1] + "/history"; + } + + if(vname == "ajax_document_diff") + return "/" + arguments[1] + "/diff/" + arguments[2] + "/" + arguments[3] + + console.log("Couldn't reverse match:", vname); + return "/404.html"; + }; + + /* + * Document Abstraction + */ + function WikiDocument(element_id) { + var meta = $('#'+element_id); + + this.id = meta.attr('data-document-name'); + this.revision = $("*[data-key='revision']", meta).text(); + this.gallery = $("*[data-key='gallery']", meta).text(); + + this.text = null; + + this.has_local_changes = false; + this._lock = -1; + this._context_lock = -1; + this._lock_count = 0; + } + +// WikiDocument.prototype.lock = function() { +// if(this._lock < 0) { +// this._lock = Math.random(); +// this._context_lock = this._lock; +// this._lock_count = 1; +// return this._lock; +// } +// +// // reentrant locks +// if(this._context_lock === this._lock) { +// this._lock_count += 1; +// return this._lock; +// } +// +// throw "Document operation in progress. Try again later." +// }; +// +// WikiDocument.prototype.unlock = function(lockNumber) { +// if(this.locked === lockNumber) { +// this._lock_count -= 1; +// +// if(this._lock_count === 0) { +// this._lock = -1; +// this._context_lock = -1; +// }; +// return; +// } +// throw "Trying to unlock with wrong lockNumber"; +// }; +// +// /* +// * About to leave context of current lock. +// */ +// WikiDocument.prototype.leaveContext = function() { +// var old = this._context_lock; +// this._context_lock = -1; +// return old; +// }; + + /* + * Fetch text of this document. + */ + WikiDocument.prototype.fetch = function(params) { + params = $.extend({}, noops, params); + var self = this; + + $.ajax({ + method: "GET", + url: reverse("ajax_document_text", self.id), + dataType: 'json', + success: function(data) + { + var changed = false; + + if (self.text === null || self.revision !== data.revision) { + self.text = data.text; + self.revision = data.revision; + self.gallery = data.gallery; + changed = true; + } + + self.has_local_changes = false; + params['success'](self, changed); + }, + error: function() { + params['failure'](self, "Nie udało się wczytać treści dokumentu."); + } + }); + }; + + /* + * Fetch history of this document. + * + * from - First revision to fetch (default = 0) + * upto - Last revision to fetch (default = tip) + * + */ + WikiDocument.prototype.fetchHistory = function(params) { + /* this doesn't modify anything, so no locks */ + params = $.extend({}, noops, params); + var self = this; + + $.ajax({ + method: "GET", + url: reverse("ajax_document_history", self.id), + dataType: 'json', + data: {"from": params['from'], "upto": params['upto']}, + success: function(data) { + params['success'](self, data); + }, + error: function() { + params['failure'](self, "Nie udało się wczytać treści dokumentu."); + } + }); + }; + + /* + * Set document's text + */ + WikiDocument.prototype.setText = function(text) { + this.text = text; + this.has_local_changes = true; + }; + + /* + * Set document's gallery link + */ + WikiDocument.prototype.setGallery = function(gallery) { + this.gallery = gallery; + this.has_local_changes = true; + }; + + /* + * Save text back to the server + */ + WikiDocument.prototype.save = function(comment, success, failure){ + var self = this; + + if (!self.has_local_changes) { + return success(self, "Nie ma zmian do zapisania."); + } + + /* you can't set text while some is fetching it (or saving) */ + var metaComment = '' + + var data = { + name: self.id, + text: self.text, + parent_revision: self.revision, + comment: comment, + }; + + $.ajax({ + url: reverse("ajax_document_text", self.id), + type: "POST", + dataType: "json", + data: data, + success: function(data){ + var changed = false; + if (data.text) { + self.text = data.text; + self.revision = data.revision; + self.gallery = data.gallery; + changed = true; + } + success(self, changed); + }, + error: function(){ + failure(self, "Nie udało się zapisać."); + } + }); + }; /* end of save() */ + + $.wikiapi.WikiDocument = WikiDocument; + +})(jQuery);