Allow new item description files to be created

This commit is contained in:
Andrew Miner
2015-05-11 09:20:42 -07:00
parent 8eb5cef71b
commit 23e98f5d31
7 changed files with 75 additions and 34 deletions
+2 -2
View File
@@ -133,7 +133,7 @@ module.exports = (grunt)->
tasks: ['browserify:dev', 'exorcise'] tasks: ['browserify:dev', 'exorcise']
jade: jade:
files: ['./src/**/*.jade'] files: ['./src/**/*.jade']
tasks: ['jade:pages', 'jade:templates', 'browserify:dev', 'exorcise'] tasks: ['jade:pages', 'jade:templates']
sass: sass:
files: ['./src/**/*.scss'] files: ['./src/**/*.scss']
tasks: ['sass', 'copy:styles'] tasks: ['sass', 'copy:styles']
@@ -156,7 +156,7 @@ module.exports = (grunt)->
grunt.registerTask 'test', ['mochaTest'] grunt.registerTask 'test', ['mochaTest']
grunt.registerTask 'watch-dev', ['clean', 'build', 'watch:static', 'watch:coffee', 'watch:jade', 'watch:sass'] grunt.registerTask 'watch-dev', ['clean', 'build', 'watch']
grunt.registerTask 'watch-test', ['clean', 'build', 'watch:test'] grunt.registerTask 'watch-test', ['clean', 'build', 'watch:test']
+27 -17
View File
@@ -49,14 +49,17 @@ module.exports = class BaseController extends backbone.View
if not ($el.hasClass('hiding') or $el.hasClass('hidden')) if not ($el.hasClass('hiding') or $el.hasClass('hidden'))
logger.verbose => "#{this} is hiding \"#{$el.selector}\"" logger.verbose => "#{this} is hiding \"#{$el.selector}\""
@_onAnimationComplete $el, Duration.normal, =>
$el.addClass 'hidden'
$el.removeClass 'hiding'
logger.verbose => "#{this} is finished hiding #{$el.selector}"
@trigger Event.animate.hide.finish, this, $el
$el.addClass 'hiding' $el.addClass 'hiding'
@trigger Event.animate.hide.start, this, $el @trigger Event.animate.hide.start, this, $el
@_onAnimationComplete $el, Duration.normal, => @hide $el
return
if $el.hasClass('hiding') and not $el.hasClass('hidden')
$el.removeClass 'hiding'
$el.addClass 'hidden'
logger.verbose => "#{this} is finished hiding #{$el.selector}"
@trigger Event.animate.hide.finish, this, $el
refresh: -> refresh: ->
logger.verbose => "#{this} refreshing" logger.verbose => "#{this} refreshing"
@@ -86,20 +89,27 @@ module.exports = class BaseController extends backbone.View
show: ($el)-> show: ($el)->
$el ?= @$el $el ?= @$el
$el.addClass 'hideable'
if $el.hasClass('hidden') or $el.hasClass('hiding') if not $el.hasClass 'hideable'
$el.addClass 'hideable'
_.defer => @show $el
return
if $el.hasClass 'hidden'
logger.verbose => "#{this} is showing \"#{$el.selector}\"" logger.verbose => "#{this} is showing \"#{$el.selector}\""
@_onAnimationComplete $el, Duration.normal, =>
logger.verbose => "#{this} is finished showing #{$el.selector}"
@trigger Event.animate.show.finish, this, $el
$el.addClass 'hiding'
$el.removeClass 'hidden' $el.removeClass 'hidden'
_.defer => $el.addClass 'hiding'
$el.removeClass 'hiding' @trigger Event.animate.show.start, this, $el
@trigger Event.animate.show.start, this, $el _.defer => @show $el
return
if $el.hasClass 'hiding'
$el.removeClass 'hiding'
@_onAnimationComplete $el, Duration.normal, => @show $el
return
logger.verbose => "#{this} is finished showing #{$el.selector}"
@trigger Event.animate.show.finish, this, $el
unrender: -> unrender: ->
@undelegateEvents() @undelegateEvents()
@@ -9,6 +9,7 @@ $ = require 'jquery'
BaseController = require './base_controller' BaseController = require './base_controller'
EmailClient = require '../models/email_client' EmailClient = require '../models/email_client'
_ = require 'underscore' _ = require 'underscore'
w = require 'when'
{Duration} = require '../constants' {Duration} = require '../constants'
{Key} = require '../constants' {Key} = require '../constants'
@@ -148,7 +148,11 @@ module.exports = class ItemPageController extends PageController
@client.fetchFile path:GitHub.file.itemDescription modSlug:@_itemSlug.mod, itemSlug:@_itemSlug.item @client.fetchFile path:GitHub.file.itemDescription modSlug:@_itemSlug.mod, itemSlug:@_itemSlug.item
.then (response)=> .then (response)=>
@_editingFile = response.json.data @_editingFile = response.json.data
@model.item.parse @_editingFile.content if @_editingFile.content.length > 0
@model.item.parse @_editingFile.content
else
@model.item.description = ''
@_descriptionController.model = @model.item.description @_descriptionController.model = @model.item.description
_endEditingDescription: -> _endEditingDescription: ->
@@ -180,6 +184,8 @@ module.exports = class ItemPageController extends PageController
if @model.item?.description?.length > 0 if @model.item?.description?.length > 0
@_descriptionController.model = @model.item.description @_descriptionController.model = @model.item.description
@show @$descriptionSection @show @$descriptionSection
else if @user?
@show @$descriptionSection
else else
@hide @$descriptionSection @hide @$descriptionSection
@@ -19,19 +19,22 @@ module.exports = class MarkdownSectionController extends BaseController
@State = State = @State = State =
appologizing: 'applogizing' appologizing: 'applogizing'
confirming: 'confirming' confirming: 'confirming'
creating: 'creating'
editing: 'editing' editing: 'editing'
previewing: 'previewing' previewing: 'previewing'
viewing: 'viewing' viewing: 'viewing'
waiting: 'waiting' waiting: 'waiting'
constructor: (options={})-> constructor: (options={})->
@_state = State.waiting
if not options.modPack? then throw new Error 'options.modPack is required' if not options.modPack? then throw new Error 'options.modPack is required'
options.model ?= null options.model ?= null
options.templateName = 'markdown_section' options.templateName = 'markdown_section'
@_state = State.waiting
super options super options
@on Event.animate.hide.finish, => @_updateStateVisibility()
@on Event.animate.show.finish, => @_updateStateVisibility()
@confirmactionMessage = options.confirmationMessage @confirmactionMessage = options.confirmationMessage
@confirmDuration = options.confirmationDuration ?= 5000 @confirmDuration = options.confirmationDuration ?= 5000
@imageBase = options.imageBase ?= '' @imageBase = options.imageBase ?= ''
@@ -52,13 +55,13 @@ module.exports = class MarkdownSectionController extends BaseController
onCancelClicked: (event)-> onCancelClicked: (event)->
event.preventDefault() event.preventDefault()
@model = @_originalModel @model = @_originalModel
@state = State.viewing @_resetToDefaultState()
onEditClicked: (event)-> onEditClicked: (event)->
event.preventDefault() event.preventDefault()
return unless @editable return unless @editable
@_originalModel = "#{@model}" @_originalModel = @model
@state = State.waiting @state = State.waiting
@_beginEditing() @_beginEditing()
.then => .then =>
@@ -66,7 +69,7 @@ module.exports = class MarkdownSectionController extends BaseController
.catch (e)=> .catch (e)=>
logger.warning "cannot begin editing: #{e.stack}" logger.warning "cannot begin editing: #{e.stack}"
@state = State.appologizing @state = State.appologizing
w(true).delay(@confirmDuration).then => @state = State.viewing w(true).delay(@confirmDuration).then => @_resetToDefaultState()
onPreviewClicked: (event)-> onPreviewClicked: (event)->
event.preventDefault() event.preventDefault()
@@ -124,6 +127,8 @@ module.exports = class MarkdownSectionController extends BaseController
@$textarea = @$('textarea') @$textarea = @$('textarea')
@$title = @$('h2') @$title = @$('h2')
@_resetToDefaultState()
super super
refresh: -> refresh: ->
@@ -131,17 +136,10 @@ module.exports = class MarkdownSectionController extends BaseController
@_updateSizer() @_updateSizer()
@_updatePreview() @_updatePreview()
@_updateStateVisibility()
super super
onWillChangeModel: (oldModel, newModel)-> onWillChangeModel: (oldModel, newModel)->
result = super oldModel, newModel result = super oldModel, newModel
if @state is State.waiting and newModel?
@state = State.viewing
else if not newModel?
@state = State.waiting
@$textarea.val newModel @$textarea.val newModel
return result return result
@@ -190,6 +188,16 @@ module.exports = class MarkdownSectionController extends BaseController
@$markdownPanel.html text @$markdownPanel.html text
_resetToDefaultState: ->
if @model?
@state = State.viewing
else
if @editable?
@state = State.creating
else
@state = State.waiting
_updateStateVisibility: -> _updateStateVisibility: ->
return if @_lastUpdatedState is @state return if @_lastUpdatedState is @state
@_lastUpdatedState = @state @_lastUpdatedState = @state
@@ -199,6 +207,7 @@ module.exports = class MarkdownSectionController extends BaseController
buttonPanel: @$('.buttons') buttonPanel: @$('.buttons')
cancelButton: @$('button.cancel') cancelButton: @$('button.cancel')
confirmingPanel: @$('.confirming') confirmingPanel: @$('.confirming')
creatingPanel: @$('.creating')
editButton: @$('button.edit') editButton: @$('button.edit')
editorPanel: @$('.editor') editorPanel: @$('.editor')
errorPanel: @$('.error') errorPanel: @$('.error')
@@ -215,6 +224,8 @@ module.exports = class MarkdownSectionController extends BaseController
visible = appologizingPanel:true visible = appologizingPanel:true
else if @state is State.confirming else if @state is State.confirming
visible = confirmingPanel:true visible = confirmingPanel:true
else if @state is State.creating
visible = buttonPanel:true, creatingPanel:true, editButton:true
else if @state is State.editing else if @state is State.editing
visible = buttonPanel:true, cancelButton:true, editorPanel:true, previewButton:true, saveButton:true visible = buttonPanel:true, cancelButton:true, editorPanel:true, previewButton:true, saveButton:true
else if @state is State.previewing else if @state is State.previewing
+2
View File
@@ -13,6 +13,8 @@
.editor.hideable.hidden .editor.hideable.hidden
textarea textarea
.sizer .sizer
.creating.hideable.hidden
p Please help by adding a description!
.buttons.hideable.hidden .buttons.hideable.hidden
.error.hideable.hidden: p .error.hideable.hidden: p
button.return.hideable.hidden return button.return.hideable.hidden return
+11
View File
@@ -52,6 +52,17 @@ All rights reserved.
} }
} }
.creating {
width: 100%;
text-align: center;
p {
color: $color-gray-light;
font-size: $font-size-x-large;
margin: 1em;
}
}
.editor { .editor {
width: 100%; width: 100%;