taskwarrior-web 1.1.10 → 1.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Guardfile +0 -3
- data/config.ru +1 -3
- data/lib/taskwarrior-web/app.rb +2 -2
- data/lib/taskwarrior-web/config/navigation.rb +1 -1
- data/lib/taskwarrior-web/helpers.rb +4 -0
- data/lib/taskwarrior-web/model/task.rb +4 -0
- data/lib/taskwarrior-web/public/css/styles.css +5 -0
- data/lib/taskwarrior-web/public/js/application.js +18 -0
- data/lib/taskwarrior-web/version.rb +1 -1
- data/lib/taskwarrior-web/views/partials/_flash.erb +1 -1
- data/lib/taskwarrior-web/views/projects/index.erb +7 -9
- data/lib/taskwarrior-web/views/projects/show.erb +8 -9
- data/lib/taskwarrior-web/views/tasks/_form.erb +1 -1
- data/lib/taskwarrior-web/views/tasks/index.erb +2 -2
- data/spec/app/app_spec.rb +12 -12
- data/spec/app/helpers_spec.rb +6 -9
- data/spec/model/task_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e9612d9c9cee0c532430c68bf9b66a1cfbaaa6f
|
4
|
+
data.tar.gz: da7c54198ac489b756efcb9d71f9649a5bace0ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa6f01caf1480aad08d527d0f62b2263a57b19713620ee100dc375ec78e6f144d5ff0016c7d1bddcd713b864812c8903a9f18714415e9e507c57948a7d930de0
|
7
|
+
data.tar.gz: 0e6c15697f13a35d706a3dc8e39942cc1700275a35a6bd7021fe8d687fabed31714f2fd3a31a2e22200cc7227cae247a8e9d4d182361c7776e9464665010b1f7
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## v1.1.11 (7/15/13)
|
2
|
+
|
3
|
+
* Rethinking the tasks that are included in project lists. Now, they include
|
4
|
+
completed and waiting tasks as well, with visual distinctions.
|
5
|
+
* Misc small fixes
|
6
|
+
|
1
7
|
## v1.1.10 (6/28/13)
|
2
8
|
|
3
9
|
* Added ability to specify "wait" property for tasks
|
data/Guardfile
CHANGED
data/config.ru
CHANGED
data/lib/taskwarrior-web/app.rb
CHANGED
@@ -132,7 +132,7 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
132
132
|
get '/projects/overview/?' do
|
133
133
|
@title = 'Projects'
|
134
134
|
@tasks = TaskwarriorWeb::Task.query('status.not' => :deleted, 'project.not' => '')
|
135
|
-
.sort_by! { |t| [-t.urgency.to_f, t.priority.nil?.to_s, t.priority.to_s, t.due.nil?.to_s, t.due.to_s] }
|
135
|
+
.sort_by! { |t| [t.active? ? 0 : 1, -t.urgency.to_f, t.priority.nil?.to_s, t.priority.to_s, t.due.nil?.to_s, t.due.to_s] }
|
136
136
|
.group_by { |t| t.project.to_s }
|
137
137
|
.reject { |project, tasks| tasks.select { |task| task.status == 'pending' }.empty? }
|
138
138
|
erb :'projects/index'
|
@@ -141,7 +141,7 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
141
141
|
get '/projects/:name/?' do
|
142
142
|
@title = unlinkify(params[:name])
|
143
143
|
@tasks = TaskwarriorWeb::Task.query('status.not' => :deleted, :project => @title)
|
144
|
-
.sort_by! { |t| [-t.urgency.to_f, t.priority.nil?.to_s, t.priority.to_s, t.due.nil?.to_s, t.due.to_s] }
|
144
|
+
.sort_by! { |t| [t.active? ? 0 : 1, -t.urgency.to_f, t.priority.nil?.to_s, t.priority.to_s, t.due.nil?.to_s, t.due.to_s] }
|
145
145
|
erb :'projects/show'
|
146
146
|
end
|
147
147
|
|
@@ -10,7 +10,7 @@ SimpleNavigation::Configuration.run do |navigation|
|
|
10
10
|
tasks.item :completed, 'Completed', '/tasks/completed'
|
11
11
|
tasks.item :deleted, 'Deleted', '/tasks/deleted'
|
12
12
|
end
|
13
|
-
primary.item :projects, 'Projects', '/projects' do |projects|
|
13
|
+
primary.item :projects, 'Projects', '/projects', { :highlights_on => %r{/projects/?.+?} } do |projects|
|
14
14
|
projects.dom_class = 'nav nav-pills'
|
15
15
|
projects.item :overview, 'Overview', '/projects/overview'
|
16
16
|
end
|
@@ -58,6 +58,10 @@ module TaskwarriorWeb
|
|
58
58
|
@_errors.empty?
|
59
59
|
end
|
60
60
|
|
61
|
+
def active?
|
62
|
+
status.in? ['pending', 'waiting']
|
63
|
+
end
|
64
|
+
|
61
65
|
def to_hash
|
62
66
|
Hash[instance_variables.select { |var| !var.to_s.start_with?('@_') }.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }]
|
63
67
|
end
|
@@ -64,6 +64,11 @@ html, body { height: 100%; }
|
|
64
64
|
#push, #footer { height: 70px; }
|
65
65
|
#footer .container > * { margin: 20px 0; }
|
66
66
|
|
67
|
+
tr.completed td { text-decoration: line-through; }
|
68
|
+
|
69
|
+
/** Prevents crud links from being broken onto lines **/
|
70
|
+
span.crud-links { white-space: nowrap; }
|
71
|
+
|
67
72
|
/** Icon spacing **/
|
68
73
|
h2.project i { vertical-align: 35%; }
|
69
74
|
span.crud-links i { margin-top: 4px; }
|
@@ -6,6 +6,7 @@ $(document).ready(function() {
|
|
6
6
|
initTablesort();
|
7
7
|
initAnnotationsModal();
|
8
8
|
initUjs();
|
9
|
+
initAutoclose();
|
9
10
|
refreshDockBadge();
|
10
11
|
|
11
12
|
// Hack to account for navbar when clicking anchor links.
|
@@ -144,6 +145,10 @@ var initTablesort = function() {
|
|
144
145
|
};
|
145
146
|
|
146
147
|
var initAnnotationsModal = function() {
|
148
|
+
$('#annotations-modal').on('shown', function() {
|
149
|
+
$(this).find('[name="annotation[description]"]').focus();
|
150
|
+
});
|
151
|
+
|
147
152
|
$(document).on('click', 'a.annotation-add', function(event) {
|
148
153
|
event.preventDefault();
|
149
154
|
$.get($(this).attr('href') + '.json', function(data) {
|
@@ -167,6 +172,19 @@ var initUjs = function() {
|
|
167
172
|
});
|
168
173
|
};
|
169
174
|
|
175
|
+
/**
|
176
|
+
* Anything that has a "data-autoclose" attribute will fade out after the given
|
177
|
+
* number of milliseconds.
|
178
|
+
*/
|
179
|
+
var initAutoclose = function() {
|
180
|
+
$('[data-autoclose]').each(function(index, element) {
|
181
|
+
$element = $(element);
|
182
|
+
setTimeout(function() {
|
183
|
+
$element.fadeOut(function() { $(this).remove(); });
|
184
|
+
}, $element.data('autoclose'))
|
185
|
+
})
|
186
|
+
};
|
187
|
+
|
170
188
|
// Count updating.
|
171
189
|
|
172
190
|
var refreshDockBadge = function() {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div id="flash-messages">
|
2
2
|
<% flash_types.select{ |severity| flash.has?(severity) }.each do |severity| %>
|
3
|
-
<div class="alert alert-<%= severity %>"
|
3
|
+
<div class="alert alert-<%= severity %>"<% if severity == :success %> data-autoclose="5000"<% end %>>
|
4
4
|
<button type="button" class="close" data-dismiss="alert">×</button>
|
5
5
|
<%= flash[severity] %>
|
6
6
|
</div>
|
@@ -30,15 +30,13 @@
|
|
30
30
|
</thead>
|
31
31
|
<tbody>
|
32
32
|
<% tasks.each do |task| %>
|
33
|
-
|
34
|
-
<
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
</tr>
|
41
|
-
<% end %>
|
33
|
+
<tr class="<%= colorize_date(task.due) if task.active? %> <%= task.status %>">
|
34
|
+
<td><%= task.description %></td>
|
35
|
+
<td><%= format_date(task.due) unless task.due.nil? %></td>
|
36
|
+
<td><%= format_tags(task.tags) unless task.tags.nil? %></td>
|
37
|
+
<td><%= task.priority unless task.priority.nil? %></td>
|
38
|
+
<% if @can_edit %><td><%= crud_links(task) if task.active? %></td><% end %>
|
39
|
+
</tr>
|
42
40
|
<% end %>
|
43
41
|
</tbody>
|
44
42
|
</table>
|
@@ -13,15 +13,14 @@
|
|
13
13
|
</thead>
|
14
14
|
<tbody>
|
15
15
|
<% @tasks.each do |task| %>
|
16
|
-
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<% end %>
|
16
|
+
<tr class="<%= colorize_date(task.due) if task.active? %> <%= task.status %>">
|
17
|
+
<td><%= task.description %></td>
|
18
|
+
<td><%= format_date(task.due) unless task.due.nil? %></td>
|
19
|
+
<td><%= format_tags(task.tags) unless task.tags.nil? %></td>
|
20
|
+
<td><%= task.tags.join(', ') unless task.tags.nil? %></td>
|
21
|
+
<td><%= task.priority unless task.priority.nil? %></td>
|
22
|
+
<% if @can_edit %><td><%= crud_links(task) if task.active? %></td><% end %>
|
23
|
+
</tr>
|
25
24
|
<% end %>
|
26
25
|
</tbody>
|
27
26
|
</table>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<label for="task-wait" class="control-label">Hide until</label>
|
24
24
|
<div class="controls">
|
25
25
|
<input class="date-picker" type="text" id="task-wait" name="task[wait]" value="<%= format_date(@task.wait) unless @task.nil? || @task.wait.blank? %>" data-date-format="<%= @date_format %>" />
|
26
|
-
<span class="help-block">If specified, the task will appear in the "Waiting
|
26
|
+
<span class="help-block">If specified, the task will appear in the <a href="/tasks/waiting">Waiting</a> list until the given date.</span>
|
27
27
|
</div>
|
28
28
|
</div>
|
29
29
|
|
@@ -24,7 +24,7 @@
|
|
24
24
|
</thead>
|
25
25
|
<tbody>
|
26
26
|
<% @tasks.each do |task| %>
|
27
|
-
<tr<%= %{ class="#{colorize_date(task.due)}"} if
|
27
|
+
<tr<%= %{ class="#{colorize_date(task.due)}"} if task.active? %>>
|
28
28
|
<% if params[:status] == 'pending' %>
|
29
29
|
<td><input type="checkbox" class="complete" data-task-id="<%= task.uuid %>" /></td>
|
30
30
|
<% end %>
|
@@ -45,7 +45,7 @@
|
|
45
45
|
<td><a href="/projects/<%= linkify(task.project) %>"><%= task.project %></a></td>
|
46
46
|
<td><%= format_date(task.due) unless task.due.nil? %></td>
|
47
47
|
<% if params[:status] == 'waiting' %><td><%= format_date(task.wait) unless task.wait.nil? %></td><% end %>
|
48
|
-
<td><%= task.tags
|
48
|
+
<td><%= format_tags(task.tags) unless task.tags.nil? %></td>
|
49
49
|
<td><%= task.priority unless task.priority.nil? %></td>
|
50
50
|
<% if can_edit %><td><%= crud_links(task) %></td><% end %>
|
51
51
|
</tr>
|
data/spec/app/app_spec.rb
CHANGED
@@ -11,9 +11,9 @@ describe TaskwarriorWeb::App do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
before do
|
14
|
-
TaskwarriorWeb::Config.
|
15
|
-
TaskwarriorWeb::Config.
|
16
|
-
TaskwarriorWeb::Runner.
|
14
|
+
allow(TaskwarriorWeb::Config).to receive(:property).with('task-web.user').and_return(nil)
|
15
|
+
allow(TaskwarriorWeb::Config).to receive(:property).with('task-web.filter').and_return(nil)
|
16
|
+
allow(TaskwarriorWeb::Runner).to receive(:run).and_return('{}')
|
17
17
|
end
|
18
18
|
|
19
19
|
['/', '/tasks'].each do |path|
|
@@ -70,7 +70,7 @@ describe TaskwarriorWeb::App do
|
|
70
70
|
|
71
71
|
it 'should render the task form' do
|
72
72
|
task = TaskwarriorWeb::Task.new({:tags => 'tag1, tag2'})
|
73
|
-
TaskwarriorWeb::Task.
|
73
|
+
allow(TaskwarriorWeb::Task).to receive(:new).and_return(task)
|
74
74
|
post '/tasks', :task => {}
|
75
75
|
last_response.body.should have_tag('form') do
|
76
76
|
with_tag('input', :with => { :name => 'task[tags]' , :value => 'tag1, tag2' })
|
@@ -79,7 +79,7 @@ describe TaskwarriorWeb::App do
|
|
79
79
|
|
80
80
|
it 'should display errors messages' do
|
81
81
|
task = TaskwarriorWeb::Task.new
|
82
|
-
TaskwarriorWeb::Task.
|
82
|
+
allow(TaskwarriorWeb::Task).to receive(:new).and_return(task)
|
83
83
|
post '/tasks', :task => {}
|
84
84
|
last_response.body.should have_tag('.alert-error')
|
85
85
|
end
|
@@ -160,7 +160,7 @@ describe TaskwarriorWeb::App do
|
|
160
160
|
describe 'DELETE /tasks/:uuid' do
|
161
161
|
context 'given a non-existant task' do
|
162
162
|
it 'should return a 404' do
|
163
|
-
TaskwarriorWeb::Task.
|
163
|
+
allow(TaskwarriorWeb::Task).to receive(:find).and_return(nil)
|
164
164
|
delete '/tasks/429897527'
|
165
165
|
last_response.should be_not_found
|
166
166
|
end
|
@@ -193,7 +193,7 @@ describe TaskwarriorWeb::App do
|
|
193
193
|
|
194
194
|
describe 'GET /projects/:name' do
|
195
195
|
it 'should replace characters in the title' do
|
196
|
-
TaskwarriorWeb::Task.
|
196
|
+
allow(TaskwarriorWeb::Task).to receive(:query).and_return([])
|
197
197
|
get '/projects/Test--Project'
|
198
198
|
last_response.body.should include('<title>Test.Project')
|
199
199
|
end
|
@@ -277,14 +277,14 @@ describe 'HTTP authentication' do
|
|
277
277
|
end
|
278
278
|
|
279
279
|
before do
|
280
|
-
TaskwarriorWeb::Config.
|
281
|
-
TaskwarriorWeb::Runner.
|
280
|
+
allow(TaskwarriorWeb::Config).to receive(:property).with('task-web.filter').and_return(nil)
|
281
|
+
allow(TaskwarriorWeb::Runner).to receive(:run).and_return('{}')
|
282
282
|
end
|
283
283
|
|
284
284
|
context 'when credentials are specified in .taskrc' do
|
285
285
|
before do
|
286
|
-
TaskwarriorWeb::Config.
|
287
|
-
TaskwarriorWeb::Config.
|
286
|
+
allow(TaskwarriorWeb::Config).to receive(:property).with('task-web.user').and_return('test_user')
|
287
|
+
allow(TaskwarriorWeb::Config).to receive(:property).with('task-web.passwd').and_return('test_pass')
|
288
288
|
end
|
289
289
|
|
290
290
|
it 'should ask for authentication' do
|
@@ -307,7 +307,7 @@ describe 'HTTP authentication' do
|
|
307
307
|
|
308
308
|
context 'when no credentials are specified in .taskrc' do
|
309
309
|
before do
|
310
|
-
TaskwarriorWeb::Config.
|
310
|
+
allow(TaskwarriorWeb::Config).to receive(:property).with('task-web.user').and_return(nil)
|
311
311
|
end
|
312
312
|
|
313
313
|
it 'should bypass authentication' do
|
data/spec/app/helpers_spec.rb
CHANGED
@@ -11,11 +11,8 @@ describe TaskwarriorWeb::App::Helpers do
|
|
11
11
|
|
12
12
|
describe '#format_date' do
|
13
13
|
context 'with no format specified' do
|
14
|
-
before do
|
15
|
-
TaskwarriorWeb::Config.should_receive(:dateformat).any_number_of_times.and_return(nil)
|
16
|
-
end
|
17
|
-
|
18
14
|
it 'should format various dates and times to the default format' do
|
15
|
+
allow(TaskwarriorWeb::Config).to receive(:dateformat).and_return(nil)
|
19
16
|
helpers.format_date('2012-01-11 12:23:00').should eq('1/11/2012')
|
20
17
|
helpers.format_date('2012-01-11').should eq('1/11/2012')
|
21
18
|
helpers.format_date('20121231T230000Z').should eq(Time.parse('20121231T230000Z').localtime.strftime('%-m/%-d/%Y'))
|
@@ -25,13 +22,13 @@ describe TaskwarriorWeb::App::Helpers do
|
|
25
22
|
|
26
23
|
context 'with a specified date format' do
|
27
24
|
it 'should format dates using the specified format' do
|
28
|
-
TaskwarriorWeb::Config.
|
25
|
+
allow(TaskwarriorWeb::Config).to receive(:dateformat).and_return('%d/%-m/%Y')
|
29
26
|
helpers.format_date('2012-12-11 12:23:00').should eq('11/12/2012')
|
30
27
|
helpers.format_date('2012-12-11').should eq('11/12/2012')
|
31
28
|
end
|
32
29
|
|
33
30
|
it 'should convert Taskwarrior formats to Ruby formats correctly' do
|
34
|
-
TaskwarriorWeb::Config.
|
31
|
+
allow(TaskwarriorWeb::Config).to receive(:store).and_return({ 'dateformat' => 'd/m/Y' })
|
35
32
|
helpers.format_date('2012-01-11 12:23:00').should eq('11/1/2012')
|
36
33
|
helpers.format_date('2012-12-02 12:23:00').should eq('2/12/2012')
|
37
34
|
end
|
@@ -48,7 +45,7 @@ describe TaskwarriorWeb::App::Helpers do
|
|
48
45
|
|
49
46
|
context 'with a due setting specified' do
|
50
47
|
before do
|
51
|
-
TaskwarriorWeb::Config.
|
48
|
+
allow(TaskwarriorWeb::Config).to receive(:due).and_return(3)
|
52
49
|
end
|
53
50
|
|
54
51
|
it 'should return "warning" when a given date is today' do
|
@@ -60,14 +57,14 @@ describe TaskwarriorWeb::App::Helpers do
|
|
60
57
|
end
|
61
58
|
|
62
59
|
it 'should return "success" when a date is within the specified range' do
|
63
|
-
TaskwarriorWeb::Config.
|
60
|
+
allow(TaskwarriorWeb::Config).to receive(:due).and_return(5)
|
64
61
|
helpers.colorize_date(Date.tomorrow.to_s).should eq('success')
|
65
62
|
end
|
66
63
|
end
|
67
64
|
|
68
65
|
context 'with no due setting specified' do
|
69
66
|
before do
|
70
|
-
TaskwarriorWeb::Config.
|
67
|
+
allow(TaskwarriorWeb::Config).to receive(:due).and_return(nil)
|
71
68
|
end
|
72
69
|
|
73
70
|
it 'should use the default setting of 7 days' do
|
data/spec/model/task_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'taskwarrior-web/model/task'
|
|
3
3
|
|
4
4
|
describe TaskwarriorWeb::Task do
|
5
5
|
RSpec::Mocks::setup(TaskwarriorWeb::Runner)
|
6
|
-
TaskwarriorWeb::Runner.
|
6
|
+
TaskwarriorWeb::Runner.double(:run) { '{}' }
|
7
7
|
|
8
8
|
describe '#initialize' do
|
9
9
|
it 'should assign the passed attributes' do
|
data/spec/spec_helper.rb
CHANGED
@@ -16,7 +16,6 @@ Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].e
|
|
16
16
|
|
17
17
|
RSpec.configure do |config|
|
18
18
|
config.mock_with :rspec
|
19
|
-
config.include(RSpec::Mocks::Methods)
|
20
19
|
end
|
21
20
|
|
22
21
|
SimpleNavigation.config_file_paths << File.dirname(__FILE__) + '/../lib/taskwarrior-web/config'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taskwarrior-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jake Bell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|