190 lines
5.5 KiB
CoffeeScript
190 lines
5.5 KiB
CoffeeScript
window.Discourse.ComposerController = Ember.Controller.extend Discourse.Presence,
|
|
|
|
needs: ['modal', 'topic']
|
|
|
|
hasReply: false
|
|
|
|
togglePreview: ->
|
|
@get('content').togglePreview()
|
|
|
|
# Import a quote from the post
|
|
importQuote: ->
|
|
@get('content').importQuote()
|
|
|
|
appendText: (text) ->
|
|
c = @get('content')
|
|
c.appendText(text) if c
|
|
|
|
save: ->
|
|
composer = @get('content')
|
|
composer.set('disableDrafts', true)
|
|
composer.save(imageSizes: @get('view').imageSizes())
|
|
.then (opts) =>
|
|
opts = opts || {}
|
|
@close()
|
|
|
|
if composer.get('creatingTopic')
|
|
Discourse.set('currentUser.topic_count', Discourse.get('currentUser.topic_count') + 1)
|
|
else
|
|
Discourse.set('currentUser.reply_count', Discourse.get('currentUser.reply_count') + 1)
|
|
|
|
Discourse.routeTo(opts.post.get('url'))
|
|
, (error) =>
|
|
composer.set('disableDrafts', false)
|
|
bootbox.alert error
|
|
|
|
checkReplyLength: ->
|
|
if @present('content.reply')
|
|
@set('hasReply', true)
|
|
else
|
|
@set('hasReply', false)
|
|
|
|
|
|
saveDraft: ->
|
|
model = @get('content')
|
|
model.saveDraft() if model
|
|
|
|
# Open the reply view
|
|
#
|
|
# opts:
|
|
# action - The action we're performing: edit, reply or createTopic
|
|
# post - The post we're replying to, if present
|
|
# topic - The topic we're replying to, if present
|
|
# quote - If we're opening a reply from a quote, the quote we're making
|
|
#
|
|
open: (opts={}) ->
|
|
opts.promise = promise = opts.promise || new RSVP.Promise
|
|
|
|
@set('hasReply', false)
|
|
|
|
unless opts.draftKey
|
|
alert("composer was opened without a draft key")
|
|
throw "composer opened without a proper draft key"
|
|
|
|
# ensure we have a view now, without it transitions are going to be messed
|
|
view = @get('view')
|
|
unless view
|
|
view = Discourse.ComposerView.create
|
|
controller: @
|
|
view.appendTo($('#main'))
|
|
@set('view', view)
|
|
# the next runloop is too soon, need to get the control rendered and then
|
|
# we need to change stuff, otherwise css animations don't kick in
|
|
Em.run.next =>
|
|
Em.run.next =>
|
|
@open(opts)
|
|
return promise
|
|
|
|
composer = @get('content')
|
|
|
|
if composer && opts.draftKey != composer.draftKey && composer.composeState == Discourse.Composer.DRAFT
|
|
@close()
|
|
composer = null
|
|
|
|
if composer && !opts.tested && composer.wouldLoseChanges()
|
|
if composer.composeState == Discourse.Composer.DRAFT && composer.draftKey == opts.draftKey && composer.action == opts.action
|
|
composer.set('composeState', Discourse.Composer.OPEN)
|
|
promise.resolve()
|
|
return promise
|
|
else
|
|
opts.tested = true
|
|
@cancel(( => @open(opts) ),( => promise.reject())) unless opts.ignoreIfChanged
|
|
return promise
|
|
|
|
|
|
# we need a draft sequence, without it drafts are bust
|
|
if opts.draftSequence == undefined
|
|
Discourse.Draft.get(opts.draftKey).then (data)=>
|
|
opts.draftSequence = data.draft_sequence
|
|
opts.draft = data.draft
|
|
@open(opts)
|
|
return promise
|
|
|
|
|
|
if opts.draft
|
|
composer = Discourse.Composer.loadDraft(opts.draftKey, opts.draftSequence, opts.draft)
|
|
composer?.set('topic', opts.topic)
|
|
|
|
composer = composer || Discourse.Composer.open(opts)
|
|
|
|
@set('content', composer)
|
|
@set('view.content', composer)
|
|
promise.resolve()
|
|
return promise
|
|
|
|
wouldLoseChanges: ->
|
|
composer = @get('content')
|
|
composer && composer.wouldLoseChanges()
|
|
|
|
# View a new reply we've made
|
|
viewNewReply: ->
|
|
Discourse.routeTo(@get('createdPost.url'))
|
|
@close()
|
|
false
|
|
|
|
destroyDraft: ->
|
|
key = @get('content.draftKey')
|
|
Discourse.Draft.clear(key, @get('content.draftSequence')) if key
|
|
|
|
cancel: (success, fail) ->
|
|
if @get('content.hasMetaData') || ((@get('content.reply') || "") != (@get('content.originalText') || ""))
|
|
bootbox.confirm Em.String.i18n("post.abandon"), Em.String.i18n("no_value"), Em.String.i18n("yes_value"), (result) =>
|
|
if result
|
|
@destroyDraft()
|
|
@close()
|
|
success() if typeof success == "function"
|
|
else
|
|
fail() if typeof fail == "function"
|
|
else
|
|
# it is possible there is some sort of crazy draft with no body ... just give up on it
|
|
@destroyDraft()
|
|
@close()
|
|
success() if typeof success == "function"
|
|
|
|
return
|
|
|
|
click: ->
|
|
if @get('content.composeState') == Discourse.Composer.DRAFT
|
|
@set('content.composeState', Discourse.Composer.OPEN)
|
|
|
|
shrink: ->
|
|
if @get('content.reply') == @get('content.originalText') then @close() else @collapse()
|
|
|
|
collapse: ->
|
|
@saveDraft()
|
|
@set('content.composeState', Discourse.Composer.DRAFT)
|
|
|
|
close: ->
|
|
@set('content', null)
|
|
@set('view.content', null)
|
|
|
|
closeIfCollapsed: ->
|
|
if @get('content.composeState') == Discourse.Composer.DRAFT
|
|
@close()
|
|
|
|
closeAutocomplete: ->
|
|
$('#wmd-input').autocomplete(cancel: true)
|
|
|
|
# Toggle the reply view
|
|
toggle: ->
|
|
@closeAutocomplete()
|
|
|
|
switch @get('content.composeState')
|
|
when Discourse.Composer.OPEN
|
|
if @blank('content.reply') and @blank('content.title') then @close() else @shrink()
|
|
when Discourse.Composer.DRAFT
|
|
@set('content.composeState', Discourse.Composer.OPEN)
|
|
when Discourse.Composer.SAVING
|
|
@close()
|
|
|
|
false
|
|
|
|
# ESC key hit
|
|
hitEsc: ->
|
|
@shrink() if @get('content.composeState') is Discourse.Composer.OPEN
|
|
|
|
|
|
showOptions: ->
|
|
@get('controllers.modal')?.show(Discourse.ArchetypeOptionsModalView.create(archetype: @get('content.archetype'), metaData: @get('content.metaData')))
|
|
|