Moves Tasks to their own tab and adds a guide-book icon next to the save icon which displays help and doubles as a level review submission modal.
This commit is contained in:
parent
fde11d8f0d
commit
14c2942134
9 changed files with 339 additions and 2 deletions
app
styles/editor/level
templates/editor/level
views/editor/level
3
app/styles/editor/level/modal/artisan-guide-modal.sass
Normal file
3
app/styles/editor/level/modal/artisan-guide-modal.sass
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#artisan-guide-modal
|
||||||
|
.centered-stack
|
||||||
|
text-align: center
|
15
app/styles/editor/level/tasks-tab.sass
Normal file
15
app/styles/editor/level/tasks-tab.sass
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#editor-level-tasks-tab-view
|
||||||
|
td
|
||||||
|
cursor: pointer
|
||||||
|
.taskCheck
|
||||||
|
width: 5%
|
||||||
|
.taskCheck *
|
||||||
|
text-align: center
|
||||||
|
margin: auto
|
||||||
|
.checkbox
|
||||||
|
margin: auto
|
||||||
|
.startEdit
|
||||||
|
cursor: pointer
|
||||||
|
text-align:center
|
||||||
|
.noArticle
|
||||||
|
color: rgba(160, 0, 0, 1)
|
|
@ -27,6 +27,8 @@ block header
|
||||||
a(href="#editor-level-components-tab-view", data-toggle="tab", data-i18n="editor.level_tab_components")#components-tab Components
|
a(href="#editor-level-components-tab-view", data-toggle="tab", data-i18n="editor.level_tab_components")#components-tab Components
|
||||||
li
|
li
|
||||||
a(href="#systems-tab-view", data-toggle="tab", data-i18n="editor.level_tab_systems") Systems
|
a(href="#systems-tab-view", data-toggle="tab", data-i18n="editor.level_tab_systems") Systems
|
||||||
|
li
|
||||||
|
a(href="#editor-level-tasks-tab-view", data-toggle="tab", data-i18n="editor.level_tab_tasks")#tasks-tab= "Tasks" + " " + view.getTaskCompletionRatio()
|
||||||
li
|
li
|
||||||
a(href="#editor-level-patches", data-toggle="tab")#patches-tab
|
a(href="#editor-level-patches", data-toggle="tab")#patches-tab
|
||||||
span(data-i18n="resources.patches").spr Patches
|
span(data-i18n="resources.patches").spr Patches
|
||||||
|
@ -50,6 +52,9 @@ block header
|
||||||
li#redo-button
|
li#redo-button
|
||||||
a
|
a
|
||||||
span.glyphicon-arrow-right.glyphicon
|
span.glyphicon-arrow-right.glyphicon
|
||||||
|
li#artisan-guide-button
|
||||||
|
a
|
||||||
|
span.glyphicon-book.glyphicon
|
||||||
if authorized
|
if authorized
|
||||||
li#commit-level-start-button
|
li#commit-level-start-button
|
||||||
a
|
a
|
||||||
|
@ -58,7 +63,7 @@ block header
|
||||||
li#level-patch-button
|
li#level-patch-button
|
||||||
a
|
a
|
||||||
span.glyphicon-floppy-disk.glyphicon
|
span.glyphicon-floppy-disk.glyphicon
|
||||||
|
|
||||||
if level.get('type') === 'ladder'
|
if level.get('type') === 'ladder'
|
||||||
li.dropdown
|
li.dropdown
|
||||||
a(data-toggle='dropdown').play-with-team-parent
|
a(data-toggle='dropdown').play-with-team-parent
|
||||||
|
@ -124,6 +129,8 @@ block outer_content
|
||||||
div.tab-pane#editor-level-components-tab-view
|
div.tab-pane#editor-level-components-tab-view
|
||||||
|
|
||||||
div.tab-pane#systems-tab-view
|
div.tab-pane#systems-tab-view
|
||||||
|
|
||||||
|
div.tab-pane#editor-level-tasks-tab-view
|
||||||
|
|
||||||
div.tab-pane#editor-level-patches
|
div.tab-pane#editor-level-patches
|
||||||
.patches-view
|
.patches-view
|
||||||
|
|
36
app/templates/editor/level/modal/artisan-guide-modal.jade
Normal file
36
app/templates/editor/level/modal/artisan-guide-modal.jade
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
extends /templates/core/modal-base
|
||||||
|
|
||||||
|
block modal-header-content
|
||||||
|
h3 Artisan Compendium
|
||||||
|
block modal-body-content
|
||||||
|
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, 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
|
||||||
|
div.centered-stack
|
||||||
|
div
|
||||||
|
a(href='https://github.com/codecombat/codecombat/wiki/Artisan-Home', target='_blank') Wiki Homepage
|
||||||
|
div
|
||||||
|
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
|
||||||
|
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!
|
||||||
|
.form
|
||||||
|
.form-group
|
||||||
|
label.control-label(for='credit-name') How would you like to be credited?
|
||||||
|
input#credit-name.form-control(name='creditName')
|
||||||
|
.form-group
|
||||||
|
label.control-label(for='level-purpose') What is the purpose of this level?
|
||||||
|
textarea#level-purpose.form-control(name='levelPurpose', rows=4)
|
||||||
|
.form-group
|
||||||
|
label.control-label(for='level-inspiration') What was the inspiration for the level?
|
||||||
|
textarea#level-inspiration.form-control(name='levelInspiration', rows=4)
|
||||||
|
.form-group
|
||||||
|
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
|
||||||
|
button.btn.btn-primary#level-submit Submit
|
40
app/templates/editor/level/tasks_tab.jade
Normal file
40
app/templates/editor/level/tasks_tab.jade
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
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!
|
|
@ -15,7 +15,9 @@ SettingsTabView = require './settings/SettingsTabView'
|
||||||
ScriptsTabView = require './scripts/ScriptsTabView'
|
ScriptsTabView = require './scripts/ScriptsTabView'
|
||||||
ComponentsTabView = require './components/ComponentsTabView'
|
ComponentsTabView = require './components/ComponentsTabView'
|
||||||
SystemsTabView = require './systems/SystemsTabView'
|
SystemsTabView = require './systems/SystemsTabView'
|
||||||
|
TasksTabView = require './tasks/TasksTabView'
|
||||||
SaveLevelModal = require './modals/SaveLevelModal'
|
SaveLevelModal = require './modals/SaveLevelModal'
|
||||||
|
ArtisanGuideModal = require './modals/ArtisanGuideModal'
|
||||||
ForkModal = require 'views/editor/ForkModal'
|
ForkModal = require 'views/editor/ForkModal'
|
||||||
SaveVersionModal = require 'views/editor/modal/SaveVersionModal'
|
SaveVersionModal = require 'views/editor/modal/SaveVersionModal'
|
||||||
PatchesView = require 'views/editor/PatchesView'
|
PatchesView = require 'views/editor/PatchesView'
|
||||||
|
@ -56,6 +58,7 @@ module.exports = class LevelEditView extends RootView
|
||||||
'mouseenter #redo-button': 'showRedoDescription'
|
'mouseenter #redo-button': 'showRedoDescription'
|
||||||
'click #patches-tab': -> @patchesView.load()
|
'click #patches-tab': -> @patchesView.load()
|
||||||
'click #components-tab': -> @subviews.editor_level_components_tab_view.refreshLevelThangsTreema @level.get('thangs')
|
'click #components-tab': -> @subviews.editor_level_components_tab_view.refreshLevelThangsTreema @level.get('thangs')
|
||||||
|
'click #artisan-guide-button': 'showArtisanGuide'
|
||||||
'click #level-patch-button': 'startPatchingLevel'
|
'click #level-patch-button': 'startPatchingLevel'
|
||||||
'click #level-watch-button': 'toggleWatchLevel'
|
'click #level-watch-button': 'toggleWatchLevel'
|
||||||
'click li:not(.disabled) > #pop-level-i18n-button': 'onPopulateI18N'
|
'click li:not(.disabled) > #pop-level-i18n-button': 'onPopulateI18N'
|
||||||
|
@ -90,6 +93,7 @@ module.exports = class LevelEditView extends RootView
|
||||||
getRenderData: (context={}) ->
|
getRenderData: (context={}) ->
|
||||||
context = super(context)
|
context = super(context)
|
||||||
context.level = @level
|
context.level = @level
|
||||||
|
console.log context.level
|
||||||
context.authorized = me.isAdmin() or @level.hasWriteAccess(me)
|
context.authorized = me.isAdmin() or @level.hasWriteAccess(me)
|
||||||
context.anonymous = me.get('anonymous')
|
context.anonymous = me.get('anonymous')
|
||||||
context.recentlyPlayedOpponents = storage.load('recently-played-matches')?[@levelID] ? []
|
context.recentlyPlayedOpponents = storage.load('recently-played-matches')?[@levelID] ? []
|
||||||
|
@ -105,10 +109,12 @@ module.exports = class LevelEditView extends RootView
|
||||||
@insertSubView new ScriptsTabView world: @world, supermodel: @supermodel, files: @files
|
@insertSubView new ScriptsTabView world: @world, supermodel: @supermodel, files: @files
|
||||||
@insertSubView new ComponentsTabView supermodel: @supermodel
|
@insertSubView new ComponentsTabView supermodel: @supermodel
|
||||||
@insertSubView new SystemsTabView supermodel: @supermodel, world: @world
|
@insertSubView new SystemsTabView supermodel: @supermodel, world: @world
|
||||||
|
@insertSubView new TasksTabView world: @world, supermodel: @supermodel, level: @level
|
||||||
@insertSubView new RelatedAchievementsView supermodel: @supermodel, level: @level
|
@insertSubView new RelatedAchievementsView supermodel: @supermodel, level: @level
|
||||||
@insertSubView new ComponentsDocumentationView lazy: true # Don't give it the supermodel, it'll pollute it!
|
@insertSubView new ComponentsDocumentationView lazy: true # Don't give it the supermodel, it'll pollute it!
|
||||||
@insertSubView new SystemsDocumentationView lazy: true # Don't give it the supermodel, it'll pollute it!
|
@insertSubView new SystemsDocumentationView lazy: true # Don't give it the supermodel, it'll pollute it!
|
||||||
@insertSubView new LevelFeedbackView level: @level
|
@insertSubView new LevelFeedbackView level: @level
|
||||||
|
|
||||||
|
|
||||||
Backbone.Mediator.publish 'editor:level-loaded', level: @level
|
Backbone.Mediator.publish 'editor:level-loaded', level: @level
|
||||||
@showReadOnly() if me.get('anonymous')
|
@showReadOnly() if me.get('anonymous')
|
||||||
|
@ -170,6 +176,10 @@ module.exports = class LevelEditView extends RootView
|
||||||
@openModalView new SaveLevelModal level: @level, supermodel: @supermodel, buildTime: @levelBuildTime
|
@openModalView new SaveLevelModal level: @level, supermodel: @supermodel, buildTime: @levelBuildTime
|
||||||
Backbone.Mediator.publish 'editor:view-switched', {}
|
Backbone.Mediator.publish 'editor:view-switched', {}
|
||||||
|
|
||||||
|
showArtisanGuide: (e) ->
|
||||||
|
@openModalView new ArtisanGuideModal()
|
||||||
|
Backbone.Mediator.publish 'editor:view-switched', {}
|
||||||
|
|
||||||
startForking: (e) ->
|
startForking: (e) ->
|
||||||
@openModalView new ForkModal model: @level, editorPath: 'level'
|
@openModalView new ForkModal model: @level, editorPath: 'level'
|
||||||
Backbone.Mediator.publish 'editor:view-switched', {}
|
Backbone.Mediator.publish 'editor:view-switched', {}
|
||||||
|
@ -210,3 +220,6 @@ module.exports = class LevelEditView extends RootView
|
||||||
return if application.userIsIdle
|
return if application.userIsIdle
|
||||||
@levelBuildTime ?= @level.get('buildTime') ? 0
|
@levelBuildTime ?= @level.get('buildTime') ? 0
|
||||||
++@levelBuildTime
|
++@levelBuildTime
|
||||||
|
|
||||||
|
getTaskCompletionRatio: ->
|
||||||
|
return _.filter(@level.get('tasks'), (_elem) -> return _elem.complete).length + "/" + @level.get('tasks').length
|
||||||
|
|
47
app/views/editor/level/modals/ArtisanGuideModal.coffee
Normal file
47
app/views/editor/level/modals/ArtisanGuideModal.coffee
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
ModalView = require 'views/core/ModalView'
|
||||||
|
template = require 'templates/editor/level/modal/artisan-guide-modal'
|
||||||
|
|
||||||
|
forms = require 'core/forms'
|
||||||
|
{sendContactMessage} = require 'core/contact'
|
||||||
|
|
||||||
|
contactSchema =
|
||||||
|
additionalProperties: false
|
||||||
|
required: ['creditName', 'levelPurpose', 'levelInspiration', 'levelLocation']
|
||||||
|
properties:
|
||||||
|
creditName:
|
||||||
|
type: 'string'
|
||||||
|
levelPurpose:
|
||||||
|
type: 'string'
|
||||||
|
levelInspiration:
|
||||||
|
type: 'string'
|
||||||
|
levelLocation:
|
||||||
|
type: 'string'
|
||||||
|
|
||||||
|
module.exports = class ArtisanGuideModal extends ModalView
|
||||||
|
id: 'artisan-guide-modal'
|
||||||
|
template: template
|
||||||
|
events:
|
||||||
|
'click #level-submit': 'levelSubmit'
|
||||||
|
|
||||||
|
constructor: (options) ->
|
||||||
|
super options
|
||||||
|
|
||||||
|
|
||||||
|
levelSubmit: ->
|
||||||
|
@playSound 'menu-button-click'
|
||||||
|
forms.clearFormAlerts @$el
|
||||||
|
contactMessage = forms.formToObject @$el
|
||||||
|
res = tv4.validateMultiple contactMessage, contactSchema
|
||||||
|
return forms.applyErrorsToForm @$el, res.errors unless res.valid
|
||||||
|
@populateBrowserData contactMessage
|
||||||
|
contactMessage = _.merge contactMessage, @options
|
||||||
|
contactMessage.country = me.get('country')
|
||||||
|
window.tracker?.trackEvent 'Sent Feedback', message: contactMessage
|
||||||
|
sendContactMessage contactMessage, @$el
|
||||||
|
$.post "/db/user/#{me.id}/track/contact_codecombat"
|
||||||
|
|
||||||
|
populateBrowserData: (context) ->
|
||||||
|
if $.browser
|
||||||
|
context.browser = "#{$.browser.platform} #{$.browser.name} #{$.browser.versionNumber}"
|
||||||
|
context.screenSize = "#{screen?.width ? $(window).width()} x #{screen?.height ? $(window).height()}"
|
||||||
|
context.screenshotURL = @screenshotURL
|
|
@ -15,7 +15,7 @@ module.exports = class SettingsTabView extends CocoView
|
||||||
editableSettings: [
|
editableSettings: [
|
||||||
'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals',
|
'name', 'description', 'documentation', 'nextLevel', 'background', 'victory', 'i18n', 'icon', 'goals',
|
||||||
'type', 'terrain', 'showsGuide', 'banner', 'employerDescription', 'loadingTip', 'requiresSubscription',
|
'type', 'terrain', 'showsGuide', 'banner', 'employerDescription', 'loadingTip', 'requiresSubscription',
|
||||||
'tasks', 'helpVideos', 'replayable', 'scoreTypes', 'concepts'
|
'helpVideos', 'replayable', 'scoreTypes', 'concepts'
|
||||||
]
|
]
|
||||||
|
|
||||||
subscriptions:
|
subscriptions:
|
||||||
|
|
176
app/views/editor/level/tasks/TasksTabView.coffee
Normal file
176
app/views/editor/level/tasks/TasksTabView.coffee
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
CocoView = require 'views/core/CocoView'
|
||||||
|
template = require 'templates/editor/level/tasks_tab'
|
||||||
|
Level = require 'models/Level'
|
||||||
|
|
||||||
|
module.exports = class TasksTabView extends CocoView
|
||||||
|
id: 'editor-level-tasks-tab-view'
|
||||||
|
className: 'tab-pane'
|
||||||
|
template: template
|
||||||
|
events:
|
||||||
|
'click .taskRow': 'onTaskRowClicked'
|
||||||
|
'click .taskInput': 'onTaskCompletionClicked'
|
||||||
|
'click .startEdit': 'onTaskEditClicked'
|
||||||
|
'click #createTask': 'onTaskCreateClicked'
|
||||||
|
'keydown #curEdit': 'onCurEditKeyDown'
|
||||||
|
|
||||||
|
subscriptions:
|
||||||
|
'editor:level-loaded': 'onLevelLoaded'
|
||||||
|
|
||||||
|
defaultTaskLinks:
|
||||||
|
# Order doesn't matter.
|
||||||
|
'Name the level.':'./'
|
||||||
|
'Create a Referee stub, if needed.':'./'
|
||||||
|
'Build the level.':'./'
|
||||||
|
'Set up goals.':'./'
|
||||||
|
'Choose the Existence System lifespan and frame rate.':'./'
|
||||||
|
'Choose the UI System paths and coordinate hover if needed.':'./'
|
||||||
|
'Choose the AI System pathfinding and Vision System line of sight.':'./'
|
||||||
|
'Write the sample code.':'./'
|
||||||
|
'Do basic set decoration.':'./'
|
||||||
|
'Adjust script camera bounds.':'./'
|
||||||
|
'Choose music file in Introduction script.':'./'
|
||||||
|
'Choose autoplay in Introduction script.':'./'
|
||||||
|
'Add to a campaign.':'./'
|
||||||
|
'Publish.':'./'
|
||||||
|
'Choose level options like required/restricted gear.':'./'
|
||||||
|
'Create achievements, including unlocking next level.':'./'
|
||||||
|
'Choose leaderboard score types.':'./'
|
||||||
|
'Playtest with a slow/tough hero.':'./'
|
||||||
|
'Playtest with a fast/weak hero.':'./'
|
||||||
|
'Playtest with a couple random seeds.':'./'
|
||||||
|
'Make sure the level ends promptly on success and failure.':'./'
|
||||||
|
'Remove/simplify unnecessary doodad collision.':'./'
|
||||||
|
'Release to adventurers via MailChimp.':'./'
|
||||||
|
'Write the description.':'./'
|
||||||
|
'Add i18n field for the sample code comments.':'./'
|
||||||
|
'Add Clojure/Lua/CoffeeScript.':'./'
|
||||||
|
'Write the guide.':'./'
|
||||||
|
'Write a loading tip, if needed.':'./'
|
||||||
|
'Click the Populate i18n button.':'./'
|
||||||
|
'Add programming concepts covered.':'./'
|
||||||
|
'Mark whether it requires a subscription.':'./'
|
||||||
|
'Release to everyone via MailChimp.':'./'
|
||||||
|
'Check completion/engagement/problem analytics.':'./'
|
||||||
|
'Do thorough set decoration.':'./'
|
||||||
|
'Add a walkthrough video.':'./'
|
||||||
|
|
||||||
|
constructor: (options) ->
|
||||||
|
super options
|
||||||
|
@render()
|
||||||
|
|
||||||
|
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
|
||||||
|
@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'
|
||||||
|
|
||||||
|
onTaskRowClicked: (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
|
||||||
|
@pushTasks()
|
||||||
|
|
||||||
|
onTaskCompletionClicked: (e) ->
|
||||||
|
tTaskKey = @findTaskByName(@tTasks, @getData e)
|
||||||
|
if tTaskKey?
|
||||||
|
@tTasks[tTaskKey].complete = e.currentTarget.checked
|
||||||
|
@pushTasks()
|
||||||
|
|
||||||
|
onTaskCreateClicked: (e) ->
|
||||||
|
if $('#curEdit').length is 0
|
||||||
|
@tTasks.push
|
||||||
|
name: ''
|
||||||
|
complete: false
|
||||||
|
reversion: false
|
||||||
|
curEdit: true
|
||||||
|
@render()
|
||||||
|
editDiv = $('#curEdit')[0]
|
||||||
|
editDiv.focus()
|
||||||
|
len = editDiv.value.length * 2
|
||||||
|
editDiv.setSelectionRange len, len
|
||||||
|
|
||||||
|
onCurEditKeyDown: (e) ->
|
||||||
|
editDiv = $('#curEdit')[0]
|
||||||
|
if e.keyCode is 13
|
||||||
|
taskIndex = @findTaskByName(@tasks, editDiv.value)
|
||||||
|
tTaskIndex = _.findKey(@tTasks, {'curEdit':true})
|
||||||
|
if taskIndex? and tTaskIndex? and taskIndex isnt tTaskIndex
|
||||||
|
noty
|
||||||
|
timeout: 5000
|
||||||
|
text: 'Task with name already exists.'
|
||||||
|
type: 'error'
|
||||||
|
layout: 'topCenter'
|
||||||
|
else
|
||||||
|
@tTasks[tTaskIndex].oldName = @tTasks[tTaskIndex].name
|
||||||
|
@tTasks[tTaskIndex].name = curEdit.value
|
||||||
|
@tTasks[tTaskIndex].curEdit = false
|
||||||
|
|
||||||
|
@pushTasks()
|
||||||
|
@render()
|
||||||
|
|
||||||
|
onTaskEditClicked: (e) ->
|
||||||
|
if $('#curEdit').length is 0
|
||||||
|
taskIndex = @findTaskByName(@tTasks, @getData e)
|
||||||
|
@tTasks[taskIndex].curEdit = true
|
||||||
|
@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')
|
||||||
|
|
||||||
|
|
Reference in a new issue