textannotation.html 8.19 KB
Newer Older
daniel cebrian committed
1
<%! from django.utils.translation import ugettext as _ %>
2
<%namespace name='static' file='/static_content.html'/>
David Baumgold committed
3 4
${static.css(group='style-vendor-tinymce-content', raw=True)}
${static.css(group='style-vendor-tinymce-skin', raw=True)}
5
${static.css(group='style-xmodule-annotations', raw=True)}
daniel cebrian committed
6 7

<div class="annotatable-wrapper">
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
    <div class="annotatable-header">
        % if display_name is not UNDEFINED and display_name is not None:
            <div class="annotatable-title">${display_name}</div>
        % endif
    </div>
    % if instructions_html is not UNDEFINED and instructions_html is not None:
    <div class="annotatable-section shaded">
        <div class="annotatable-section-title">
            ${_('Instructions')}
            <a class="annotatable-toggle annotatable-toggle-instructions expanded" href="javascript:void(0)">${_('Collapse Instructions')}</a>
        </div>
        <div class="annotatable-section-body annotatable-instructions">
            ${instructions_html}
        </div>
    </div>
    % endif
    <div class="annotatable-section">
        <div class="annotatable-content">
            <div id="textHolder">${content_html}</div>
            <div id="sourceCitation">${_('Source:')} ${source}</div>
            <div id="catchDIV">
                <div class="annotationListContainer">${_('You do not have any notes.')}</div>
            </div>
        </div>
    </div>
daniel cebrian committed
33 34 35 36
</div>


<script>
37 38 39 40 41 42 43 44 45 46 47 48 49
    function onClickHideInstructions(){
        //Reset function if there is more than one event handler
        $(this).off();
        $(this).on('click',onClickHideInstructions);
        var hide = $(this).html()=='Collapse Instructions'?true:false,
            cls, txt,slideMethod;
        txt = (hide ? 'Expand' : 'Collapse') + ' Instructions';
        cls = (hide ? ['expanded', 'collapsed'] : ['collapsed', 'expanded']);
        slideMethod = (hide ? 'slideUp' : 'slideDown');
        $(this).text(txt).removeClass(cls[0]).addClass(cls[1]);
        $(this).parents('.annotatable-section:first').find('.annotatable-instructions')[slideMethod]();
    }
    $('.annotatable-toggle-instructions').on('click', onClickHideInstructions);
50

51
    //Grab uri of the course
52
    var parts = window.location.href.split("/"),
53 54 55 56 57 58 59 60 61 62 63
        uri = '';
    for (var index = 0; index <= 9; index += 1) uri += parts[index]+"/"; //Get the unit url
    //Change uri in cms
    var lms_location = $('.sidebar .preview-button').attr('href');
    if (typeof lms_location!='undefined'){
        uri = window.location.protocol;
        for (var index = 0; index <= 9; index += 1) uri += lms_location.split("/")[index]+"/"; //Get the unit url
    }
    var unit_id = $('#sequence-list').find('.active').attr("data-element");
    uri += unit_id;
    var pagination = 100,
64
        is_staff = '${is_course_staff}' === 'True',
daniel cebrian committed
65 66 67 68
        options = {
        optionsAnnotator: {
            permissions:{
                user: {
69
                    id:"${user.email}",
daniel cebrian committed
70 71 72
                    name:"${user.username}"
                },
                userString: function (user) {
73
                    if (user && user.name)
daniel cebrian committed
74 75 76 77
                        return user.name;
                    return user;
                },
                userId: function (user) {
78
                    if (user && user.id)
daniel cebrian committed
79 80 81 82 83 84 85 86 87
                        return user.id;
                    return user;
                },
                permissions: {
                        'read':   [],
                        'update': ["${user.email}"],
                        'delete': ["${user.email}"],
                        'admin':  ["${user.email}"]
                },
88
                showViewPermissionsCheckbox: false,
daniel cebrian committed
89 90 91 92 93 94
                showEditPermissionsCheckbox: false,
                userAuthorize: function(action, annotation, user) {
                    var token, tokens, _i, _len;
                    if (annotation.permissions) {
                      tokens = annotation.permissions[action] || [];
                      if (is_staff){
95
                          return true;
daniel cebrian committed
96 97 98 99 100 101
                      }
                      if (tokens.length === 0) {
                        return true;
                      }
                      for (_i = 0, _len = tokens.length; _i < _len; _i++) {
                        token = tokens[_i];
102

daniel cebrian committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
                        if (this.userId(user) === token) {

                          return true;
                        }
                      }

                      return false;
                    } else if (annotation.user) {
                      if (user) {
                        return this.userId(user) === this.userId(annotation.user);
                      } else {
                        return false;
                      }
                    }
                    return true;
                  },
            },
            auth: {
121
                token: "${token}"
daniel cebrian committed
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
            },
            store: {
                // The endpoint of the store on your server.
                prefix: "${annotation_storage}",

                annotationData: {
                    uri: uri,
                    citation: "${source}"
                },

                urls: {
                    // These are the default URLs.
                    create:  '/create',
                    read:    '/read/:id',
                    update:  '/update/:id',
                    destroy: '/delete/:id',
                    search:  '/search'
                },

                loadFromSearch:{
                    limit:pagination,
                    offset:0,
                    uri:uri,
                    media:'text',
146
                    userid:'${user.email}',
daniel cebrian committed
147 148 149 150
                }
            },
            highlightTags:{
                tag: "${tag}",
151
            },
152 153 154
            diacriticMarks:{
                diacritics: "${diacritic_marks}"
            }
daniel cebrian committed
155 156 157
        },
        optionsVideoJS: {techOrder: ["html5","flash","youtube"]},
        optionsRS: {},
158
        optionsOVA: {posBigNew:'none', default_tab:"${default_tab}"},
daniel cebrian committed
159 160 161
        optionsRichText: {
            tinymce:{
                selector: "li.annotator-item textarea",
162
                plugins: "media image codemirror",
daniel cebrian committed
163 164 165
                menubar: false,
                toolbar_items_size: 'small',
                extended_valid_elements : "iframe[src|frameborder|style|scrolling|class|width|height|name|align|id]",
166
                toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | image rubric | code ",
daniel cebrian committed
167 168 169
            }
        },
    };
daniel cebrian committed
170

171
    var imgURLRoot = "${settings.STATIC_URL}" + "js/vendor/ova/catch/img/";
172
    var ova, Catch, annotator, catchOptions;
173 174 175 176 177 178 179
    var startova = function(){
        //remove old instances
        if (Annotator._instances.length !== 0) {
          $('#textHolder').annotator("destroy");
        }
        delete ova;
        //Load the plugin Video/Text Annotation
180
        ova = new OpenVideoAnnotation.Annotator($('#textHolder'),options);
181 182 183 184 185 186 187 188 189

        if (typeof Annotator.Plugin["Grouping"] === 'function') 
            ova.annotator.addPlugin("Grouping");

        var userId = ('${default_tab}'.toLowerCase() === 'instructor') ? 
                '${instructor_email}':
                '${user.email}';

        //Catch
190 191
        annotator = ova.annotator;
        catchOptions = {
192 193 194 195 196 197 198 199 200 201 202 203
                media:'text',
                externalLink:false,
                imageUrlRoot:imgURLRoot,
                showMediaSelector: false,
                showPublicPrivate: true,
                userId:userId,
                pagination:pagination,//Number of Annotations per load in the pagination,
                flags:is_staff,
                default_tab: "${default_tab}",
                instructor_email: "${instructor_email}",
                annotation_mode: "${annotation_mode}",
            };
204
        Catch = new CatchAnnotation($('#catchDIV'),catchOptions);
205 206
    }

207
    // if the following is true, template is being rendered in LMS, otherwise it is in Studio
208 209 210
    if (typeof Annotator !== 'undefined') {
        startova();
    } else {
211 212 213 214 215 216 217
        try {
            require(["ova"], function(ova) {
                startova();
            });
        } catch(error) {
            console.log("Error: " + error.message + " - Annotator not loaded in LMS.");
        }
daniel cebrian committed
218 219
    }
</script>