55# = provides tasklist:changing
66# = provides tasklist:change
77#
8+ # = require crema/element/fire
89# = require crema/events/pageupdate
910#
1011# Enables Task List update behavior.
2728#
2829# ### Specification
2930#
30- # TaskLists MUST be contained in a `div.js-task-list-container`.
31+ # TaskLists MUST be contained in a `( div) .js-task-list-container`.
3132#
3233# TaskList Items SHOULD be an a list (`UL`/`OL`) element.
3334#
3839# `value` attribute is the source (Markdown) to be udpated. The source MUST
3940# follow the syntax guidelines.
4041#
41- # TaskList updates trigger `tasklist:change` events.
42+ # TaskList updates trigger `tasklist:change` events. If the change is
43+ # successful, `tasklist:changed` is fired. The change can be canceled.
4244#
43- # jQuery is required and the `$.pageUpdate` behavior MUST be available .
45+ # jQuery and crema are required .
4446#
4547# ### Events
4648#
@@ -112,7 +114,25 @@ updateTaskListItem = (source, itemIndex, checked) ->
112114 line
113115 result .join (" \n " )
114116
115- # Enables task list items to trigger updates.
117+ # Updates the $field value to reflect the state of $item.
118+ # Triggers the `tasklist:change` event before the value has changed, and fires
119+ # a `tasklist:changed` event once the value has changed.
120+ updateTaskList = ($item ) ->
121+ $container = $item .closest ' .js-task-list-container'
122+ $field = $container .find ' .js-task-list-field'
123+ index = 1 + $container .find (' .task-list-item-checkbox' ).index ($item)
124+ checked = $item .prop ' checked'
125+
126+ $field .fire ' tasklist:change' , [index, checked], ->
127+ $field .val updateTaskListItem ($field .val (), index, checked)
128+ $field .trigger ' change'
129+ $field .fire ' tasklist:changed' , [index, checked]
130+
131+ # When the task list item checkbox is updated, submit the change
132+ $ (document ).on ' change' , ' .task-list-item-checkbox' , ->
133+ updateTaskList $ (this )
134+
135+ # Enables TaskList item changes.
116136enableTaskList = ($container ) ->
117137 if $container .find (' .js-task-list-field' ).length > 0
118138 $container.
@@ -121,39 +141,32 @@ enableTaskList = ($container) ->
121141 $container .addClass (' is-task-list-enabled' ).
122142 trigger ' tasklist:enabled'
123143
144+ # Enables a collection of TaskList containers.
145+ $ .fn .enableTaskList = ->
146+ for container in this
147+ enableTaskList $ (container)
148+
149+ # (Re)enable a TaskList container.
150+ $ (document ).on ' tasklist:enable' , ' .js-task-list-container' , (event ) ->
151+ enableTaskList $ (this )
152+
153+ # Disable TaskList item changes.
124154disableTaskList = ($container ) ->
125155 $container.
126156 find (' .task-list-item' ).removeClass (' enabled' ).
127157 find (' .task-list-item-checkbox' ).attr (' disabled' , ' disabled' )
128158 $container .removeClass (' is-task-list-enabled' ).
129159 trigger ' tasklist:disabled'
130160
131- # Updates the $field value to reflect the state of $item.
132- # Triggers the `tasklist:change` event when the value has changed.
133- updateTaskList = ($item ) ->
134- $container = $item .closest ' .js-task-list-container'
135- $field = $container .find ' .js-task-list-field'
136- index = 1 + $container .find (' .task-list-item-checkbox' ).index ($item)
137- checked = $item .prop ' checked'
138-
139- $container .trigger ' tasklist:changing' , [index, checked]
140- $field .val updateTaskListItem ($field .val (), index, checked)
141- $field .trigger ' change'
142- $field .trigger ' tasklist:change' , [index, checked]
143-
144- # When the task list item checkbox is updated, submit the change
145- $ (document ).on ' change' , ' .task-list-item-checkbox' , ->
146- updateTaskList $ (this )
161+ # Disables a collection of TaskList containers.
162+ $ .fn .disableTaskList = ->
163+ for container in this
164+ disableTaskList $ (container)
147165
148166# Disable a TaskList container.
149167$ (document ).on ' tasklist:disable' , ' .js-task-list-container' , (event ) ->
150168 disableTaskList $ (this )
151169
152- # (Re)enable a TaskList container.
153- $ (document ).on ' tasklist:enable' , ' .js-task-list-container' , (event ) ->
154- enableTaskList $ (this )
155-
156170# When the page is updated, enable new TaskList containers.
157171$ .pageUpdate ->
158- $ (' .js-task-list-container' ).each ->
159- enableTaskList $ (this )
172+ $ (' .js-task-list-container' ).enableTaskList ()
0 commit comments