From 23e98f5d31c08cdf13e58333ddaf41e9fc203aad Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Mon, 11 May 2015 09:20:42 -0700 Subject: [PATCH] Allow new item description files to be created --- Gruntfile.coffee | 4 +- src/coffee/controllers/base_controller.coffee | 44 ++++++++++++------- .../controllers/feedback_controller.coffee | 1 + .../controllers/item_page_controller.coffee | 8 +++- .../markdown_section_controller.coffee | 39 ++++++++++------ src/jade/templates/markdown_section.jade | 2 + src/scss/templates/markdown_section.scss | 11 +++++ 7 files changed, 75 insertions(+), 34 deletions(-) diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 2725faa11..4be0962df 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -133,7 +133,7 @@ module.exports = (grunt)-> tasks: ['browserify:dev', 'exorcise'] jade: files: ['./src/**/*.jade'] - tasks: ['jade:pages', 'jade:templates', 'browserify:dev', 'exorcise'] + tasks: ['jade:pages', 'jade:templates'] sass: files: ['./src/**/*.scss'] tasks: ['sass', 'copy:styles'] @@ -156,7 +156,7 @@ module.exports = (grunt)-> 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'] diff --git a/src/coffee/controllers/base_controller.coffee b/src/coffee/controllers/base_controller.coffee index 0dbf0198e..54876e7c0 100644 --- a/src/coffee/controllers/base_controller.coffee +++ b/src/coffee/controllers/base_controller.coffee @@ -49,14 +49,17 @@ module.exports = class BaseController extends backbone.View if not ($el.hasClass('hiding') or $el.hasClass('hidden')) 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' @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: -> logger.verbose => "#{this} refreshing" @@ -86,20 +89,27 @@ module.exports = class BaseController extends backbone.View show: ($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}\"" - - @_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' - _.defer => - $el.removeClass 'hiding' - @trigger Event.animate.show.start, this, $el + $el.addClass 'hiding' + @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: -> @undelegateEvents() diff --git a/src/coffee/controllers/feedback_controller.coffee b/src/coffee/controllers/feedback_controller.coffee index 2f3430755..5eaef9ab3 100644 --- a/src/coffee/controllers/feedback_controller.coffee +++ b/src/coffee/controllers/feedback_controller.coffee @@ -9,6 +9,7 @@ $ = require 'jquery' BaseController = require './base_controller' EmailClient = require '../models/email_client' _ = require 'underscore' +w = require 'when' {Duration} = require '../constants' {Key} = require '../constants' diff --git a/src/coffee/controllers/item_page_controller.coffee b/src/coffee/controllers/item_page_controller.coffee index f161be91d..d45a43b5b 100644 --- a/src/coffee/controllers/item_page_controller.coffee +++ b/src/coffee/controllers/item_page_controller.coffee @@ -148,7 +148,11 @@ module.exports = class ItemPageController extends PageController @client.fetchFile path:GitHub.file.itemDescription modSlug:@_itemSlug.mod, itemSlug:@_itemSlug.item .then (response)=> @_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 _endEditingDescription: -> @@ -180,6 +184,8 @@ module.exports = class ItemPageController extends PageController if @model.item?.description?.length > 0 @_descriptionController.model = @model.item.description @show @$descriptionSection + else if @user? + @show @$descriptionSection else @hide @$descriptionSection diff --git a/src/coffee/controllers/markdown_section_controller.coffee b/src/coffee/controllers/markdown_section_controller.coffee index 570b24959..166d8f20b 100644 --- a/src/coffee/controllers/markdown_section_controller.coffee +++ b/src/coffee/controllers/markdown_section_controller.coffee @@ -19,19 +19,22 @@ module.exports = class MarkdownSectionController extends BaseController @State = State = appologizing: 'applogizing' confirming: 'confirming' + creating: 'creating' editing: 'editing' previewing: 'previewing' viewing: 'viewing' waiting: 'waiting' constructor: (options={})-> - @_state = State.waiting - if not options.modPack? then throw new Error 'options.modPack is required' - options.model ?= null - options.templateName = 'markdown_section' + options.model ?= null + options.templateName = 'markdown_section' + @_state = State.waiting super options + @on Event.animate.hide.finish, => @_updateStateVisibility() + @on Event.animate.show.finish, => @_updateStateVisibility() + @confirmactionMessage = options.confirmationMessage @confirmDuration = options.confirmationDuration ?= 5000 @imageBase = options.imageBase ?= '' @@ -52,13 +55,13 @@ module.exports = class MarkdownSectionController extends BaseController onCancelClicked: (event)-> event.preventDefault() @model = @_originalModel - @state = State.viewing + @_resetToDefaultState() onEditClicked: (event)-> event.preventDefault() return unless @editable - @_originalModel = "#{@model}" + @_originalModel = @model @state = State.waiting @_beginEditing() .then => @@ -66,7 +69,7 @@ module.exports = class MarkdownSectionController extends BaseController .catch (e)=> logger.warning "cannot begin editing: #{e.stack}" @state = State.appologizing - w(true).delay(@confirmDuration).then => @state = State.viewing + w(true).delay(@confirmDuration).then => @_resetToDefaultState() onPreviewClicked: (event)-> event.preventDefault() @@ -124,6 +127,8 @@ module.exports = class MarkdownSectionController extends BaseController @$textarea = @$('textarea') @$title = @$('h2') + @_resetToDefaultState() + super refresh: -> @@ -131,17 +136,10 @@ module.exports = class MarkdownSectionController extends BaseController @_updateSizer() @_updatePreview() - @_updateStateVisibility() super onWillChangeModel: (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 return result @@ -190,6 +188,16 @@ module.exports = class MarkdownSectionController extends BaseController @$markdownPanel.html text + _resetToDefaultState: -> + if @model? + @state = State.viewing + else + if @editable? + @state = State.creating + else + @state = State.waiting + + _updateStateVisibility: -> return if @_lastUpdatedState is @state @_lastUpdatedState = @state @@ -199,6 +207,7 @@ module.exports = class MarkdownSectionController extends BaseController buttonPanel: @$('.buttons') cancelButton: @$('button.cancel') confirmingPanel: @$('.confirming') + creatingPanel: @$('.creating') editButton: @$('button.edit') editorPanel: @$('.editor') errorPanel: @$('.error') @@ -215,6 +224,8 @@ module.exports = class MarkdownSectionController extends BaseController visible = appologizingPanel:true else if @state is State.confirming visible = confirmingPanel:true + else if @state is State.creating + visible = buttonPanel:true, creatingPanel:true, editButton:true else if @state is State.editing visible = buttonPanel:true, cancelButton:true, editorPanel:true, previewButton:true, saveButton:true else if @state is State.previewing diff --git a/src/jade/templates/markdown_section.jade b/src/jade/templates/markdown_section.jade index 44e83fb57..b06fe439f 100644 --- a/src/jade/templates/markdown_section.jade +++ b/src/jade/templates/markdown_section.jade @@ -13,6 +13,8 @@ .editor.hideable.hidden textarea .sizer + .creating.hideable.hidden + p Please help by adding a description! .buttons.hideable.hidden .error.hideable.hidden: p button.return.hideable.hidden return diff --git a/src/scss/templates/markdown_section.scss b/src/scss/templates/markdown_section.scss index 33ad6d612..9fbdfcd91 100644 --- a/src/scss/templates/markdown_section.scss +++ b/src/scss/templates/markdown_section.scss @@ -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 { width: 100%;