74 lines
2.4 KiB
CoffeeScript
74 lines
2.4 KiB
CoffeeScript
class StudentNotes
|
|
_debug: false
|
|
|
|
targets: [] # holds elements with annotator() instances
|
|
|
|
# Adds a listener for "notes" events that may bubble up from descendants.
|
|
constructor: ($, el) ->
|
|
console.log 'student notes init', arguments, this if @_debug
|
|
|
|
if not $(el).data('notes-instance')
|
|
events = 'notes:init': @onInitNotes
|
|
$(el).delegate('*', events)
|
|
$(el).data('notes-instance', @)
|
|
|
|
# Initializes annotations on a container element in response to an init event.
|
|
onInitNotes: (event, uri=null) =>
|
|
event.stopPropagation()
|
|
|
|
storeConfig = @getStoreConfig uri
|
|
found = @targets.some (target) -> target is event.target
|
|
|
|
if found
|
|
annotator = $(event.target).data('annotator')
|
|
if annotator
|
|
store = annotator.plugins['Store']
|
|
$.extend(store.options, storeConfig)
|
|
if uri
|
|
store.loadAnnotationsFromSearch(storeConfig['loadFromSearch'])
|
|
else
|
|
console.log 'URI is required to load annotations'
|
|
else
|
|
console.log 'No annotator() instance found for target: ', event.target
|
|
else
|
|
$(event.target).annotator()
|
|
.annotator('addPlugin', 'Tags')
|
|
.annotator('addPlugin', 'Store', storeConfig)
|
|
@targets.push(event.target)
|
|
|
|
# Returns a JSON config object that can be passed to the annotator Store plugin
|
|
getStoreConfig: (uri) ->
|
|
prefix = @getPrefix()
|
|
if uri is null
|
|
uri = @getURIPath()
|
|
|
|
storeConfig =
|
|
prefix: prefix
|
|
loadFromSearch:
|
|
uri: uri
|
|
limit: 0
|
|
annotationData:
|
|
uri: uri
|
|
storeConfig
|
|
|
|
# Returns the API endpoint for the annotation store
|
|
getPrefix: () ->
|
|
re = /^(\/courses\/[^/]+\/[^/]+\/[^/]+)/
|
|
match = re.exec(@getURIPath())
|
|
prefix = (if match then match[1] else '')
|
|
return "#{prefix}/notes/api"
|
|
|
|
# Returns the URI path of the current page for filtering annotations
|
|
getURIPath: () ->
|
|
window.location.href.toString().split(window.location.host)[1]
|
|
|
|
|
|
# Enable notes by default on the document root.
|
|
# To initialize annotations on a container element in the document:
|
|
#
|
|
# $('#myElement').trigger('notes:init');
|
|
#
|
|
# Comment this line to disable notes.
|
|
|
|
$(document).ready ($) -> new StudentNotes $, @
|