task-manager 0.1.4 → 0.1.5
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.
- data/app/assets/javascripts/task-manager/extjs/app/controller/Plans.js +24 -2
- data/app/assets/javascripts/task-manager/extjs/app/controller/Tasks.js +17 -4
- data/app/assets/javascripts/task-manager/extjs/app/store/Plans.js +0 -1
- data/app/assets/javascripts/task-manager/extjs/app/store/Tasks.js +1 -2
- data/app/assets/javascripts/task-manager/extjs/app/view/assignee/TreeCombo.js +1 -0
- data/app/assets/javascripts/task-manager/extjs/app/view/callback/CheckboxCombo.js +1 -1
- data/app/assets/javascripts/task-manager/extjs/app/view/plan/Form.js +13 -13
- data/app/assets/javascripts/task-manager/extjs/app/view/plan/Grid.js +5 -2
- data/app/assets/javascripts/task-manager/extjs/app/view/task/Grid.js +1 -1
- data/app/assets/javascripts/task-manager/extjs/lib/ux/CheckboxListCombo.js +0 -1
- data/app/models/task_manager/plan.rb +4 -2
- data/lib/task-manager/version.rb +1 -1
- metadata +4 -4
@@ -19,8 +19,15 @@ Ext.define('TM.controller.Plans', {
|
|
19
19
|
}, {
|
20
20
|
ref: 'planForm',
|
21
21
|
selector: 'plan_form'
|
22
|
+
}, {
|
23
|
+
ref: 'planGrid',
|
24
|
+
selector: 'plan_grid'
|
22
25
|
}],
|
23
26
|
|
27
|
+
index: function() {
|
28
|
+
this.render('TM.view.plan.Index');
|
29
|
+
},
|
30
|
+
|
24
31
|
init: function() {
|
25
32
|
this.control({
|
26
33
|
'plan_search button[action="query"]': {
|
@@ -38,6 +45,9 @@ Ext.define('TM.controller.Plans', {
|
|
38
45
|
'plan_grid button[action="delete"]': {
|
39
46
|
click: this.onDeleteClick
|
40
47
|
},
|
48
|
+
'plan_grid': {
|
49
|
+
render: this.onGridRender
|
50
|
+
},
|
41
51
|
'plan_form button[action="save"]': {
|
42
52
|
click: this.onSaveClick
|
43
53
|
},
|
@@ -47,10 +57,12 @@ Ext.define('TM.controller.Plans', {
|
|
47
57
|
});
|
48
58
|
},
|
49
59
|
|
60
|
+
// @protected
|
50
61
|
onAddClick: function() {
|
51
62
|
Ext.create('TM.view.plan.FormWindow', { title: '添加计划' }).show();
|
52
63
|
},
|
53
64
|
|
65
|
+
// @protected
|
54
66
|
onEditClick: function(btn) {
|
55
67
|
var length = btn.up('plan_grid').getSelectionModel().getSelection().length;
|
56
68
|
if (length == 0) {
|
@@ -70,6 +82,7 @@ Ext.define('TM.controller.Plans', {
|
|
70
82
|
this.getPlanForm().loadRecord(record);
|
71
83
|
},
|
72
84
|
|
85
|
+
// @protected
|
73
86
|
onDeleteClick: function(btn) {
|
74
87
|
var select = btn.up('plan_grid').getSelectionModel().getSelection()[0];
|
75
88
|
if(select == null) {
|
@@ -87,6 +100,7 @@ Ext.define('TM.controller.Plans', {
|
|
87
100
|
});
|
88
101
|
},
|
89
102
|
|
103
|
+
// @protected
|
90
104
|
onSaveClick: function(btn) {
|
91
105
|
var self = this;
|
92
106
|
var attrs = this.getPlanForm().getValues();
|
@@ -97,6 +111,8 @@ Ext.define('TM.controller.Plans', {
|
|
97
111
|
record.save({
|
98
112
|
success: function() {
|
99
113
|
Ext.Msg.alert('提示', '保存计划成功!');
|
114
|
+
|
115
|
+
self.getPlanGrid().reconfigure();
|
100
116
|
self.getPlanFormWindow().close();
|
101
117
|
},
|
102
118
|
failure: function() {
|
@@ -105,20 +121,26 @@ Ext.define('TM.controller.Plans', {
|
|
105
121
|
});
|
106
122
|
},
|
107
123
|
|
124
|
+
// @protected
|
108
125
|
onCancelClick: function(btn) {
|
109
126
|
this.getPlanFormWindow().close();
|
110
127
|
},
|
111
128
|
|
129
|
+
// @protected
|
112
130
|
onQueryClick: function(btn) {
|
113
131
|
var params = this.getSearchForm().getValues();
|
114
132
|
Ext.getStore('TM.store.Plans').load({ params: params });
|
115
133
|
},
|
116
134
|
|
135
|
+
// @protected
|
117
136
|
onSearchResetClick: function(btn) {
|
118
137
|
this.getSearchForm().getForm().reset();
|
119
138
|
},
|
120
139
|
|
121
|
-
|
122
|
-
|
140
|
+
// @protected
|
141
|
+
onGridRender: function(grid) {
|
142
|
+
if(grid.getStore().getCount() <= 0) {
|
143
|
+
grid.getStore().load();
|
144
|
+
}
|
123
145
|
}
|
124
146
|
});
|
@@ -8,6 +8,10 @@ Ext.define('TM.controller.Tasks', {
|
|
8
8
|
selector: 'task_search'
|
9
9
|
}],
|
10
10
|
|
11
|
+
index: function() {
|
12
|
+
this.render('TM.view.task.Index');
|
13
|
+
},
|
14
|
+
|
11
15
|
init: function() {
|
12
16
|
this.control({
|
13
17
|
'task_search button[action="query"]': {
|
@@ -18,19 +22,25 @@ Ext.define('TM.controller.Tasks', {
|
|
18
22
|
},
|
19
23
|
'task_grid button[action="delete"]': {
|
20
24
|
click: this.onDeleteClick
|
21
|
-
}
|
25
|
+
},
|
26
|
+
'task_grid': {
|
27
|
+
render: this.onGridRender
|
28
|
+
}
|
22
29
|
});
|
23
30
|
},
|
24
31
|
|
32
|
+
// @protected
|
25
33
|
onQueryClick: function(btn) {
|
26
34
|
var params = this.getSearchForm().getValues();
|
27
35
|
Ext.getStore('TM.store.Tasks').load({ params: params });
|
28
36
|
},
|
29
37
|
|
38
|
+
// @protected
|
30
39
|
onSearchResetClick: function(btn) {
|
31
40
|
this.getSearchForm().getForm().reset();
|
32
41
|
},
|
33
42
|
|
43
|
+
// @protected
|
34
44
|
onDeleteClick: function(btn) {
|
35
45
|
var select = btn.up('task_grid').getSelectionModel().getSelection()[0];
|
36
46
|
if(select == null) {
|
@@ -50,7 +60,10 @@ Ext.define('TM.controller.Tasks', {
|
|
50
60
|
});
|
51
61
|
},
|
52
62
|
|
53
|
-
|
54
|
-
|
55
|
-
|
63
|
+
// @protected
|
64
|
+
onGridRender: function(grid) {
|
65
|
+
if(grid.getStore().getCount() <= 0) {
|
66
|
+
grid.getStore().load();
|
67
|
+
}
|
68
|
+
}
|
56
69
|
});
|
@@ -5,7 +5,7 @@ Ext.define('TM.view.callback.CheckboxCombo', {
|
|
5
5
|
getSubmitValue: function() {
|
6
6
|
var callbacks = [];
|
7
7
|
|
8
|
-
Ext.Array.forEach(this.value, function(c, i) {
|
8
|
+
Ext.Array.forEach(this.value || [], function(c, i) {
|
9
9
|
callbacks.push({
|
10
10
|
callback_id: c,
|
11
11
|
callback_type: Ext.getStore('TM.store.Callbacks').getAt(0).get('class_name')
|
@@ -2,10 +2,6 @@ Ext.define('TM.view.plan.Form', {
|
|
2
2
|
extend: 'Ext.form.Panel',
|
3
3
|
xtype: 'plan_form',
|
4
4
|
|
5
|
-
//requires: [
|
6
|
-
//'Ext.ux.TreeCombo',
|
7
|
-
//],
|
8
|
-
|
9
5
|
defaultPlanType: 'yearly',
|
10
6
|
defaultBeginToRemind: 0,
|
11
7
|
|
@@ -29,28 +25,30 @@ Ext.define('TM.view.plan.Form', {
|
|
29
25
|
},
|
30
26
|
|
31
27
|
items: [{
|
32
|
-
fieldLabel: '
|
28
|
+
fieldLabel: '名称',
|
33
29
|
name: 'name',
|
34
30
|
allowBlank: false
|
35
31
|
}, {
|
36
32
|
xtype: 'assignee_treecombo',
|
37
|
-
fieldLabel: '
|
33
|
+
fieldLabel: '执行人',
|
38
34
|
name: 'assignables_attributes',
|
39
35
|
store: Ext.getStore('TM.store.Assignees').toTreeStore()
|
40
36
|
}, {
|
41
|
-
fieldLabel: '
|
37
|
+
fieldLabel: '类型',
|
42
38
|
name: 'plan_type',
|
43
39
|
store: 'TM.store.Types',
|
44
40
|
editable: false,
|
45
41
|
valueField: 'value',
|
46
42
|
xtype: 'combo',
|
47
|
-
blankText: '
|
43
|
+
blankText: '请选择类型!',
|
48
44
|
allowBlank: false
|
49
45
|
}, {
|
50
46
|
fieldLabel: '横向指标',
|
47
|
+
emptyText: '请用逗号分割指标项',
|
51
48
|
name: 'data.x'
|
52
49
|
}, {
|
53
50
|
fieldLabel: '纵向指标',
|
51
|
+
emptyText: '请用逗号分割指标项',
|
54
52
|
name: 'data.y'
|
55
53
|
}, {
|
56
54
|
fieldLabel: '生效时间',
|
@@ -60,15 +58,14 @@ Ext.define('TM.view.plan.Form', {
|
|
60
58
|
format: 'Y/m/d',
|
61
59
|
name: 'enabled_at'
|
62
60
|
}, {
|
63
|
-
fieldLabel: '
|
64
|
-
emptyText: '计划完成前多少天开始提醒,此处为倒计时。',
|
61
|
+
fieldLabel: '提前几天提醒',
|
65
62
|
name: 'begin_to_remind'
|
66
63
|
}, {
|
67
64
|
fieldLabel: '是否自动完成',
|
68
65
|
xtype: 'checkbox',
|
69
66
|
name: 'autocompletable'
|
70
67
|
}, {
|
71
|
-
fieldLabel: '
|
68
|
+
fieldLabel: '逾期处理',
|
72
69
|
xtype: 'callback_checkboxcombo',
|
73
70
|
editable: false,
|
74
71
|
name: 'callables_attributes',
|
@@ -80,7 +77,7 @@ Ext.define('TM.view.plan.Form', {
|
|
80
77
|
}, {
|
81
78
|
xtype: 'fieldset',
|
82
79
|
itemId: 'deadline',
|
83
|
-
title: '
|
80
|
+
title: '截止时间',
|
84
81
|
layout: {
|
85
82
|
type: 'table',
|
86
83
|
columns: 2
|
@@ -142,6 +139,8 @@ Ext.define('TM.view.plan.Form', {
|
|
142
139
|
delete values['data.' + name];
|
143
140
|
}, this);
|
144
141
|
|
142
|
+
values.begin_to_remind = values.begin_to_remind * 24 * 60;
|
143
|
+
|
145
144
|
return values;
|
146
145
|
},
|
147
146
|
|
@@ -158,6 +157,8 @@ Ext.define('TM.view.plan.Form', {
|
|
158
157
|
this.query('textfield[name="data.' + name + '"]')[0].setValue(record.get('data')[name]);
|
159
158
|
}, this);
|
160
159
|
|
160
|
+
this.query('textfield[name="begin_to_remind"]')[0].setValue(record.get('begin_to_remind') / (24 * 60));
|
161
|
+
|
161
162
|
this.checkSelectedAssignees(record.get('assignees'));
|
162
163
|
this.checkSelectedCallbacks(record.get('callbacks'));
|
163
164
|
},
|
@@ -210,7 +211,6 @@ Ext.define('TM.view.plan.Form', {
|
|
210
211
|
}
|
211
212
|
}, this);
|
212
213
|
|
213
|
-
//console.log(values);
|
214
214
|
this.getAssigneesTreeCombo().setValue(values);
|
215
215
|
},
|
216
216
|
|
@@ -69,7 +69,7 @@ Ext.define('TM.view.plan.Grid', {
|
|
69
69
|
},
|
70
70
|
flex: 3
|
71
71
|
}, {
|
72
|
-
text: '
|
72
|
+
text: '逾期处理',
|
73
73
|
renderer: function(v, m, record) {
|
74
74
|
var names = new Array();
|
75
75
|
Ext.Array.forEach(record.get('callbacks'), function(callback, index) {names.push(callback.name)});
|
@@ -89,8 +89,11 @@ Ext.define('TM.view.plan.Grid', {
|
|
89
89
|
},
|
90
90
|
flex: 1
|
91
91
|
}, {
|
92
|
-
text: '
|
92
|
+
text: '提前几天提醒',
|
93
93
|
dataIndex: 'begin_to_remind',
|
94
|
+
renderer: function(v, m, record) {
|
95
|
+
return v / (24 * 60);
|
96
|
+
},
|
94
97
|
flex: 1
|
95
98
|
}]
|
96
99
|
});
|
@@ -120,7 +120,6 @@ Ext.define('Ext.ux.form.CheckboxListCombo', {
|
|
120
120
|
}
|
121
121
|
me.resumeEvents();// resume events, though selectAll & deselectAll send them anyway
|
122
122
|
me.view.resumeEvents();
|
123
|
-
console.log("CheckboxComboList.changed: " + allState + " / " + nChecked);
|
124
123
|
}
|
125
124
|
}
|
126
125
|
}
|
@@ -61,7 +61,7 @@ module TaskManager
|
|
61
61
|
|
62
62
|
Task.create! do |t|
|
63
63
|
t.name = name
|
64
|
-
t.data = {
|
64
|
+
t.data = data.select{ |k, v| !(k.to_s.start_with?('deadline_')) }
|
65
65
|
t.task_type = plan_type
|
66
66
|
t.deadline = calculate_deadline(plan_type, data)
|
67
67
|
t.reminding_at = reminding_at
|
@@ -118,7 +118,9 @@ module TaskManager
|
|
118
118
|
when :yearly then now.beginning_of_year
|
119
119
|
end
|
120
120
|
|
121
|
-
squeel{ (plan_type == type) &
|
121
|
+
squeel{ (plan_type == type) &
|
122
|
+
((last_task_created_at <= beginning_at) | (last_task_created_at == nil)) &
|
123
|
+
(enabled_at <= now) }
|
122
124
|
end
|
123
125
|
end
|
124
126
|
end
|
data/lib/task-manager/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: task-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -324,7 +324,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
324
324
|
version: '0'
|
325
325
|
segments:
|
326
326
|
- 0
|
327
|
-
hash:
|
327
|
+
hash: -419505164111857855
|
328
328
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
329
329
|
none: false
|
330
330
|
requirements:
|
@@ -333,7 +333,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
333
333
|
version: '0'
|
334
334
|
segments:
|
335
335
|
- 0
|
336
|
-
hash:
|
336
|
+
hash: -419505164111857855
|
337
337
|
requirements: []
|
338
338
|
rubyforge_project:
|
339
339
|
rubygems_version: 1.8.24
|