diff --git a/app/styles/editor/level/modal/artisan-guide-modal.sass b/app/styles/editor/level/modal/artisan-guide-modal.sass index 0240381c2..d87e6898f 100644 --- a/app/styles/editor/level/modal/artisan-guide-modal.sass +++ b/app/styles/editor/level/modal/artisan-guide-modal.sass @@ -1,3 +1,3 @@ #artisan-guide-modal .centered-stack - text-align: center \ No newline at end of file + text-align: center diff --git a/app/styles/editor/level/tasks-tab.sass b/app/styles/editor/level/tasks-tab.sass index 0852f47d9..96d5c6e85 100644 --- a/app/styles/editor/level/tasks-tab.sass +++ b/app/styles/editor/level/tasks-tab.sass @@ -2,7 +2,9 @@ td cursor: pointer .taskCheck - width: 5% + width: 5em + .editCell + width: 5em .taskCheck * text-align: center margin: auto @@ -12,4 +14,4 @@ cursor: pointer text-align:center .noArticle - color: rgba(160, 0, 0, 1) \ No newline at end of file + color: rgba(160, 0, 0, 1) diff --git a/app/templates/editor/level/modal/artisan-guide-modal.jade b/app/templates/editor/level/modal/artisan-guide-modal.jade index a9a861c35..92f740f79 100644 --- a/app/templates/editor/level/modal/artisan-guide-modal.jade +++ b/app/templates/editor/level/modal/artisan-guide-modal.jade @@ -2,12 +2,16 @@ extends /templates/core/modal-base block modal-header-content h3 Artisan Compendium + block modal-body-content + 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 - if creator == meID + if view.creator === view.meID |, 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 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 div a(href='http://direct.codecombat.com/community', target='_blank') Artisan Rankings - if creator == meID + if view.creator === view.meID h4 Level Submission 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! @@ -33,9 +37,8 @@ block modal-body-content 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) - block modal-footer-content div a(href='#', data-dismiss="modal", aria-hidden="true").btn Close - if creator == meID - button.btn.btn-primary#level-submit Submit \ No newline at end of file + if view.creator === view.meID + button.btn.btn-primary#level-submit Submit diff --git a/app/templates/editor/level/tasks-tab.jade b/app/templates/editor/level/tasks-tab.jade new file mode 100644 index 000000000..3555720be --- /dev/null +++ b/app/templates/editor/level/tasks-tab.jade @@ -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 diff --git a/app/templates/editor/level/tasks_tab.jade b/app/templates/editor/level/tasks_tab.jade deleted file mode 100644 index ef2298515..000000000 --- a/app/templates/editor/level/tasks_tab.jade +++ /dev/null @@ -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! \ No newline at end of file diff --git a/app/templates/editor/thangTasksView.jade b/app/templates/editor/thangTasksView.jade index 6574a4807..48a216782 100644 --- a/app/templates/editor/thangTasksView.jade +++ b/app/templates/editor/thangTasksView.jade @@ -26,4 +26,4 @@ mixin thangRow(thang) for task in (thang.tasks || []) if !task.complete tr - td= task.name \ No newline at end of file + td= task.name diff --git a/app/views/editor/level/modals/ArtisanGuideModal.coffee b/app/views/editor/level/modals/ArtisanGuideModal.coffee index dd50438cb..a0887a3c4 100644 --- a/app/views/editor/level/modals/ArtisanGuideModal.coffee +++ b/app/views/editor/level/modals/ArtisanGuideModal.coffee @@ -23,17 +23,11 @@ module.exports = class ArtisanGuideModal extends ModalView events: 'click #level-submit': 'levelSubmit' - constructor: (options) -> - super options + initialize: (options) -> @level = options.level @options = level: @level.get 'name' - @render() - - getRenderData: -> - c = super() - c.creator = @level.get 'creator' - c.meID = me.id - c + @creator = @level.get 'creator' + @meID = me.id levelSubmit: -> @playSound 'menu-button-click' diff --git a/app/views/editor/level/tasks/TasksTabView.coffee b/app/views/editor/level/tasks/TasksTabView.coffee index a2e385be3..c67751cf9 100644 --- a/app/views/editor/level/tasks/TasksTabView.coffee +++ b/app/views/editor/level/tasks/TasksTabView.coffee @@ -1,5 +1,5 @@ CocoView = require 'views/core/CocoView' -template = require 'templates/editor/level/tasks_tab' +template = require 'templates/editor/level/tasks-tab' Level = require 'models/Level' module.exports = class TasksTabView extends CocoView @@ -7,11 +7,11 @@ module.exports = class TasksTabView extends CocoView className: 'tab-pane' template: template events: - 'click .taskRow': 'onTaskRowClicked' - 'click .taskInput': 'onTaskCompletionClicked' - 'click .startEdit': 'onTaskEditClicked' - 'click #createTask': 'onTaskCreateClicked' - 'keydown #curEdit': 'onCurEditKeyDown' + 'click .taskRow': 'onClickTaskRow' + 'click .taskInput': 'onClickTaskInput' + 'click .startEdit': 'onClickStartEdit' + 'click #createTask': 'onClickCreateTask' + 'keydown #curEdit': 'onKeyDownCurEdit' subscriptions: 'editor:level-loaded': 'onLevelLoaded' @@ -54,123 +54,96 @@ module.exports = class TasksTabView extends CocoView 'Do thorough set decoration.':'./' 'Add a walkthrough video.':'./' - constructor: (options) -> - super options - @render() + taskMap: -> + return @tasks?.map((_obj) -> return (name: _obj.get('name'), complete: (_obj.get('complete') || false))) + + taskArray: -> + return @tasks?.toArray() + + findTask: (_name) -> + return @tasks.findWhere(name:_name) onLoaded: -> onLevelLoaded: (e) -> @level = e.level - if e.level._revertAttributes - @revertTasks = e.level._revertAttributes.tasks - else - @revertTasks = @level.get 'tasks' - @tasks = @level.get 'tasks' - @tTasks = _.clone @tasks, true - for task in @tTasks - if @revertTasks[_.findKey(@revertTasks, {'name':task.name})] - task.reversion = @revertTasks[_.findKey(@revertTasks, {'name':task.name})].complete || null - else - task.reversion = false + Task = Backbone.Model.extend({ + initialize: -> + if e?.level?._revertAttributes?.tasks? + if _.find(e.level._revertAttributes.tasks, {name:arguments[0].name}) + @set 'revert', _.find(e.level._revertAttributes.tasks, {name:arguments[0].name}) + else + @set 'revert', arguments[0] + else + @set 'revert', arguments[0] + }) + TaskList = Backbone.Collection.extend({ + model: Task + }) + @tasks = new TaskList(@level.get 'tasks') @render() - - getRenderData: -> - c = super() - c.tasks = @tasks - c.status - c + pushTasks: -> - for task in @tTasks - 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' + @level.set 'tasks', @taskMap() - onTaskRowClicked: (e) -> + onClickTaskRow: (e) -> if not $(e.target).is('input') and not $(e.target).is('a') and not $(e.target).hasClass('startEdit') - checkBox = $(e.currentTarget).find('.taskInput')[0] - tTaskKey = @findTaskByName(@tTasks, @getData e) - if tTaskKey? - if checkBox.checked - checkBox.checked = false - else - checkBox.checked = true - console.log(checkBox.checked) - @tTasks[tTaskKey].complete = checkBox.checked + task = @findTask($(e.target).closest('tr').data('task').name) + checkbox = $(e.currentTarget).find('.taskInput')[0] + if task.get 'complete' + task.set 'complete', false + else + task.set 'complete', true + checkbox.checked = task.get 'complete' @pushTasks() - onTaskCompletionClicked: (e) -> - tTaskKey = @findTaskByName(@tTasks, @getData e) - if tTaskKey? - @tTasks[tTaskKey].complete = e.currentTarget.checked + onClickTaskInput: (e) -> + task = @findTask($(e.target).closest('tr').data('task').name) + task.set 'complete', e.currentTarget.checked @pushTasks() - onTaskCreateClicked: (e) -> + onClickStartEdit: (e) -> if $('#curEdit').length is 0 - @tTasks.push - name: '' - complete: false - reversion: false - curEdit: true + task = @findTask($(e.target).closest('tr').data('task').name) + task.set 'curEdit', true @render() editDiv = $('#curEdit')[0] editDiv.focus() len = editDiv.value.length * 2 editDiv.setSelectionRange len, len - onCurEditKeyDown: (e) -> - editDiv = $('#curEdit')[0] + onKeyDownCurEdit: (e) -> if e.keyCode is 13 - taskIndex = @findTaskByName(@tasks, editDiv.value) - tTaskIndex = _.findKey(@tTasks, {'curEdit':true}) - if taskIndex? and tTaskIndex? and taskIndex isnt tTaskIndex + editDiv = $('#curEdit')[0] + task = @findTask($(e.target).closest('tr').data('task').name) + potentialTask = @findTask(editDiv.value) + if potentialTask and potentialTask isnt task noty timeout: 5000 - text: 'Task with name already exists.' + text: 'Task with name already exists!' type: 'error' layout: 'topCenter' + else if editDiv.value is '' + @tasks.remove task + @pushTasks() + @render() else - @tTasks[tTaskIndex].oldName = @tTasks[tTaskIndex].name - @tTasks[tTaskIndex].name = curEdit.value - @tTasks[tTaskIndex].curEdit = false + task.set 'name', editDiv.value + task.set 'curEdit', false + @pushTasks() + @render() - @pushTasks() - @render() - - onTaskEditClicked: (e) -> + onClickCreateTask: (e) -> if $('#curEdit').length is 0 - taskIndex = @findTaskByName(@tTasks, @getData e) - @tTasks[taskIndex].curEdit = true + @tasks.add + name: '' + complete: false + curEdit: true + revert: + name: 'null' + complete: false @render() editDiv = $('#curEdit')[0] editDiv.focus() len = editDiv.value.length * 2 editDiv.setSelectionRange len, len - - findTaskByName: (obj, name) -> - return _.findKey(obj, {'name':name}) - - getData: (elem) -> - return elem.currentTarget.getAttribute('data') - - \ No newline at end of file