diff --git a/app/styles/achievements.sass b/app/styles/achievements.sass index 122f81e45..4896c5eec 100644 --- a/app/styles/achievements.sass +++ b/app/styles/achievements.sass @@ -218,3 +218,6 @@ h2.achievements-category .table-layout #no-achievements margin-top: 40px + +.achievement-icon-small + height: 18px diff --git a/app/styles/editor/related-achievements.sass b/app/styles/editor/related-achievements.sass new file mode 100644 index 000000000..46314ea65 --- /dev/null +++ b/app/styles/editor/related-achievements.sass @@ -0,0 +1,6 @@ +#related-achievements-view + #new-achievement-button + margin-bottom: 10px + + .icon-column + width: 25px diff --git a/app/templates/editor/related-achievements.jade b/app/templates/editor/related-achievements.jade new file mode 100644 index 000000000..9270c0def --- /dev/null +++ b/app/templates/editor/related-achievements.jade @@ -0,0 +1,26 @@ + +button.btn.btn-primary#new-achievement-button(disabled=me.isAdmin() === true ? undefined : "true" data-i18n="editor.new_achievement_title") Create a New Achievement + +if achievements.loading + h2 Loading... +else if ! achievements.models.length + .panel + .panel-body + p No achievements added for this level yet. +else + table.table.table-hover + thead + tr + th + th Name + th Description + th XP + tbody + each achievement in achievements.models + tr + td(style="width: 20px") + img.achievement-icon-small(src=achievement.getImageURL() alt="#{achievement.get('name') icon") + td + a(href="/editor/achievement/#{achievement.get('slug')}")= achievement.get('name') + td= achievement.get('description') + td= achievement.get('worth') diff --git a/app/templates/editor/related_achievements.jade b/app/templates/editor/related_achievements.jade deleted file mode 100644 index 1ab64773e..000000000 --- a/app/templates/editor/related_achievements.jade +++ /dev/null @@ -1,18 +0,0 @@ - -if achievements.loading - h2 Loading... -else if ! achievements.models.length - .panel - .panel-body - p No achievements added for this level yet. -else - table - tr - th Name - th Description - th XP - each achievement in achievements.models - tr - td= achievement.get('name') - td= achievement.get('description') - td= achievement.get('worth') diff --git a/app/views/editor/RelatedAchievementsView.coffee b/app/views/editor/RelatedAchievementsView.coffee index 2f341c843..774b550e7 100644 --- a/app/views/editor/RelatedAchievementsView.coffee +++ b/app/views/editor/RelatedAchievementsView.coffee @@ -1,13 +1,18 @@ CocoView = require 'views/kinds/CocoView' -template = require 'templates/editor/related_achievements' +template = require 'templates/editor/related-achievements' RelatedAchievementsCollection = require 'collections/RelatedAchievementsCollection' Achievement = require 'models/Achievement' +NewModelModal = require 'views/modal/NewModelModal' +app = require 'application' module.exports = class RelatedAchievementsView extends CocoView id: 'related-achievements-view' template: template className: 'tab-pane' + events: + 'click #new-achievement-button': 'makeNewAchievement' + constructor: (options) -> super options @relatedID = options.relatedID @@ -29,3 +34,11 @@ module.exports = class RelatedAchievementsView extends CocoView render: -> console.debug 'rendering achievements' super() + + onNewAchievementSaved: (achievement) -> + app.router.navigate('/editor/achievement/' + (achievement.get('slug') or achievement.id), {trigger: true}) + + makeNewAchievement: -> + modal = new NewModelModal model: Achievement, modelLabel: 'Achievement', properties: related: @relatedID + modal.once 'success', @onNewAchievementSaved + @openModalView modal diff --git a/app/views/kinds/SearchView.coffee b/app/views/kinds/SearchView.coffee index ef79c4ab4..1e41c8ead 100644 --- a/app/views/kinds/SearchView.coffee +++ b/app/views/kinds/SearchView.coffee @@ -78,8 +78,6 @@ module.exports = class SearchView extends RootView @collection = null onNewModelSaved: (@model) -> - # Can only redirect after the modal hidden event has triggered - console.debug 'new model saved' base = document.location.pathname[1..] + '/' app.router.navigate(base + (@model.get('slug') or @model.id), {trigger: true}) diff --git a/app/views/modal/NewModelModal.coffee b/app/views/modal/NewModelModal.coffee index 3114b2608..9e7667207 100644 --- a/app/views/modal/NewModelModal.coffee +++ b/app/views/modal/NewModelModal.coffee @@ -12,11 +12,11 @@ module.exports = class NewModelModal extends ModalView 'submit form': 'makeNewModel' 'shown.bs.modal #new-model-modal': 'focusOnName' - constructor: (options) -> super options @model = options.model @modelLabel = options.modelLabel + @properties = options.properties getRenderData: -> c = super() @@ -31,6 +31,7 @@ module.exports = class NewModelModal extends ModalView model.set('name', name) if @model.schema.properties.permissions model.set 'permissions', [{access: 'owner', target: me.id}] + model.set(key, prop) for key, prop of @properties if @properties? res = model.save() return unless res diff --git a/server/achievements/achievement_handler.coffee b/server/achievements/achievement_handler.coffee index 433df56d6..feed09f20 100644 --- a/server/achievements/achievement_handler.coffee +++ b/server/achievements/achievement_handler.coffee @@ -5,7 +5,7 @@ class AchievementHandler extends Handler modelClass: Achievement # Used to determine which properties requests may edit - editableProperties: ['name', 'query', 'worth', 'collection', 'description', 'userField', 'proportionalTo', 'icon', 'function'] + editableProperties: ['name', 'query', 'worth', 'collection', 'description', 'userField', 'proportionalTo', 'icon', 'function', 'related', 'difficulty', 'category'] jsonSchema = require '../../app/schemas/models/achievement.coffee' hasAccess: (req) ->