taskwarrior-web 1.0.8 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
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