Files
grecia/app/assets/javascripts/legislation_annotatable.js
Senén Rodero Rodríguez 6b17452bd5 Fix "Publish comment" button when restoring a page from browser cache
We need to use page body event delegation so it will work with any
element even with the ones added through ajax, in this case the
annotation comments box form. By doing this way we do not need
this code on the server response anymore.

Furthermore JS events defined at ajax responses are not part of
application javascript and are lost when restoring a page from
browser cache, you can try to apply the same event delegation
technique to the `erb` file and it wont work just because events
added dinamically are not treated the same than `application.js`
code.

To reproduce the error:

  1. Load an annotatable draft version
  2. Move to any other page
  3. Go back

Now "Publish comment" button wont work.
2020-08-12 10:07:35 +02:00

248 lines
9.8 KiB
JavaScript

(function() {
"use strict";
App.LegislationAnnotatable = {
makeEditableAndHighlight: function(colour) {
var range, sel;
sel = window.getSelection();
if (sel.rangeCount && sel.getRangeAt) {
range = sel.getRangeAt(0);
}
document.designMode = "on";
if (range) {
sel.removeAllRanges();
sel.addRange(range);
}
if (!document.execCommand("HiliteColor", false, colour)) {
document.execCommand("BackColor", false, colour);
}
document.designMode = "off";
},
highlight: function(colour) {
try {
if (!document.execCommand("BackColor", false, colour)) {
App.LegislationAnnotatable.makeEditableAndHighlight(colour);
}
} catch (error) {
App.LegislationAnnotatable.makeEditableAndHighlight(colour);
}
},
remove_highlight: function() {
$("[data-legislation-draft-version-id] span[style]").replaceWith(function() {
return $(this).contents();
});
},
loadAnnotationComments: function(annotation_url, annotation_id) {
$.ajax({
method: "GET",
url: annotation_url + "/annotations/" + annotation_id + "/comments",
dataType: "script"
});
},
renderAnnotationComments: function(event) {
if (event.offset) {
$("#comments-box").css({
top: event.offset - $(".calc-comments").offset().top
});
}
if (App.LegislationAnnotatable.isMobile()) {
return;
}
App.LegislationAnnotatable.loadAnnotationComments(event.annotation_url, event.annotation_id);
},
onClick: function(event) {
var annotation_id, annotation_url, parents, parents_ids, target;
event.preventDefault();
event.stopPropagation();
if (App.LegislationAnnotatable.isMobile()) {
annotation_url = $(event.target).closest(".legislation-annotatable").data("legislation-annotatable-base-url");
window.location.href = annotation_url + "/annotations/" + ($(this).data("annotation-id"));
return;
}
$("[data-annotation-id]").removeClass("current-annotation");
target = $(this);
parents = target.parents(".annotator-hl");
parents_ids = parents.map(function(_, elem) {
return $(elem).data("annotation-id");
});
annotation_id = target.data("annotation-id");
$("[data-annotation-id='" + annotation_id + "']").addClass("current-annotation");
$("#comments-box").html("");
App.LegislationAllegations.show_comments();
$("#comments-box").show();
$("body").trigger({
type: "renderLegislationAnnotation",
annotation_id: target.data("annotation-id"),
annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url"),
offset: target.offset().top
});
parents_ids.each(function(i, pid) {
$("body").trigger({
type: "renderLegislationAnnotation",
annotation_id: pid,
annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url")
});
});
},
isMobile: function() {
return window.innerWidth <= 652;
},
viewerExtension: function(viewer) {
return viewer._onHighlightMouseover = function() {};
},
customShow: function(position) {
var annotation_url;
$(this.element).html("");
// Clean comments section and open it
$("#comments-box").html("");
App.LegislationAllegations.show_comments();
$("#comments-box").show();
annotation_url = $("[data-legislation-annotatable-base-url]").data("legislation-annotatable-base-url");
$.ajax({
method: "GET",
url: annotation_url + "/annotations/new",
dataType: "script"
}).done((function() {
$("#new_legislation_annotation #legislation_annotation_quote").val(this.annotation.quote);
$("#new_legislation_annotation #legislation_annotation_ranges").val(JSON.stringify(this.annotation.ranges));
$("#comments-box").css({
top: position.top - $(".calc-comments").offset().top
});
if ($("[data-legislation-open-phase]").data("legislation-open-phase") !== false) {
App.LegislationAnnotatable.highlight("#7fff9a");
$("#comments-box textarea").focus();
$("#new_legislation_annotation").on("ajax:complete", function(e, data) {
if (data.status === 200) {
App.LegislationAnnotatable.remove_highlight();
App.LegislationAnnotatable.app.annotations.runHook("annotationCreated", [data.responseJSON]);
$("#comments-box").html("").hide();
App.LegislationAnnotatable.loadAnnotationComments(annotation_url, data.responseJSON.id);
} else {
$(e.target).find("label").addClass("error");
$("<small class='error'>" + data.responseJSON[0] + "</small>").insertAfter($(e.target).find("textarea"));
}
});
}
}).bind(this));
},
editorExtension: function(editor) {
return editor.show = App.LegislationAnnotatable.customShow;
},
scrollToAnchor: function() {
return {
annotationsLoaded: function() {
var anchor, ann_id, checkExist;
anchor = $(location).attr("hash");
if (anchor && anchor.startsWith("#annotation")) {
ann_id = anchor.split("-").slice(-1);
return checkExist = setInterval((function() {
var el;
if ($("span[data-annotation-id='" + ann_id + "']").length) {
el = $("span[data-annotation-id='" + ann_id + "']");
el.addClass("current-annotation");
$("#comments-box").html("");
App.LegislationAllegations.show_comments();
$("html,body").animate({
scrollTop: el.offset().top
});
$("body").trigger({
type: "renderLegislationAnnotation",
annotation_id: ann_id,
annotation_url: el.closest(".legislation-annotatable").data("legislation-annotatable-base-url"),
offset: el.offset().top
});
clearInterval(checkExist);
}
}), 100);
}
}
};
},
propotionalWeight: function(v, max) {
return Math.floor(v * 5 / (max + 1)) + 1;
},
addWeightClasses: function() {
return {
annotationsLoaded: function(annotations) {
var checkExist, last_annotation, max_weight, weights;
if (annotations.length === 0) {
return;
}
weights = annotations.map(function(ann) {
return ann.weight;
});
max_weight = Math.max.apply(null, weights);
last_annotation = annotations[annotations.length - 1];
return checkExist = setInterval((function() {
if ($("span[data-annotation-id='" + last_annotation.id + "']").length) {
annotations.forEach(function(annotation) {
var ann_weight, el;
ann_weight = App.LegislationAnnotatable.propotionalWeight(annotation.weight, max_weight);
el = $("span[data-annotation-id='" + annotation.id + "']");
el.addClass("weight-" + ann_weight);
});
clearInterval(checkExist);
}
}), 100);
}
};
},
initCommentFormToggler: function() {
$("body").on("click", ".comment-box a.publish-comment", function(e) {
e.preventDefault();
var annotation_id = $(this).closest(".comment-box").data("id");
$("a.publish-comment").hide();
$("#js-comment-form-annotation-" + annotation_id).toggle();
$("#js-comment-form-annotation-" + annotation_id + " textarea").trigger("focus");
});
},
initialize: function() {
var current_user_id;
$("body").on("renderLegislationAnnotation", App.LegislationAnnotatable.renderAnnotationComments);
$("body").on("click", "[data-annotation-id]", App.LegislationAnnotatable.onClick);
$("body").on("click", "[data-cancel-annotation]", function(e) {
e.preventDefault();
$("#comments-box").html("");
$("#comments-box").hide();
App.LegislationAnnotatable.remove_highlight();
});
current_user_id = $("html").data("current-user-id");
$(".legislation-annotatable").each(function() {
var ann_id, base_url;
ann_id = $(this).data("legislation-draft-version-id");
base_url = $(this).data("legislation-annotatable-base-url");
App.LegislationAnnotatable.app = new annotator.App().include(function() {
return {
beforeAnnotationCreated: function(ann) {
ann.legislation_draft_version_id = ann_id;
ann.permissions = ann.permissions || {};
ann.permissions.admin = [];
}
};
}).include(annotator.ui.main, {
element: this,
viewerExtensions: [App.LegislationAnnotatable.viewerExtension],
editorExtensions: [App.LegislationAnnotatable.editorExtension]
}).include(App.LegislationAnnotatable.scrollToAnchor).include(App.LegislationAnnotatable.addWeightClasses).include(annotator.storage.http, {
prefix: base_url,
urls: {
search: "/annotations/search"
}
});
App.LegislationAnnotatable.app.start().then(function() {
App.LegislationAnnotatable.app.ident.identity = current_user_id;
App.LegislationAnnotatable.app.annotations.load({
legislation_draft_version_id: ann_id
});
});
});
App.LegislationAnnotatable.initCommentFormToggler();
},
destroy: function() {
if ($(".legislation-annotatable").length > 0) {
App.LegislationAnnotatable.app.destroy();
}
}
};
}).call(this);