task-manager 0.1.1

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 (69) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +4 -0
  3. data/Rakefile +27 -0
  4. data/app/assets/images/task-manager/icons/add.png +0 -0
  5. data/app/assets/images/task-manager/icons/delete.png +0 -0
  6. data/app/assets/images/task-manager/icons/edit.png +0 -0
  7. data/app/assets/javascripts/task-manager/application.js +43 -0
  8. data/app/assets/javascripts/task-manager/extjs/app/controller/Plans.js +359 -0
  9. data/app/assets/javascripts/task-manager/extjs/app/controller/Tasks.js +56 -0
  10. data/app/assets/javascripts/task-manager/extjs/app/helper/application_helper.js +24 -0
  11. data/app/assets/javascripts/task-manager/extjs/app/model/Assignee.js +19 -0
  12. data/app/assets/javascripts/task-manager/extjs/app/model/Plan.js +195 -0
  13. data/app/assets/javascripts/task-manager/extjs/app/model/Task.js +23 -0
  14. data/app/assets/javascripts/task-manager/extjs/app/store/Assignees.js +53 -0
  15. data/app/assets/javascripts/task-manager/extjs/app/store/AssigneesTree.js +3 -0
  16. data/app/assets/javascripts/task-manager/extjs/app/store/Booleans.js +9 -0
  17. data/app/assets/javascripts/task-manager/extjs/app/store/Days.js +38 -0
  18. data/app/assets/javascripts/task-manager/extjs/app/store/Hours.js +31 -0
  19. data/app/assets/javascripts/task-manager/extjs/app/store/Minutes.js +67 -0
  20. data/app/assets/javascripts/task-manager/extjs/app/store/Months.js +19 -0
  21. data/app/assets/javascripts/task-manager/extjs/app/store/Plans.js +6 -0
  22. data/app/assets/javascripts/task-manager/extjs/app/store/QuarterlyMonths.js +10 -0
  23. data/app/assets/javascripts/task-manager/extjs/app/store/Statuses.js +11 -0
  24. data/app/assets/javascripts/task-manager/extjs/app/store/Tasks.js +6 -0
  25. data/app/assets/javascripts/task-manager/extjs/app/store/Types.js +12 -0
  26. data/app/assets/javascripts/task-manager/extjs/app/store/WeekDays.js +14 -0
  27. data/app/assets/javascripts/task-manager/extjs/app/view/plan/AssignablesWindow.js +23 -0
  28. data/app/assets/javascripts/task-manager/extjs/app/view/plan/Edit.js +189 -0
  29. data/app/assets/javascripts/task-manager/extjs/app/view/plan/EditWindow.js +21 -0
  30. data/app/assets/javascripts/task-manager/extjs/app/view/plan/Grid.js +92 -0
  31. data/app/assets/javascripts/task-manager/extjs/app/view/plan/Index.js +24 -0
  32. data/app/assets/javascripts/task-manager/extjs/app/view/plan/New.js +190 -0
  33. data/app/assets/javascripts/task-manager/extjs/app/view/plan/Search.js +132 -0
  34. data/app/assets/javascripts/task-manager/extjs/app/view/plan/SelectAssignables.js +22 -0
  35. data/app/assets/javascripts/task-manager/extjs/app/view/plan/SelectAssignablesGrid.js +22 -0
  36. data/app/assets/javascripts/task-manager/extjs/app/view/plan/SelectAssignablesTree.js +9 -0
  37. data/app/assets/javascripts/task-manager/extjs/app/view/plan/Window.js +21 -0
  38. data/app/assets/javascripts/task-manager/extjs/app/view/task/Grid.js +62 -0
  39. data/app/assets/javascripts/task-manager/extjs/app/view/task/Index.js +21 -0
  40. data/app/assets/javascripts/task-manager/extjs/app/view/task/Search.js +148 -0
  41. data/app/assets/javascripts/task-manager/extjs/lib/ux/MultiSelectablePagingGrid.js +20 -0
  42. data/app/assets/javascripts/task-manager/extjs/lib/ux/RowExpander.js +230 -0
  43. data/app/assets/stylesheets/task-manager/application.css.scss +13 -0
  44. data/app/assets/stylesheets/task-manager/extjs.css.scss +43 -0
  45. data/app/controllers/task_manager/api/v1/plans_controller.rb +251 -0
  46. data/app/controllers/task_manager/api/v1/tasks_controller.rb +82 -0
  47. data/app/controllers/task_manager/application_controller.rb +4 -0
  48. data/app/helpers/task_manager/application_helper.rb +4 -0
  49. data/app/models/task_manager/assignable.rb +10 -0
  50. data/app/models/task_manager/callable.rb +10 -0
  51. data/app/models/task_manager/plan.rb +114 -0
  52. data/app/models/task_manager/task.rb +81 -0
  53. data/app/serializers/task_manager/plan_serializer.rb +8 -0
  54. data/app/serializers/task_manager/task_serializer.rb +8 -0
  55. data/app/views/layouts/task-manager/application.html.erb +14 -0
  56. data/config/routes.rb +8 -0
  57. data/db/migrate/20121102054723_setup_hstore.rb +9 -0
  58. data/db/migrate/20121102055137_create_task_manager_plans.rb +16 -0
  59. data/db/migrate/20121102142657_create_task_manager_assignables.rb +13 -0
  60. data/db/migrate/20121102150720_create_task_manager_callables.rb +13 -0
  61. data/db/migrate/20121105170602_create_task_manager_tasks.rb +18 -0
  62. data/lib/task-manager.rb +37 -0
  63. data/lib/task-manager/api_constraints.rb +12 -0
  64. data/lib/task-manager/deadline_calculator.rb +22 -0
  65. data/lib/task-manager/deadline_validator.rb +27 -0
  66. data/lib/task-manager/engine.rb +5 -0
  67. data/lib/task-manager/version.rb +3 -0
  68. data/lib/tasks/task-manager_tasks.rake +4 -0
  69. metadata +327 -0
@@ -0,0 +1,81 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module TaskManager
3
+ class Task < ActiveRecord::Base
4
+ extend Enumerize
5
+
6
+ has_one :assignable, as: :target
7
+ has_many :callables, as: :target
8
+
9
+ enumerize :task_type, in: [:daily, :weekly, :monthly, :quarterly, :yearly]
10
+ enumerize :status, in: [:new, :in_process, :expired, :finished]
11
+
12
+ serialize :data, ActiveRecord::Coders::Hstore
13
+
14
+ default_value_for :status, :new
15
+
16
+ attr_accessible :data, :deadline, :name, :reminding_at, :status, :task_type, :finished_at
17
+
18
+ validates_presence_of :name, :task_type, :status, :assignable, :deadline
19
+
20
+ def assignee
21
+ assignable.assignee
22
+ end
23
+
24
+ def callbacks
25
+ callables.collect(&:callback)
26
+ end
27
+
28
+ def remindable?
29
+ return false if reminding_at.nil?
30
+
31
+ (status == :new || status == :in_process) &&
32
+ (deadline - reminding_at) / 60 >= 2 * 24 * 60 * 60
33
+ end
34
+
35
+ def next_reminding_at
36
+ if remindable?
37
+ seconds = (deadline - reminding_at) / 60
38
+
39
+ reminding_at.since(seconds)
40
+ end
41
+ end
42
+
43
+ # 提醒任务执行者,任务即将到期,并且修改任务下次提醒时间。
44
+ # 如果`next_reminding_at`返回`nil`,则表示该任务不再需要提醒。
45
+ def remind
46
+ Task.transaction do
47
+ assignee.remind_of_expiring_task(self) if assignee.respond_to?(:remind_of_expiring_task)
48
+
49
+ update_attributes!(reminding_at: next_reminding_at)
50
+ end
51
+ end
52
+
53
+ def expire
54
+ Task.transaction do
55
+ callbacks.each do |c|
56
+ c.call(self) if c.respond_to?(:call)
57
+ end
58
+
59
+ update_attributes!(status: :expired)
60
+ end
61
+ end
62
+
63
+ def finish
64
+ update_attributes(finished_at: Time.now, status: :finished)
65
+ end
66
+
67
+ class << self
68
+ def active
69
+ where("status = ? OR status = ?", :new, :in_process)
70
+ end
71
+
72
+ def just_expired
73
+ active.where("deadline <= ?", Time.now)
74
+ end
75
+
76
+ def remindable
77
+ active.where("reminding_at <= ?", Time.now)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,8 @@
1
+ module TaskManager
2
+ class PlanSerializer < ActiveModel::Serializer
3
+ attributes :id, :name, :plan_type, :data, :enabled_at,
4
+ :begin_to_remind, :autocompletable, :created_at, :updated_at
5
+
6
+ has_many :assignees
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module TaskManager
2
+ class TaskSerializer < ActiveModel::Serializer
3
+ attributes :id, :name, :task_type, :data, :status,
4
+ :deadline, :created_at, :updated_at
5
+
6
+ has_one :assignee
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>TaskManager</title>
5
+ <%= stylesheet_link_tag "task-manager/application", :media => "all" %>
6
+ <%= javascript_include_tag "task-manager/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,8 @@
1
+ TaskManager::Engine.routes.draw do
2
+ namespace :api, defaults: { format: 'json' } do
3
+ scope module: :v1, constraints: TaskManager::ApiConstraints.new(version: 1, default: true) do
4
+ resources :plans, only: [:index, :create, :update, :destroy]
5
+ resources :tasks, only: [:index, :destroy]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class SetupHstore < ActiveRecord::Migration
2
+ def self.up
3
+ execute "CREATE EXTENSION IF NOT EXISTS hstore"
4
+ end
5
+
6
+ def self.down
7
+ execute "DROP EXTENSION IF EXISTS hstore"
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ class CreateTaskManagerPlans < ActiveRecord::Migration
2
+ def change
3
+ create_table :task_manager_plans do |t|
4
+ t.string :name
5
+ t.hstore :data
6
+ t.boolean :autocompletable
7
+ t.string :plan_type
8
+ t.integer :begin_to_remind
9
+
10
+ t.timestamp :enabled_at
11
+ t.timestamp :last_task_created_at
12
+
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ class CreateTaskManagerAssignables < ActiveRecord::Migration
2
+ def change
3
+ create_table :task_manager_assignables do |t|
4
+ t.belongs_to :target, polymorphic: true
5
+ t.belongs_to :assignee, polymorphic: true
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :task_manager_assignables, [:assignee_id, :assignee_type]
11
+ add_index :task_manager_assignables, [:target_id, :target_type]
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class CreateTaskManagerCallables < ActiveRecord::Migration
2
+ def change
3
+ create_table :task_manager_callables do |t|
4
+ t.belongs_to :callback, polymorphic: true
5
+ t.belongs_to :target, polymorphic: true
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :task_manager_callables, [:callback_id, :callback_type]
11
+ add_index :task_manager_callables, [:target_id, :target_type]
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ class CreateTaskManagerTasks < ActiveRecord::Migration
2
+ def change
3
+ create_table :task_manager_tasks do |t|
4
+ t.string :name
5
+ t.string :task_type
6
+ t.string :status
7
+
8
+ t.hstore :data
9
+
10
+ t.timestamp :deadline
11
+ t.timestamp :reminding_at
12
+
13
+ t.timestamp :finished_at
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "enumerize"
4
+ require "default_value_for"
5
+ require "active_model_serializers"
6
+
7
+ require "task-manager/api_constraints"
8
+ require "task-manager/engine"
9
+ require "task-manager/deadline_calculator"
10
+ require "task-manager/deadline_validator"
11
+
12
+ module TaskManager
13
+
14
+ # 创建计划任务
15
+ #
16
+ # 首先,获取所有需要生成计划任务的计划,参见{TaskManager::Plan.active}。
17
+ # 然后调用{TaskManager::Plan#generate_tasks}生成计划任务。
18
+ def self.generate_tasks
19
+ Plan.active.collect(&:generate_tasks).flatten
20
+ end
21
+
22
+ # 找到刚刚过期的计划任务,然后调用{TaskManager::Task#expire}。
23
+ def self.expire_tasks
24
+ tasks = Task.just_expired
25
+ tasks.each(&:expire)
26
+
27
+ tasks
28
+ end
29
+
30
+ # 通知任务执行者,任务即将到期。参见{TaskManager::Task#remind}
31
+ def self.remind_assignees_of_expiring_tasks
32
+ tasks = Task.remindable
33
+ tasks.each(&:remind)
34
+
35
+ tasks
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module TaskManager
2
+ class ApiConstraints
3
+ def initialize(options)
4
+ @version = options[:version]
5
+ @default = options[:default]
6
+ end
7
+
8
+ def matches?(req)
9
+ @default || req.headers['Accept'].include?("application/vnd.menglifang.com.cn; version=#{@version}")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ module TaskManager
2
+ module DeadlineCalculator
3
+ def calculate_deadline(type, opts)
4
+ type = convert_type(type)
5
+ opts.symbolize_keys!
6
+
7
+ beginning = Time.now.send("beginning_of_#{type}")
8
+ beginning.
9
+ months_since(opts[:deadline_month].to_i).
10
+ since(opts[:deadline_day].to_i * 24 * 60 * 60).
11
+ since(opts[:deadline_hour].to_i * 60 * 60).
12
+ since(opts[:deadline_minute].to_i * 60)
13
+ end
14
+
15
+ private
16
+ def convert_type(type)
17
+ return :day if type.to_sym == :daily
18
+
19
+ type.to_s.gsub(/ly/, '').to_sym
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ class DeadlineValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ type = get_type(record)
4
+ if type.blank?
5
+ record.errors[:type] << (options[:message] || 'invalid type')
6
+ else
7
+ record.errors[attribute] << (options[:message] || "deadline_hour is required") if value.blank? || value[:deadline_hour].blank?
8
+ record.errors[attribute] << (options[:message] || "deadline_minute is required") if value.blank? || value[:deadline_minute].blank?
9
+
10
+ case type.to_sym
11
+ when :weekly, :monthly
12
+ record.errors[attribute] << (options[:message] || "deadline_day is required in a #{type} plan") if value.blank? || value[:deadline_day].blank?
13
+ when :quarterly, :yearly
14
+ record.errors[attribute] << (options[:message] || "deadline_month is required in a #{type} plan") if value.blank? || value[:deadline_month].blank?
15
+ record.errors[attribute] << (options[:message] || "deadline_day is required in a #{type} plan") if value.blank? || value[:deadline_day].blank?
16
+ else
17
+ record.errors[attribute] << (options[:message] || "invalid type!") unless type.to_sym == :daily
18
+ end
19
+ end
20
+ end
21
+
22
+ def get_type(record)
23
+ return record.type if record.respond_to?(:type)
24
+
25
+ record.send("#{record.class.name.demodulize.underscore}_type")
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ module TaskManager
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace TaskManager
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module TaskManager
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :task-manager do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,327 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: task-manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Beijing Menglifang Network Science and Technology CO.,Ltd.
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.8
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.8
30
+ - !ruby/object:Gem::Dependency
31
+ name: ransack
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: kaminari
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: activerecord-postgres-hstore
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.4.1
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.4.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: enumerize
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.5.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.5.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: default_value_for
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 2.0.1
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 2.0.1
110
+ - !ruby/object:Gem::Dependency
111
+ name: active_model_serializers
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.6.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.6.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: pg
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rspec-rails
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: factory_girl_rails
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: pry
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: shoulda-matchers
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: fivemat
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ description: TaskManager can help you to manage your routine tasks effectually.
223
+ email:
224
+ - dev@menglifang.org
225
+ executables: []
226
+ extensions: []
227
+ extra_rdoc_files: []
228
+ files:
229
+ - app/assets/images/task-manager/icons/add.png
230
+ - app/assets/images/task-manager/icons/delete.png
231
+ - app/assets/images/task-manager/icons/edit.png
232
+ - app/assets/javascripts/task-manager/application.js
233
+ - app/assets/javascripts/task-manager/extjs/app/controller/Plans.js
234
+ - app/assets/javascripts/task-manager/extjs/app/controller/Tasks.js
235
+ - app/assets/javascripts/task-manager/extjs/app/helper/application_helper.js
236
+ - app/assets/javascripts/task-manager/extjs/app/model/Assignee.js
237
+ - app/assets/javascripts/task-manager/extjs/app/model/Plan.js
238
+ - app/assets/javascripts/task-manager/extjs/app/model/Task.js
239
+ - app/assets/javascripts/task-manager/extjs/app/store/Assignees.js
240
+ - app/assets/javascripts/task-manager/extjs/app/store/AssigneesTree.js
241
+ - app/assets/javascripts/task-manager/extjs/app/store/Booleans.js
242
+ - app/assets/javascripts/task-manager/extjs/app/store/Days.js
243
+ - app/assets/javascripts/task-manager/extjs/app/store/Hours.js
244
+ - app/assets/javascripts/task-manager/extjs/app/store/Minutes.js
245
+ - app/assets/javascripts/task-manager/extjs/app/store/Months.js
246
+ - app/assets/javascripts/task-manager/extjs/app/store/Plans.js
247
+ - app/assets/javascripts/task-manager/extjs/app/store/QuarterlyMonths.js
248
+ - app/assets/javascripts/task-manager/extjs/app/store/Statuses.js
249
+ - app/assets/javascripts/task-manager/extjs/app/store/Tasks.js
250
+ - app/assets/javascripts/task-manager/extjs/app/store/Types.js
251
+ - app/assets/javascripts/task-manager/extjs/app/store/WeekDays.js
252
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/AssignablesWindow.js
253
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/Edit.js
254
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/EditWindow.js
255
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/Grid.js
256
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/Index.js
257
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/New.js
258
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/Search.js
259
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/SelectAssignables.js
260
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/SelectAssignablesGrid.js
261
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/SelectAssignablesTree.js
262
+ - app/assets/javascripts/task-manager/extjs/app/view/plan/Window.js
263
+ - app/assets/javascripts/task-manager/extjs/app/view/task/Grid.js
264
+ - app/assets/javascripts/task-manager/extjs/app/view/task/Index.js
265
+ - app/assets/javascripts/task-manager/extjs/app/view/task/Search.js
266
+ - app/assets/javascripts/task-manager/extjs/lib/ux/MultiSelectablePagingGrid.js
267
+ - app/assets/javascripts/task-manager/extjs/lib/ux/RowExpander.js
268
+ - app/assets/stylesheets/task-manager/application.css.scss
269
+ - app/assets/stylesheets/task-manager/extjs.css.scss
270
+ - app/controllers/task_manager/api/v1/plans_controller.rb
271
+ - app/controllers/task_manager/api/v1/tasks_controller.rb
272
+ - app/controllers/task_manager/application_controller.rb
273
+ - app/helpers/task_manager/application_helper.rb
274
+ - app/models/task_manager/assignable.rb
275
+ - app/models/task_manager/callable.rb
276
+ - app/models/task_manager/plan.rb
277
+ - app/models/task_manager/task.rb
278
+ - app/serializers/task_manager/plan_serializer.rb
279
+ - app/serializers/task_manager/task_serializer.rb
280
+ - app/views/layouts/task-manager/application.html.erb
281
+ - config/routes.rb
282
+ - db/migrate/20121102054723_setup_hstore.rb
283
+ - db/migrate/20121102055137_create_task_manager_plans.rb
284
+ - db/migrate/20121102142657_create_task_manager_assignables.rb
285
+ - db/migrate/20121102150720_create_task_manager_callables.rb
286
+ - db/migrate/20121105170602_create_task_manager_tasks.rb
287
+ - lib/task-manager/api_constraints.rb
288
+ - lib/task-manager/deadline_calculator.rb
289
+ - lib/task-manager/deadline_validator.rb
290
+ - lib/task-manager/engine.rb
291
+ - lib/task-manager/version.rb
292
+ - lib/task-manager.rb
293
+ - lib/tasks/task-manager_tasks.rake
294
+ - MIT-LICENSE
295
+ - Rakefile
296
+ - README.md
297
+ homepage: https://github.com/menglifang/task-manager
298
+ licenses: []
299
+ post_install_message:
300
+ rdoc_options: []
301
+ require_paths:
302
+ - lib
303
+ required_ruby_version: !ruby/object:Gem::Requirement
304
+ none: false
305
+ requirements:
306
+ - - ! '>='
307
+ - !ruby/object:Gem::Version
308
+ version: '0'
309
+ segments:
310
+ - 0
311
+ hash: 3200132327859687953
312
+ required_rubygems_version: !ruby/object:Gem::Requirement
313
+ none: false
314
+ requirements:
315
+ - - ! '>='
316
+ - !ruby/object:Gem::Version
317
+ version: '0'
318
+ segments:
319
+ - 0
320
+ hash: 3200132327859687953
321
+ requirements: []
322
+ rubyforge_project:
323
+ rubygems_version: 1.8.24
324
+ signing_key:
325
+ specification_version: 3
326
+ summary: With TaskManager, you can manage and trace your routine tasks.
327
+ test_files: []