jquery_gantt_rails 0.0.2
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 +15 -0
- data/.gitignore +74 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/jquery_gantt_rails.iml +9 -0
- data/.idea/misc.xml +22 -0
- data/.idea/modules.xml +9 -0
- data/.idea/scopes/scope_settings.xml +5 -0
- data/.idea/vcs.xml +7 -0
- data/.ruby-version.rb +1 -0
- data/Gemfile +3 -0
- data/README.md +41 -0
- data/Rakefile +1 -0
- data/jquery_gantt_rails.gemspec +20 -0
- data/lib/jquery_gantt_rails/version.rb +3 -0
- data/lib/jquery_gantt_rails/version.rb~ +3 -0
- data/lib/jquery_gantt_rails.rb +9 -0
- data/vendor/assets/javascripts/jquery_gantt/README.md +28 -0
- data/vendor/assets/javascripts/jquery_gantt/add.gif +0 -0
- data/vendor/assets/javascripts/jquery_gantt/alert.gif +0 -0
- data/vendor/assets/javascripts/jquery_gantt/closeBig.png +0 -0
- data/vendor/assets/javascripts/jquery_gantt/del.gif +0 -0
- data/vendor/assets/javascripts/jquery_gantt/edit.gif +0 -0
- data/vendor/assets/javascripts/jquery_gantt/gantt.css +323 -0
- data/vendor/assets/javascripts/jquery_gantt/gantt.html +547 -0
- data/vendor/assets/javascripts/jquery_gantt/ganttDrawer.js +752 -0
- data/vendor/assets/javascripts/jquery_gantt/ganttGridEditor.js +518 -0
- data/vendor/assets/javascripts/jquery_gantt/ganttMaster.js +702 -0
- data/vendor/assets/javascripts/jquery_gantt/ganttTask.js +947 -0
- data/vendor/assets/javascripts/jquery_gantt/ganttUtilities.js +237 -0
- data/vendor/assets/javascripts/jquery_gantt/gantt_compact.css +323 -0
- data/vendor/assets/javascripts/jquery_gantt/hasExternalDeps.png +0 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/JST/jquery.JST.js +167 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/date.js +584 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/dateField/images/next.png +0 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/dateField/images/prev.png +0 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/dateField/jquery.dateField.css +88 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/dateField/jquery.dateField.js +212 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/i18nJs.js +140 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/jquery.livequery.min.js +11 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/jquery.timers.js +142 -0
- data/vendor/assets/javascripts/jquery_gantt/libs/platform.js +954 -0
- data/vendor/assets/javascripts/jquery_gantt/linkArrow.png +0 -0
- data/vendor/assets/javascripts/jquery_gantt/milestone.png +0 -0
- data/vendor/assets/javascripts/jquery_gantt/platform.css +346 -0
- data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.eot +0 -0
- data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.otf +0 -0
- data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.svg +152 -0
- data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.ttf +0 -0
- data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.woff +0 -0
- data/vendor/assets/javascripts/jquery_gantt/teamworkFont.css +16 -0
- data/vendor/assets/javascripts/jquery_gantt/twGanttSmall.png +0 -0
- metadata +107 -0
@@ -0,0 +1,547 @@
|
|
1
|
+
<!DOCTYPE HTML>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE"/>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
6
|
+
<title>Teamwork</title>
|
7
|
+
|
8
|
+
<link rel=stylesheet href="platform.css" type="text/css">
|
9
|
+
<link rel=stylesheet href="libs/dateField/jquery.dateField.css" type="text/css">
|
10
|
+
<link rel=stylesheet href="gantt.css" type="text/css">
|
11
|
+
|
12
|
+
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
|
13
|
+
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
|
14
|
+
|
15
|
+
<script src="libs/jquery.livequery.min.js"></script>
|
16
|
+
<script src="libs/jquery.timers.js"></script>
|
17
|
+
<script src="libs/platform.js"></script>
|
18
|
+
<script src="libs/date.js"></script>
|
19
|
+
<script src="libs/i18nJs.js"></script>
|
20
|
+
<script src="libs/dateField/jquery.dateField.js"></script>
|
21
|
+
<script src="libs/JST/jquery.JST.js"></script>
|
22
|
+
|
23
|
+
<script src="ganttUtilities.js"></script>
|
24
|
+
<script src="ganttTask.js"></script>
|
25
|
+
<script src="ganttDrawer.js"></script>
|
26
|
+
<script src="ganttGridEditor.js"></script>
|
27
|
+
<script src="ganttMaster.js"></script>
|
28
|
+
|
29
|
+
</head>
|
30
|
+
<body style="background-color: #fff;">
|
31
|
+
|
32
|
+
|
33
|
+
<div id="ndo" style="position:absolute;right:5px;top:5px;width:378px;padding:5px;background-color: #FFF5E6; border:1px solid #F9A22F; font-size:12px">
|
34
|
+
This Gantt can be used in a complete project management solution - imports your Gantt and more - <a href="http://twproject.com" target="_blank">Teamwork: give it a try</a>.
|
35
|
+
</div>
|
36
|
+
<div id="workSpace" style="padding:0px; overflow-y:auto; overflow-x:hidden;border:1px solid #e5e5e5;position:relative;margin:0 5px"></div>
|
37
|
+
|
38
|
+
<div id="taZone" style="display:none;">
|
39
|
+
<textarea rows="8" cols="150" id="ta">
|
40
|
+
{"tasks":[
|
41
|
+
{"id":-1,"name":"Gantt editor","code":"","level":0,"status":"STATUS_ACTIVE","start":1346623200000,"duration":16,"end":1348523999999,"startIsMilestone":true,"endIsMilestone":false,"assigs":[]},
|
42
|
+
{"id":-2,"name":"coding","code":"","level":1,"status":"STATUS_ACTIVE","start":1346623200000,"duration":10,"end":1347659999999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"description":"","progress":0},
|
43
|
+
{"id":-3,"name":"gant part","code":"","level":2,"status":"STATUS_ACTIVE","start":1346623200000,"duration":2,"end":1346795999999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"depends":""},
|
44
|
+
{"id":-4,"name":"editor part","code":"","level":2,"status":"STATUS_SUSPENDED","start":1346796000000,"duration":4,"end":1347314399999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"depends":"3"},
|
45
|
+
{"id":-5,"name":"testing","code":"","level":1,"status":"STATUS_SUSPENDED","start":1347832800000,"duration":6,"end":1348523999999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"depends":"2:5","description":"","progress":0},
|
46
|
+
{"id":-6,"name":"test on safari","code":"","level":2,"status":"STATUS_SUSPENDED","start":1347832800000,"duration":2,"end":1348005599999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"depends":""},
|
47
|
+
{"id":-7,"name":"test on ie","code":"","level":2,"status":"STATUS_SUSPENDED","start":1348005600000,"duration":3,"end":1348264799999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"depends":"6"},
|
48
|
+
{"id":-8,"name":"test on chrome","code":"","level":2,"status":"STATUS_SUSPENDED","start":1348005600000,"duration":2,"end":1348178399999,"startIsMilestone":false,"endIsMilestone":false,"assigs":[],"depends":"6"}
|
49
|
+
],"selectedRow":0,"deletedTaskIds":[],"canWrite":true,"canWriteOnParent":true }
|
50
|
+
</textarea>
|
51
|
+
<button onclick="loadGanttFromServer();">load</button>
|
52
|
+
</div>
|
53
|
+
|
54
|
+
<style>
|
55
|
+
.resEdit {
|
56
|
+
padding: 15px;
|
57
|
+
}
|
58
|
+
|
59
|
+
.resLine {
|
60
|
+
width: 95%;
|
61
|
+
padding: 3px;
|
62
|
+
margin: 5px;
|
63
|
+
border: 1px solid #d0d0d0;
|
64
|
+
}
|
65
|
+
|
66
|
+
body {
|
67
|
+
overflow: hidden;
|
68
|
+
}
|
69
|
+
</style>
|
70
|
+
|
71
|
+
<form id="gimmeBack" style="display:none;" action="../gimmeBack.jsp" method="post" target="_blank"><input type="hidden" name="prj" id="gimBaPrj"></form>
|
72
|
+
|
73
|
+
<script type="text/javascript">
|
74
|
+
|
75
|
+
var ge; //this is the hugly but very friendly global var for the gantt editor
|
76
|
+
$(function() {
|
77
|
+
|
78
|
+
//load templates
|
79
|
+
$("#ganttemplates").loadTemplates();
|
80
|
+
|
81
|
+
// here starts gantt initialization
|
82
|
+
ge = new GanttMaster();
|
83
|
+
var workSpace = $("#workSpace");
|
84
|
+
workSpace.css({width:$(window).width() - 20,height:$(window).height() - 100});
|
85
|
+
ge.init(workSpace);
|
86
|
+
|
87
|
+
//inject some buttons (for this demo only)
|
88
|
+
$(".ganttButtonBar div").append("<button onclick='clearGantt();' class='button'>clear</button>")
|
89
|
+
.append(" ")
|
90
|
+
.append("<button onclick='openResourceEditor();' class='button'>edit resources</button>")
|
91
|
+
.append("<button onclick='getFile();' class='button'>export</button>");
|
92
|
+
$(".ganttButtonBar h1").html("<img src='twGanttSmall.png'>");
|
93
|
+
$(".ganttButtonBar div").addClass('buttons');
|
94
|
+
//overwrite with localized ones
|
95
|
+
loadI18n();
|
96
|
+
|
97
|
+
//simulate a data load from a server.
|
98
|
+
loadGanttFromServer();
|
99
|
+
|
100
|
+
|
101
|
+
//fill default Teamwork roles if any
|
102
|
+
if (!ge.roles || ge.roles.length == 0) {
|
103
|
+
setRoles();
|
104
|
+
}
|
105
|
+
|
106
|
+
//fill default Resources roles if any
|
107
|
+
if (!ge.resources || ge.resources.length == 0) {
|
108
|
+
setResource();
|
109
|
+
}
|
110
|
+
|
111
|
+
|
112
|
+
/*/debug time scale
|
113
|
+
$(".splitBox2").mousemove(function(e){
|
114
|
+
var x=e.clientX-$(this).offset().left;
|
115
|
+
var mill=Math.round(x/(ge.gantt.fx) + ge.gantt.startMillis)
|
116
|
+
$("#ndo").html(x+" "+new Date(mill))
|
117
|
+
});*/
|
118
|
+
|
119
|
+
});
|
120
|
+
|
121
|
+
|
122
|
+
function loadGanttFromServer(taskId, callback) {
|
123
|
+
|
124
|
+
//this is a simulation: load data from the local storage if you have already played with the demo or a textarea with starting demo data
|
125
|
+
loadFromLocalStorage();
|
126
|
+
|
127
|
+
//this is the real implementation
|
128
|
+
/*
|
129
|
+
//var taskId = $("#taskSelector").val();
|
130
|
+
var prof = new Profiler("loadServerSide");
|
131
|
+
prof.reset();
|
132
|
+
|
133
|
+
$.getJSON("ganttAjaxController.jsp", {CM:"LOADPROJECT",taskId:taskId}, function(response) {
|
134
|
+
//console.debug(response);
|
135
|
+
if (response.ok) {
|
136
|
+
prof.stop();
|
137
|
+
|
138
|
+
ge.loadProject(response.project);
|
139
|
+
ge.checkpoint(); //empty the undo stack
|
140
|
+
|
141
|
+
if (typeof(callback)=="function") {
|
142
|
+
callback(response);
|
143
|
+
}
|
144
|
+
} else {
|
145
|
+
jsonErrorHandling(response);
|
146
|
+
}
|
147
|
+
});
|
148
|
+
*/
|
149
|
+
}
|
150
|
+
|
151
|
+
|
152
|
+
function saveGanttOnServer() {
|
153
|
+
|
154
|
+
//this is a simulation: save data to the local storage or to the textarea
|
155
|
+
saveInLocalStorage();
|
156
|
+
|
157
|
+
|
158
|
+
/*
|
159
|
+
var prj = ge.saveProject();
|
160
|
+
|
161
|
+
delete prj.resources;
|
162
|
+
delete prj.roles;
|
163
|
+
|
164
|
+
var prof = new Profiler("saveServerSide");
|
165
|
+
prof.reset();
|
166
|
+
|
167
|
+
if (ge.deletedTaskIds.length>0) {
|
168
|
+
if (!confirm("TASK_THAT_WILL_BE_REMOVED\n"+ge.deletedTaskIds.length)) {
|
169
|
+
return;
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
$.ajax("ganttAjaxController.jsp", {
|
174
|
+
dataType:"json",
|
175
|
+
data: {CM:"SVPROJECT",prj:JSON.stringify(prj)},
|
176
|
+
type:"POST",
|
177
|
+
|
178
|
+
success: function(response) {
|
179
|
+
if (response.ok) {
|
180
|
+
prof.stop();
|
181
|
+
if (response.project) {
|
182
|
+
ge.loadProject(response.project); //must reload as "tmp_" ids are now the good ones
|
183
|
+
} else {
|
184
|
+
ge.reset();
|
185
|
+
}
|
186
|
+
} else {
|
187
|
+
var errMsg="Errors saving project\n";
|
188
|
+
if (response.message) {
|
189
|
+
errMsg=errMsg+response.message+"\n";
|
190
|
+
}
|
191
|
+
|
192
|
+
if (response.errorMessages.length) {
|
193
|
+
errMsg += response.errorMessages.join("\n");
|
194
|
+
}
|
195
|
+
|
196
|
+
alert(errMsg);
|
197
|
+
}
|
198
|
+
}
|
199
|
+
|
200
|
+
});
|
201
|
+
*/
|
202
|
+
}
|
203
|
+
|
204
|
+
|
205
|
+
//------------------------------------------- Create some demo data ------------------------------------------------------
|
206
|
+
function setRoles() {
|
207
|
+
ge.roles = [
|
208
|
+
{
|
209
|
+
id:"tmp_1",
|
210
|
+
name:"Project Manager"
|
211
|
+
},
|
212
|
+
{
|
213
|
+
id:"tmp_2",
|
214
|
+
name:"Worker"
|
215
|
+
},
|
216
|
+
{
|
217
|
+
id:"tmp_3",
|
218
|
+
name:"Stakeholder/Customer"
|
219
|
+
}
|
220
|
+
];
|
221
|
+
}
|
222
|
+
|
223
|
+
function setResource() {
|
224
|
+
var res = [];
|
225
|
+
for (var i = 1; i <= 10; i++) {
|
226
|
+
res.push({id:"tmp_" + i,name:"Resource " + i});
|
227
|
+
}
|
228
|
+
ge.resources = res;
|
229
|
+
}
|
230
|
+
|
231
|
+
|
232
|
+
function clearGantt() {
|
233
|
+
ge.reset();
|
234
|
+
}
|
235
|
+
|
236
|
+
function loadI18n() {
|
237
|
+
GanttMaster.messages = {
|
238
|
+
"CHANGE_OUT_OF_SCOPE":"NO_RIGHTS_FOR_UPDATE_PARENTS_OUT_OF_EDITOR_SCOPE",
|
239
|
+
"START_IS_MILESTONE":"START_IS_MILESTONE",
|
240
|
+
"END_IS_MILESTONE":"END_IS_MILESTONE",
|
241
|
+
"TASK_HAS_CONSTRAINTS":"TASK_HAS_CONSTRAINTS",
|
242
|
+
"GANTT_ERROR_DEPENDS_ON_OPEN_TASK":"GANTT_ERROR_DEPENDS_ON_OPEN_TASK",
|
243
|
+
"GANTT_ERROR_DESCENDANT_OF_CLOSED_TASK":"GANTT_ERROR_DESCENDANT_OF_CLOSED_TASK",
|
244
|
+
"TASK_HAS_EXTERNAL_DEPS":"TASK_HAS_EXTERNAL_DEPS",
|
245
|
+
"GANTT_ERROR_LOADING_DATA_TASK_REMOVED":"GANTT_ERROR_LOADING_DATA_TASK_REMOVED",
|
246
|
+
"ERROR_SETTING_DATES":"ERROR_SETTING_DATES",
|
247
|
+
"CIRCULAR_REFERENCE":"CIRCULAR_REFERENCE",
|
248
|
+
"CANNOT_DEPENDS_ON_ANCESTORS":"CANNOT_DEPENDS_ON_ANCESTORS",
|
249
|
+
"CANNOT_DEPENDS_ON_DESCENDANTS":"CANNOT_DEPENDS_ON_DESCENDANTS",
|
250
|
+
"INVALID_DATE_FORMAT":"INVALID_DATE_FORMAT",
|
251
|
+
"TASK_MOVE_INCONSISTENT_LEVEL":"TASK_MOVE_INCONSISTENT_LEVEL",
|
252
|
+
|
253
|
+
"GANTT_QUARTER_SHORT":"trim.",
|
254
|
+
"GANTT_SEMESTER_SHORT":"sem."
|
255
|
+
};
|
256
|
+
}
|
257
|
+
|
258
|
+
|
259
|
+
//------------------------------------------- Open a black popup for managing resources. This is only an axample of implementation (usually resources come from server) ------------------------------------------------------
|
260
|
+
function openResourceEditor() {
|
261
|
+
var editor = $("<div>");
|
262
|
+
editor.append("<h2>Resource editor</h2>");
|
263
|
+
editor.addClass("resEdit");
|
264
|
+
|
265
|
+
for (var i in ge.resources) {
|
266
|
+
var res = ge.resources[i];
|
267
|
+
var inp = $("<input type='text'>").attr("pos", i).addClass("resLine").val(res.name);
|
268
|
+
editor.append(inp).append("<br>");
|
269
|
+
}
|
270
|
+
|
271
|
+
var sv = $("<div>save</div>").css("float", "right").addClass("button").click(function() {
|
272
|
+
$(this).closest(".resEdit").find("input").each(function() {
|
273
|
+
var el = $(this);
|
274
|
+
var pos = el.attr("pos");
|
275
|
+
ge.resources[pos].name = el.val();
|
276
|
+
});
|
277
|
+
ge.editor.redraw();
|
278
|
+
closeBlackPopup();
|
279
|
+
});
|
280
|
+
editor.append(sv);
|
281
|
+
|
282
|
+
var ndo = createBlackPage(800, 500).append(editor);
|
283
|
+
}
|
284
|
+
|
285
|
+
//------------------------------------------- Get project file as JSON (used for migrate project from gantt to Teamwork) ------------------------------------------------------
|
286
|
+
function getFile() {
|
287
|
+
$("#gimBaPrj").val(JSON.stringify(ge.saveProject()));
|
288
|
+
$("#gimmeBack").submit();
|
289
|
+
$("#gimBaPrj").val("");
|
290
|
+
|
291
|
+
/* var uriContent = "data:text/html;charset=utf-8," + encodeURIComponent(JSON.stringify(prj));
|
292
|
+
console.debug(uriContent);
|
293
|
+
neww=window.open(uriContent,"dl");*/
|
294
|
+
}
|
295
|
+
|
296
|
+
|
297
|
+
//------------------------------------------- LOCAL STORAGE MANAGEMENT (for this demo only) ------------------------------------------------------
|
298
|
+
Storage.prototype.setObject = function(key, value) {
|
299
|
+
this.setItem(key, JSON.stringify(value));
|
300
|
+
};
|
301
|
+
|
302
|
+
|
303
|
+
Storage.prototype.getObject = function(key) {
|
304
|
+
return this.getItem(key) && JSON.parse(this.getItem(key));
|
305
|
+
};
|
306
|
+
|
307
|
+
|
308
|
+
function loadFromLocalStorage() {
|
309
|
+
var ret;
|
310
|
+
if (localStorage) {
|
311
|
+
if (localStorage.getObject("teamworkGantDemo")) {
|
312
|
+
ret = localStorage.getObject("teamworkGantDemo");
|
313
|
+
}
|
314
|
+
} else {
|
315
|
+
$("#taZone").show();
|
316
|
+
}
|
317
|
+
if (!ret || !ret.tasks || ret.tasks.length == 0){
|
318
|
+
ret = JSON.parse($("#ta").val());
|
319
|
+
|
320
|
+
|
321
|
+
//actualiza data
|
322
|
+
var offset=new Date().getTime()-ret.tasks[0].start;
|
323
|
+
for (var i=0;i<ret.tasks.length;i++)
|
324
|
+
ret.tasks[i].start=ret.tasks[i].start+offset;
|
325
|
+
|
326
|
+
|
327
|
+
}
|
328
|
+
ge.loadProject(ret);
|
329
|
+
ge.checkpoint(); //empty the undo stack
|
330
|
+
}
|
331
|
+
|
332
|
+
|
333
|
+
function saveInLocalStorage() {
|
334
|
+
var prj = ge.saveProject();
|
335
|
+
if (localStorage) {
|
336
|
+
localStorage.setObject("teamworkGantDemo", prj);
|
337
|
+
} else {
|
338
|
+
$("#ta").val(JSON.stringify(prj));
|
339
|
+
}
|
340
|
+
}
|
341
|
+
|
342
|
+
|
343
|
+
</script>
|
344
|
+
|
345
|
+
|
346
|
+
<div id="gantEditorTemplates" style="display:none;">
|
347
|
+
<div class="__template__" type="GANTBUTTONS"><!--
|
348
|
+
<div class="ganttButtonBar">
|
349
|
+
<h1 style="float:left">task tree/gantt</h1>
|
350
|
+
<div class="buttons">
|
351
|
+
<button onclick="$('#workSpace').trigger('undo.gantt');" class="button textual" title="undo"><span class="teamworkIcon">'</span></button>
|
352
|
+
<button onclick="$('#workSpace').trigger('redo.gantt');" class="button textual" title="redo"><span class="teamworkIcon">·</span></button>
|
353
|
+
<span class="ganttButtonSeparator"></span>
|
354
|
+
<button onclick="$('#workSpace').trigger('addAboveCurrentTask.gantt');" class="button textual" title="insert above"><span class="teamworkIcon">l</span></button>
|
355
|
+
<button onclick="$('#workSpace').trigger('addBelowCurrentTask.gantt');" class="button textual" title="insert below"><span class="teamworkIcon">X</span></button>
|
356
|
+
<span class="ganttButtonSeparator"></span>
|
357
|
+
<button onclick="$('#workSpace').trigger('indentCurrentTask.gantt');" class="button textual" title="indent task"><span class="teamworkIcon">.</span></button>
|
358
|
+
<button onclick="$('#workSpace').trigger('outdentCurrentTask.gantt');" class="button textual" title="unindent task"><span class="teamworkIcon">:</span></button>
|
359
|
+
<span class="ganttButtonSeparator"></span>
|
360
|
+
<button onclick="$('#workSpace').trigger('moveUpCurrentTask.gantt');" class="button textual" title="move up"><span class="teamworkIcon">k</span></button>
|
361
|
+
<button onclick="$('#workSpace').trigger('moveDownCurrentTask.gantt');" class="button textual" title="move down"><span class="teamworkIcon">j</span></button>
|
362
|
+
<span class="ganttButtonSeparator"></span>
|
363
|
+
<button onclick="$('#workSpace').trigger('zoomMinus.gantt');" class="button textual" title="zoom out"><span class="teamworkIcon">)</span></button>
|
364
|
+
<button onclick="$('#workSpace').trigger('zoomPlus.gantt');" class="button textual" title="zoom in"><span class="teamworkIcon">(</span></button>
|
365
|
+
<span class="ganttButtonSeparator"></span>
|
366
|
+
<button onclick="$('#workSpace').trigger('deleteCurrentTask.gantt');" class="button textual" title="delete"><span class="teamworkIcon">¢</span></button>
|
367
|
+
|
368
|
+
<button onclick="saveGanttOnServer();" class="button first big" title="save">save</button>
|
369
|
+
</div></div>
|
370
|
+
--></div>
|
371
|
+
|
372
|
+
<div class="__template__" type="TASKSEDITHEAD"><!--
|
373
|
+
<table class="gdfTable" cellspacing="0" cellpadding="0">
|
374
|
+
<thead>
|
375
|
+
<tr style="height:40px">
|
376
|
+
<th class="gdfColHeader" style="width:35px;"></th>
|
377
|
+
<th class="gdfColHeader" style="width:25px;"></th>
|
378
|
+
<th class="gdfColHeader gdfResizable" style="width:30px;">code/short name</th>
|
379
|
+
<th class="gdfColHeader gdfResizable" style="width:10px;"></th>
|
380
|
+
<th class="gdfColHeader gdfResizable" style="width:200px;">name</th>
|
381
|
+
<th class="gdfColHeader gdfResizable" style="width:80px;">start</th>
|
382
|
+
<th class="gdfColHeader gdfResizable" style="width:80px;">end</th>
|
383
|
+
<th class="gdfColHeader gdfResizable" style="width:50px;">dur.</th>
|
384
|
+
<th class="gdfColHeader gdfResizable" style="width:50px;">dep.</th>
|
385
|
+
<th class="gdfColHeader gdfResizable" style="width:200px;">assignees</th>
|
386
|
+
</tr>
|
387
|
+
</thead>
|
388
|
+
</table>
|
389
|
+
--></div>
|
390
|
+
|
391
|
+
<div class="__template__" type="TASKROW"><!--
|
392
|
+
<tr taskId="(#=obj.id#)" class="taskEditRow" level="(#=level#)">
|
393
|
+
<th class="gdfCell edit" align="right" style="cursor:pointer;"><span class="taskRowIndex">(#=obj.getRow()+1#)</span> <span class="teamworkIcon" style="font-size:12px;" >e</span></th>
|
394
|
+
<td class="gdfCell" align="center"><div class="taskStatus cvcColorSquare" status="(#=obj.status#)"></div></td>
|
395
|
+
<td class="gdfCell"><input type="text" name="code" value="(#=obj.code?obj.code:''#)"></td>
|
396
|
+
<td class="gdfCell"><span>-</span></td>
|
397
|
+
|
398
|
+
<td class="gdfCell indentCell" style="padding-left:(#=obj.level*10#)px;"><input type="text" name="name" value="(#=obj.name#)" style="(#=obj.level>0?'border-left:2px dotted orange':''#)"></td>
|
399
|
+
|
400
|
+
<td class="gdfCell"><input type="text" name="start" value="" class="date"></td>
|
401
|
+
<td class="gdfCell"><input type="text" name="end" value="" class="date"></td>
|
402
|
+
<td class="gdfCell"><input type="text" name="duration" value="(#=obj.duration#)"></td>
|
403
|
+
<td class="gdfCell"><input type="text" name="depends" value="(#=obj.depends#)" (#=obj.hasExternalDep?"readonly":""#)></td>
|
404
|
+
<td class="gdfCell taskAssigs">(#=obj.getAssigsString()#)</td>
|
405
|
+
</tr>
|
406
|
+
--></div>
|
407
|
+
|
408
|
+
<div class="__template__" type="TASKEMPTYROW"><!--
|
409
|
+
<tr class="taskEditRow emptyRow" >
|
410
|
+
<th class="gdfCell" align="right"></th>
|
411
|
+
<td class="gdfCell" align="center"></td>
|
412
|
+
<td class="gdfCell"></td>
|
413
|
+
<td class="gdfCell"></td>
|
414
|
+
<td class="gdfCell"></td>
|
415
|
+
<td class="gdfCell"></td>
|
416
|
+
<td class="gdfCell"></td>
|
417
|
+
<td class="gdfCell"></td>
|
418
|
+
<td class="gdfCell"></td>
|
419
|
+
</tr>
|
420
|
+
--></div>
|
421
|
+
|
422
|
+
<div class="__template__" type="TASKBAR"><!--
|
423
|
+
<div class="taskBox" taskId="(#=obj.id#)" >
|
424
|
+
<div class="layout (#=obj.hasExternalDep?'extDep':''#)">
|
425
|
+
<div class="taskStatus" status="(#=obj.status#)"></div>
|
426
|
+
<div class="taskProgress" style="width:(#=obj.progress>100?100:obj.progress#)%; background-color:(#=obj.progress>100?'red':'rgb(153,255,51);'#);"></div>
|
427
|
+
<div class="milestone (#=obj.startIsMilestone?'active':''#)" ></div>
|
428
|
+
|
429
|
+
<div class="taskLabel"></div>
|
430
|
+
<div class="milestone end (#=obj.endIsMilestone?'active':''#)" ></div>
|
431
|
+
</div>
|
432
|
+
</div>
|
433
|
+
--></div>
|
434
|
+
|
435
|
+
|
436
|
+
<div class="__template__" type="CHANGE_STATUS"><!--
|
437
|
+
<div class="taskStatusBox">
|
438
|
+
<div class="taskStatus cvcColorSquare" status="STATUS_ACTIVE" title="active"></div>
|
439
|
+
<div class="taskStatus cvcColorSquare" status="STATUS_DONE" title="completed"></div>
|
440
|
+
<div class="taskStatus cvcColorSquare" status="STATUS_FAILED" title="failed"></div>
|
441
|
+
<div class="taskStatus cvcColorSquare" status="STATUS_SUSPENDED" title="suspended"></div>
|
442
|
+
<div class="taskStatus cvcColorSquare" status="STATUS_UNDEFINED" title="undefined"></div>
|
443
|
+
</div>
|
444
|
+
--></div>
|
445
|
+
|
446
|
+
|
447
|
+
<div class="__template__" type="TASK_EDITOR"><!--
|
448
|
+
<div class="ganttTaskEditor">
|
449
|
+
<table width="100%">
|
450
|
+
<tr>
|
451
|
+
<td>
|
452
|
+
<table cellpadding="5">
|
453
|
+
<tr>
|
454
|
+
<td><label for="code">code/short name</label><br><input type="text" name="code" id="code" value="" class="formElements"></td>
|
455
|
+
</tr><tr>
|
456
|
+
<td><label for="name">name</label><br><input type="text" name="name" id="name" value="" size="35" class="formElements"></td>
|
457
|
+
</tr>
|
458
|
+
<tr></tr>
|
459
|
+
<td>
|
460
|
+
<label for="description">description</label><br>
|
461
|
+
<textarea rows="5" cols="30" id="description" name="description" class="formElements"></textarea>
|
462
|
+
</td>
|
463
|
+
</tr>
|
464
|
+
</table>
|
465
|
+
</td>
|
466
|
+
<td valign="top">
|
467
|
+
<table cellpadding="5">
|
468
|
+
<tr>
|
469
|
+
<td colspan="2"><label for="status">status</label><br><div id="status" class="taskStatus" status=""></div></td>
|
470
|
+
<tr>
|
471
|
+
<td colspan="2"><label for="progress">progress</label><br><input type="text" name="progress" id="progress" value="" size="3" class="formElements"></td>
|
472
|
+
</tr>
|
473
|
+
<tr>
|
474
|
+
<td><label for="start">start</label><br><input type="text" name="start" id="start" value="" class="date" size="10" class="formElements"><input type="checkbox" id="startIsMilestone"> </td>
|
475
|
+
<td rowspan="2" class="graph" style="padding-left:50px"><label for="duration">dur.</label><br><input type="text" name="duration" id="duration" value="" size="5" class="formElements"></td>
|
476
|
+
</tr><tr>
|
477
|
+
<td><label for="end">end</label><br><input type="text" name="end" id="end" value="" class="date" size="10" class="formElements"><input type="checkbox" id="endIsMilestone"></td>
|
478
|
+
</table>
|
479
|
+
</td>
|
480
|
+
</tr>
|
481
|
+
</table>
|
482
|
+
|
483
|
+
<h2>assignments</h2>
|
484
|
+
<table cellspacing="1" cellpadding="0" width="100%" id="assigsTable">
|
485
|
+
<tr>
|
486
|
+
<th style="width:100px;">name</th>
|
487
|
+
<th style="width:70px;">role</th>
|
488
|
+
<th style="width:30px;">est.wklg.</th>
|
489
|
+
<th style="width:30px;" id="addAssig"><span class="teamworkIcon" style="cursor: pointer">+</span></th>
|
490
|
+
</tr>
|
491
|
+
</table>
|
492
|
+
|
493
|
+
<div style="text-align: right; padding-top: 20px"><button id="saveButton" class="button big">save</button></div>
|
494
|
+
</div>
|
495
|
+
--></div>
|
496
|
+
|
497
|
+
|
498
|
+
<div class="__template__" type="ASSIGNMENT_ROW"><!--
|
499
|
+
<tr taskId="(#=obj.task.id#)" assigId="(#=obj.assig.id#)" class="assigEditRow" >
|
500
|
+
<td ><select name="resourceId" class="formElements" (#=obj.assig.id.indexOf("tmp_")==0?"":"disabled"#) ></select></td>
|
501
|
+
<td ><select type="select" name="roleId" class="formElements"></select></td>
|
502
|
+
<td ><input type="text" name="effort" value="(#=getMillisInHoursMinutes(obj.assig.effort)#)" size="5" class="formElements"></td>
|
503
|
+
<td align="center"><span class="teamworkIcon delAssig" style="cursor: pointer">d</span></td>
|
504
|
+
</tr>
|
505
|
+
--></div>
|
506
|
+
|
507
|
+
</div>
|
508
|
+
<script type="text/javascript">
|
509
|
+
$.JST.loadDecorator("ASSIGNMENT_ROW", function(assigTr, taskAssig) {
|
510
|
+
|
511
|
+
var resEl = assigTr.find("[name=resourceId]");
|
512
|
+
for (var i in taskAssig.task.master.resources) {
|
513
|
+
var res = taskAssig.task.master.resources[i];
|
514
|
+
var opt = $("<option>");
|
515
|
+
opt.val(res.id).html(res.name);
|
516
|
+
if (taskAssig.assig.resourceId == res.id)
|
517
|
+
opt.attr("selected", "true");
|
518
|
+
resEl.append(opt);
|
519
|
+
}
|
520
|
+
|
521
|
+
|
522
|
+
var roleEl = assigTr.find("[name=roleId]");
|
523
|
+
for (var i in taskAssig.task.master.roles) {
|
524
|
+
var role = taskAssig.task.master.roles[i];
|
525
|
+
var optr = $("<option>");
|
526
|
+
optr.val(role.id).html(role.name);
|
527
|
+
if (taskAssig.assig.roleId == role.id)
|
528
|
+
optr.attr("selected", "true");
|
529
|
+
roleEl.append(optr);
|
530
|
+
}
|
531
|
+
|
532
|
+
if (taskAssig.task.master.canWrite) {
|
533
|
+
assigTr.find(".delAssig").click(function() {
|
534
|
+
var tr = $(this).closest("[assigId]").fadeOut(200, function() {
|
535
|
+
$(this).remove();
|
536
|
+
});
|
537
|
+
});
|
538
|
+
}
|
539
|
+
|
540
|
+
|
541
|
+
});
|
542
|
+
</script>
|
543
|
+
|
544
|
+
|
545
|
+
|
546
|
+
</body>
|
547
|
+
</html>
|