Obey length limits for wikidata import.
[redakcja.git] / src / redakcja / static / js / wiki / wikiapi.js
index 53b2a9d..73642ac 100644 (file)
@@ -35,6 +35,9 @@
            return base_path + "/history/" + arguments[1] + '/';
        }
 
            return base_path + "/history/" + arguments[1] + '/';
        }
 
+       if (vname == "ajax_document_scans") {
+            return base_path + "/scans/" + arguments[1] + '/';
+       }
        if (vname == "ajax_document_gallery") {
            return base_path + "/gallery/" + arguments[1] + '/';
        }
        if (vname == "ajax_document_gallery") {
            return base_path + "/gallery/" + arguments[1] + '/';
        }
            this.readonly = !!$("*[data-key='readonly']", meta).text();
 
            this.bookSlug = $("*[data-key='book-slug']", meta).text();
            this.readonly = !!$("*[data-key='readonly']", meta).text();
 
            this.bookSlug = $("*[data-key='book-slug']", meta).text();
+           this.scansLink = $("*[data-key='scans']", meta).text();
            this.galleryLink = $("*[data-key='gallery']", meta).text();
             this.galleryStart = parseInt($("*[data-key='gallery-start']", meta).text());
             this.fullUri = $("*[data-key='full-uri']", meta).text();
 
            this.galleryLink = $("*[data-key='gallery']", meta).text();
             this.galleryStart = parseInt($("*[data-key='gallery-start']", meta).text());
             this.fullUri = $("*[data-key='full-uri']", meta).text();
 
-           this.galleryImages = [];
            this.text = null;
            this.text = null;
+            this.saving = false;
            this.has_local_changes = false;
            this.has_local_changes = false;
-            this.active = true;
+            this.active = new Date();
            this._lock = -1;
            this._context_lock = -1;
            this._lock_count = 0;
            this._lock = -1;
            this._context_lock = -1;
            this._lock_count = 0;
 
                    if (self.text === null || self.revision !== data.revision) {
                        self.text = data.text;
 
                    if (self.text === null || self.revision !== data.revision) {
                        self.text = data.text;
+                        $.wiki.undo.push(data.text);
                        self.revision = data.revision;
                        self.gallery = data.gallery;
                        changed = true;
                        self.revision = data.revision;
                        self.gallery = data.gallery;
                        changed = true;
         checkRevision(params) {
             /* this doesn't modify anything, so no locks */
             var self = this;
         checkRevision(params) {
             /* this doesn't modify anything, so no locks */
             var self = this;
-            let active = self.active;
-            self.active = false;
+            let active = new Date() - self.active < 30 * 1000;
+            let saving = self.saving;
             $.ajax({
                 method: "GET",
                 url: reverse("ajax_document_rev", self.id),
                 data: {
                     'a': active,
             $.ajax({
                 method: "GET",
                 url: reverse("ajax_document_rev", self.id),
                 data: {
                     'a': active,
+                    'new': 1,
                 },
                 },
-                dataType: 'text',
+                dataType: 'json',
                 success: function(data) {
                     if (data == '') {
                         if (params.error)
                             params.error();
                     }
                 success: function(data) {
                     if (data == '') {
                         if (params.error)
                             params.error();
                     }
-                    else if (data != self.revision)
-                        params.outdated();
+                    else {
+                        let people = $('<div>');
+                        data.people.forEach((p) => {
+                            let item = $('<img>');
+                            item.attr('src', p.gravatar),
+                            item.attr(
+                                'title',
+                                p.name  + ' (' +
+                                    (p.active ? 'akt.' : 'nieakt.') +
+                                    ' od ' + p.since + ')')
+                            if (p.active) {
+                                item.addClass('active');
+                            }
+                            people.append(item);
+                        });
+                        $("#people").html(people);
+
+                        if (!saving && (data.rev != self.revision)) {
+                            params.outdated();
+                        }
+                   }
                 }
             });
         }
 
                 }
             });
         }
 
+        refreshImageGallery(params) {
+            if (this.galleryLink) {
+                params = $.extend({}, params, {
+                    url: reverse("ajax_document_gallery", this.galleryLink)
+                });
+            }
+            this.refreshGallery(params);
+        }
+
+        refreshScansGallery(params) {
+            if (this.scansLink) {
+                params = $.extend({}, params, {
+                    url: reverse("ajax_document_scans", this.scansLink)
+                });
+                this.refreshGallery(params);
+            } else {
+                // Fallback to image gallery.
+                this.refreshImageGallery(params)
+            }
+        }
+        
         /*
          * Fetch gallery
          */
         refreshGallery(params) {
            params = $.extend({}, noops, params);
            var self = this;
         /*
          * Fetch gallery
          */
         refreshGallery(params) {
            params = $.extend({}, noops, params);
            var self = this;
-           if (!self.galleryLink) {
-               params['failure'](self, 'Brak galerii.');
+            if (!params.url) {
+               params.failure('Brak galerii.');
                return;
                return;
-           }
+            }
            $.ajax({
                method: "GET",
            $.ajax({
                method: "GET",
-               url: reverse("ajax_document_gallery", self.galleryLink),
+               url: params.url,
                dataType: 'json',
                dataType: 'json',
-               // data: {},
                success: function(data) {
                success: function(data) {
-                   self.galleryImages = data;
-                   params['success'](self, data);
+                   params.success(data);
                },
                error: function(xhr) {
                     switch (xhr.status) {
                },
                error: function(xhr) {
                     switch (xhr.status) {
                         var msg = 'Galerie dostępne tylko dla zalogowanych użytkowników.';
                         break;
                     case 404:
                         var msg = 'Galerie dostępne tylko dla zalogowanych użytkowników.';
                         break;
                     case 404:
-                        var msg = "Nie znaleziono galerii o nazwie: '" + self.galleryLink + "'.";
+                        var msg = "Nie znaleziono galerii.";
                     default:
                     default:
-                        var msg = "Nie udało się wczytać galerii o nazwie: '" + self.galleryLink + "'.";
+                        var msg = "Nie udało się wczytać galerii.";
                     }
                     }
-                   self.galleryImages = [];
-                   params['failure'](self, msg);
+                   params.failure(msg);
                }
            });
         }
                }
            });
         }
         /*
          * Set document's text
          */
         /*
          * Set document's text
          */
-        setText(text) {
+        setText(text, silent=false) {
             if (text == this.text) return;
             if (text == this.text) return;
+            if (!silent) {
+                $.wiki.undo.push(text);
+            }
             this.text = text;
             this.has_local_changes = true;
         }
 
             this.text = text;
             this.has_local_changes = true;
         }
 
+        undo() {
+            let ctx = $.wiki.exitContext();
+            this.setText(
+                $.wiki.undo.undo(),
+                true
+            );
+            $.wiki.enterContext(ctx);
+        }
+        redo() {
+            let ctx = $.wiki.exitContext();
+            this.setText(
+                $.wiki.undo.redo(),
+                true
+            );
+            $.wiki.enterContext(ctx);
+        }
+
         /*
          * Save text back to the server
          */
         /*
          * Save text back to the server
          */
 
            data['textsave-text'] = self.text;
 
 
            data['textsave-text'] = self.text;
 
+            self.saving = true;
            $.ajax({
                url: reverse("ajax_document_text", self.id),
                type: "POST",
            $.ajax({
                url: reverse("ajax_document_text", self.id),
                type: "POST",
                        changed = true;
                        self.triggerDocumentChanged();
                    };
                        changed = true;
                        self.triggerDocumentChanged();
                    };
+                    self.saving = false;
 
                    params['success'](self, changed, ((changed && "Udało się zapisać :)") || "Twoja wersja i serwera jest identyczna"));
                },
                error: function(xhr) {
 
                    params['success'](self, changed, ((changed && "Udało się zapisać :)") || "Twoja wersja i serwera jest identyczna"));
                },
                error: function(xhr) {
+                    self.saving = false;
                     if ($('#header').hasClass('saving')) {
                         $('#header').removeClass('saving');
                         $.blockUI({
                     if ($('#header').hasClass('saving')) {
                         $('#header').removeClass('saving');
                         $.blockUI({