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.
Files changed (52) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +74 -0
  3. data/.idea/encodings.xml +5 -0
  4. data/.idea/jquery_gantt_rails.iml +9 -0
  5. data/.idea/misc.xml +22 -0
  6. data/.idea/modules.xml +9 -0
  7. data/.idea/scopes/scope_settings.xml +5 -0
  8. data/.idea/vcs.xml +7 -0
  9. data/.ruby-version.rb +1 -0
  10. data/Gemfile +3 -0
  11. data/README.md +41 -0
  12. data/Rakefile +1 -0
  13. data/jquery_gantt_rails.gemspec +20 -0
  14. data/lib/jquery_gantt_rails/version.rb +3 -0
  15. data/lib/jquery_gantt_rails/version.rb~ +3 -0
  16. data/lib/jquery_gantt_rails.rb +9 -0
  17. data/vendor/assets/javascripts/jquery_gantt/README.md +28 -0
  18. data/vendor/assets/javascripts/jquery_gantt/add.gif +0 -0
  19. data/vendor/assets/javascripts/jquery_gantt/alert.gif +0 -0
  20. data/vendor/assets/javascripts/jquery_gantt/closeBig.png +0 -0
  21. data/vendor/assets/javascripts/jquery_gantt/del.gif +0 -0
  22. data/vendor/assets/javascripts/jquery_gantt/edit.gif +0 -0
  23. data/vendor/assets/javascripts/jquery_gantt/gantt.css +323 -0
  24. data/vendor/assets/javascripts/jquery_gantt/gantt.html +547 -0
  25. data/vendor/assets/javascripts/jquery_gantt/ganttDrawer.js +752 -0
  26. data/vendor/assets/javascripts/jquery_gantt/ganttGridEditor.js +518 -0
  27. data/vendor/assets/javascripts/jquery_gantt/ganttMaster.js +702 -0
  28. data/vendor/assets/javascripts/jquery_gantt/ganttTask.js +947 -0
  29. data/vendor/assets/javascripts/jquery_gantt/ganttUtilities.js +237 -0
  30. data/vendor/assets/javascripts/jquery_gantt/gantt_compact.css +323 -0
  31. data/vendor/assets/javascripts/jquery_gantt/hasExternalDeps.png +0 -0
  32. data/vendor/assets/javascripts/jquery_gantt/libs/JST/jquery.JST.js +167 -0
  33. data/vendor/assets/javascripts/jquery_gantt/libs/date.js +584 -0
  34. data/vendor/assets/javascripts/jquery_gantt/libs/dateField/images/next.png +0 -0
  35. data/vendor/assets/javascripts/jquery_gantt/libs/dateField/images/prev.png +0 -0
  36. data/vendor/assets/javascripts/jquery_gantt/libs/dateField/jquery.dateField.css +88 -0
  37. data/vendor/assets/javascripts/jquery_gantt/libs/dateField/jquery.dateField.js +212 -0
  38. data/vendor/assets/javascripts/jquery_gantt/libs/i18nJs.js +140 -0
  39. data/vendor/assets/javascripts/jquery_gantt/libs/jquery.livequery.min.js +11 -0
  40. data/vendor/assets/javascripts/jquery_gantt/libs/jquery.timers.js +142 -0
  41. data/vendor/assets/javascripts/jquery_gantt/libs/platform.js +954 -0
  42. data/vendor/assets/javascripts/jquery_gantt/linkArrow.png +0 -0
  43. data/vendor/assets/javascripts/jquery_gantt/milestone.png +0 -0
  44. data/vendor/assets/javascripts/jquery_gantt/platform.css +346 -0
  45. data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.eot +0 -0
  46. data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.otf +0 -0
  47. data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.svg +152 -0
  48. data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.ttf +0 -0
  49. data/vendor/assets/javascripts/jquery_gantt/teamwork-regular-webfont.woff +0 -0
  50. data/vendor/assets/javascripts/jquery_gantt/teamworkFont.css +16 -0
  51. data/vendor/assets/javascripts/jquery_gantt/twGanttSmall.png +0 -0
  52. 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("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
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">&#39;</span></button>
352
+ <button onclick="$('#workSpace').trigger('redo.gantt');" class="button textual" title="redo"><span class="teamworkIcon">&middot;</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">&cent;</span></button>
367
+ &nbsp; &nbsp; &nbsp; &nbsp;
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>