Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
5e091354
Commit
5e091354
authored
Sep 10, 2012
by
Matthew Mongeau
Committed by
Ibrahim Awwal
Sep 10, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add backbone checks.
parent
d0c2d315
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
450 additions
and
441 deletions
+450
-441
lms/static/coffee/src/discussion/discussion_router.coffee
+39
-38
lms/static/coffee/src/discussion/main.coffee
+17
-16
lms/static/coffee/src/discussion/models/discussion_user.coffee
+12
-11
lms/static/coffee/src/discussion/user_profile.coffee
+29
-28
lms/static/coffee/src/discussion/views/discussion_content_view.coffee
+89
-88
lms/static/coffee/src/discussion/views/discussion_thread_inline_view.coffee
+0
-0
lms/static/coffee/src/discussion/views/discussion_thread_list_view.coffee
+0
-0
lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
+79
-78
lms/static/coffee/src/discussion/views/new_post_inline_vew.coffee
+56
-55
lms/static/coffee/src/discussion/views/new_post_view.coffee
+0
-0
lms/static/coffee/src/discussion/views/response_comment_view.coffee
+23
-22
lms/static/coffee/src/discussion/views/thread_response_view.coffee
+106
-105
No files found.
lms/static/coffee/src/discussion/discussion_router.coffee
View file @
5e091354
class
@
DiscussionRouter
extends
Backbone
.
Router
routes
:
""
:
"allThreads"
":forum_name/threads/:thread_id"
:
"showThread"
initialize
:
(
options
)
->
@
discussion
=
options
[
'discussion'
]
@
nav
=
new
DiscussionThreadListView
(
collection
:
@
discussion
,
el
:
$
(
".sidebar"
))
@
nav
.
on
"thread:selected"
,
@
navigateToThread
@
nav
.
on
"thread:removed"
,
@
navigateToAllThreads
@
nav
.
on
"threads:rendered"
,
@
setActiveThread
@
nav
.
render
()
@
newPostView
=
new
NewPostView
(
el
:
$
(
".new-post-article"
),
collection
:
@
discussion
)
@
newPostView
.
on
"thread:created"
,
@
navigateToThread
allThreads
:
->
@
nav
.
updateSidebar
()
setActiveThread
:
=>
if
@
thread
@
nav
.
setActiveThread
(
@
thread
.
get
(
"id"
))
showThread
:
(
forum_name
,
thread_id
)
->
@
thread
=
@
discussion
.
get
(
thread_id
)
@
setActiveThread
()
if
(
@
main
)
@
main
.
undelegateEvents
()
@
main
=
new
DiscussionThreadView
(
el
:
$
(
".discussion-column"
),
model
:
@
thread
)
@
main
.
render
()
@
main
.
on
"thread:responses:rendered"
,
=>
if
Backbone
?
class
@
DiscussionRouter
extends
Backbone
.
Router
routes
:
""
:
"allThreads"
":forum_name/threads/:thread_id"
:
"showThread"
initialize
:
(
options
)
->
@
discussion
=
options
[
'discussion'
]
@
nav
=
new
DiscussionThreadListView
(
collection
:
@
discussion
,
el
:
$
(
".sidebar"
))
@
nav
.
on
"thread:selected"
,
@
navigateToThread
@
nav
.
on
"thread:removed"
,
@
navigateToAllThreads
@
nav
.
on
"threads:rendered"
,
@
setActiveThread
@
nav
.
render
()
@
newPostView
=
new
NewPostView
(
el
:
$
(
".new-post-article"
),
collection
:
@
discussion
)
@
newPostView
.
on
"thread:created"
,
@
navigateToThread
allThreads
:
->
@
nav
.
updateSidebar
()
navigateToThread
:
(
thread_id
)
=>
thread
=
@
discussion
.
get
(
thread_id
)
@
navigate
(
"
#{
thread
.
get
(
"commentable_id"
)
}
/threads/
#{
thread_id
}
"
,
trigger
:
true
)
setActiveThread
:
=>
if
@
thread
@
nav
.
setActiveThread
(
@
thread
.
get
(
"id"
)
)
navigateToAllThreads
:
=>
console
.
log
"navigating"
@
navigate
(
""
,
trigger
:
true
)
showThread
:
(
forum_name
,
thread_id
)
->
@
thread
=
@
discussion
.
get
(
thread_id
)
@
setActiveThread
()
if
(
@
main
)
@
main
.
undelegateEvents
()
@
main
=
new
DiscussionThreadView
(
el
:
$
(
".discussion-column"
),
model
:
@
thread
)
@
main
.
render
()
@
main
.
on
"thread:responses:rendered"
,
=>
@
nav
.
updateSidebar
()
navigateToThread
:
(
thread_id
)
=>
thread
=
@
discussion
.
get
(
thread_id
)
@
navigate
(
"
#{
thread
.
get
(
"commentable_id"
)
}
/threads/
#{
thread_id
}
"
,
trigger
:
true
)
navigateToAllThreads
:
=>
console
.
log
"navigating"
@
navigate
(
""
,
trigger
:
true
)
lms/static/coffee/src/discussion/main.coffee
View file @
5e091354
DiscussionApp
=
start
:
(
elem
)
->
# TODO: Perhaps eliminate usage of global variables when possible
element
=
$
(
elem
)
window
.
$
$course_id
=
element
.
data
(
"course-id"
)
user_info
=
element
.
data
(
"user-info"
)
threads
=
element
.
data
(
"threads"
)
content_info
=
element
.
data
(
"content-info"
)
window
.
user
=
new
DiscussionUser
(
user_info
)
Content
.
loadContentInfos
(
content_info
)
discussion
=
new
Discussion
(
threads
)
new
DiscussionRouter
({
discussion
:
discussion
})
Backbone
.
history
.
start
({
pushState
:
true
,
root
:
"/courses/
#{
$$course_id
}
/discussion/forum/"
})
if
Backbone
?
DiscussionApp
=
start
:
(
elem
)
->
# TODO: Perhaps eliminate usage of global variables when possible
element
=
$
(
elem
)
window
.
$
$course_id
=
element
.
data
(
"course-id"
)
user_info
=
element
.
data
(
"user-info"
)
threads
=
element
.
data
(
"threads"
)
content_info
=
element
.
data
(
"content-info"
)
window
.
user
=
new
DiscussionUser
(
user_info
)
Content
.
loadContentInfos
(
content_info
)
discussion
=
new
Discussion
(
threads
)
new
DiscussionRouter
({
discussion
:
discussion
})
Backbone
.
history
.
start
({
pushState
:
true
,
root
:
"/courses/
#{
$$course_id
}
/discussion/forum/"
})
$
->
$
(
"section.discussion"
).
each
(
index
,
elem
)
->
DiscussionApp
.
start
(
elem
)
$
->
$
(
"section.discussion"
).
each
(
index
,
elem
)
->
DiscussionApp
.
start
(
elem
)
lms/static/coffee/src/discussion/models/discussion_user.coffee
View file @
5e091354
class
@
DiscussionUser
extends
Backbone
.
Model
following
:
(
thread
)
->
_
.
include
(
@
get
(
'subscribed_thread_ids'
),
thread
.
id
)
if
Backbone
?
class
@
DiscussionUser
extends
Backbone
.
Model
following
:
(
thread
)
->
_
.
include
(
@
get
(
'subscribed_thread_ids'
),
thread
.
id
)
voted
:
(
thread
)
->
_
.
include
(
@
get
(
'upvoted_ids'
),
thread
.
id
)
voted
:
(
thread
)
->
_
.
include
(
@
get
(
'upvoted_ids'
),
thread
.
id
)
vote
:
(
thread
)
->
@
get
(
'upvoted_ids'
).
push
(
thread
.
id
)
thread
.
vote
()
vote
:
(
thread
)
->
@
get
(
'upvoted_ids'
).
push
(
thread
.
id
)
thread
.
vote
()
unvote
:
(
thread
)
->
@
set
(
'upvoted_ids'
,
_
.
without
(
@
get
(
'upvoted_ids'
),
thread
.
id
))
thread
.
unvote
()
unvote
:
(
thread
)
->
@
set
(
'upvoted_ids'
,
_
.
without
(
@
get
(
'upvoted_ids'
),
thread
.
id
))
thread
.
unvote
()
lms/static/coffee/src/discussion/user_profile.coffee
View file @
5e091354
class
@
DiscussionUserProfileView
extends
Backbone
.
View
toggleModeratorStatus
:
(
event
)
->
confirmValue
=
confirm
(
"Are you sure?"
)
if
not
confirmValue
then
return
$elem
=
$
(
event
.
target
)
if
$elem
.
hasClass
(
"sidebar-promote-moderator-button"
)
isModerator
=
true
else
if
$elem
.
hasClass
(
"sidebar-revoke-moderator-button"
)
isModerator
=
false
else
console
.
error
"unrecognized moderator status"
return
url
=
DiscussionUtil
.
urlFor
(
'update_moderator_status'
,
$$profiled_user_id
)
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
type
:
"POST"
dataType
:
'json'
data
:
is_moderator
:
isModerator
error
:
(
response
,
textStatus
,
e
)
->
console
.
log
e
success
:
(
response
,
textStatus
)
=>
parent
=
@
$el
.
parent
()
@
$el
.
replaceWith
(
response
.
html
)
view
=
new
DiscussionUserProfileView
el
:
parent
.
children
(
".user-profile"
)
if
Backbone
?
class
@
DiscussionUserProfileView
extends
Backbone
.
View
toggleModeratorStatus
:
(
event
)
->
confirmValue
=
confirm
(
"Are you sure?"
)
if
not
confirmValue
then
return
$elem
=
$
(
event
.
target
)
if
$elem
.
hasClass
(
"sidebar-promote-moderator-button"
)
isModerator
=
true
else
if
$elem
.
hasClass
(
"sidebar-revoke-moderator-button"
)
isModerator
=
false
else
console
.
error
"unrecognized moderator status"
return
url
=
DiscussionUtil
.
urlFor
(
'update_moderator_status'
,
$$profiled_user_id
)
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
type
:
"POST"
dataType
:
'json'
data
:
is_moderator
:
isModerator
error
:
(
response
,
textStatus
,
e
)
->
console
.
log
e
success
:
(
response
,
textStatus
)
=>
parent
=
@
$el
.
parent
()
@
$el
.
replaceWith
(
response
.
html
)
view
=
new
DiscussionUserProfileView
el
:
parent
.
children
(
".user-profile"
)
events
:
"click .sidebar-toggle-moderator-button"
:
"toggleModeratorStatus"
events
:
"click .sidebar-toggle-moderator-button"
:
"toggleModeratorStatus"
lms/static/coffee/src/discussion/views/discussion_content_view.coffee
View file @
5e091354
class
@
DiscussionContentView
extends
Backbone
.
View
attrRenderer
:
endorsed
:
(
endorsed
)
->
if
endorsed
@
$
(
".action-endorse"
).
addClass
(
"is-endorsed"
)
else
@
$
(
".action-endorse"
).
removeClass
(
"is-endorsed"
)
closed
:
(
closed
)
->
return
if
not
@
$
(
".action-openclose"
).
length
return
if
not
@
$
(
".post-status-closed"
).
length
if
closed
@
$
(
".post-status-closed"
).
show
()
@
$
(
".action-openclose"
).
html
(
@
$
(
".action-openclose"
).
html
().
replace
(
"Close"
,
"Open"
))
@
$
(
".discussion-reply-new"
).
hide
()
else
@
$
(
".post-status-closed"
).
hide
()
@
$
(
".action-openclose"
).
html
(
@
$
(
".action-openclose"
).
html
().
replace
(
"Open"
,
"Close"
))
@
$
(
".discussion-reply-new"
).
show
()
voted
:
(
voted
)
->
votes_point
:
(
votes_point
)
->
comments_count
:
(
comments_count
)
->
subscribed
:
(
subscribed
)
->
if
subscribed
@
$
(
".dogear"
).
addClass
(
"is-followed"
)
else
@
$
(
".dogear"
).
removeClass
(
"is-followed"
)
ability
:
(
ability
)
->
for
action
,
selector
of
@
abilityRenderer
if
not
ability
[
action
]
selector
.
disable
.
apply
(
@
)
if
Backbone
?
class
@
DiscussionContentView
extends
Backbone
.
View
attrRenderer
:
endorsed
:
(
endorsed
)
->
if
endorsed
@
$
(
".action-endorse"
).
addClass
(
"is-endorsed"
)
else
@
$
(
".action-endorse"
).
removeClass
(
"is-endorsed"
)
closed
:
(
closed
)
->
return
if
not
@
$
(
".action-openclose"
).
length
return
if
not
@
$
(
".post-status-closed"
).
length
if
closed
@
$
(
".post-status-closed"
).
show
()
@
$
(
".action-openclose"
).
html
(
@
$
(
".action-openclose"
).
html
().
replace
(
"Close"
,
"Open"
))
@
$
(
".discussion-reply-new"
).
hide
()
else
@
$
(
".post-status-closed"
).
hide
()
@
$
(
".action-openclose"
).
html
(
@
$
(
".action-openclose"
).
html
().
replace
(
"Open"
,
"Close"
))
@
$
(
".discussion-reply-new"
).
show
()
voted
:
(
voted
)
->
votes_point
:
(
votes_point
)
->
comments_count
:
(
comments_count
)
->
subscribed
:
(
subscribed
)
->
if
subscribed
@
$
(
".dogear"
).
addClass
(
"is-followed"
)
else
selector
.
enable
.
apply
(
@
)
abilityRenderer
:
editable
:
enable
:
->
@
$
(
".action-edit"
).
closest
(
"li"
).
show
()
disable
:
->
@
$
(
".action-edit"
).
closest
(
"li"
).
hide
()
can_delete
:
enable
:
->
@
$
(
".action-delete"
).
closest
(
"li"
).
show
()
disable
:
->
@
$
(
".action-delete"
).
closest
(
"li"
).
hide
()
can_endorse
:
enable
:
->
@
$
(
".action-endorse"
).
css
(
"cursor"
,
"auto"
)
disable
:
->
@
$
(
".action-endorse"
).
css
(
"cursor"
,
"default"
)
can_openclose
:
enable
:
->
@
$
(
".action-openclose"
).
closest
(
"li"
).
show
()
disable
:
->
@
$
(
".action-openclose"
).
closest
(
"li"
).
hide
()
renderPartialAttrs
:
->
for
attr
,
value
of
@
model
.
changedAttributes
()
if
@
attrRenderer
[
attr
]
@
attrRenderer
[
attr
].
apply
(
@
,
[
value
])
renderAttrs
:
->
for
attr
,
value
of
@
model
.
attributes
if
@
attrRenderer
[
attr
]
@
attrRenderer
[
attr
].
apply
(
@
,
[
value
])
$
:
(
selector
)
->
@
$local
.
find
(
selector
)
initLocal
:
->
@
$local
=
@
$el
.
children
(
".local"
)
if
not
@
$local
.
length
@
$local
=
@
$el
@
$delegateElement
=
@
$local
makeWmdEditor
:
(
cls_identifier
)
=>
if
not
@
$el
.
find
(
".wmd-panel"
).
length
DiscussionUtil
.
makeWmdEditor
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
getWmdEditor
:
(
cls_identifier
)
=>
DiscussionUtil
.
getWmdEditor
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
getWmdContent
:
(
cls_identifier
)
=>
DiscussionUtil
.
getWmdContent
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
setWmdContent
:
(
cls_identifier
,
text
)
=>
DiscussionUtil
.
setWmdContent
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
,
text
initialize
:
->
@
initLocal
()
@
model
.
bind
(
'change'
,
@
renderPartialAttrs
,
@
)
@
$
(
".dogear"
).
removeClass
(
"is-followed"
)
ability
:
(
ability
)
->
for
action
,
selector
of
@
abilityRenderer
if
not
ability
[
action
]
selector
.
disable
.
apply
(
@
)
else
selector
.
enable
.
apply
(
@
)
abilityRenderer
:
editable
:
enable
:
->
@
$
(
".action-edit"
).
closest
(
"li"
).
show
()
disable
:
->
@
$
(
".action-edit"
).
closest
(
"li"
).
hide
()
can_delete
:
enable
:
->
@
$
(
".action-delete"
).
closest
(
"li"
).
show
()
disable
:
->
@
$
(
".action-delete"
).
closest
(
"li"
).
hide
()
can_endorse
:
enable
:
->
@
$
(
".action-endorse"
).
css
(
"cursor"
,
"auto"
)
disable
:
->
@
$
(
".action-endorse"
).
css
(
"cursor"
,
"default"
)
can_openclose
:
enable
:
->
@
$
(
".action-openclose"
).
closest
(
"li"
).
show
()
disable
:
->
@
$
(
".action-openclose"
).
closest
(
"li"
).
hide
()
renderPartialAttrs
:
->
for
attr
,
value
of
@
model
.
changedAttributes
()
if
@
attrRenderer
[
attr
]
@
attrRenderer
[
attr
].
apply
(
@
,
[
value
])
renderAttrs
:
->
for
attr
,
value
of
@
model
.
attributes
if
@
attrRenderer
[
attr
]
@
attrRenderer
[
attr
].
apply
(
@
,
[
value
])
$
:
(
selector
)
->
@
$local
.
find
(
selector
)
initLocal
:
->
@
$local
=
@
$el
.
children
(
".local"
)
if
not
@
$local
.
length
@
$local
=
@
$el
@
$delegateElement
=
@
$local
makeWmdEditor
:
(
cls_identifier
)
=>
if
not
@
$el
.
find
(
".wmd-panel"
).
length
DiscussionUtil
.
makeWmdEditor
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
getWmdEditor
:
(
cls_identifier
)
=>
DiscussionUtil
.
getWmdEditor
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
getWmdContent
:
(
cls_identifier
)
=>
DiscussionUtil
.
getWmdContent
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
setWmdContent
:
(
cls_identifier
,
text
)
=>
DiscussionUtil
.
setWmdContent
@
$el
,
$
.
proxy
(
@
$
,
@
),
cls_identifier
,
text
initialize
:
->
@
initLocal
()
@
model
.
bind
(
'change'
,
@
renderPartialAttrs
,
@
)
lms/static/coffee/src/discussion/views/discussion_thread_inline_view.coffee
View file @
5e091354
This diff is collapsed.
Click to expand it.
lms/static/coffee/src/discussion/views/discussion_thread_list_view.coffee
View file @
5e091354
This diff is collapsed.
Click to expand it.
lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
View file @
5e091354
class
@
DiscussionThreadView
extends
DiscussionContentView
if
Backbone
?
class
@
DiscussionThreadView
extends
DiscussionContentView
events
:
"click .discussion-submit-post"
:
"submitComment"
events
:
"click .discussion-submit-post"
:
"submitComment"
template
:
_
.
template
(
$
(
"#thread-template"
).
html
())
template
:
_
.
template
(
$
(
"#thread-template"
).
html
())
$
:
(
selector
)
->
@
$el
.
find
(
selector
)
$
:
(
selector
)
->
@
$el
.
find
(
selector
)
initialize
:
->
super
()
@
showView
=
new
DiscussionThreadShowView
(
model
:
@
model
)
@
showView
.
bind
"thread:delete"
,
@
delete
@
showView
.
bind
"thread:edit"
,
@
edit
initialize
:
->
super
()
@
showView
=
new
DiscussionThreadShowView
(
model
:
@
model
)
@
showView
.
bind
"thread:delete"
,
@
delete
@
showView
.
bind
"thread:edit"
,
@
edit
render
:
->
@
$el
.
html
(
@
template
(
@
model
.
toJSON
()))
@
delegateEvents
()
render
:
->
@
$el
.
html
(
@
template
(
@
model
.
toJSON
()))
@
delegateEvents
()
@
showView
.
setElement
(
@
$
(
'.thread-content-wrapper'
))
@
showView
.
render
()
@
showView
.
delegateEvents
()
@
showView
.
setElement
(
@
$
(
'.thread-content-wrapper'
))
@
showView
.
render
()
@
showView
.
delegateEvents
()
@
renderAttrs
()
@
$
(
"span.timeago"
).
timeago
()
@
makeWmdEditor
"reply-body"
@
renderResponses
()
@
@
renderAttrs
()
@
$
(
"span.timeago"
).
timeago
()
@
makeWmdEditor
"reply-body"
@
renderResponses
()
@
renderResponses
:
->
DiscussionUtil
.
safeAjax
url
:
"/courses/
#{
$$course_id
}
/discussion/forum/
#{
@
model
.
get
(
'commentable_id'
)
}
/threads/
#{
@
model
.
id
}
"
success
:
(
data
,
textStatus
,
xhr
)
=>
@
$el
.
find
(
".loading"
).
remove
()
Content
.
loadContentInfos
(
data
[
'annotated_content_info'
])
comments
=
new
Comments
(
data
[
'content'
][
'children'
])
comments
.
each
@
renderResponse
@
trigger
"thread:responses:rendered"
renderResponses
:
->
DiscussionUtil
.
safeAjax
url
:
"/courses/
#{
$$course_id
}
/discussion/forum/
#{
@
model
.
get
(
'commentable_id'
)
}
/threads/
#{
@
model
.
id
}
"
success
:
(
data
,
textStatus
,
xhr
)
=>
@
$el
.
find
(
".loading"
).
remove
()
Content
.
loadContentInfos
(
data
[
'annotated_content_info'
])
comments
=
new
Comments
(
data
[
'content'
][
'children'
])
comments
.
each
@
renderResponse
@
trigger
"thread:responses:rendered"
renderResponse
:
(
response
)
=>
response
.
set
(
'thread'
,
@
model
)
view
=
new
ThreadResponseView
(
model
:
response
)
view
.
on
"comment:add"
,
@
addComment
view
.
on
"comment:endorse"
,
@
endorseThread
view
.
render
()
@
$el
.
find
(
".responses"
).
append
(
view
.
el
)
renderResponse
:
(
response
)
=>
response
.
set
(
'thread'
,
@
model
)
view
=
new
ThreadResponseView
(
model
:
response
)
view
.
on
"comment:add"
,
@
addComment
view
.
on
"comment:endorse"
,
@
endorseThread
view
.
render
()
@
$el
.
find
(
".responses"
).
append
(
view
.
el
)
addComment
:
=>
@
model
.
comment
()
addComment
:
=>
@
model
.
comment
()
endorseThread
:
(
endorsed
)
=>
is_endorsed
=
@
$el
.
find
(
".is-endorsed"
).
length
@
model
.
set
'endorsed'
,
is_endorsed
endorseThread
:
(
endorsed
)
=>
is_endorsed
=
@
$el
.
find
(
".is-endorsed"
).
length
@
model
.
set
'endorsed'
,
is_endorsed
submitComment
:
(
event
)
->
event
.
preventDefault
()
url
=
@
model
.
urlFor
(
'reply'
)
body
=
@
getWmdContent
(
"reply-body"
)
return
if
not
body
.
trim
().
length
@
setWmdContent
(
"reply-body"
,
""
)
comment
=
new
Comment
(
body
:
body
,
created_at
:
(
new
Date
()).
toISOString
(),
username
:
window
.
user
.
get
(
"username"
),
votes
:
{
up_count
:
0
},
endorsed
:
false
,
user_id
:
window
.
user
.
get
(
"id"
))
comment
.
set
(
'thread'
,
@
model
.
get
(
'thread'
))
@
renderResponse
(
comment
)
@
model
.
addComment
()
submitComment
:
(
event
)
->
event
.
preventDefault
()
url
=
@
model
.
urlFor
(
'reply'
)
body
=
@
getWmdContent
(
"reply-body"
)
return
if
not
body
.
trim
().
length
@
setWmdContent
(
"reply-body"
,
""
)
comment
=
new
Comment
(
body
:
body
,
created_at
:
(
new
Date
()).
toISOString
(),
username
:
window
.
user
.
get
(
"username"
),
votes
:
{
up_count
:
0
},
endorsed
:
false
,
user_id
:
window
.
user
.
get
(
"id"
))
comment
.
set
(
'thread'
,
@
model
.
get
(
'thread'
))
@
renderResponse
(
comment
)
@
model
.
addComment
()
DiscussionUtil
.
safeAjax
$elem
:
$
(
event
.
target
)
url
:
url
type
:
"POST"
dataType
:
'json'
data
:
body
:
body
success
:
(
data
,
textStatus
)
=>
comment
.
updateInfo
(
data
.
annotated_content_info
)
comment
.
set
(
data
.
content
)
DiscussionUtil
.
safeAjax
$elem
:
$
(
event
.
target
)
url
:
url
type
:
"POST"
dataType
:
'json'
data
:
body
:
body
success
:
(
data
,
textStatus
)
=>
comment
.
updateInfo
(
data
.
annotated_content_info
)
comment
.
set
(
data
.
content
)
edit
:
->
edit
:
->
delete
:
(
event
)
->
url
=
@
model
.
urlFor
(
'delete'
)
if
not
@
model
.
can
(
'can_delete'
)
return
if
not
confirm
"Are you sure to delete thread
\"
#{
@
model
.
get
(
'title'
)
}
\"
?"
return
@
model
.
remove
()
@
$el
.
empty
()
$elem
=
$
(
event
.
target
)
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
delete
:
(
event
)
->
url
=
@
model
.
urlFor
(
'delete'
)
if
not
@
model
.
can
(
'can_delete'
)
return
if
not
confirm
"Are you sure to delete thread
\"
#{
@
model
.
get
(
'title'
)
}
\"
?"
return
@
model
.
remove
()
@
$el
.
empty
()
$elem
=
$
(
event
.
target
)
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
lms/static/coffee/src/discussion/views/new_post_inline_vew.coffee
View file @
5e091354
class
@
NewPostInlineView
extends
Backbone
.
View
initialize
:
()
->
@
topicId
=
@
$
(
".topic"
).
first
().
data
(
"discussion-id"
)
@
maxNameWidth
=
100
DiscussionUtil
.
makeWmdEditor
@
$el
,
$
.
proxy
(
@
$
,
@
),
"new-post-body"
@
$
(
".new-post-tags"
).
tagsInput
DiscussionUtil
.
tagsInputOptions
()
events
:
"submit .new-post-form"
:
"createPost"
# Because we want the behavior that when the body is clicked the menu is
# closed, we need to ignore clicks in the search field and stop propagation.
# Without this, clicking the search field would also close the menu.
ignoreClick
:
(
event
)
->
event
.
stopPropagation
()
createPost
:
(
event
)
->
event
.
preventDefault
()
title
=
@
$
(
".new-post-title"
).
val
()
body
=
@
$
(
".new-post-body"
).
find
(
".wmd-input"
).
val
()
tags
=
@
$
(
".new-post-tags"
).
val
()
anonymous
=
false
||
@
$
(
"input.discussion-anonymous"
).
is
(
":checked"
)
follow
=
false
||
@
$
(
"input.discussion-follow"
).
is
(
":checked"
)
url
=
DiscussionUtil
.
urlFor
(
'create_thread'
,
@
topicId
)
DiscussionUtil
.
safeAjax
$elem
:
$
(
event
.
target
)
$loading
:
$
(
event
.
target
)
if
event
url
:
url
type
:
"POST"
dataType
:
'json'
async
:
false
# TODO when the rest of the stuff below is made to work properly..
data
:
title
:
title
body
:
body
tags
:
tags
anonymous
:
anonymous
auto_subscribe
:
follow
error
:
DiscussionUtil
.
formErrorHandler
(
@
$
(
".new-post-form-errors"
))
success
:
(
response
,
textStatus
)
=>
# TODO: Move this out of the callback, this makes it feel sluggish
thread
=
new
Thread
response
[
'content'
]
DiscussionUtil
.
clearFormErrors
(
@
$
(
".new-post-form-errors"
))
@
$el
.
hide
()
@
$
(
".new-post-title"
).
val
(
""
).
attr
(
"prev-text"
,
""
)
@
$
(
".new-post-body textarea"
).
val
(
""
).
attr
(
"prev-text"
,
""
)
@
$
(
".new-post-tags"
).
val
(
""
)
@
$
(
".new-post-tags"
).
importTags
(
""
)
@
collection
.
add
thread
if
Backbone
?
class
@
NewPostInlineView
extends
Backbone
.
View
initialize
:
()
->
@
topicId
=
@
$
(
".topic"
).
first
().
data
(
"discussion-id"
)
@
maxNameWidth
=
100
DiscussionUtil
.
makeWmdEditor
@
$el
,
$
.
proxy
(
@
$
,
@
),
"new-post-body"
@
$
(
".new-post-tags"
).
tagsInput
DiscussionUtil
.
tagsInputOptions
()
events
:
"submit .new-post-form"
:
"createPost"
# Because we want the behavior that when the body is clicked the menu is
# closed, we need to ignore clicks in the search field and stop propagation.
# Without this, clicking the search field would also close the menu.
ignoreClick
:
(
event
)
->
event
.
stopPropagation
()
createPost
:
(
event
)
->
event
.
preventDefault
()
title
=
@
$
(
".new-post-title"
).
val
()
body
=
@
$
(
".new-post-body"
).
find
(
".wmd-input"
).
val
()
tags
=
@
$
(
".new-post-tags"
).
val
()
anonymous
=
false
||
@
$
(
"input.discussion-anonymous"
).
is
(
":checked"
)
follow
=
false
||
@
$
(
"input.discussion-follow"
).
is
(
":checked"
)
url
=
DiscussionUtil
.
urlFor
(
'create_thread'
,
@
topicId
)
DiscussionUtil
.
safeAjax
$elem
:
$
(
event
.
target
)
$loading
:
$
(
event
.
target
)
if
event
url
:
url
type
:
"POST"
dataType
:
'json'
async
:
false
# TODO when the rest of the stuff below is made to work properly..
data
:
title
:
title
body
:
body
tags
:
tags
anonymous
:
anonymous
auto_subscribe
:
follow
error
:
DiscussionUtil
.
formErrorHandler
(
@
$
(
".new-post-form-errors"
))
success
:
(
response
,
textStatus
)
=>
# TODO: Move this out of the callback, this makes it feel sluggish
thread
=
new
Thread
response
[
'content'
]
DiscussionUtil
.
clearFormErrors
(
@
$
(
".new-post-form-errors"
))
@
$el
.
hide
()
@
$
(
".new-post-title"
).
val
(
""
).
attr
(
"prev-text"
,
""
)
@
$
(
".new-post-body textarea"
).
val
(
""
).
attr
(
"prev-text"
,
""
)
@
$
(
".new-post-tags"
).
val
(
""
)
@
$
(
".new-post-tags"
).
importTags
(
""
)
@
collection
.
add
thread
lms/static/coffee/src/discussion/views/new_post_view.coffee
View file @
5e091354
This diff is collapsed.
Click to expand it.
lms/static/coffee/src/discussion/views/response_comment_view.coffee
View file @
5e091354
class
@
ResponseCommentView
extends
DiscussionContentView
tagName
:
"li"
template
:
_
.
template
(
$
(
"#response-comment-template"
).
html
())
initLocal
:
->
# TODO .response-local is the parent of the comments so @$local is null, not sure what was intended here...
@
$local
=
@
$el
.
find
(
".response-local"
)
@
$delegateElement
=
@
$local
if
Backbone
?
class
@
ResponseCommentView
extends
DiscussionContentView
tagName
:
"li"
template
:
_
.
template
(
$
(
"#response-comment-template"
).
html
())
initLocal
:
->
# TODO .response-local is the parent of the comments so @$local is null, not sure what was intended here...
@
$local
=
@
$el
.
find
(
".response-local"
)
@
$delegateElement
=
@
$local
render
:
->
@
$el
.
html
(
@
template
(
@
model
.
toJSON
()))
@
initLocal
()
@
delegateEvents
()
@
renderAttrs
()
@
$el
.
find
(
".timeago"
).
timeago
()
@
convertMath
()
@
convertMath
:
->
body
=
@
$el
.
find
(
".response-body"
)
body
.
html
DiscussionUtil
.
postMathJaxProcessor
DiscussionUtil
.
markdownWithHighlight
body
.
html
()
# This removes paragraphs so that comments are more compact
body
.
children
(
"p"
).
each
(
index
,
elem
)
->
$
(
elem
).
replaceWith
(
$
(
elem
).
html
())
MathJax
.
Hub
.
Queue
[
"Typeset"
,
MathJax
.
Hub
,
body
[
0
]]
render
:
->
@
$el
.
html
(
@
template
(
@
model
.
toJSON
()))
@
initLocal
()
@
delegateEvents
()
@
renderAttrs
()
@
$el
.
find
(
".timeago"
).
timeago
()
@
convertMath
()
@
convertMath
:
->
body
=
@
$el
.
find
(
".response-body"
)
body
.
html
DiscussionUtil
.
postMathJaxProcessor
DiscussionUtil
.
markdownWithHighlight
body
.
html
()
# This removes paragraphs so that comments are more compact
body
.
children
(
"p"
).
each
(
index
,
elem
)
->
$
(
elem
).
replaceWith
(
$
(
elem
).
html
())
MathJax
.
Hub
.
Queue
[
"Typeset"
,
MathJax
.
Hub
,
body
[
0
]]
lms/static/coffee/src/discussion/views/thread_response_view.coffee
View file @
5e091354
class
@
ThreadResponseView
extends
DiscussionContentView
tagName
:
"li"
template
:
_
.
template
(
$
(
"#thread-response-template"
).
html
())
if
Backbone
?
class
@
ThreadResponseView
extends
DiscussionContentView
tagName
:
"li"
template
:
_
.
template
(
$
(
"#thread-response-template"
).
html
())
events
:
"click .vote-btn"
:
"toggleVote"
"submit .comment-form"
:
"submitComment"
"click .action-endorse"
:
"toggleEndorse"
"click .action-delete"
:
"delete"
events
:
"click .vote-btn"
:
"toggleVote"
"submit .comment-form"
:
"submitComment"
"click .action-endorse"
:
"toggleEndorse"
"click .action-delete"
:
"delete"
render
:
->
@
$el
.
html
(
@
template
(
@
model
.
toJSON
()))
@
initLocal
()
@
delegateEvents
()
if
window
.
user
.
voted
(
@
model
)
@
$
(
".vote-btn"
).
addClass
(
"is-cast"
)
@
renderAttrs
()
@
$el
.
find
(
".posted-details"
).
timeago
()
@
convertMath
()
@
renderComments
()
@
render
:
->
@
$el
.
html
(
@
template
(
@
model
.
toJSON
()))
@
initLocal
()
@
delegateEvents
()
if
window
.
user
.
voted
(
@
model
)
@
$
(
".vote-btn"
).
addClass
(
"is-cast"
)
@
renderAttrs
()
@
$el
.
find
(
".posted-details"
).
timeago
()
@
convertMath
()
@
renderComments
()
@
convertMath
:
->
element
=
@
$
(
".response-body"
)
element
.
html
DiscussionUtil
.
postMathJaxProcessor
DiscussionUtil
.
markdownWithHighlight
element
.
html
()
MathJax
.
Hub
.
Queue
[
"Typeset"
,
MathJax
.
Hub
,
element
[
0
]]
convertMath
:
->
element
=
@
$
(
".response-body"
)
element
.
html
DiscussionUtil
.
postMathJaxProcessor
DiscussionUtil
.
markdownWithHighlight
element
.
html
()
MathJax
.
Hub
.
Queue
[
"Typeset"
,
MathJax
.
Hub
,
element
[
0
]]
renderComments
:
->
@
model
.
get
(
"comments"
).
each
@
renderComment
renderComments
:
->
@
model
.
get
(
"comments"
).
each
@
renderComment
renderComment
:
(
comment
)
=>
comment
.
set
(
'thread'
,
@
model
.
get
(
'thread'
))
view
=
new
ResponseCommentView
(
model
:
comment
)
view
.
render
()
@
$el
.
find
(
".comments li:last"
).
before
(
view
.
el
)
renderComment
:
(
comment
)
=>
comment
.
set
(
'thread'
,
@
model
.
get
(
'thread'
))
view
=
new
ResponseCommentView
(
model
:
comment
)
view
.
render
()
@
$el
.
find
(
".comments li:last"
).
before
(
view
.
el
)
toggleVote
:
(
event
)
->
event
.
preventDefault
()
@
$
(
".vote-btn"
).
toggleClass
(
"is-cast"
)
if
@
$
(
".vote-btn"
).
hasClass
(
"is-cast"
)
@
vote
()
else
@
unvote
()
toggleVote
:
(
event
)
->
event
.
preventDefault
()
@
$
(
".vote-btn"
).
toggleClass
(
"is-cast"
)
if
@
$
(
".vote-btn"
).
hasClass
(
"is-cast"
)
@
vote
()
else
@
unvote
()
vote
:
->
url
=
@
model
.
urlFor
(
"upvote"
)
@
$
(
".votes-count-number"
).
html
(
parseInt
(
@
$
(
".votes-count-number"
).
html
())
+
1
)
DiscussionUtil
.
safeAjax
$elem
:
@
$
(
".discussion-vote"
)
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
if
textStatus
==
'success'
@
model
.
set
(
response
)
vote
:
->
url
=
@
model
.
urlFor
(
"upvote"
)
@
$
(
".votes-count-number"
).
html
(
parseInt
(
@
$
(
".votes-count-number"
).
html
())
+
1
)
DiscussionUtil
.
safeAjax
$elem
:
@
$
(
".discussion-vote"
)
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
if
textStatus
==
'success'
@
model
.
set
(
response
)
unvote
:
->
url
=
@
model
.
urlFor
(
"unvote"
)
@
$
(
".votes-count-number"
).
html
(
parseInt
(
@
$
(
".votes-count-number"
).
html
())
-
1
)
DiscussionUtil
.
safeAjax
$elem
:
@
$
(
".discussion-vote"
)
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
if
textStatus
==
'success'
@
model
.
set
(
response
)
unvote
:
->
url
=
@
model
.
urlFor
(
"unvote"
)
@
$
(
".votes-count-number"
).
html
(
parseInt
(
@
$
(
".votes-count-number"
).
html
())
-
1
)
DiscussionUtil
.
safeAjax
$elem
:
@
$
(
".discussion-vote"
)
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
if
textStatus
==
'success'
@
model
.
set
(
response
)
submitComment
:
(
event
)
->
event
.
preventDefault
()
url
=
@
model
.
urlFor
(
'reply'
)
body
=
@
$
(
".comment-form-input"
).
val
()
if
not
body
.
trim
().
length
return
comment
=
new
Comment
(
body
:
body
,
created_at
:
(
new
Date
()).
toISOString
(),
username
:
window
.
user
.
get
(
"username"
),
user_id
:
window
.
user
.
get
(
"id"
))
@
renderComment
(
comment
)
@
trigger
"comment:add"
,
comment
@
$
(
".comment-form-input"
).
val
(
""
)
submitComment
:
(
event
)
->
event
.
preventDefault
()
url
=
@
model
.
urlFor
(
'reply'
)
body
=
@
$
(
".comment-form-input"
).
val
()
if
not
body
.
trim
().
length
return
comment
=
new
Comment
(
body
:
body
,
created_at
:
(
new
Date
()).
toISOString
(),
username
:
window
.
user
.
get
(
"username"
),
user_id
:
window
.
user
.
get
(
"id"
))
@
renderComment
(
comment
)
@
trigger
"comment:add"
,
comment
@
$
(
".comment-form-input"
).
val
(
""
)
DiscussionUtil
.
safeAjax
$elem
:
$
(
event
.
target
)
url
:
url
type
:
"POST"
dataType
:
'json'
data
:
body
:
body
DiscussionUtil
.
safeAjax
$elem
:
$
(
event
.
target
)
url
:
url
type
:
"POST"
dataType
:
'json'
data
:
body
:
body
delete
:
(
event
)
->
event
.
preventDefault
()
if
not
@
model
.
can
(
'can_delete'
)
return
console
.
log
$
(
event
.
target
)
url
=
@
model
.
urlFor
(
'delete'
)
if
not
confirm
"Are you sure to delete this response? "
return
@
model
.
remove
()
@
$el
.
remove
()
$elem
=
$
(
event
.
target
)
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
delete
:
(
event
)
->
event
.
preventDefault
()
if
not
@
model
.
can
(
'can_delete'
)
return
console
.
log
$
(
event
.
target
)
url
=
@
model
.
urlFor
(
'delete'
)
if
not
confirm
"Are you sure to delete this response? "
return
@
model
.
remove
()
@
$el
.
remove
()
$elem
=
$
(
event
.
target
)
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
type
:
"POST"
success
:
(
response
,
textStatus
)
=>
toggleEndorse
:
(
event
)
->
event
.
preventDefault
()
if
not
@
model
.
can
(
'can_endorse'
)
return
$elem
=
$
(
event
.
target
)
url
=
@
model
.
urlFor
(
'endorse'
)
endorsed
=
@
model
.
get
(
'endorsed'
)
data
=
{
endorsed
:
not
endorsed
}
@
model
.
set
(
'endorsed'
,
not
endorsed
)
@
trigger
"comment:endorse"
,
not
endorsed
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
data
:
data
type
:
"POST"
toggleEndorse
:
(
event
)
->
event
.
preventDefault
()
if
not
@
model
.
can
(
'can_endorse'
)
return
$elem
=
$
(
event
.
target
)
url
=
@
model
.
urlFor
(
'endorse'
)
endorsed
=
@
model
.
get
(
'endorsed'
)
data
=
{
endorsed
:
not
endorsed
}
@
model
.
set
(
'endorsed'
,
not
endorsed
)
@
trigger
"comment:endorse"
,
not
endorsed
DiscussionUtil
.
safeAjax
$elem
:
$elem
url
:
url
data
:
data
type
:
"POST"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment