taskwarrior-web 1.0.8 → 1.0.9

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.
Files changed (30) hide show
  1. data/CHANGELOG.md +6 -0
  2. data/README.md +5 -1
  3. data/lib/taskwarrior-web/app.rb +14 -41
  4. data/lib/taskwarrior-web/helpers.rb +1 -1
  5. data/lib/taskwarrior-web/public/css/datepicker.css +230 -112
  6. data/lib/taskwarrior-web/public/js/application.js +2 -1
  7. data/lib/taskwarrior-web/public/js/bootstrap-datepicker.js +570 -135
  8. data/lib/taskwarrior-web/{command_builders → services/builder}/base.rb +3 -3
  9. data/lib/taskwarrior-web/{command_builders → services/builder}/v1.rb +1 -2
  10. data/lib/taskwarrior-web/{command_builders → services/builder}/v2.rb +0 -0
  11. data/lib/taskwarrior-web/{command_builder.rb → services/builder.rb} +3 -3
  12. data/lib/taskwarrior-web/{parser → services/parser}/csv.rb +0 -0
  13. data/lib/taskwarrior-web/{parser → services/parser}/json.rb +0 -0
  14. data/lib/taskwarrior-web/{parser.rb → services/parser.rb} +2 -2
  15. data/lib/taskwarrior-web/{runner.rb → services/runner.rb} +0 -0
  16. data/lib/taskwarrior-web/task.rb +11 -1
  17. data/lib/taskwarrior-web/views/projects.erb +31 -33
  18. data/lib/taskwarrior-web/views/task_form.erb +4 -4
  19. data/lib/taskwarrior-web.rb +3 -3
  20. data/spec/app/app_spec.rb +68 -1
  21. data/spec/app/helpers_spec.rb +6 -0
  22. data/spec/models/task_spec.rb +20 -0
  23. data/spec/{models/command_builders → services/builder}/base_spec.rb +19 -2
  24. data/spec/{models/command_builders → services/builder}/v1_spec.rb +7 -4
  25. data/spec/{models/command_builder_spec.rb → services/builder_spec.rb} +1 -1
  26. data/spec/services/parser_spec.rb +14 -0
  27. data/spec/{models → services}/runner_spec.rb +1 -1
  28. data/taskwarrior-web.gemspec +1 -1
  29. metadata +39 -39
  30. data/spec/models/command_builders/v2_spec.rb +0 -0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## v1.0.9 (11/19/12)
2
+
3
+ * Fixed bug on projects listing page where projects with no pending tasks were
4
+ being shown.
5
+ * Updated datepicker library, much better
6
+
1
7
  ## v1.0.8 (11/18/12)
2
8
 
3
9
  * Better layout for projects listing page.
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  A lightweight, Sinatra-based web interface for the
4
4
  wonderful [Taskwarrior](http://taskwarrior.org/) todo application.
5
5
 
6
- **Now compatible with all versions of Taskwarrior, including 2.x**
6
+ **Now compatible with all versions of Taskwarrior, including 2.x**
7
7
  **Also, now including a NEW theme based on Twitter Bootstrap. Mobile version
8
8
  forthcoming!**
9
9
 
@@ -13,6 +13,10 @@ forthcoming!**
13
13
 
14
14
  * `ruby` >= 1.9 (support for `ruby` < 1.9 is very unlikely, but pull requests
15
15
  are gladly accepted).
16
+ * In your `.taskrc` file, `xterm.title` cannot be enabled. Either remove that
17
+ line from `.taskrc` or set it to `off`. If you have a very compelling reason
18
+ for needing this to be enabled, submit a bug report and I'll reconsider
19
+ adding support for it.
16
20
 
17
21
  ## Installation
18
22
 
@@ -53,28 +53,20 @@ class TaskwarriorWeb::App < Sinatra::Base
53
53
 
54
54
  get '/tasks/new/?' do
55
55
  @title = 'New Task'
56
- @date_format = TaskwarriorWeb::Config.dateformat || 'm/d/yy'
57
- @date_format.gsub!('Y', 'yy')
56
+ @date_format = (TaskwarriorWeb::Config.dateformat || 'm/d/yy').gsub('Y', 'yy')
58
57
  erb :task_form
59
58
  end
60
59
 
61
60
  post '/tasks/?' do
62
- results = passes_validation(params[:task], :task)
63
- if results.empty?
64
- task = TaskwarriorWeb::Task.new(params[:task])
65
- task.save!.to_s
61
+ @task = TaskwarriorWeb::Task.new(params[:task])
62
+
63
+ if @task.is_valid?
64
+ @task.save!
66
65
  redirect '/tasks'
67
- else
68
- @task = params[:task]
69
- @title = 'New Task'
70
- @date_format = TaskwarriorWeb::Config.dateformat || 'm/d/yy'
71
- @date_format.gsub!('Y', 'yy')
72
- @messages = []
73
- results.each do |result|
74
- @messages << { :severity => 'alert-error', :message => result }
75
- end
76
- erb :task_form
77
66
  end
67
+
68
+ @messages = @task.errors.map { |error| { :severity => 'alert-error', :message => error } }
69
+ call! env.merge('REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/tasks/new')
78
70
  end
79
71
 
80
72
  # Projects
@@ -85,14 +77,18 @@ class TaskwarriorWeb::App < Sinatra::Base
85
77
  get '/projects/overview/?' do
86
78
  @title = 'Projects'
87
79
  @subnav = subnav('projects')
88
- @tasks = TaskwarriorWeb::Task.query('status.not' => 'deleted', 'project.not' => '').sort_by! { |x| [x.priority.nil?.to_s, x.priority.to_s, x.due.nil?.to_s, x.due.to_s] }.group_by { |x| x.project.to_s }
80
+ @tasks = TaskwarriorWeb::Task.query('status.not' => :deleted, 'project.not' => '')
81
+ .sort_by! { |x| [x.priority.nil?.to_s, x.priority.to_s, x.due.nil?.to_s, x.due.to_s] }
82
+ .group_by { |x| x.project.to_s }
83
+ .reject { |project, tasks| tasks.select { |task| task.status == 'pending' }.empty? }
89
84
  erb :projects
90
85
  end
91
86
 
92
87
  get '/projects/:name/?' do
93
88
  @subnav = subnav('projects')
94
89
  subbed = params[:name].gsub('--', '.')
95
- @tasks = TaskwarriorWeb::Task.query('status.not' => 'deleted', :project => subbed).sort_by! { |x| [x.priority.nil?.to_s, x.priority.to_s, x.due.nil?.to_s, x.due.to_s] }
90
+ @tasks = TaskwarriorWeb::Task.query('status.not' => 'deleted', :project => subbed)
91
+ .sort_by! { |x| [x.priority.nil?.to_s, x.priority.to_s, x.due.nil?.to_s, x.due.to_s] }
96
92
  @title = @tasks.select { |t| t.project.match(/^#{subbed}$/i) }.first.project
97
93
  erb :project
98
94
  end
@@ -102,18 +98,6 @@ class TaskwarriorWeb::App < Sinatra::Base
102
98
  TaskwarriorWeb::Command.new(:projects).run.split("\n").to_json
103
99
  end
104
100
 
105
- get '/ajax/tags/?' do
106
- tags = TaskwarriorWeb::Command.new(:tags).run.split("\n")
107
- tags.keep_if { |tag| tag.include?(params[:query]) }
108
-
109
- json = []
110
- tags.each do |tag|
111
- json << { :name => tag, :id => tag }
112
- end
113
-
114
- json.to_json
115
- end
116
-
117
101
  get '/ajax/count/?' do
118
102
  TaskwarriorWeb::Task.count(:status => :pending).to_s
119
103
  end
@@ -130,15 +114,4 @@ class TaskwarriorWeb::App < Sinatra::Base
130
114
  @referrer = request.referrer
131
115
  erb :'404'
132
116
  end
133
-
134
- def passes_validation(item, method)
135
- results = []
136
- case method
137
- when :task
138
- if item['description'].empty?
139
- results << 'You must provide a description'
140
- end
141
- end
142
- results
143
- end
144
117
  end
@@ -34,7 +34,7 @@ module TaskwarriorWeb::App::Helpers
34
34
 
35
35
  def subnav(type)
36
36
  case type
37
- when 'tasks' then
37
+ when 'tasks'
38
38
  { '/tasks/pending' => "Pending <span class=\"badge\">#{TaskwarriorWeb::Task.count(:status => :pending)}</span>",
39
39
  '/tasks/waiting' => "Waiting",
40
40
  '/tasks/completed' => "Completed",
@@ -1,156 +1,274 @@
1
1
  /*!
2
- * Datepicker for Bootstrap
3
- *
4
- * Copyright 2012 Stefan Petre
5
- * Licensed under the Apache License v2.0
6
- * http://www.apache.org/licenses/LICENSE-2.0
7
- *
8
- */
2
+ * Datepicker for Bootstrap
3
+ *
4
+ * Copyright 2012 Stefan Petre
5
+ * Improvements by Andrew Rowls
6
+ * Licensed under the Apache License v2.0
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ */
9
10
  .datepicker {
10
- top: 0;
11
- left: 0;
12
- padding: 4px;
13
- margin-top: 1px;
14
- -webkit-border-radius: 4px;
15
- -moz-border-radius: 4px;
16
- border-radius: 4px;
17
- /*.dow {
18
- border-top: 1px solid #ddd !important;
19
- }*/
11
+ top: 0;
12
+ left: 0;
13
+ padding: 4px;
14
+ margin-top: 1px;
15
+ -webkit-border-radius: 4px;
16
+ -moz-border-radius: 4px;
17
+ border-radius: 4px;
18
+ /*.dow {
19
+ border-top: 1px solid #ddd !important;
20
+ }*/
21
+
20
22
  }
21
23
  .datepicker:before {
22
- content: '';
23
- display: inline-block;
24
- border-left: 7px solid transparent;
25
- border-right: 7px solid transparent;
26
- border-bottom: 7px solid #ccc;
27
- border-bottom-color: rgba(0, 0, 0, 0.2);
28
- position: absolute;
29
- top: -7px;
30
- left: 6px;
24
+ content: '';
25
+ display: inline-block;
26
+ border-left: 7px solid transparent;
27
+ border-right: 7px solid transparent;
28
+ border-bottom: 7px solid #ccc;
29
+ border-bottom-color: rgba(0, 0, 0, 0.2);
30
+ position: absolute;
31
+ top: -7px;
32
+ left: 6px;
31
33
  }
32
34
  .datepicker:after {
33
- content: '';
34
- display: inline-block;
35
- border-left: 6px solid transparent;
36
- border-right: 6px solid transparent;
37
- border-bottom: 6px solid #ffffff;
38
- position: absolute;
39
- top: -6px;
40
- left: 7px;
35
+ content: '';
36
+ display: inline-block;
37
+ border-left: 6px solid transparent;
38
+ border-right: 6px solid transparent;
39
+ border-bottom: 6px solid #ffffff;
40
+ position: absolute;
41
+ top: -6px;
42
+ left: 7px;
41
43
  }
42
44
  .datepicker > div {
43
- display: none;
45
+ display: none;
46
+ }
47
+ .datepicker.days div.datepicker-days {
48
+ display: block;
49
+ }
50
+ .datepicker.months div.datepicker-months {
51
+ display: block;
52
+ }
53
+ .datepicker.years div.datepicker-years {
54
+ display: block;
44
55
  }
45
56
  .datepicker table {
46
- width: 100%;
47
- margin: 0;
57
+ margin: 0;
48
58
  }
49
- .datepicker td, .datepicker th {
50
- text-align: center;
51
- width: 20px;
52
- height: 20px;
53
- -webkit-border-radius: 4px;
54
- -moz-border-radius: 4px;
55
- border-radius: 4px;
59
+ .datepicker td,
60
+ .datepicker th {
61
+ text-align: center;
62
+ width: 20px;
63
+ height: 20px;
64
+ -webkit-border-radius: 4px;
65
+ -moz-border-radius: 4px;
66
+ border-radius: 4px;
56
67
  }
57
68
  .datepicker td.day:hover {
58
- background: #eeeeee;
59
- cursor: pointer;
60
- }
61
- .datepicker td.old, .datepicker td.new {
62
- color: #999999;
63
- }
64
- .datepicker td.active, .datepicker td.active:hover {
65
- background-color: #006dcc;
66
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
67
- background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
68
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
69
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
70
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
71
- background-image: linear-gradient(top, #0088cc, #0044cc);
72
- background-repeat: repeat-x;
73
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
74
- border-color: #0044cc #0044cc #002a80;
75
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
76
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
77
- color: #fff;
78
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
69
+ background: #eeeeee;
70
+ cursor: pointer;
71
+ }
72
+ .datepicker td.old,
73
+ .datepicker td.new {
74
+ color: #999999;
75
+ }
76
+ .datepicker td.disabled,
77
+ .datepicker td.disabled:hover {
78
+ background: none;
79
+ color: #999999;
80
+ cursor: default;
81
+ }
82
+ .datepicker td.today,
83
+ .datepicker td.today:hover,
84
+ .datepicker td.today.disabled,
85
+ .datepicker td.today.disabled:hover {
86
+ background-color: #fde19a;
87
+ background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
88
+ background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
89
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
90
+ background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
91
+ background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
92
+ background-image: linear-gradient(top, #fdd49a, #fdf59a);
93
+ background-repeat: repeat-x;
94
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
95
+ border-color: #fdf59a #fdf59a #fbed50;
96
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
97
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
98
+ }
99
+ .datepicker td.today:hover,
100
+ .datepicker td.today:hover:hover,
101
+ .datepicker td.today.disabled:hover,
102
+ .datepicker td.today.disabled:hover:hover,
103
+ .datepicker td.today:active,
104
+ .datepicker td.today:hover:active,
105
+ .datepicker td.today.disabled:active,
106
+ .datepicker td.today.disabled:hover:active,
107
+ .datepicker td.today.active,
108
+ .datepicker td.today:hover.active,
109
+ .datepicker td.today.disabled.active,
110
+ .datepicker td.today.disabled:hover.active,
111
+ .datepicker td.today.disabled,
112
+ .datepicker td.today:hover.disabled,
113
+ .datepicker td.today.disabled.disabled,
114
+ .datepicker td.today.disabled:hover.disabled,
115
+ .datepicker td.today[disabled],
116
+ .datepicker td.today:hover[disabled],
117
+ .datepicker td.today.disabled[disabled],
118
+ .datepicker td.today.disabled:hover[disabled] {
119
+ background-color: #fdf59a;
120
+ }
121
+ .datepicker td.today:active,
122
+ .datepicker td.today:hover:active,
123
+ .datepicker td.today.disabled:active,
124
+ .datepicker td.today.disabled:hover:active,
125
+ .datepicker td.today.active,
126
+ .datepicker td.today:hover.active,
127
+ .datepicker td.today.disabled.active,
128
+ .datepicker td.today.disabled:hover.active {
129
+ background-color: #fbf069 \9;
130
+ }
131
+ .datepicker td.active,
132
+ .datepicker td.active:hover,
133
+ .datepicker td.active.disabled,
134
+ .datepicker td.active.disabled:hover {
135
+ background-color: #006dcc;
136
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
137
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
138
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
139
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
140
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
141
+ background-image: linear-gradient(top, #0088cc, #0044cc);
142
+ background-repeat: repeat-x;
143
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
144
+ border-color: #0044cc #0044cc #002a80;
145
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
146
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
147
+ color: #fff;
148
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
79
149
  }
80
150
  .datepicker td.active:hover,
81
151
  .datepicker td.active:hover:hover,
152
+ .datepicker td.active.disabled:hover,
153
+ .datepicker td.active.disabled:hover:hover,
82
154
  .datepicker td.active:active,
83
155
  .datepicker td.active:hover:active,
156
+ .datepicker td.active.disabled:active,
157
+ .datepicker td.active.disabled:hover:active,
84
158
  .datepicker td.active.active,
85
159
  .datepicker td.active:hover.active,
160
+ .datepicker td.active.disabled.active,
161
+ .datepicker td.active.disabled:hover.active,
86
162
  .datepicker td.active.disabled,
87
163
  .datepicker td.active:hover.disabled,
164
+ .datepicker td.active.disabled.disabled,
165
+ .datepicker td.active.disabled:hover.disabled,
88
166
  .datepicker td.active[disabled],
89
- .datepicker td.active:hover[disabled] {
90
- background-color: #0044cc;
167
+ .datepicker td.active:hover[disabled],
168
+ .datepicker td.active.disabled[disabled],
169
+ .datepicker td.active.disabled:hover[disabled] {
170
+ background-color: #0044cc;
91
171
  }
92
172
  .datepicker td.active:active,
93
173
  .datepicker td.active:hover:active,
174
+ .datepicker td.active.disabled:active,
175
+ .datepicker td.active.disabled:hover:active,
94
176
  .datepicker td.active.active,
95
- .datepicker td.active:hover.active {
96
- background-color: #003399 \9;
177
+ .datepicker td.active:hover.active,
178
+ .datepicker td.active.disabled.active,
179
+ .datepicker td.active.disabled:hover.active {
180
+ background-color: #003399 \9;
97
181
  }
98
182
  .datepicker td span {
99
- display: block;
100
- width: 47px;
101
- height: 54px;
102
- line-height: 54px;
103
- float: left;
104
- margin: 2px;
105
- cursor: pointer;
106
- -webkit-border-radius: 4px;
107
- -moz-border-radius: 4px;
108
- border-radius: 4px;
183
+ display: block;
184
+ width: 23%;
185
+ height: 54px;
186
+ line-height: 54px;
187
+ float: left;
188
+ margin: 1%;
189
+ cursor: pointer;
190
+ -webkit-border-radius: 4px;
191
+ -moz-border-radius: 4px;
192
+ border-radius: 4px;
109
193
  }
110
194
  .datepicker td span:hover {
111
- background: #eeeeee;
112
- }
113
- .datepicker td span.active {
114
- background-color: #006dcc;
115
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
116
- background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
117
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
118
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
119
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
120
- background-image: linear-gradient(top, #0088cc, #0044cc);
121
- background-repeat: repeat-x;
122
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
123
- border-color: #0044cc #0044cc #002a80;
124
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
125
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
126
- color: #fff;
127
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
195
+ background: #eeeeee;
196
+ }
197
+ .datepicker td span.disabled,
198
+ .datepicker td span.disabled:hover {
199
+ background: none;
200
+ color: #999999;
201
+ cursor: default;
128
202
  }
203
+ .datepicker td span.active,
129
204
  .datepicker td span.active:hover,
205
+ .datepicker td span.active.disabled,
206
+ .datepicker td span.active.disabled:hover {
207
+ background-color: #006dcc;
208
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
209
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
210
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
211
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
212
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
213
+ background-image: linear-gradient(top, #0088cc, #0044cc);
214
+ background-repeat: repeat-x;
215
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
216
+ border-color: #0044cc #0044cc #002a80;
217
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
218
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
219
+ color: #fff;
220
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
221
+ }
222
+ .datepicker td span.active:hover,
223
+ .datepicker td span.active:hover:hover,
224
+ .datepicker td span.active.disabled:hover,
225
+ .datepicker td span.active.disabled:hover:hover,
130
226
  .datepicker td span.active:active,
227
+ .datepicker td span.active:hover:active,
228
+ .datepicker td span.active.disabled:active,
229
+ .datepicker td span.active.disabled:hover:active,
131
230
  .datepicker td span.active.active,
231
+ .datepicker td span.active:hover.active,
232
+ .datepicker td span.active.disabled.active,
233
+ .datepicker td span.active.disabled:hover.active,
132
234
  .datepicker td span.active.disabled,
133
- .datepicker td span.active[disabled] {
134
- background-color: #0044cc;
235
+ .datepicker td span.active:hover.disabled,
236
+ .datepicker td span.active.disabled.disabled,
237
+ .datepicker td span.active.disabled:hover.disabled,
238
+ .datepicker td span.active[disabled],
239
+ .datepicker td span.active:hover[disabled],
240
+ .datepicker td span.active.disabled[disabled],
241
+ .datepicker td span.active.disabled:hover[disabled] {
242
+ background-color: #0044cc;
135
243
  }
136
- .datepicker td span.active:active, .datepicker td span.active.active {
137
- background-color: #003399 \9;
244
+ .datepicker td span.active:active,
245
+ .datepicker td span.active:hover:active,
246
+ .datepicker td span.active.disabled:active,
247
+ .datepicker td span.active.disabled:hover:active,
248
+ .datepicker td span.active.active,
249
+ .datepicker td span.active:hover.active,
250
+ .datepicker td span.active.disabled.active,
251
+ .datepicker td span.active.disabled:hover.active {
252
+ background-color: #003399 \9;
138
253
  }
139
254
  .datepicker td span.old {
140
- color: #999999;
255
+ color: #999999;
141
256
  }
142
257
  .datepicker th.switch {
143
- width: 145px;
258
+ width: 145px;
259
+ }
260
+ .datepicker thead tr:first-child th,
261
+ .datepicker tfoot tr:first-child th {
262
+ cursor: pointer;
144
263
  }
145
- .datepicker thead tr:first-child th {
146
- cursor: pointer;
264
+ .datepicker thead tr:first-child th:hover,
265
+ .datepicker tfoot tr:first-child th:hover {
266
+ background: #eeeeee;
147
267
  }
148
- .datepicker thead tr:first-child th:hover {
149
- background: #eeeeee;
268
+ .input-append.date .add-on i,
269
+ .input-prepend.date .add-on i {
270
+ display: block;
271
+ cursor: pointer;
272
+ width: 16px;
273
+ height: 16px;
150
274
  }
151
- .input-append.date .add-on i, .input-prepend.date .add-on i {
152
- display: block;
153
- cursor: pointer;
154
- width: 16px;
155
- height: 16px;
156
- }
@@ -27,7 +27,8 @@ var refreshPageContents = function() {
27
27
 
28
28
  var initDatePicker = function() {
29
29
  $('.date-picker').datepicker({
30
- autoclose: true
30
+ autoclose: true,
31
+ todayBtn: 'linked'
31
32
  });
32
33
  };
33
34