X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/404bfe407798a8a83fa02dc1742a315400b7c00b..3b0d1718ec6c9dddcee4a4620384a83e30ff6f2f:/redakcja/static/js/wiki/wikiapi.js?ds=inline diff --git a/redakcja/static/js/wiki/wikiapi.js b/redakcja/static/js/wiki/wikiapi.js index 13435ea0..8df3ef5a 100644 --- a/redakcja/static/js/wiki/wikiapi.js +++ b/redakcja/static/js/wiki/wikiapi.js @@ -7,46 +7,51 @@ failure: noop }; /* - * Return absolute reverse path of given named view. - * (at least he have it hard-coded in one place) + * 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]; - var base_path = "/documents"; + var base_path = "/editor"; if (vname == "ajax_document_text") { - var path = "/" + arguments[1] + "/text"; + var path = "/text/" + arguments[1] + '/'; if (arguments[2] !== undefined) - path += "/" + arguments[2]; + path += arguments[2] + '/'; return base_path + path; } + if (vname == "ajax_document_revert") { + return base_path + "/revert/" + arguments[1] + '/'; + } + + if (vname == "ajax_document_history") { - return base_path + "/" + arguments[1] + "/history"; + return base_path + "/history/" + arguments[1] + '/'; } if (vname == "ajax_document_gallery") { - return base_path + "/gallery/" + arguments[1]; + return base_path + "/gallery/" + arguments[1] + '/'; } if (vname == "ajax_document_diff") - return base_path + "/" + arguments[1] + "/diff"; + return base_path + "/diff/" + arguments[1] + '/'; - if (vname == "ajax_document_addtag") - return base_path + "/" + arguments[1] + "/tags"; + if (vname == "ajax_document_rev") + return base_path + "/rev/" + arguments[1] + '/'; - if (vname == "ajax_publish") - return base_path + "/" + arguments[1] + "/publish"; - - if (vname == 'ping') - return base_path + '/ping/' + if (vname == "ajax_document_pubmark") + return base_path + "/pubmark/" + arguments[1] + '/'; + + if (vname == "ajax_cover_preview") + return "/cover/preview/"; console.log("Couldn't reverse match:", vname); return "/404.html"; @@ -57,12 +62,26 @@ */ function WikiDocument(element_id) { var meta = $('#' + element_id); - this.id = meta.attr('data-document-name'); + this.id = meta.attr('data-chunk-id'); this.revision = $("*[data-key='revision']", meta).text(); this.readonly = !!$("*[data-key='readonly']", meta).text(); this.galleryLink = $("*[data-key='gallery']", meta).text(); + this.galleryStart = parseInt($("*[data-key='gallery-start']", meta).text()); + + var diff = $("*[data-key='diff']", meta).text(); + if (diff) { + diff = diff.split(','); + if (diff.length == 2 && diff[0] < diff[1]) + this.diff = diff; + else if (diff.length == 1) { + diff = parseInt(diff); + if (diff != NaN) + this.diff = [diff - 1, diff]; + } + } + this.galleryImages = []; this.text = null; this.has_local_changes = false; @@ -107,8 +126,8 @@ /* * Fetch history of this document. * - * from - First revision to fetch (default = 0) - * upto - Last revision to fetch (default = tip) + * from - First revision to fetch (default = 0) upto - Last revision to + * fetch (default = tip) * */ WikiDocument.prototype.fetchHistory = function(params) { @@ -155,6 +174,24 @@ }); }; + WikiDocument.prototype.checkRevision = function(params) { + /* this doesn't modify anything, so no locks */ + var self = this; + $.ajax({ + method: "GET", + url: reverse("ajax_document_rev", self.id), + dataType: 'text', + success: function(data) { + if (data == '') { + if (params.error) + params.error(); + } + else if (data != self.revision) + params.outdated(); + } + }); + }; + /* * Fetch gallery */ @@ -170,9 +207,18 @@ self.galleryImages = data; params['success'](self, data); }, - error: function() { + error: function(xhr) { + switch (xhr.status) { + case 403: + var msg = 'Galerie dostępne tylko dla zalogowanych użytkowników.'; + break; + case 404: + var msg = "Nie znaleziono galerii o nazwie: '" + self.galleryLink + "'."; + default: + var msg = "Nie udało się wczytać galerii o nazwie: '" + self.galleryLink + "'."; + } self.galleryImages = []; - params['failure'](self, "

Nie udało się wczytać gallerii pod nazwą: '" + self.galleryLink + "'.

"); + params['failure'](self, "

" + msg + "

"); } }); }; @@ -181,16 +227,24 @@ * Set document's text */ WikiDocument.prototype.setText = function(text) { - this.text = text; - this.has_local_changes = true; + return this.setDocumentProperty('text', text); }; /* * Set document's gallery link */ WikiDocument.prototype.setGalleryLink = function(gallery) { - this.galleryLink = gallery; - this.has_local_changes = true; + return this.setDocumentProperty('galleryLink', gallery); + }; + + /* + * Set document's property + */ + WikiDocument.prototype.setDocumentProperty = function(property, value) { + if(this[property] !== value) { + this[property] = value; + this.has_local_changes = true; + } }; /* @@ -211,21 +265,18 @@ data[this.name] = this.value; }); - var metaComment = '\n' - - data['textsave-text'] = metaComment + self.text; + data['textsave-text'] = self.text; $.ajax({ url: reverse("ajax_document_text", self.id), type: "POST", dataType: "json", data: data, - timeout: 5000, success: function(data) { var changed = false; + $('#header').removeClass('saving'); + if (data.text) { self.text = data.text; self.revision = data.revision; @@ -236,57 +287,78 @@ params['success'](self, changed, ((changed && "Udało się zapisać :)") || "Twoja wersja i serwera jest identyczna")); }, - error: function(xhr, msg) { - if (msg == 'timeout') { - params['failure'](self, { - "__message": "Przekroczony czas połączenia. Zmiany nie zostały zapisane." - }); - } - else { + error: function(xhr) { + if ($('#header').hasClass('saving')) { + $('#header').removeClass('saving'); + $.blockUI({ + message: "

Nie udało się zapisać zmian.

" + }) + } + else { try { params['failure'](self, $.parseJSON(xhr.responseText)); } catch (e) { params['failure'](self, { - "__message": "Nie udało się zapisać - błąd serwera." + "__message": "

Nie udało się zapisać - błąd serwera.

" }); }; - } + } + } }); + + $('#save-hide').click(function(){ + $('#header').addClass('saving'); + $.unblockUI(); + $.wiki.blocking.unblock(); + }); }; /* end of save() */ - WikiDocument.prototype.publish = function(params) { - params = $.extend({}, noops, params); - var self = this; - $.ajax({ - url: reverse("ajax_publish", self.id), - type: "POST", - dataType: "json", - success: function(data) { - params.success(self, data); - }, - error: function(xhr) { - if (xhr.status == 403 || xhr.status == 401) { - params.failure(self, "Nie masz uprawnień lub nie jesteś zalogowany."); - } - else { - try { - params.failure(self, xhr.responseText); - } - catch (e) { - params.failure(self, "Nie udało się - błąd serwera."); - }; - }; + WikiDocument.prototype.revertToVersion = function(params) { + var self = this; + params = $.extend({}, noops, params); - } - }); - }; - WikiDocument.prototype.setTag = function(params) { + if (params.revision >= this.revision) { + params.failure(self, 'Proszę wybrać rewizję starszą niż aktualna.'); + return; + } + + // Serialize form to dictionary + var data = {}; + $.each(params['form'].serializeArray(), function() { + data[this.name] = this.value; + }); + + $.ajax({ + url: reverse("ajax_document_revert", self.id), + type: "POST", + dataType: "json", + data: data, + success: function(data) { + if (data.text) { + self.text = data.text; + self.revision = data.revision; + self.gallery = data.gallery; + self.triggerDocumentChanged(); + + params.success(self, "Udało się przywrócić wersję :)"); + } + else { + params.failure(self, "Przywracana wersja identyczna z aktualną. Anulowano przywracanie."); + } + }, + error: function(xhr) { + params.failure(self, "Nie udało się przywrócić wersji - błąd serwera."); + } + }); + }; + + WikiDocument.prototype.pubmark = function(params) { params = $.extend({}, noops, params); var self = this; var data = { - "addtag-id": self.id, + "pubmark-id": self.id, }; /* unpack form */ @@ -295,7 +367,7 @@ }); $.ajax({ - url: reverse("ajax_document_addtag", self.id), + url: reverse("ajax_document_pubmark", self.id), type: "POST", dataType: "json", data: data, @@ -322,21 +394,41 @@ }); }; - $.wikiapi.WikiDocument = WikiDocument; - - - var ping = function () { + WikiDocument.prototype.refreshCover = function(params) { + var self = this; + var data = { + xml: self.text // TODO: send just DC + }; $.ajax({ - url : reverse('ping'), - timeout: 2000, - complete : function () { - setTimeout(function () { - ping(); - }, 600000); + url: reverse("ajax_cover_preview"), + type: "POST", + data: data, + success: function(data) { + params.success(data); + }, + error: function(xhr) { + // params.failure("Nie udało się odświeżyć okładki - błąd serwera."); } }); - }; - - ping(); + }; + + + WikiDocument.prototype.getLength = function(params) { + var xml = this.text.replace(/\/(\s+)/g, '
$1'); + var parser = new DOMParser(); + var doc = parser.parseFromString(xml, 'text/xml'); + var error = $('parsererror', doc); + if (error.length > 0) { + throw "Not an XML document."; + } + $.xmlns["rdf"] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + $('rdf|RDF, motyw, pa, pe, pr, pt', doc).remove(); + var text = $(doc).text(); + text = $.trim(text.replace(/\s{2,}/g, ' ')); + return text.length; + } + + + $.wikiapi.WikiDocument = WikiDocument; })(jQuery);