Files
nairobi/app/assets/javascripts/legislation_annotatable.js.coffee
Javi Martín b27855c1cf Use double quotes in CoffeeScript files
As we do in the rest of the application.

Note we cannot add a rule enforcing double quotes because CoffeeScript
Lint does not have such rule.
2019-03-06 11:41:21 +01:00

216 lines
8.0 KiB
CoffeeScript

_t = (key) -> new Gettext().gettext(key)
App.LegislationAnnotatable =
makeEditableAndHighlight: (colour) ->
sel = window.getSelection()
if sel.rangeCount and sel.getRangeAt
range = sel.getRangeAt(0)
document.designMode = "on"
if range
sel.removeAllRanges()
sel.addRange range
# Use HiliteColor since some browsers apply BackColor to the whole block
if !document.execCommand("HiliteColor", false, colour)
document.execCommand "BackColor", false, colour
document.designMode = "off"
return
highlight: (colour) ->
if window.getSelection
# IE9 and non-IE
try
if !document.execCommand("BackColor", false, colour)
App.LegislationAnnotatable.makeEditableAndHighlight colour
catch ex
App.LegislationAnnotatable.makeEditableAndHighlight colour
else if document.selection and document.selection.createRange
# IE <= 8 case
range = document.selection.createRange()
range.execCommand "BackColor", false, colour
return
remove_highlight: ->
$("[data-legislation-draft-version-id] span[style]").replaceWith(->
return $(this).contents()
)
return
renderAnnotationComments: (event) ->
if event.offset
$("#comments-box").css({ top: event.offset - $(".calc-comments").offset().top })
if App.LegislationAnnotatable.isMobile()
return
$.ajax
method: "GET"
url: "#{event.annotation_url}/annotations/#{event.annotation_id}/comments"
dataType: "script"
onClick: (event) ->
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 (_, elem) ->
$(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()
$.event.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 (i, pid) ->
$.event.trigger
type: "renderLegislationAnnotation"
annotation_id: pid
annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url")
isMobile: ->
return window.innerWidth <= 652
viewerExtension: (viewer) ->
viewer._onHighlightMouseover = (event) ->
return
customShow: (position) ->
$(@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 (->
$("#new_legislation_annotation #legislation_annotation_quote").val(@annotation.quote)
$("#new_legislation_annotation #legislation_annotation_ranges").val(JSON.stringify(@annotation.ranges))
$("#comments-box").css({ top: position.top - $(".calc-comments").offset().top })
unless $("[data-legislation-open-phase]").data("legislation-open-phase") == false
App.LegislationAnnotatable.highlight("#7fff9a")
$("#comments-box textarea").focus()
$("#new_legislation_annotation").on("ajax:complete", (e, data, status, xhr) ->
App.LegislationAnnotatable.app.destroy()
if data.status == 200
App.LegislationAnnotatable.remove_highlight()
$("#comments-box").html("").hide()
$.ajax
method: "GET"
url: "#{annotation_url}/annotations/#{data.responseJSON.id}/comments"
dataType: "script"
else
$(e.target).find("label").addClass("error")
$("<small class='error'>#{data.responseJSON[0]}</small>").insertAfter($(e.target).find("textarea"))
return true
)
return
).bind(this)
editorExtension: (editor) ->
editor.show = App.LegislationAnnotatable.customShow
scrollToAnchor: ->
annotationsLoaded: (annotations) ->
anchor = $(location).attr("hash")
if anchor && anchor.startsWith("#annotation")
ann_id = anchor.split("-")[-1..]
checkExist = setInterval((->
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 })
$.event.trigger
type: "renderLegislationAnnotation"
annotation_id: ann_id
annotation_url: el.closest(".legislation-annotatable").data("legislation-annotatable-base-url")
offset: el.offset()["top"]
clearInterval checkExist
return
), 100)
propotionalWeight: (v, max) ->
Math.floor(v * 5 / (max + 1)) + 1
addWeightClasses: ->
annotationsLoaded: (annotations) ->
return if annotations.length == 0
weights = annotations.map (ann) -> ann.weight
max_weight = Math.max.apply(null, weights)
last_annotation = annotations[annotations.length - 1]
checkExist = setInterval((->
if $("span[data-annotation-id='#{last_annotation.id}']").length
for annotation in annotations
ann_weight = App.LegislationAnnotatable.propotionalWeight(annotation.weight, max_weight)
el = $("span[data-annotation-id='#{annotation.id}']")
el.addClass("weight-#{ann_weight}")
clearInterval checkExist
return
), 100)
initialize: ->
$(document).off("renderLegislationAnnotation").on("renderLegislationAnnotation", App.LegislationAnnotatable.renderAnnotationComments)
$(document).off("click", "[data-annotation-id]").on("click", "[data-annotation-id]", App.LegislationAnnotatable.onClick)
$(document).off("click", "[data-cancel-annotation]").on("click", "[data-cancel-annotation]", (e) ->
e.preventDefault()
$("#comments-box").html("")
$("#comments-box").hide()
App.LegislationAnnotatable.remove_highlight()
return
)
current_user_id = $("html").data("current-user-id")
$(".legislation-annotatable").each ->
$this = $(this)
ann_type = "legislation_draft_version"
ann_id = $this.data("legislation-draft-version-id")
base_url = $this.data("legislation-annotatable-base-url")
App.LegislationAnnotatable.app = new annotator.App()
.include ->
beforeAnnotationCreated: (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 ->
App.LegislationAnnotatable.app.ident.identity = current_user_id
options = {}
options["legislation_draft_version_id"] = ann_id
App.LegislationAnnotatable.app.annotations.load(options)