mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-02 08:53:38 -04:00
Implements fixes based on code review.
This commit is contained in:
parent
80c2a9e539
commit
c28720c640
8 changed files with 125 additions and 152 deletions
app
styles/editor/level
templates/editor
views/editor/level
|
@ -1,3 +1,3 @@
|
||||||
#artisan-guide-modal
|
#artisan-guide-modal
|
||||||
.centered-stack
|
.centered-stack
|
||||||
text-align: center
|
text-align: center
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
td
|
td
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
.taskCheck
|
.taskCheck
|
||||||
width: 5%
|
width: 5em
|
||||||
|
.editCell
|
||||||
|
width: 5em
|
||||||
.taskCheck *
|
.taskCheck *
|
||||||
text-align: center
|
text-align: center
|
||||||
margin: auto
|
margin: auto
|
||||||
|
@ -12,4 +14,4 @@
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
text-align:center
|
text-align:center
|
||||||
.noArticle
|
.noArticle
|
||||||
color: rgba(160, 0, 0, 1)
|
color: rgba(160, 0, 0, 1)
|
||||||
|
|
|
@ -2,12 +2,16 @@ extends /templates/core/modal-base
|
||||||
|
|
||||||
block modal-header-content
|
block modal-header-content
|
||||||
h3 Artisan Compendium
|
h3 Artisan Compendium
|
||||||
|
|
||||||
block modal-body-content
|
block modal-body-content
|
||||||
|
p
|
||||||
|
|
||||||
p
|
p
|
||||||
| Welcome to the Artisan Compendium. Below you will find a series of helpful guides and tutorials for getting your levels to Master Artisan quality
|
| Welcome to the Artisan Compendium. Below you will find a series of helpful guides and tutorials for getting your levels to Master Artisan quality
|
||||||
if creator == meID
|
if view.creator === view.meID
|
||||||
|, as well as a way to submit your level for official Artisan review
|
|, as well as a way to submit your level for official Artisan review
|
||||||
|! If you have any feedback on the Level Editor, please contact us at: artisans@codecombat.com
|
|! If you have any feedback on the Level Editor, please contact us at:
|
||||||
|
a(href='mailto:artisans@codecombat.com') artisans@codecombat.com
|
||||||
div.centered-stack
|
div.centered-stack
|
||||||
div
|
div
|
||||||
a(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home', target='_blank') Wiki Homepage
|
a(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home', target='_blank') Wiki Homepage
|
||||||
|
@ -15,7 +19,7 @@ block modal-body-content
|
||||||
a(href='https://github.com/codecombat/codecombat/wiki/Artisan-How-To-Index', target='_blank') Basic How-tos
|
a(href='https://github.com/codecombat/codecombat/wiki/Artisan-How-To-Index', target='_blank') Basic How-tos
|
||||||
div
|
div
|
||||||
a(href='http://direct.codecombat.com/community', target='_blank') Artisan Rankings
|
a(href='http://direct.codecombat.com/community', target='_blank') Artisan Rankings
|
||||||
if creator == meID
|
if view.creator === view.meID
|
||||||
h4 Level Submission
|
h4 Level Submission
|
||||||
p
|
p
|
||||||
| Do you want your level to be added to the campaign? Please take a moment to fill out the questions below! Don’t worry, this isn’t a timed quiz. It is just a way for the artisans at CodeCombat HQ to get a feel for the purpose of this level. If it doesn’t quite yet meet our standards for release we will give you feedback to help polish it further!
|
| Do you want your level to be added to the campaign? Please take a moment to fill out the questions below! Don’t worry, this isn’t a timed quiz. It is just a way for the artisans at CodeCombat HQ to get a feel for the purpose of this level. If it doesn’t quite yet meet our standards for release we will give you feedback to help polish it further!
|
||||||
|
@ -33,9 +37,8 @@ block modal-body-content
|
||||||
label.control-label(for='level-location') Where in the campaign do you think this level belongs?
|
label.control-label(for='level-location') Where in the campaign do you think this level belongs?
|
||||||
textarea#level-location.form-control(name='levelLocation', rows=4)
|
textarea#level-location.form-control(name='levelLocation', rows=4)
|
||||||
|
|
||||||
|
|
||||||
block modal-footer-content
|
block modal-footer-content
|
||||||
div
|
div
|
||||||
a(href='#', data-dismiss="modal", aria-hidden="true").btn Close
|
a(href='#', data-dismiss="modal", aria-hidden="true").btn Close
|
||||||
if creator == meID
|
if view.creator === view.meID
|
||||||
button.btn.btn-primary#level-submit Submit
|
button.btn.btn-primary#level-submit Submit
|
||||||
|
|
41
app/templates/editor/level/tasks-tab.jade
Normal file
41
app/templates/editor/level/tasks-tab.jade
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
mixin task-row(task)
|
||||||
|
- var taskName = task.get('name');
|
||||||
|
- var isComplete = task.get('complete')
|
||||||
|
- var taskLink = view.defaultTaskLinks[taskName]
|
||||||
|
tr.taskRow(data-task=task)
|
||||||
|
td.taskCheck
|
||||||
|
div.checkbox
|
||||||
|
input(type='checkbox', checked=(isComplete || false)).taskInput
|
||||||
|
if task.get('curEdit') === true
|
||||||
|
td.editCell
|
||||||
|
td
|
||||||
|
input(type="input", value=taskName)#curEdit
|
||||||
|
else
|
||||||
|
td.editCell
|
||||||
|
span.startEdit ✎
|
||||||
|
td
|
||||||
|
if taskLink
|
||||||
|
if taskLink === './'
|
||||||
|
a.noArticle(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home', target='blank')= taskName
|
||||||
|
else
|
||||||
|
a(href=taskLink, target='_blank')= taskName
|
||||||
|
else
|
||||||
|
span= taskName
|
||||||
|
|
||||||
|
block
|
||||||
|
table.table.table-striped.table-hover
|
||||||
|
tr
|
||||||
|
th.taskCheck Complete
|
||||||
|
th Edit
|
||||||
|
th Incomplete Tasks
|
||||||
|
for task in (view.taskArray() || [])
|
||||||
|
if task.get('revert').complete !== true
|
||||||
|
+task-row(task)
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
th
|
||||||
|
th Completed Tasks
|
||||||
|
for task in (view.taskArray() || [])
|
||||||
|
if task.get('revert').complete === true
|
||||||
|
+task-row(task)
|
||||||
|
button#createTask.btn.btn-default Add Task
|
|
@ -1,40 +0,0 @@
|
||||||
mixin taskRow(task)
|
|
||||||
tr.taskRow(data=task.name)
|
|
||||||
td.taskCheck
|
|
||||||
div.checkbox
|
|
||||||
input(type='checkbox', checked=(task.complete || false), data=task.name, placeholder='Enter a description of the task.').taskInput
|
|
||||||
if task.curEdit == true
|
|
||||||
td
|
|
||||||
td
|
|
||||||
input(type="input", value=task.name)#curEdit
|
|
||||||
else
|
|
||||||
td
|
|
||||||
span.startEdit(data=task.name) ✎
|
|
||||||
td
|
|
||||||
if view.defaultTaskLinks[task.name]
|
|
||||||
if view.defaultTaskLinks[task.name] === './'
|
|
||||||
a.noArticle(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home' target='_blank')= task.name
|
|
||||||
else
|
|
||||||
a(href=view.defaultTaskLinks[task.name], target='_blank')= task.name
|
|
||||||
else
|
|
||||||
span= task.name
|
|
||||||
block
|
|
||||||
if view.tasks
|
|
||||||
table.table.table-striped.table-hover
|
|
||||||
tr
|
|
||||||
th.taskCheck Complete
|
|
||||||
th Edit
|
|
||||||
th Incomplete Tasks
|
|
||||||
for task in view.tTasks
|
|
||||||
if task.reversion !== true
|
|
||||||
+taskRow(task)
|
|
||||||
tr
|
|
||||||
th
|
|
||||||
th
|
|
||||||
th Completed Tasks
|
|
||||||
for task in view.tTasks
|
|
||||||
if task.reversion === true
|
|
||||||
+taskRow(task)
|
|
||||||
button#createTask.btn.btn-default Add Task
|
|
||||||
else
|
|
||||||
div Wrong!
|
|
|
@ -26,4 +26,4 @@ mixin thangRow(thang)
|
||||||
for task in (thang.tasks || [])
|
for task in (thang.tasks || [])
|
||||||
if !task.complete
|
if !task.complete
|
||||||
tr
|
tr
|
||||||
td= task.name
|
td= task.name
|
||||||
|
|
|
@ -23,17 +23,11 @@ module.exports = class ArtisanGuideModal extends ModalView
|
||||||
events:
|
events:
|
||||||
'click #level-submit': 'levelSubmit'
|
'click #level-submit': 'levelSubmit'
|
||||||
|
|
||||||
constructor: (options) ->
|
initialize: (options) ->
|
||||||
super options
|
|
||||||
@level = options.level
|
@level = options.level
|
||||||
@options = level: @level.get 'name'
|
@options = level: @level.get 'name'
|
||||||
@render()
|
@creator = @level.get 'creator'
|
||||||
|
@meID = me.id
|
||||||
getRenderData: ->
|
|
||||||
c = super()
|
|
||||||
c.creator = @level.get 'creator'
|
|
||||||
c.meID = me.id
|
|
||||||
c
|
|
||||||
|
|
||||||
levelSubmit: ->
|
levelSubmit: ->
|
||||||
@playSound 'menu-button-click'
|
@playSound 'menu-button-click'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
CocoView = require 'views/core/CocoView'
|
CocoView = require 'views/core/CocoView'
|
||||||
template = require 'templates/editor/level/tasks_tab'
|
template = require 'templates/editor/level/tasks-tab'
|
||||||
Level = require 'models/Level'
|
Level = require 'models/Level'
|
||||||
|
|
||||||
module.exports = class TasksTabView extends CocoView
|
module.exports = class TasksTabView extends CocoView
|
||||||
|
@ -7,11 +7,11 @@ module.exports = class TasksTabView extends CocoView
|
||||||
className: 'tab-pane'
|
className: 'tab-pane'
|
||||||
template: template
|
template: template
|
||||||
events:
|
events:
|
||||||
'click .taskRow': 'onTaskRowClicked'
|
'click .taskRow': 'onClickTaskRow'
|
||||||
'click .taskInput': 'onTaskCompletionClicked'
|
'click .taskInput': 'onClickTaskInput'
|
||||||
'click .startEdit': 'onTaskEditClicked'
|
'click .startEdit': 'onClickStartEdit'
|
||||||
'click #createTask': 'onTaskCreateClicked'
|
'click #createTask': 'onClickCreateTask'
|
||||||
'keydown #curEdit': 'onCurEditKeyDown'
|
'keydown #curEdit': 'onKeyDownCurEdit'
|
||||||
|
|
||||||
subscriptions:
|
subscriptions:
|
||||||
'editor:level-loaded': 'onLevelLoaded'
|
'editor:level-loaded': 'onLevelLoaded'
|
||||||
|
@ -54,123 +54,96 @@ module.exports = class TasksTabView extends CocoView
|
||||||
'Do thorough set decoration.':'./'
|
'Do thorough set decoration.':'./'
|
||||||
'Add a walkthrough video.':'./'
|
'Add a walkthrough video.':'./'
|
||||||
|
|
||||||
constructor: (options) ->
|
taskMap: ->
|
||||||
super options
|
return @tasks?.map((_obj) -> return (name: _obj.get('name'), complete: (_obj.get('complete') || false)))
|
||||||
@render()
|
|
||||||
|
taskArray: ->
|
||||||
|
return @tasks?.toArray()
|
||||||
|
|
||||||
|
findTask: (_name) ->
|
||||||
|
return @tasks.findWhere(name:_name)
|
||||||
|
|
||||||
onLoaded: ->
|
onLoaded: ->
|
||||||
onLevelLoaded: (e) ->
|
onLevelLoaded: (e) ->
|
||||||
@level = e.level
|
@level = e.level
|
||||||
if e.level._revertAttributes
|
Task = Backbone.Model.extend({
|
||||||
@revertTasks = e.level._revertAttributes.tasks
|
initialize: ->
|
||||||
else
|
if e?.level?._revertAttributes?.tasks?
|
||||||
@revertTasks = @level.get 'tasks'
|
if _.find(e.level._revertAttributes.tasks, {name:arguments[0].name})
|
||||||
@tasks = @level.get 'tasks'
|
@set 'revert', _.find(e.level._revertAttributes.tasks, {name:arguments[0].name})
|
||||||
@tTasks = _.clone @tasks, true
|
else
|
||||||
for task in @tTasks
|
@set 'revert', arguments[0]
|
||||||
if @revertTasks[_.findKey(@revertTasks, {'name':task.name})]
|
else
|
||||||
task.reversion = @revertTasks[_.findKey(@revertTasks, {'name':task.name})].complete || null
|
@set 'revert', arguments[0]
|
||||||
else
|
})
|
||||||
task.reversion = false
|
TaskList = Backbone.Collection.extend({
|
||||||
|
model: Task
|
||||||
|
})
|
||||||
|
@tasks = new TaskList(@level.get 'tasks')
|
||||||
@render()
|
@render()
|
||||||
|
|
||||||
getRenderData: ->
|
|
||||||
c = super()
|
|
||||||
c.tasks = @tasks
|
|
||||||
c.status
|
|
||||||
c
|
|
||||||
|
|
||||||
pushTasks: ->
|
pushTasks: ->
|
||||||
for task in @tTasks
|
@level.set 'tasks', @taskMap()
|
||||||
taskKey = @findTaskByName(@tasks, task.name)
|
|
||||||
oTaskKey = @findTaskByName(@tasks, task.oldName)
|
|
||||||
if taskKey?
|
|
||||||
@tasks[taskKey].complete = task.complete
|
|
||||||
else if oTaskKey?
|
|
||||||
if task.name is ''
|
|
||||||
@tasks.splice(oTaskKey, 1)
|
|
||||||
@tTasks.splice(@tTasks.indexOf(task), 1)
|
|
||||||
break
|
|
||||||
@pushTasks()
|
|
||||||
else
|
|
||||||
@tasks[oTaskKey].name = task.name
|
|
||||||
@tasks[oTaskKey].complete = task.complete
|
|
||||||
else
|
|
||||||
if task.name is ''
|
|
||||||
@tasks.splice(oTaskKey, 1)
|
|
||||||
@tTasks.splice(@tTasks.indexOf(task), 1)
|
|
||||||
else
|
|
||||||
@tasks.push
|
|
||||||
name: task.name
|
|
||||||
complete: task.complete
|
|
||||||
@level.set 'tasks', @tasks
|
|
||||||
@parent.renderSelectors '#tasks-tab'
|
|
||||||
|
|
||||||
onTaskRowClicked: (e) ->
|
onClickTaskRow: (e) ->
|
||||||
if not $(e.target).is('input') and not $(e.target).is('a') and not $(e.target).hasClass('startEdit')
|
if not $(e.target).is('input') and not $(e.target).is('a') and not $(e.target).hasClass('startEdit')
|
||||||
checkBox = $(e.currentTarget).find('.taskInput')[0]
|
task = @findTask($(e.target).closest('tr').data('task').name)
|
||||||
tTaskKey = @findTaskByName(@tTasks, @getData e)
|
checkbox = $(e.currentTarget).find('.taskInput')[0]
|
||||||
if tTaskKey?
|
if task.get 'complete'
|
||||||
if checkBox.checked
|
task.set 'complete', false
|
||||||
checkBox.checked = false
|
else
|
||||||
else
|
task.set 'complete', true
|
||||||
checkBox.checked = true
|
checkbox.checked = task.get 'complete'
|
||||||
console.log(checkBox.checked)
|
|
||||||
@tTasks[tTaskKey].complete = checkBox.checked
|
|
||||||
@pushTasks()
|
@pushTasks()
|
||||||
|
|
||||||
onTaskCompletionClicked: (e) ->
|
onClickTaskInput: (e) ->
|
||||||
tTaskKey = @findTaskByName(@tTasks, @getData e)
|
task = @findTask($(e.target).closest('tr').data('task').name)
|
||||||
if tTaskKey?
|
task.set 'complete', e.currentTarget.checked
|
||||||
@tTasks[tTaskKey].complete = e.currentTarget.checked
|
|
||||||
@pushTasks()
|
@pushTasks()
|
||||||
|
|
||||||
onTaskCreateClicked: (e) ->
|
onClickStartEdit: (e) ->
|
||||||
if $('#curEdit').length is 0
|
if $('#curEdit').length is 0
|
||||||
@tTasks.push
|
task = @findTask($(e.target).closest('tr').data('task').name)
|
||||||
name: ''
|
task.set 'curEdit', true
|
||||||
complete: false
|
|
||||||
reversion: false
|
|
||||||
curEdit: true
|
|
||||||
@render()
|
@render()
|
||||||
editDiv = $('#curEdit')[0]
|
editDiv = $('#curEdit')[0]
|
||||||
editDiv.focus()
|
editDiv.focus()
|
||||||
len = editDiv.value.length * 2
|
len = editDiv.value.length * 2
|
||||||
editDiv.setSelectionRange len, len
|
editDiv.setSelectionRange len, len
|
||||||
|
|
||||||
onCurEditKeyDown: (e) ->
|
onKeyDownCurEdit: (e) ->
|
||||||
editDiv = $('#curEdit')[0]
|
|
||||||
if e.keyCode is 13
|
if e.keyCode is 13
|
||||||
taskIndex = @findTaskByName(@tasks, editDiv.value)
|
editDiv = $('#curEdit')[0]
|
||||||
tTaskIndex = _.findKey(@tTasks, {'curEdit':true})
|
task = @findTask($(e.target).closest('tr').data('task').name)
|
||||||
if taskIndex? and tTaskIndex? and taskIndex isnt tTaskIndex
|
potentialTask = @findTask(editDiv.value)
|
||||||
|
if potentialTask and potentialTask isnt task
|
||||||
noty
|
noty
|
||||||
timeout: 5000
|
timeout: 5000
|
||||||
text: 'Task with name already exists.'
|
text: 'Task with name already exists!'
|
||||||
type: 'error'
|
type: 'error'
|
||||||
layout: 'topCenter'
|
layout: 'topCenter'
|
||||||
|
else if editDiv.value is ''
|
||||||
|
@tasks.remove task
|
||||||
|
@pushTasks()
|
||||||
|
@render()
|
||||||
else
|
else
|
||||||
@tTasks[tTaskIndex].oldName = @tTasks[tTaskIndex].name
|
task.set 'name', editDiv.value
|
||||||
@tTasks[tTaskIndex].name = curEdit.value
|
task.set 'curEdit', false
|
||||||
@tTasks[tTaskIndex].curEdit = false
|
@pushTasks()
|
||||||
|
@render()
|
||||||
|
|
||||||
@pushTasks()
|
onClickCreateTask: (e) ->
|
||||||
@render()
|
|
||||||
|
|
||||||
onTaskEditClicked: (e) ->
|
|
||||||
if $('#curEdit').length is 0
|
if $('#curEdit').length is 0
|
||||||
taskIndex = @findTaskByName(@tTasks, @getData e)
|
@tasks.add
|
||||||
@tTasks[taskIndex].curEdit = true
|
name: ''
|
||||||
|
complete: false
|
||||||
|
curEdit: true
|
||||||
|
revert:
|
||||||
|
name: 'null'
|
||||||
|
complete: false
|
||||||
@render()
|
@render()
|
||||||
editDiv = $('#curEdit')[0]
|
editDiv = $('#curEdit')[0]
|
||||||
editDiv.focus()
|
editDiv.focus()
|
||||||
len = editDiv.value.length * 2
|
len = editDiv.value.length * 2
|
||||||
editDiv.setSelectionRange len, len
|
editDiv.setSelectionRange len, len
|
||||||
|
|
||||||
findTaskByName: (obj, name) ->
|
|
||||||
return _.findKey(obj, {'name':name})
|
|
||||||
|
|
||||||
getData: (elem) ->
|
|
||||||
return elem.currentTarget.getAttribute('data')
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue