Skip to content
This repository was archived by the owner on Nov 1, 2017. It is now read-only.

Commit 247f9d7

Browse files
committed
Remove form[data-remote] concerns
This means `rails/remote` is no longer required. TaskList updates won't submit any forms; that is now an integration concern. I added `rails/remote` into the functional tests, a good example of how to integrate TaskList changes with AJAX updates. I'm not happy with how enabling/disabling the task list items currently works, though.
1 parent 41c7e20 commit 247f9d7

File tree

7 files changed

+38
-47
lines changed

7 files changed

+38
-47
lines changed

app/assets/javascripts/task_lists.coffee

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
#= provides tasklist:enabled
44
#= provides tasklist:disabled
55
#= provides tasklist:change
6-
#= provides tasklist:updateSend
7-
#= provides tasklist:updateComplete
86
#
9-
#= require jquery
107
#= require crema/events/pageupdate
11-
#= require rails/remote
128
#
139
# Enables Task List update behavior.
1410
#
@@ -23,7 +19,7 @@
2319
# </label>
2420
# </li>
2521
# </ul>
26-
# <form class="js-task-list-form">
22+
# <form>
2723
# <textarea class="js-task-list-field">- [ ] text</textarea>
2824
# </form>
2925
# </div>
@@ -34,32 +30,27 @@
3430
#
3531
# TaskList Items SHOULD be an a list (`UL`/`OL`) element.
3632
#
37-
# Task list items MUST match `input.task-list-item-checkbox[type=checkbox]`,
38-
# MUST be `disabled`, and MUST define `data-item-index`. The Item's contents
39-
# SHOULD be wrapped in a `LABEL` element.
33+
# Task list items MUST match `(input).task-list-item-checkbox`, MUST be
34+
# `disabled` by default and MUST define `data-item-index`. The Item's
35+
# contents SHOULD be wrapped in a `LABEL` element.
4036
#
41-
# TaskLists MUST have a `(form).js-task-list-form` containing a
42-
# `(textarea).js-task-list-field` form element whose `value` attribute is the
43-
# source (Markdown) to be udpated. The source MUST follow the syntax guidelines.
37+
# TaskLists MUST have a `(textarea).js-task-list-field` form element whose
38+
# `value` attribute is the source (Markdown) to be udpated. The source MUST
39+
# follow the syntax guidelines.
4440
#
45-
# TaskList updates SHOULD be handled asynchronosly with `data-remote`.
46-
# See: https://github.com/josh/rails-behaviors
41+
# TaskList updates trigger `tasklist:change` events.
4742
#
4843
# jQuery is required and the `$.pageUpdate` behavior MUST be available.
4944
#
5045
# ### Events
5146
#
5247
# When the TaskList field has been changed, a `tasklist:change` event is fired.
5348
#
54-
# Updating a task list item by clicking on the check box will send an
55-
# `tasklist:updateSend` event. Following the `ajaxComplete` event,
56-
# `tasklist:updateComplete` is triggered.
57-
#
5849
# ### NOTE
5950
#
6051
# Task list checkboxes are rendered as disabled by default because rendered
6152
# user content is cached without regard for the viewer. We enable checkboxes
62-
# on `pageUpdate` if the container has a `form.js-task-list-form`.
53+
# on `pageUpdate` if the container has a `(textarea).js-task-list-field`.
6354

6455
incomplete = "[ ]"
6556
complete = "[x]"
@@ -121,12 +112,9 @@ updateTaskListItem = (source, itemIndex, checked) ->
121112
line
122113
result.join("\n")
123114

124-
# Task list checkboxes are rendered as disabled by default
125-
# because rendered user content is cached without regard
126-
# for the viewer. Enables the checkboxes and applies the
127-
# correct list style, if the viewer is able to edit the comment.
115+
# Enables task list items to trigger updates.
128116
enableTaskList = ($container) ->
129-
if $container.find('.js-task-list-form').length > 0
117+
if $container.find('.js-task-list-field').length > 0
130118
$container.
131119
find('.task-list-item').addClass('enabled').
132120
find('.task-list-item-checkbox').attr('disabled', null)
@@ -138,12 +126,11 @@ disableTaskList = ($container) ->
138126
find('.task-list-item-checkbox').attr('disabled', 'disabled')
139127
$container.trigger 'tasklist:disabled'
140128

141-
# Submit updates to task list items asynchronously.
142-
# Successful updates won't require re-rendering to represent reality.
129+
# Updates the $field value to reflect the state of $item.
130+
# Triggers the `tasklist:change` event when the value has changed.
143131
updateTaskList = ($item) ->
144132
$container = $item.closest '.js-task-list-container'
145-
$form = $container.find '.js-task-list-form'
146-
$field = $form.find '.js-task-list-field'
133+
$field = $container.find '.js-task-list-field'
147134
index = parseInt $item.attr('data-item-index')
148135
checked = $item.prop 'checked'
149136

@@ -152,16 +139,17 @@ updateTaskList = ($item) ->
152139
$field.val updateTaskListItem($field.val(), index, checked)
153140
$field.trigger 'change'
154141
$field.trigger 'tasklist:change', [index, checked]
155-
$form.trigger 'tasklist:updateSend', [index, checked]
156-
$form.one 'ajaxComplete', ->
157-
enableTaskList $container
158-
$form.trigger 'tasklist:updateComplete'
159-
$form.submit()
160142

161143
# When the task list item checkbox is updated, submit the change
162144
$(document).on 'change', '.task-list-item-checkbox', ->
163145
updateTaskList $(this)
164146

147+
$(document).on 'tasklist:disable', '.js-task-list-container', (event) ->
148+
disableTaskList $(this)
149+
150+
$(document).on 'tasklist:enable', '.js-task-list-container', (event) ->
151+
enableTaskList $(this)
152+
165153
$.pageUpdate ->
166154
$('.js-task-list-container').each ->
167155
enableTaskList $(this)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#= require jquery
2+
#= require rails/remote
3+
#= require task_lists

test/functional/test_task_lists_behavior.html

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang="en">
33
<head>
44
<meta charset="utf-8">
5-
<script type="text/javascript" src="/assets/task_lists.js"></script>
5+
<script type="text/javascript" src="/assets/functional/helpers/remote.js"></script>
66
<script type="text/javascript">
77
function logEvent(event) {
88
console.log(event)
@@ -14,13 +14,18 @@
1414
$('.log').prepend("<li class='timestamp'><time>" + new Date + "</time></li>")
1515
}, 3000)
1616

17-
$(document).on('ajaxStart', logEvent)
18-
$(document).on('ajaxComplete', logEvent)
19-
2017
$(document).on('tasklist:enabled', logEvent)
2118
$(document).on('tasklist:disabled', logEvent)
22-
$(document).on('tasklist:updateSend', logEvent)
23-
$(document).on('tasklist:updateComplete', logEvent)
19+
$(document).on('tasklist:change', '.js-task-list-field', function(event){
20+
logEvent(event)
21+
$(this).closest('form').submit()
22+
})
23+
24+
$(document).on('ajaxStart', logEvent)
25+
$(document).on('ajaxSuccess', '.js-task-list-container', function(event){
26+
logEvent(event)
27+
$(this).pageUpdate() // reenables the task lists
28+
})
2429
</script>
2530

2631
<style>
@@ -69,7 +74,7 @@
6974
</li>
7075
</ul>
7176
</div>
72-
<form action="/update" class="js-task-list-form" data-remote data-type="json">
77+
<form action="/update" method="POST" data-remote data-type="json">
7378
<textarea name="comment[body]" class="js-task-list-field">- [ ] I'm a task list item</textarea>
7479
</form>
7580
</div>

test/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
<html lang="en">
33
<head>
44
<meta charset="utf-8">
5-
<link rel="stylesheet" href="/assets/test.css">
6-
<script type="text/javascript" src="/assets/test.js"></script>
5+
<link rel="stylesheet" href="/assets/units.css">
6+
<script type="text/javascript" src="/assets/units.js"></script>
77
</head>
88
<body>
99
<div id="qunit"></div>

test/unit/test_task_lists.coffee

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,13 @@ module "TaskLists",
1414
disabled: 'disabled'
1515
"data-item-index": 1
1616

17-
@form = $ '<form>', class: 'js-task-list-form'
1817
@field = $ '<textarea>', class: 'js-task-list-field', "- [ ] text"
1918

2019
@item.append @checkbox
2120
@list.append @item
2221
@container.append @list
2322

24-
@form.append @field
25-
@container.append @form
26-
27-
@form.on 'submit', (event) ->
28-
event.preventDefault()
23+
@container.append @field
2924

3025
$('#qunit-fixture').append(@container).pageUpdate()
3126

File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)