Commit 68acf66f by lduarte1991

Annotation Tools: PR Fixes

- Fixed camel case for variable name
- Fixed indentation in imageannotation.html
- Changed all mentions of Instructor Username to Email
- Turned annotation_mode into phrase
- Fixed indentation in imageannotation.html
- Added comments in imageannotation.html

- Changing annotation_mode in OSDA
parent b22643ad
...@@ -69,17 +69,18 @@ class AnnotatableFields(object): ...@@ -69,17 +69,18 @@ class AnnotatableFields(object):
scope=Scope.settings, scope=Scope.settings,
default="myNotes", default="myNotes",
) )
instructor_username = String( # currently only supports one instructor, will build functionality for multiple later
display_name=_("Username for 'Instructor' Annotations"), instructor_email = String(
help=_("Username that will be attached to all annotations that will be found in 'Instructor' tab."), display_name=_("Email for 'Instructor' Annotations"),
help=_("Email of the user that will be attached to all annotations that will be found in 'Instructor' tab."),
scope=Scope.settings, scope=Scope.settings,
default="", default="",
) )
annotation_mode = String( annotation_mode = String(
display_name=_("Mode for Annotation Tool"), display_name=_("Mode for Annotation Tool"),
help=_("Type in number corresponding to following modes: 1 = only instructor can annotate , 2 = Everyone can annotate"), help=_("Type in number corresponding to following modes: 'instructor' or 'everyone'"),
scope=Scope.settings, scope=Scope.settings,
default="2", default="everyone",
) )
...@@ -123,7 +124,7 @@ class ImageAnnotationModule(AnnotatableFields, XModule): ...@@ -123,7 +124,7 @@ class ImageAnnotationModule(AnnotatableFields, XModule):
'tag': self.instructor_tags, 'tag': self.instructor_tags,
'openseadragonjson': self.openseadragonjson, 'openseadragonjson': self.openseadragonjson,
'default_tab': self.default_tab, 'default_tab': self.default_tab,
'instructor_username': self.instructor_username, 'instructor_email': self.instructor_email,
'annotation_mode': self.annotation_mode, 'annotation_mode': self.annotation_mode,
} }
......
...@@ -71,17 +71,18 @@ class AnnotatableFields(object): ...@@ -71,17 +71,18 @@ class AnnotatableFields(object):
scope=Scope.settings, scope=Scope.settings,
default="myNotes", default="myNotes",
) )
instructor_username = String( # currently only supports one instructor, will build functionality for multiple later
display_name=_("Username for 'Instructor' Annotations"), instructor_email = String(
help=_("Username that will be attached to all annotations that will be found in 'Instructor' tab."), display_name=_("Email for 'Instructor' Annotations"),
help=_("Email of the user that will be attached to all annotations that will be found in 'Instructor' tab."),
scope=Scope.settings, scope=Scope.settings,
default="", default="",
) )
annotation_mode = String( annotation_mode = String(
display_name=_("Mode for Annotation Tool"), display_name=_("Mode for Annotation Tool"),
help=_("Type in number corresponding to following modes: 1 = only instructor can annotate , 2 = Everyone can annotate"), help=_("Type in number corresponding to following modes: 'instructor' or 'everyone'"),
scope=Scope.settings, scope=Scope.settings,
default="2", default="everyone",
) )
...@@ -120,7 +121,7 @@ class TextAnnotationModule(AnnotatableFields, XModule): ...@@ -120,7 +121,7 @@ class TextAnnotationModule(AnnotatableFields, XModule):
'token': retrieve_token(self.user_email, self.annotation_token_secret), 'token': retrieve_token(self.user_email, self.annotation_token_secret),
'diacritic_marks': self.diacritics, 'diacritic_marks': self.diacritics,
'default_tab': self.default_tab, 'default_tab': self.default_tab,
'instructor_username': self.instructor_username, 'instructor_email': self.instructor_email,
'annotation_mode': self.annotation_mode, 'annotation_mode': self.annotation_mode,
} }
fragment = Fragment(self.system.render_template('textannotation.html', context)) fragment = Fragment(self.system.render_template('textannotation.html', context))
......
...@@ -63,17 +63,18 @@ class AnnotatableFields(object): ...@@ -63,17 +63,18 @@ class AnnotatableFields(object):
scope=Scope.settings, scope=Scope.settings,
default="myNotes", default="myNotes",
) )
instructor_username = String( # currently only supports one instructor, will build functionality for multiple later
display_name=_("Username for 'Instructor' Annotations"), instructor_email = String(
help=_("Username that will be attached to all annotations that will be found in 'Instructor' tab."), display_name=_("Email for 'Instructor' Annotations"),
help=_("Email of the user that will be attached to all annotations that will be found in 'Instructor' tab."),
scope=Scope.settings, scope=Scope.settings,
default="", default="",
) )
annotation_mode = String( annotation_mode = String(
display_name=_("Mode for Annotation Tool"), display_name=_("Mode for Annotation Tool"),
help=_("Type in number corresponding to following modes: 1 = only instructor can annotate , 2 = Everyone can annotate"), help=_("Type in number corresponding to following modes: 'instructor' or 'everyone'"),
scope=Scope.settings, scope=Scope.settings,
default="2", default="everyone",
) )
class VideoAnnotationModule(AnnotatableFields, XModule): class VideoAnnotationModule(AnnotatableFields, XModule):
...@@ -125,7 +126,7 @@ class VideoAnnotationModule(AnnotatableFields, XModule): ...@@ -125,7 +126,7 @@ class VideoAnnotationModule(AnnotatableFields, XModule):
'annotation_storage': self.annotation_storage_url, 'annotation_storage': self.annotation_storage_url,
'token': retrieve_token(self.user_email, self.annotation_token_secret), 'token': retrieve_token(self.user_email, self.annotation_token_secret),
'default_tab': self.default_tab, 'default_tab': self.default_tab,
'instructor_username': self.instructor_username, 'instructor_email': self.instructor_email,
'annotation_mode': self.annotation_mode, 'annotation_mode': self.annotation_mode,
} }
fragment = Fragment(self.system.render_template('videoannotation.html', context)) fragment = Fragment(self.system.render_template('videoannotation.html', context))
......
...@@ -380,7 +380,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ...@@ -380,7 +380,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
clickTimeThreshold: viewer.clickTimeThreshold, clickTimeThreshold: viewer.clickTimeThreshold,
clickDistThreshold: viewer.clickDistThreshold clickDistThreshold: viewer.clickDistThreshold
}); });
if(this.options.viewer.annotation_mode == "2" || this.options.viewer.flags){ if(this.options.viewer.annotation_mode == "everyone" || this.options.viewer.flags){
/* Set elements to the control menu */ /* Set elements to the control menu */
viewer.annotatorControl = viewer.wrapperAnnotation.element; viewer.annotatorControl = viewer.wrapperAnnotation.element;
if( viewer.toolbar ){ if( viewer.toolbar ){
......
...@@ -42,29 +42,29 @@ annotationList: ...@@ -42,29 +42,29 @@ annotationList:
'</div>'+ '</div>'+
'<div class="annotatedBy field">'+ '<div class="annotatedBy field">'+
'User'+ gettext('User')+
'</div>'+ '</div>'+
'<div class="body field">'+ '<div class="body field">'+
'Annotation'+ gettext('Annotation')+
'</div>'+ '</div>'+
'{{#if videoFormat}}'+ '{{#if videoFormat}}'+
'<div class="start field">'+ '<div class="start field">'+
'Start'+ gettext('Start')+
'</div>'+ '</div>'+
'<div class="end field">'+ '<div class="end field">'+
'End'+ gettext('End')+
'</div>'+ '</div>'+
'{{/if}}'+ '{{/if}}'+
'<div class="totalreplies field">'+ '<div class="totalreplies field">'+
'#Replies'+ gettext('#Replies')+
'</div>'+ '</div>'+
'<div class="annotatedAt field">'+ '<div class="annotatedAt field">'+
'Date posted'+ gettext('Date posted')+
'</div>'+ '</div>'+
'</div>'+ '</div>'+
'</div>'+ '</div>'+
...@@ -73,41 +73,41 @@ annotationList: ...@@ -73,41 +73,41 @@ annotationList:
'{{/each}}'+ '{{/each}}'+
'</div>'+ '</div>'+
'<div class="annotationListButtons">'+ '<div class="annotationListButtons">'+
'<div class="moreButtonCatch">More</div>'+ '<div class="moreButtonCatch">'+gettext('More')+'</div>'+
'</div>', '</div>',
//Main->PublicPrivateInstructor //Main->PublicPrivateInstructor
annotationPublicPrivateInstructor: annotationPublicPrivateInstructor:
'<div class="selectors"><div class="PublicPrivate myNotes active">My Notes<span class="action">myNotes</span></div>'+ '<div class="selectors"><div class="PublicPrivate myNotes active">'+gettext('My Notes')+'<span class="action">myNotes</span></div>'+
'<div class="PublicPrivate instructor"> Instructor<span class="action">instructor</span></div>'+ '<div class="PublicPrivate instructor"> '+gettext('Instructor')+'<span class="action">instructor</span></div>'+
'<div class="PublicPrivate public"> Public<span class="action">public</span></div></div>'+ '<div class="PublicPrivate public"> '+gettext('Public')+'<span class="action">public</span></div></div>'+
'<div class="searchbox"><div class="searchinst">Search</div><select class="dropdown-list">'+ '<div class="searchbox"><div class="searchinst">'+gettext('Search')+'</div><select class="dropdown-list">'+
'<option>Users</option>'+ '<option>'+gettext('Users')+'</option>'+
'<option>Tags</option>'+ '<option>'+gettext('Tags')+'</option>'+
'<option>Annotation Text</option>'+ '<option>'+gettext('Annotation Text')+'</option>'+
'</select><input type="text" name="search"/><div class="search-icon" alt="Run search."></div><div class="clear-search-icon" alt="Clear search.">Clear</div></div>', '</select><input type="text" name="search"/><div class="search-icon" alt="Run search."></div><div class="clear-search-icon" alt="Clear search.">'+gettext('Clear')+'</div></div>',
//Main->PublicPrivate //Main->PublicPrivate
annotationPublicPrivate: annotationPublicPrivate:
'<div class="selectors"><div class="PublicPrivate myNotes active">My Notes<span class="action">myNotes</span></div>'+ '<div class="selectors"><div class="PublicPrivate myNotes active">'+gettext('My Notes')+'<span class="action">myNotes</span></div>'+
'<div class="PublicPrivate public"> Public<span class="action">public</span></div></div>'+ '<div class="PublicPrivate public"> '+gettext('Public')+'<span class="action">public</span></div></div>'+
'<div class="searchbox"><div class="searchinst">Search</div><select class="dropdown-list">'+ '<div class="searchbox"><div class="searchinst">'+gettext('Search')+'</div><select class="dropdown-list">'+
'<option>Users</option>'+ '<option>'+gettext('Users')+'</option>'+
'<option>Tags</option>'+ '<option>'+gettext('Tags')+'</option>'+
'<option>Annotation Text</option>'+ '<option>'+gettext('Annotation Text')+'</option>'+
'</select><input type="text" name="search"/><div class="search-icon" alt="Run search."></div><div class="clear-search-icon" alt="Clear search.">Clear</div></div>', '</select><input type="text" name="search"/><div class="search-icon" alt="Run search."></div><div class="clear-search-icon" alt="Clear search.">'+gettext('Clear')+'</div></div>',
//Main->MediaSelector //Main->MediaSelector
annotationMediaSelector: annotationMediaSelector:
'<ul class="ui-tabs-nav">'+ '<ul class="ui-tabs-nav">'+
'<li class="ui-state-default" media="text">'+ '<li class="ui-state-default" media="text">'+
'Text'+ gettext('Text')+
'</li>'+ '</li>'+
'<li class="ui-state-default" media="video">'+ '<li class="ui-state-default" media="video">'+
'Video'+ gettext('Video')+
'</li>'+ '</li>'+
'li class="ui-state-default" media="image">'+ 'li class="ui-state-default" media="image">'+
'Image'+ gettext('Image')+
'</li>'+ '</li>'+
'</ul>', '</ul>',
...@@ -137,7 +137,7 @@ annotationReply: ...@@ -137,7 +137,7 @@ annotationReply:
'<div class="map"></div>'+ '<div class="map"></div>'+
'</div>'+ '</div>'+
'{{/if}}'+ '{{/if}}'+
'<div class="deleteReply">Delete</div>'+ '<div class="deleteReply">'+gettext('Delete')+'</div>'+
'</p>'+ '</p>'+
'<p>'+ '<p>'+
'{{#if this.text}}'+ '{{#if this.text}}'+
...@@ -244,13 +244,13 @@ annotationDetail: ...@@ -244,13 +244,13 @@ annotationDetail:
'</div>'+ '</div>'+
'<div class="controlReplies">'+ '<div class="controlReplies">'+
'<div class="newReply" style="text-decoration:underline">Reply</div>&nbsp;'+ '<div class="newReply" style="text-decoration:underline">'+gettext('Reply')+'</div>&nbsp;'+
'<div class="hideReplies" style="text-decoration:underline;display:{{#if hasReplies}}block{{else}}none{{/if}}">Show Replies</div>&nbsp;'+ '<div class="hideReplies" style="text-decoration:underline;display:{{#if hasReplies}}block{{else}}none{{/if}}">Show Replies</div>&nbsp;'+
'{{#if authToEditButton}}'+ '{{#if authToEditButton}}'+
'<div class="editAnnotation" style="text-decoration:underline">Edit</div>'+ '<div class="editAnnotation" style="text-decoration:underline">'+gettext('Edit')+'</div>'+
'{{/if}}'+ '{{/if}}'+
'{{#if authToDeleteButton}}'+ '{{#if authToDeleteButton}}'+
'<div class="deleteAnnotation" style="text-decoration:underline">Delete</div>'+ '<div class="deleteAnnotation" style="text-decoration:underline">'+gettext('Delete')+'</div>'+
'{{/if}}'+ '{{/if}}'+
'</div>'+ '</div>'+
...@@ -259,7 +259,7 @@ annotationDetail: ...@@ -259,7 +259,7 @@ annotationDetail:
'{{#if tags}}'+ '{{#if tags}}'+
'<div class="tags">'+ '<div class="tags">'+
'<h3>Tags:</h3>'+ '<h3>'+gettext('Tags:')+'</h3>'+
'{{#each tags}}'+ '{{#each tags}}'+
'<div class="tag">'+ '<div class="tag">'+
'{{this}}'+ '{{this}}'+
...@@ -348,14 +348,22 @@ CatchAnnotation.prototype = { ...@@ -348,14 +348,22 @@ CatchAnnotation.prototype = {
this.HTMLTEMPLATES = CatchSources.HTMLTEMPLATES(this.options.imageUrlRoot); this.HTMLTEMPLATES = CatchSources.HTMLTEMPLATES(this.options.imageUrlRoot);
this.TEMPLATES = {}; this.TEMPLATES = {};
this._compileTemplates(); this._compileTemplates();
// the default annotations are the user's personal ones instead of instructor
// if the default tab is instructor, we must refresh the catch to pull the ones
// under the instructor's email. passing empty strings as arguments will default
// to pulling the annotations for the email within this.options.userId.
if(this.options.default_tab.toLowerCase() == 'instructor'){ if(this.options.default_tab.toLowerCase() == 'instructor'){
this.options.userId = this.options.instructor_username; this.options.userId = this.options.instructor_email;
this._refresh('',''); this._refresh('','');
} }
}, },
// //
// GLOBAL UTILITIES // GLOBAL UTILITIES
// //
getTemplate: function(templateName){
return this.TEMPLATES[templateName]() || '';
},
refreshCatch: function(newInstance) { refreshCatch: function(newInstance) {
var mediaType = this.options.media || 'text', var mediaType = this.options.media || 'text',
annotationItems = [], annotationItems = [],
...@@ -396,18 +404,16 @@ CatchAnnotation.prototype = { ...@@ -396,18 +404,16 @@ CatchAnnotation.prototype = {
if (newInstance){ if (newInstance){
var videoFormat = (mediaType === "video") ? true:false; var videoFormat = (mediaType === "video") ? true:false;
var publicprivatetemplate = ''; var publicPrivateTemplate = '';
if (self.options.showPublicPrivate) { if (self.options.showPublicPrivate) {
if(self.options.instructor_username != ''){ var templateName = this.options.instructor_email ?
publicprivatetemplate = self.TEMPLATES.annotationPublicPrivateInstructor(); "annotationPublicPrivateInstructor" :
} else{ "annotationPublicPrivate";
publicprivatetemplate = self.TEMPLATES.annotationPublicPrivate();
}
} }
el.html(self.TEMPLATES.annotationList({ el.html(self.TEMPLATES.annotationList({
annotationItems: annotationItems, annotationItems: annotationItems,
videoFormat: videoFormat, videoFormat: videoFormat,
PublicPrivate: publicprivatetemplate, PublicPrivate: this.getTemplate(templateName),
MediaSelector: self.options.showMediaSelector?self.TEMPLATES.annotationMediaSelector():'', MediaSelector: self.options.showMediaSelector?self.TEMPLATES.annotationMediaSelector():'',
})); }));
}else{ }else{
...@@ -433,7 +439,7 @@ CatchAnnotation.prototype = { ...@@ -433,7 +439,7 @@ CatchAnnotation.prototype = {
self.options.userId = ''; self.options.userId = '';
break; break;
case 'instructor': case 'instructor':
self.options.userId = this.options.instructor_username; self.options.userId = this.options.instructor_email;
break; break;
default: default:
self.options.userId = this.annotator.plugins.Permissions.user.id; self.options.userId = this.annotator.plugins.Permissions.user.id;
...@@ -1055,7 +1061,7 @@ CatchAnnotation.prototype = { ...@@ -1055,7 +1061,7 @@ CatchAnnotation.prototype = {
userId = ''; userId = '';
break; break;
case 'instructor': case 'instructor':
userId = this.options.instructor_username; userId = this.options.instructor_email;
break; break;
default: default:
userId = this.annotator.plugins.Permissions.user.id; userId = this.annotator.plugins.Permissions.user.id;
...@@ -1119,7 +1125,7 @@ CatchAnnotation.prototype = { ...@@ -1119,7 +1125,7 @@ CatchAnnotation.prototype = {
}, },
_onClearSearchButtonClick: function(evt){ _onClearSearchButtonClick: function(evt){
this._refresh("",""); this._refresh('','');
}, },
_clearAnnotator: function(){ _clearAnnotator: function(){
var annotator = this.annotator, var annotator = this.annotator,
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
${static.css(group='style-vendor-tinymce-skin', raw=True)} ${static.css(group='style-vendor-tinymce-skin', raw=True)}
</div> </div>
<div id="catchDIV"> <div id="catchDIV">
## Translators: Notes below refer to annotations. They wil later be put under a "Notes" section.
<div class="annotationListContainer">${_('Note: only instructors may annotate.')}</div> <div class="annotationListContainer">${_('Note: only instructors may annotate.')}</div>
</div> </div>
</div> </div>
...@@ -72,7 +71,7 @@ ...@@ -72,7 +71,7 @@
var unit_id = $('#sequence-list').find('.active').attr("data-element"); var unit_id = $('#sequence-list').find('.active').attr("data-element");
uri += unit_id; uri += unit_id;
var pagination = 100, var pagination = 100,
is_staff = ('${user.email}'=='${instructor_username}'), is_staff = ('${user.email}'=='${instructor_email}'),
options = { options = {
optionsAnnotator: { optionsAnnotator: {
permissions:{ permissions:{
...@@ -191,10 +190,9 @@ ...@@ -191,10 +190,9 @@
//Load the plugin Image/Text Annotation //Load the plugin Image/Text Annotation
var osda = new OpenSeadragonAnnotation($('#imageHolder'),options); var osda = new OpenSeadragonAnnotation($('#imageHolder'),options);
var userId = '${user.email}'; var userId = ('${default_tab}'.toLowerCase() === 'instructor') ?
if('${default_tab}'.toLowerCase() == 'instructor'){ '${instructor_email}':
userId = '${instructor_username}'; '${user.email}';
}
//Catch //Catch
var annotator = osda.annotator; var annotator = osda.annotator;
...@@ -208,12 +206,17 @@ ...@@ -208,12 +206,17 @@
pagination:pagination,//Number of Annotations per load in the pagination, pagination:pagination,//Number of Annotations per load in the pagination,
flags:is_staff, flags:is_staff,
default_tab: "${default_tab}", default_tab: "${default_tab}",
instructor_username: "${instructor_username}", instructor_email: "${instructor_email}",
annotation_mode: "${annotation_mode}", annotation_mode: "${annotation_mode}",
}; };
if ("${annotation_mode}" == "2" || ("${annotation_mode}" == 1 && "${instructor_username}" != ""))
// if annotations are opened to everyone (2) or if they want to create no annotations (1 with no instructor)
// then the table at the bottom of the source should be displayed
if ("${annotation_mode}" == "everyone" || ("${annotation_mode}" == "instructor" && "${instructor_email}" != ""))
var Catch = new CatchAnnotation($('#catchDIV'),catchOptions); var Catch = new CatchAnnotation($('#catchDIV'),catchOptions);
if ("${annotation_mode}" == 1 && "${instructor_username}" == "" && !is_staff)
// if it is in instructor mode only (1), the annotator should be destroyed for all except the instructor
if ("${annotation_mode}" == "instructor" && "${instructor_email}" == "" && !is_staff)
osda.annotator.destroy(); osda.annotator.destroy();
} }
</script> </script>
\ No newline at end of file
...@@ -177,10 +177,9 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)} ...@@ -177,10 +177,9 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)}
//Load the plugin Video/Text Annotation //Load the plugin Video/Text Annotation
var ova = new OpenVideoAnnotation.Annotator($('#textHolder'),options); var ova = new OpenVideoAnnotation.Annotator($('#textHolder'),options);
var userId = '${user.email}'; var userId = ('${default_tab}'.toLowerCase() === 'instructor') ?
if('${default_tab}'.toLowerCase() == 'instructor'){ '${instructor_email}':
userId = '${instructor_username}'; '${user.email}';
}
//Catch //Catch
var annotator = ova.annotator; var annotator = ova.annotator;
...@@ -194,7 +193,7 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)} ...@@ -194,7 +193,7 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)}
pagination:pagination,//Number of Annotations per load in the pagination, pagination:pagination,//Number of Annotations per load in the pagination,
flags:is_staff, flags:is_staff,
default_tab: "${default_tab}", default_tab: "${default_tab}",
instructor_username: "${instructor_username}", instructor_email: "${instructor_email}",
annotation_mode: "${annotation_mode}", annotation_mode: "${annotation_mode}",
}; };
var Catch = new CatchAnnotation($('#catchDIV'),catchOptions); var Catch = new CatchAnnotation($('#catchDIV'),catchOptions);
......
...@@ -175,10 +175,9 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)} ...@@ -175,10 +175,9 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)}
var ova = new OpenVideoAnnotation.Annotator($('#videoHolder'),options); var ova = new OpenVideoAnnotation.Annotator($('#videoHolder'),options);
ova.annotator.addPlugin('Tags'); ova.annotator.addPlugin('Tags');
var userId = '${user.email}'; var userId = ('${default_tab}'.toLowerCase() === 'instructor') ?
if('${default_tab}'.toLowerCase() == 'instructor'){ '${instructor_email}':
userId = '${instructor_username}'; '${user.email}';
}
//Catch //Catch
var annotator = ova.annotator; var annotator = ova.annotator;
...@@ -192,7 +191,7 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)} ...@@ -192,7 +191,7 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)}
pagination:pagination,//Number of Annotations per load in the pagination, pagination:pagination,//Number of Annotations per load in the pagination,
flags:is_staff, flags:is_staff,
default_tab: "${default_tab}", default_tab: "${default_tab}",
instructor_username: "${instructor_username}", instructor_email: "${instructor_email}",
annotation_mode: "${annotation_mode}", annotation_mode: "${annotation_mode}",
}; };
var Catch = new CatchAnnotation($('#catchDIV'),catchOptions); var Catch = new CatchAnnotation($('#catchDIV'),catchOptions);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment