1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
32:
33:
34: interface projectTaskBoardImpl {
35:
36: function initialize();
37: function getPluginAppId();
38: function enableObject($enable = true);
39: function getAppMainViewItem();
40: function registerHttpRequestObjects(&$apphandler);
41: function registerAppMenuHandler(&$obj);
42: function configureTaskBoard(&$apphandler,$data_arr);
43: function setAppMainView(&$pagewrap,&$apphandler,&$baseui,$db,$params_arr);
44: function setTaskBoardView(&$pagewrap,&$mainhandler,&$baseui,$params_arr = null);
45: }
46:
47: define ('COMPLETION',4);
48:
49: class projectTaskBoard implements projectTaskBoardImpl {
50:
51: private $PLUGIN_APP_ID = PROJECT_APP;
52: private $instance;
53: private $enabled;
54: private $menuhandler;
55: private $config_dir = '../lib/class/plugins/config/bmm_erp_project_task_board';
56:
57: private $board_configuration_arr = array();
58: private $board_views_array = array();
59:
60: public function __construct (){
61: if (!file_exists($this->config_dir)) mkdir($this->config_dir,0770,true);
62: $this->instance = $this;
63: $this->enabled = true;
64: $this->handler = 'project';
65: $this->appview = 'bmm_erp_project_task_board';
66: $this->initialize();
67: }
68:
69: public function initialize(){
70: global $STATUS_LIST;
71: $this->board_progression_list = array();
72: if (isset($STATUS_LIST['PROJECT_TASK']))
73: $this->board_configuration_arr = array(
74: 'progression' => array(
75: "open" => array("statuslist"=>array("OPEN" => "{$STATUS_LIST['PROJECT_TASK']['OPEN'][0]}"),'new_status_id' => "{$STATUS_LIST['PROJECT_TASK']['OPEN'][0]}","position"=>1),
76: "in_progress" => array("statuslist"=>array("PROGRESS" => "{$STATUS_LIST['PROJECT_TASK']['PROGRESS'][0]}"),'new_status_id' => "{$STATUS_LIST['PROJECT_TASK']['PROGRESS'][0]}","position"=>2),
77: "in_verification" => array("statuslist"=>array("VERIFICATION" => "{$STATUS_LIST['PROJECT_TASK']['VERIFICATION'][0]}"),'new_status_id' => "{$STATUS_LIST['PROJECT_TASK']['VERIFICATION'][0]}","position"=>3),
78: "complete" => array("statuslist"=>array("COMPLETE" => "{$STATUS_LIST['PROJECT_TASK']['COMPLETE'][0]}"),'new_status_id' => "{$STATUS_LIST['PROJECT_TASK']['COMPLETE'][0]}","position"=>4)
79: ),
80: 'planning_status' => array("status_id" => "{$STATUS_LIST['PROJECT_TASK']['PLANNING'][0]}"),
81: 'views' => array(
82:
83: )
84: );
85:
86: }
87:
88: public function getPluginAppId(){
89: return $this->PLUGIN_APP_ID;
90: }
91:
92: public function enableObject($enable = true){
93: $this->enabled = $enable;
94: }
95:
96: public function getObjectStatus(){
97: return $this->enabled;
98: }
99:
100: public function getAppMainViewItem(){
101: return $this->appview;
102: }
103:
104: public function registerHttpRequestObjects(&$apphandler){
105: $apphandler->registerHttpRequestObjects(array(get_class($this->instance),$this->appview,"bmm_erp_project_task_board","configureTaskBoard",$this->PLUGIN_APP_ID));
106: }
107:
108: public function registerAppMenuHandler(&$obj){
109:
110: $obj->setMenuObject($this->appview,"agile",$this->handler,null,false);
111: }
112:
113: private function loadActionData($schema_name = null,$target_id = null){
114: global $STATUS_LIST;
115: $file = "{$this->config_dir}/{$schema_name}_{$target_id}_{$this->appview}.json";
116: if (file_exists($file) == true){
117: $_board_configuration_arr = json_decode(file_get_contents($file),true);
118:
119:
120: if (!isset($_board_configuration_arr['progression']))
121: $this->board_configuration_arr['progression'] = $_board_configuration_arr;
122: else
123: $this->board_configuration_arr = $_board_configuration_arr;
124: }
125:
126: if (!isset($this->board_configuration['planning_status']))
127: $this->board_configuration['planning_status']['status_id'] = "{$STATUS_LIST['PROJECT_TASK']['PLANNING'][0]}";
128:
129: }
130:
131: private function writeActionData($schema_name,$target_id){
132: $file = "{$this->config_dir}/{$schema_name}_{$target_id}_{$this->appview}.json";
133: if (($f = fopen($file, "w") ) == false)
134: throw new Exception ("Failed to open $file for write");
135:
136: fwrite($f, json_encode($this->board_configuration_arr));
137: fclose($f);
138: }
139:
140: public function setAppMainView(&$pagewrap,&$mainhandler,&$baseui,$db,$params_arr){
141: $this->initialize();
142: $actionhandler = $params_arr['actionhandler'];
143: $mainhandler->setReadOnlyActions(get_class($actionhandler),get_class($this),array('get_project_task_list'));
144: $this->setTaskBoardView($pagewrap,$mainhandler,$baseui,$params_arr);
145: }
146:
147: private function getProgressFromPosition($position){
148: foreach (array_keys($this->board_configuration_arr['progression']) as $key){
149: if ( $this->board_configuration_arr['progression'][$key]['position'] == $position) {return $key;}
150: }
151: return null;
152: }
153:
154: private function getCompletionStatuses(){
155: $status_list_arr = array();
156: $lastpos = sizeof($this->board_configuration_arr['progression']);
157: $ckey = $this->getProgressFromPosition($lastpos);
158: foreach(array_keys($this->board_configuration_arr['progression'][$ckey]['statuslist']) as $key){
159: array_push($status_list_arr,$this->board_configuration_arr['progression'][$ckey]['statuslist'][$key]);
160: }
161:
162: error_log("JSON:".json_encode($status_list_arr));
163: return $status_list_arr;
164: }
165:
166: public function configureTaskBoard(&$apphandler,$data_arr){
167:
168: $project_id = $apphandler->getAppTargetId();
169: $project_key = !intval($project_id) ? 'default' : $apphandler->getAppTargetId();
170:
171: $backdata_arr = array();
172: $data_arr['position'] = !isset($data_arr['position']) ? null : $data_arr['position'];
173: $action = isset($data_arr['action']) ? $data_arr['action'] : null;
174: $plugin_config_action = isset($data_arr['config_action']) ? $data_arr['config_action'] : null;
175: $position = isset($data_arr['position']) ? $data_arr['position'] : null;
176: $status_id = isset($data_arr['status_id']) ? $data_arr['status_id'] : null;
177: $status_text = isset($data_arr['status_text']) ? $data_arr['status_text'] : null;
178: $progression = isset($data_arr['progression']) ? $data_arr['progression'] : $this->getProgressFromPosition($data_arr['position']);
179:
180: if ($plugin_config_action){
181: switch ($plugin_config_action){
182: case "add":
183: $this->board_configuration_arr['progression'][$progression]['statuslist'][$status_text] = $status_id;
184: break;
185:
186: case "remove":
187: $this->board_configuration_arr['progression'][$progression]['statuslist'][$status_text] = null;
188: $status_id = null;
189: break;
190:
191: case "set_default_status":
192: $this->board_configuration_arr['progression'][$progression]['new_status_id'] = $status_id;
193: break;
194:
195: case "set_planning_item":
196: $this->board_configuration_arr['planning_status']['status_id'] = $status_id;
197: break;
198:
199: case "update_header_text":
200: $new_progression = $data_arr['new_progression'];
201: if ($progression != $new_progression){
202: $this->board_configuration_arr['progression'][$new_progression] = $this->board_configuration_arr['progression'][$progression];
203: unset($this->board_configuration_arr['progression'][$progression]);
204: $progression = $new_progression;
205: }
206: break;
207: }
208:
209: $this->writeActionData($apphandler->getSchemaName(),$project_key);
210: return json_encode(array('success'=>true,'config_action'=>$plugin_config_action,'progression'=>$progression,'position'=>$position,'status_id'=>$status_id,'status_text' => $status_text));
211: }
212:
213: error_log("ACTION: $action JS:".json_encode($data_arr));
214: if ($action){
215: $view = isset($data_arr['view']) ? $data_arr['view'] : null;
216: switch($action){
217:
218: case "change_task_position":
219: $apphandler->taskhandler->initializeById($data_arr['task_key'],true);
220: $apphandler->taskhandler->changeTaskPosition(array(
221: 'project_id' => $apphandler->getProjectId(),
222: 'version_id' => $apphandler->taskhandler->getTaskComponentVersionId(),
223: 'assignee_id' => null,
224: 'task_type_id' => null,
225: 'area_id' => null,
226: 'last_update' => null,
227: 'last_create' => null,
228: 'my_task' => null,
229: 'category' => null,
230: 'status' => null,
231: 'stype' => null,
232: 'search_value' => null,
233: 'statuslist' => null,
234: 'offset' => 0,
235: 'board_type' => $data_arr['board_type'],
236: 'query_type' => $data_arr['query_type'],
237: 'backlog_id' => $data_arr['backlog_id'],
238: 'limit' => 1000),$data_arr['position_new'],$data_arr['position_cur']);
239: $status_key = $apphandler->getStatusListKey('PROJECT_TASK',$data_arr['status_id']);
240:
241: return json_encode($data_arr['backlog_id']);
242: break;
243:
244: case "new_sprint":
245: $apphandler->createScrumSprint($data_arr['name']);
246: return json_encode(array('action' => 'sprint','success'=>true));
247: break;
248:
249: case "change_sprint_status":
250: $sprint_status = $apphandler->getScrumSprintStatus($data_arr['sprint_id']);
251: $new_sprint_status = $sprint_status == 'f' ? 1 : 0;
252: return $apphandler->setScrumSprintStatus($data_arr['sprint_id'],$new_sprint_status);
253: break;
254:
255: case "sprint_date_update_start":
256: return $apphandler->updateScrumSprintDateStart($data_arr['sprint_id'],$data_arr['value']);
257: break;
258:
259: case "sprint_date_update_end":
260: return $apphandler->updateScrumSprintDateEnd($data_arr['sprint_id'],$data_arr['value']);
261: break;
262:
263: case "sprint_get_story_points":
264: $story_arr = array();
265: $story_arr['total'] = intval($apphandler->getSprintStoryPoints($data_arr['sprint_id']));
266: $story_arr['complete'] = intval($apphandler->getSprintStoryPointsByStatus($data_arr['sprint_id'],implode(',',$this->getCompletionStatuses())));
267: return json_encode($story_arr);
268: break;
269:
270: case "get_scrum_backlogs":
271: return json_encode($apphandler->getScrumBacklog());
272: break;
273:
274: case "get_scrum_sprints":
275: return json_encode($apphandler->getScrumSprints());
276: break;
277:
278: case "get_scrum_sprint_tasks":
279: return json_encode($apphandler->getScrumSprintTasks());
280: break;
281:
282: case "add_backlog_task":
283: $apphandler->addScrumBacklogTask($data_arr['backlog_id'],$data_arr['task_key']);
284: return json_encode(array('success'=>true));
285: break;
286:
287: case "update_sprint_auto_complete":
288: $apphandler->updateSprintAutoComplete($data_arr['sprint_id'],$data_arr['value']);
289: return json_encode(array('success'=>true));
290: break;
291:
292: case "add_sprint_task":
293:
294: $active_sprint_id = $data_arr['sprint_id'];
295: if (intval($active_sprint_id) == 0)
296: return json_encode(array('success' => false,'msg'=>'no sprints found'));
297: $active_sprint_id = $data_arr['sprint_id'];
298: $apphandler->addScrumSprintTask($data_arr['task_key'],$active_sprint_id);
299: $apphandler->setScrumBacklogSprintId($data_arr['backlog_id'],$data_arr['task_key'],$active_sprint_id);
300: return json_encode(array('success'=>true));
301: break;
302:
303: case "new_task_board_view":
304: if ($apphandler->verifyAccessWrite($apphandler->getAppName()) == false )
305: throw new Exception('invalid_permission');
306:
307: $board_id = $apphandler->createTaskBoardView($view);
308: if (!isset($this->board_configuration_arr['views'])){
309: $this->board_configuration_arr['views'][$view] = array();
310: }
311: $this->board_configuration_arr['views'][$view]['areas'] = array();
312: $this->board_configuration_arr['views'][$view]['id'] = $board_id;
313: $backdata_arr = array('success'=>true,'action' => 'new','message'=>'View "'.$view.'" created','new_view'=>$view);
314: break;
315:
316: case "project_release_search":
317: return json_encode($apphandler->taskhandler->searchTaskData(array(
318: 'project_id' => $apphandler->getProjectId(),
319: 'version_id' => null,
320: 'assignee_id' => null,
321: 'task_type_id' => null,
322: 'area_id' => null,
323: 'last_update' => null,
324: 'last_create' => null,
325: 'my_task' => null,
326: 'category' => null,
327: 'status' => null,
328: 'stype' => null,
329: 'search_value' => null,
330: 'statuslist' => null,
331: 'offset' => 0,
332: 'board_type' => 'kanban_board',
333: 'query_type' => 'search_release',
334: 'release_id' => $data_arr['release_id'],
335: 'limit' => 1000)));
336:
337: break;
338:
339:
340: case "get_task_board_releases":
341: return json_encode($apphandler->getProjectReleases($data_arr['board_id']));
342: break;
343:
344: case "save_task_board_release":
345: $task_type_id = isset($data_arr['task_type_id']) ? $data_arr['task_type_id'] : null;
346: $component_id = isset($data_arr['component_id']) ? $data_arr['component_id'] : null;
347: $statuslist = $this->getCompletionStatuses();
348:
349: $results = $apphandler->taskhandler->searchTaskData(array(
350: 'project_id' => $apphandler->getProjectId(),
351: 'version_id' => $component_id,
352: 'assignee_id' => null,
353: 'task_type_id' => null,
354: 'area_id' => null,
355: 'last_update' => null,
356: 'last_create' => null,
357: 'my_task' => null,
358: 'category' => null,
359: 'status' => null,
360: 'stype' => null,
361: 'search_value' => null,
362: 'statuslist' => $statuslist,
363: 'offset' => 0,
364: 'board_type' => 'default',
365: 'query_type' => 'default',
366: 'limit' => 10000));
367:
368: $apphandler->createProjectRelease($data_arr['view'],$data_arr['board_id'],$data_arr['board_date'],$results);
369: return json_encode(array('success'=>true));
370: break;
371:
372: case "save_task_board_view":
373: if ($apphandler->verifyAccessWrite($apphandler->getAppName()) == false )
374: throw new Exception('invalid_permission');
375:
376: $this->board_configuration_arr['views'][$view]['areas'] = $data_arr['config']['areas'];
377: error_log("JSONI: ".json_encode($data_arr));
378: $backdata_arr = array('success'=>true,'action' => 'edit','message'=>'View "'.$view.'" updated','new_view'=>$view,'versions'=>$data_arr['config']);
379: break;
380:
381: case "get_project_task_list":
382: $task_type_id = isset($data_arr['task_type_id']) ? $data_arr['task_type_id'] : null;
383: $component_version_id = isset($data_arr['component_version_id']) ? $data_arr['component_version_id'] : null;
384:
385: if (!is_numeric($component_version_id) && isset($component_version_id['areas'])){
386: $component_version_id = $component_version_id['areas'];
387: }
388:
389: return json_encode($apphandler->taskhandler->searchTaskData(array(
390: 'project_id' => $apphandler->getProjectId(),
391: 'version_id' => $component_version_id,
392: 'assignee_id' => $data_arr['assignee_id'],
393: 'task_type_id' => $task_type_id,
394: 'area_id' => null,
395: 'last_update' => null,
396: 'last_create' => null,
397: 'my_task' => null,
398: 'category' => null,
399: 'status' => null,
400: 'stype' => null,
401: 'search_value' => null,
402: 'statuslist ' => null,
403: 'offset' => 0,
404: 'limit' => 1000,
405: 'query_type' => $data_arr['query_type'],
406: 'board_type' => $data_arr['board_type'],
407: 'board_id' => $data_arr['board_id'],
408: 'backlog_id' => $data_arr['backlog_id'],
409: 'sprint_id' => $data_arr['sprint_id'])));
410: break;
411: }
412:
413: $this->writeActionData($apphandler->getSchemaName(),$project_key);
414: return json_encode($backdata_arr);
415: }
416: }
417:
418: public function configurationView(&$actionhandler,$project_key = 'default'){
419: global $STATUS_LIST;
420:
421: $project_key = null;
422: $mainhandler = $actionhandler->getMainObject();
423: if (method_exists($mainhandler,'getProjectKey'))
424: $project_key = $mainhandler->getProjectKey();
425: $target_id = $mainhandler->getAppTargetId();
426: $this->loadActionData($mainhandler->getSchemaName(),$target_id);
427:
428: echo "
429: <script type=\"text/javascript\">
430: var project_key = \"$project_key\";
431: var board_list = JSON.decode('".json_encode($this->board_configuration_arr['progression'])."');
432: function bmm_erp_project_task_board_modify_progression_list(action,project_key,progression,status_id,status_text){
433:
434: $('bmm_erp_project_task_board_ajaxload').style.visibility = 'visible';
435: if (action == 'add'){
436: var eid = 'status_flow_item_new:'+progression;
437: var e = get_dom_element(eid);
438: var status_id = e.options[e.selectedIndex].value;
439: var status_text = e.options[e.selectedIndex].innerHTML;
440: }
441: JSONSearchObject = {
442: 'project_key':project_key,
443: 'config_action':action,
444: 'progression': progression,
445: 'status_id':status_id,
446: 'status_text':status_text,
447: 'appnr':{$this->PLUGIN_APP_ID}
448: };
449:
450: ajax_reqobj.createAjaxRequest('bmm_erp_project_task_board','bmm_erp_project_task_board', JSON.stringify(JSONSearchObject),bmm_erp_project_task_board_processHttpRetrieveRequest);
451: }
452:
453: function bmm_erp_project_task_board_modify_planning_item(action,project_key,status_id){
454:
455: $('bmm_erp_project_task_board_ajaxload').style.visibility = 'visible';
456:
457: JSONSearchObject = {
458: 'project_key':project_key,
459: 'config_action':action,
460: 'status_id':status_id,
461: 'appnr':{$this->PLUGIN_APP_ID}
462: };
463:
464: ajax_reqobj.createAjaxRequest('bmm_erp_project_task_board','bmm_erp_project_task_board', JSON.stringify(JSONSearchObject),bmm_erp_project_task_board_processHttpPlanningRequest);
465: }
466:
467:
468: function bmm_erp_project_task_board_edit_header_text(action,position){
469: var div_text_id='bmm_erp_project_taskboard_div_header_text:'+position;
470: var div_edit_text_id='bmm_erp_project_taskboard_div_edit_header_text:'+position;
471:
472: if (action == 'cancel'){
473: $(div_text_id).style.display='block';
474: $(div_edit_text_id).style.display='none';
475: }
476:
477: if (action == 'edit'){
478: $(div_text_id).style.display='none';
479: $(div_edit_text_id).style.display='block';
480: }
481:
482: if (action == 'update_header_text'){
483: $('bmm_erp_project_task_board_ajaxload').style.visibility = 'visible';
484: var progress_header_text_id = 'bmm_erp_project_taskboard_input_header_text:'+position;
485: var new_progression_value = $(progress_header_text_id).value;
486: JSONSearchObject = {
487: 'project_key':project_key,
488: 'config_action':action,
489: 'position': position,
490: 'status_id':null,
491: 'status_text':null,
492: 'new_progression':new_progression_value,
493: 'appnr':{$this->PLUGIN_APP_ID}
494: };
495: ajax_reqobj.createAjaxRequest('bmm_erp_project_task_board','bmm_erp_project_task_board', JSON.stringify(JSONSearchObject),bmm_erp_project_task_board_processHttpRetrieveRequest);
496: }
497: }
498:
499:
500: function bmm_erp_project_task_board_processHttpPlanningRequest(rq_data){
501: $('bmm_erp_project_task_board_ajaxload').style.visibility = 'hidden';
502: }
503:
504: function bmm_erp_project_task_board_processHttpRetrieveRequest(rq_data){
505: var rq_data = clean_json_request_data(rq_data,'hash');
506:
507: var action = rq_data['config_action'];
508: var progression = rq_data['progression'];
509: var position = rq_data['position'];
510: var status_key = rq_data['status_text'];
511: var status_id = rq_data['status_id'];
512: if (action == 'set_default_status'){
513: board_list[progression]['new_status_id'] = status_id;
514: }else if (action == 'update_header_text'){
515: var div_text_id='bmm_erp_project_taskboard_div_header_text:'+position;
516: var div_text_span_id = 'bmm_erp_project_taskboard_span_header_text:'+position;
517: var div_edit_text_id='bmm_erp_project_taskboard_div_edit_header_text:'+position;
518: $(div_edit_text_id).style.display='none';
519: $(div_text_id).style.display='block';
520: $(div_text_span_id).innerHTML = progression;
521: }else{
522: board_list[progression]['statuslist'][status_key] = status_id;
523: }
524: $('bmm_erp_project_task_board_ajaxload').style.visibility = 'hidden';
525: create_progression_status_list();
526: }
527:
528: function create_progression_status_list(){
529: // type,input_type,id,class_id,value,ctbody_elemhild,attributes
530: var pgkey_prev = null;
531: for (var pgkey in board_list){
532: if ( pgkey_prev != pgkey){
533: if (table_elem){
534: append_child_elem(table_elem,tbody_elem);
535: }
536: var table_id = 'bmm_erp_project_task_board_progress_status_table:'+pgkey;
537: var tbody_id = 'bmm_erp_project_task_board_progress_status_tbody:'+pgkey;
538: var table_elem = get_dom_element(table_id);
539: table_elem.removeChild(get_dom_element(tbody_id));
540: var tbody_elem = create_dom_element('tbody','tbody',tbody_id,null,null,null,null);
541: }
542: var board_status_list = board_list[pgkey]['statuslist'];
543: for (var statuskey in board_status_list){
544: if (board_status_list[statuskey] == null){continue;}
545:
546: var txt = statuskey+' <a style=\"text-decoration:none;color:#254bd9;font-size:11px\" href=\'javascript: bmm_erp_project_task_board_modify_progression_list(\"remove\",\"'+project_key+'\",\"'+pgkey+'\",\"'+board_status_list[statuskey]+'\",\"'+statuskey+'\");\'>remove</a>';
547: var new_td_elem = create_dom_element('td','td',null,null,null,null,{'bcolor':'#fff','width':'400px','border':'0px','fontsize':'13px','innerhtml':txt});
548: if (board_status_list[statuskey] == board_list[pgkey]['new_status_id']){
549: var new_td_box_elem = create_dom_element('td','td',null,null,null,null,{'bcolor':'#fff','width':'50px','border':'0px','fontsize':'15px','innerhtml':'<input type=\"checkbox\" value=\"text\" checked=\"checked\" readonly=\"readonly\" />'});
550: }else{
551: var new_td_box_elem = create_dom_element('td','td',null,null,null,null,{'bcolor':'#fff','width':'50px','border':'0px','fontsize':'15px','innerhtml':'<input type=\"checkbox\" onClick=\"javascript:bmm_erp_project_task_board_modify_progression_list(\'set_default_status\',\''+project_key+'\',\''+pgkey+'\',\''+board_status_list[statuskey]+'\',null)\" value=\"text\" />'});
552: }
553:
554: var new_tr_elem = create_dom_element('tr','tr', null,null,null,new_td_elem,null);
555: append_child_elem(new_tr_elem,new_td_box_elem);
556: append_child_elem(tbody_elem,new_tr_elem);
557: }
558: pgkey_prev = pgkey;
559: }
560: append_child_elem(table_elem,tbody_elem);
561: }
562:
563: function bmm_erp_project_task_board_create_progression_headers(key,progression){
564: var txt = '';
565: txt = txt.concat(
566: '<div id=\'bmm_erp_project_taskboard_div_header_text:',key,'\'>',
567: '<span id=\'bmm_erp_project_taskboard_span_header_text:',key,'\' style=\"width:200px;font-weight:normal;font-size:15px;color:#000\">',key,'</span>',
568: '<a style=\'text-decoration:none;color:#254bd9;font-size:11px\' href=\"javascript: bmm_erp_project_task_board_edit_header_text(\'edit\',\'',key,'\');\" \> edit</a>',
569: '</div>',
570: '<div id=\'bmm_erp_project_taskboard_div_edit_header_text:',key,' style=\"display:none\">',
571: '<div>',
572: '<input id=\'bmm_erp_project_taskboard_input_header_text:',key,'\' type=\"text\" style=\"width.200px\" value=\"',key,'\" />',
573: '</div>',
574: '<div style=\"margin-left:40px\">',
575: '<a style=\'text-decoration:none;color:#254bd9;font-size:11px\' href=\"javascript: bmm_erp_project_task_board_edit_header_text(\'cancel\',\',\'',key,'\');\" \> cancel</a>',
576: '<span style=\"margin-left:20px\">',
577: '<a style=\'text-decoration:none;color:#254bd9;font-size:11px\' href=\"javascript: bmm_erp_project_task_board_edit_header_text(\'update_header_text\',\'',key,'\');\" \> update</a>',
578: '</span>',
579: '</div>',
580: '</div>');
581: var new_td_elem = create_dom_element('td','','',null,null,null,{'valign':'top','border':'0px','bcolor':'#fff','innerhtml':txt});
582: }
583:
584: </script>";
585:
586: echo "
587: <div style=\"margin-left:850px;margin-top:-50px;position:absolute\"><img id=\"bmm_erp_project_task_board_ajaxload\" style=\"visibility:hidden\" src=\"img/ajax-loader.gif\"></div>
588: <table style=\"border:0px\">
589: <tr>
590: <th style=\"width:250px\" >Progression</th>
591: <th><span>Configured status</span><span style=\"margin-left:280px\">Set</span></th>
592: <th>Statuslist</th>
593: </tr>";
594:
595: $position = 1;
596: while ($position <= 4){
597: foreach (array_keys($this->board_configuration_arr['progression']) as $key){
598: if ($position != $this->board_configuration_arr['progression'][$key]['position']) continue;
599: echo "
600: <tr>
601: <td style='border-bottom:1px solid #f1f1f1;border-top:1px solid #f1f1f1;vertical-align:top;color:#727272;background-color:#fff'>
602: <div id='bmm_erp_project_taskboard_div_header_text:$position'>
603: <span id='bmm_erp_project_taskboard_span_header_text:$position' style=\"width:200px;font-weight:normal;font-size:15px;color:#000\">{$mainhandler->translator->translate($key)}</span>
604: <a style='text-decoration:none;color:#254bd9;font-size:11px' href=\"javascript: bmm_erp_project_task_board_edit_header_text('edit','$position');\" \> edit</a>
605: </div>
606: <div id='bmm_erp_project_taskboard_div_edit_header_text:$position' style=\"display:none\">
607: <div>
608: <input id='bmm_erp_project_taskboard_input_header_text:$position' type=\"text\" style=\"width.200px\" value=\"{$mainhandler->translator->translate($key)}\" />
609: </div>
610: <div style=\"margin-left:40px\">
611: <a style='text-decoration:none;color:#254bd9;font-size:11px' href=\"javascript: bmm_erp_project_task_board_edit_header_text('cancel','$position');\" \> cancel</a>
612: <span style=\"margin-left:20px\">
613: <a style='text-decoration:none;color:#254bd9;font-size:11px' href=\"javascript: bmm_erp_project_task_board_edit_header_text('update_header_text','$position');\" \> update</a>
614: </span>
615: </div>
616: </div>
617: </td>
618: <td style='border-bottom:1px solid #f1f1f1;border-top:1px solid #f1f1f1;;color:#727272;background-color:#fff'>
619: <table id=\"bmm_erp_project_task_board_progress_status_table:$key\">
620: <tbody id=\"bmm_erp_project_task_board_progress_status_tbody:$key\" style=\"position:relative\">
621: </tbody>
622: </table>
623: </td>
624: <td style='width:200px;vertical-align:top;text-align:left;border-bottom:1px solid #f1f1f1;border-top:1px solid #f1f1f1;color:#727272;background-color:#fff'>
625: <select id=\"status_flow_item_new:$key\" name=\"status_flow_item_new:$key\">";
626: foreach($STATUS_LIST['PROJECT_TASK'] as $s => $sy){
627: if ($s == 'CANCELLED') continue;
628: echo "
629: <option value=\"{$sy[0]}\">$s</option>";
630: }
631: echo "
632: </select>
633: <span style=\"\">
634: <a style=\"text-decoration:none;color:#254bd9;font-size:11px\" href=\"javascript:bmm_erp_project_task_board_modify_progression_list('add','$project_key','$key',null,null);\">{$mainhandler->translator->translate('add','u')}</a>
635: </span>
636: </td>";
637: echo "
638: </tr>";
639: }
640: $position++;
641: }
642: echo "
643: </table>
644:
645: <div>
646: <span>Status for planning board</span>
647: <span>
648: <select id=\"status_planning_item:$key\" name=\"status_planning_item:$key\" onChange=\"javascript:bmm_erp_project_task_board_modify_planning_item('set_planning_item','$project_key',this.options[this.options.selectedIndex].value)\">";
649: foreach($STATUS_LIST['PROJECT_TASK'] as $s => $sy){
650: $selected = null;
651: error_log($this->board_configuration_arr['planning_status']['status_id']);
652: if ($s == 'CANCELLED') continue;
653: if ($this->board_configuration_arr['planning_status']['status_id'] == $sy[0] )
654: $selected = "selected = 'selected'";
655:
656: echo "
657: <option value=\"{$sy[0]}\" $selected >$s</option>";
658: }
659: echo "
660: </select>
661: </span>
662: </<div>
663:
664: <script type=\"text/javascript\">
665: create_progression_status_list();
666: </script>";
667: }
668:
669: public function setTaskWorkFlowAdd(&$pagewrap,&$mainhandler,&$baseui,$params_arr = null){
670: global $STATUS_LIST;
671: $disabled = $mainhandler->getProjectId() > 0 ? null : "disabled = 'disabled'";
672: echo "
673: <tr>
674: <td style='border:0px;color:#727272;background-color:#fff'><input type=\"text\" name=\"status_item\" style=\"width:150px;font-weight:normal;font-size:11px;color:#000\" value=\"\" /></span></td>
675: <td style='border:0px;color:#727272;background-color:#fff'><input style=\"height:30px\" type=\"button\" onClick=\"javascript: add_config_item('status');\" value=\"Submit\" $disabled /></span></td>
676: </tr>";
677: }
678:
679: private function pluginConfiguration(&$apphandler){
680: $pluginhandler = new pluginConfigHandler(null);
681: $pluginhandler->readPluginConfigurations($apphandler);
682: $plugin_arr = $pluginhandler->getPluginXmlInfo();
683: $pluginhandler->viewhandler->listRegisteredPlugins($plugin_arr,PROJECT_APP,$apphandler->getAppTargetId(),"900px");
684: }
685:
686:
687: public function setTaskBoardView(&$pagewrap,&$mainhandler,&$baseui,$params_arr = null){
688: global $STATUS_LIST;
689: $dataobj = $params_arr['actionhandler']->getDataObject();
690: $project_key = $dataobj->getProjectKey();
691: $target = isset($project_key) ? $project_key : 'any';
692: $this->loadActionData($mainhandler->getSchemaName(),$mainhandler->getAppTargetId());
693:
694: $target_types = array("member","group","roles");
695: $component_version_list_arr = $mainhandler->getProjectTaskComponentCount(true);
696: $membership_list_arr = $mainhandler->getProjectUserList();
697:
698: $default_component_option_key = "task_board_default_component:{$mainhandler->getProjectKey()}:{$mainhandler->getUserId()}";
699: $default_component = $mainhandler->optionshandler->getOptionValue($default_component_option_key,true);
700:
701: $default_screen_option_key = "task_board_default_screen:{$mainhandler->getProjectKey()}:{$mainhandler->getUserId()}";
702: $default_screen = $mainhandler->optionshandler->getOptionValue($default_screen_option_key,true);
703:
704: $mainhandler->optionshandler->addCustomOptionEntry($default_component_option_key,$default_component);
705: $mainhandler->optionshandler->addCustomOptionEntry($default_screen_option_key,$default_screen);
706:
707: $write = $mainhandler->verifyApplicationPermission($mainhandler->getAppTargetId(),$mainhandler->getUserId(),null,'WRITE');
708:
709: $ctask_list = $dataobj->getProjectTaskComponentCount();
710: if (!is_array($ctask_list)) $ctask_list = array();
711: echo "
712: <div id=\"task_board_main_window\" style=\"width:700px\">
713: <div id=\"scrum_board_config_view\" style=\"visibility:none\">
714: </div>
715: <div id=\"task_board_config_view\">
716: <div style=\"float:left;width:70px;text-align:right;font-size:14px\">{$mainhandler->translator->translate('area','u')} </div>
717: <select id=\"bmm_erp_project_task_board_component_select\" style=\"width:200px\" onChange=\"javascript: this.blur();bmm_erp_project_task_board.set_search_option('component_version_id',this.options[this.options.selectedIndex].value);\" >
718: <option value=\"\" selected=\"selected\">none</option>
719: <option value=\"0\" selected=\"selected\">-Any-</option>";
720: foreach ($ctask_list as $data_arr){
721: list ($component,$version,$cnt,$cid,$vid,$enabled) = $data_arr;
722: if ($enabled == 0){continue;}
723: if (intval($cnt)){
724: $selected = $vid == $default_component ? $selected = "selected = 'selected'" : null;
725: echo "
726: <option value=\"$vid\" $selected >$component - $version</option>";
727: }
728: }
729: echo "
730: </select>
731: <span>
732: <a style=\"font-size:14px\" href=\"javascript: bmm_erp_project_task_board.set_default_component(bmm_erp_project_task_board_component_select.options[bmm_erp_project_task_board_component_select.options.selectedIndex].value)\">{$mainhandler->translator->translate('default','u')}</a>
733: </span>
734:
735: <span style=\"margin-left:20px;font-size:14px\">{$mainhandler->translator->translate('assignee','u')}</span>
736: <select id=\"bmm_erp_project_task_board_assignee_select\" style=\"width:200px\" onChange=\"javascript:this.blur();bmm_erp_project_task_board.set_search_option('assignee_id',this.options[this.options.selectedIndex].value);\">
737: <option value=\"null\">-Any-</option>";
738: foreach (array_keys($membership_list_arr) as $key){
739: echo "
740: <option value=\"{$membership_list_arr[$key]}\">{$mainhandler->translator->translate('$key')}</option>";
741: }
742: echo "
743: </select>";
744:
745: echo "
746: <div class=\"clearfix\" style=\"clear:both;margin-top:5px\">
747: <div style=\"float:left\">
748: <div style=\"float:left;width:70px;text-align:right;font-size:14px\">{$mainhandler->translator->translate('board','u')} </div>
749: <select id=\"bmm_erp_project_task_board_view_select\" style=\"width:200px\" onChange=\"javascript: this.blur();bmm_erp_project_task_board.set_view_option(this.options[this.options.selectedIndex].value);\" >
750: <option value=\"0\" selected=\"selected\">none</option>";
751: foreach (array_keys($this->board_configuration_arr['views']) as $view){
752: echo "
753: <option value=\"$view\" >$view</option>";
754: }
755: echo "
756: </select>
757: <a style=\"font-size:14px\" href=\"javascript: bmm_erp_project_task_board.manage_board_view('new')\">{$mainhandler->translator->translate('new')}</a>
758: <a id=\"manage_board_view_edit\" style=\"font-size:14px\" href=\"javascript: bmm_erp_project_task_board.manage_board_view('edit')\"></a>
759: </div>
760:
761:
762: <div id=\"bmm_erp_project_task_board_app_board_link\" style=\"float:left;margin-left:70px;margin-top:5px;display:none;\">
763: <a href=\"javascript: bmm_erp_project_task_board.get_project_task_board_data()\">{$mainhandler->translator->translate('task_board','u')}</a>
764: </div>
765:
766: <div id=\"bmm_erp_project_task_board_app_planning_link\" style=\"float:left;margin-left:70px;margin-top:5px\">
767: <a style=\"font-size:14px;font-weight:bold\" href=\"javascript: bmm_erp_project_planning_board.get_project_planning_board_data()\">{$mainhandler->translator->translate('planning')}</a>
768: </div>
769: <div id=\"bmm_erp_project_task_board_app_release_link\" style=\"float:left;margin-left:70px;margin-top:5px;visibility:hidden\">
770: <a style=\"font-size:14px;font-weight:bold\" href=\"javascript: bmm_erp_project_task_board.show_release_details_view()\">{$mainhandler->translator->translate('release','u')}</a>
771: </div>
772: </div>
773:
774: <div id=\"bmm_erp_project_task_board_edit_views\" style=\"position:absolute;margin-left:300px\">
775:
776: </div>
777: </div>
778: </div>
779: <img id=\"ajaxload_project_area\" style=\"position:absolute;margin-top:-30px;margin-left:550px;visibility:hidden\" src=\"img/ajax-loader.gif\">";
780:
781: echo "
782: <table style=\"border:0px solid #fff\">
783: <tr>
784: <th colspan=3 style='padding:0px;background-color:#000;color:#fff;font-weight:bold'>
785: <span style=\"padding:0px;font-size:15px\">{$mainhandler->translator->translate('tasks','u')}</span>
786: <span id=\"task_board_span_fullscreen_link\" style=\"padding:0px;margin:0px;margin-left:450px\">
787: <a href=\"javascript:bmm_erp_project_task_board.set_task_board_full_screen(true)\"><img height=24 width=24 src=\"img/fullscreen-11-128.png\" /></a>
788: </span>
789: </th>
790: </tr>
791: </table> ";
792:
793: echo "
794: <table id=\"task_board\" style=\"border:0px solid #fff;\">
795: </table>
796:
797: <script type='text/javascript'>
798:
799: var txt = '';
800: txt = bmm_erp_project_task_board.set_manage_board_view_edit_window(txt);
801: txt = bmm_erp_project_task_board.set_manage_board_view_new_window(txt);
802: $('bmm_erp_project_task_board_edit_views').innerHTML = txt;
803:
804: bmm_hide_edit_section();
805: bmm_erp_project_task_board.progression_list = JSON.decode('".json_encode($this->board_configuration_arr['progression'])."');
806: bmm_erp_project_task_board.write = '$write';
807: bmm_erp_project_task_board.color_arr = Array('#ffdeb6','#f9e182','#b6ffe4','#bdffb6');";
808:
809: $header_arr =
810: "bmm_erp_project_task_board.header_arr = Array('{$mainhandler->translator->translate( $this->getProgressFromPosition(1),'u')}','{$mainhandler->translator->translate($this->getProgressFromPosition(2),'u')}','{$mainhandler->translator->translate($this->getProgressFromPosition(3),'u')}','{$mainhandler->translator->translate($this->getProgressFromPosition(4),'u')}');";
811:
812:
813: $status_arr = "";
814: $priority_arr = "";
815: $component_arr = "";
816: $memberships_arr = "";
817:
818: $priority_color = array(
819: 'NONE' => '#dcdcdc',
820: 'MINOR' => '#00bfe1',
821: 'MAJOR' => '#e1d400',
822: 'CRITICAL' => '#bd6e6e');
823: $position = 0;
824: while(1){
825: if ($position > 3) break;
826: $progression_prev = $position ? $this->getProgressFromPosition($position) : null;
827: $progression = $this->getProgressFromPosition($position + 1);
828: $progression_next = $this->getProgressFromPosition($position + 2);
829: foreach(array_keys($this->board_configuration_arr['progression'][$progression]['statuslist']) as $status){
830: if ($this->board_configuration_arr['progression'][$progression]['statuslist'][$status] == null) continue;
831: $status_current_id = $this->board_configuration_arr['progression'][$progression]['statuslist'][$status];
832: $status_arr .= "
833: bmm_erp_project_task_board.status_arr[\"$status\"] = Array();";
834:
835: $status_arr .= "
836: bmm_erp_project_task_board.status_arr[\"$status\"][\"id\"] = \"{$STATUS_LIST['PROJECT_TASK']["$status"][0]}\";
837: bmm_erp_project_task_board.status_arr[\"$status\"][\"position\"] = $position;";
838:
839: $status_arr .= $progression_prev ? "bmm_erp_project_task_board.status_arr[\"$status\"][\"prev_id\"] = \"{$this->board_configuration_arr['progression'][$progression_prev]['new_status_id']}\";" : "bmm_erp_project_task_board.status_arr[\"$status\"][\"prev_id\"] = null;";
840:
841: $status_arr .= $progression_next ? "bmm_erp_project_task_board.status_arr[\"$status\"][\"next_id\"] = \"{$this->board_configuration_arr['progression'][$progression_next]['new_status_id']}\";" : "bmm_erp_project_task_board.status_arr[\"$status\"][\"next_id\"] = null;";
842: }
843: $position++;
844: }
845:
846: foreach (array_keys( $priority_color) as $priority){
847: $priority_id = $STATUS_LIST['TASK_PRIORITY']["$priority"][0];
848: $priority_arr .= "
849: bmm_erp_project_task_board.priority_arr[\"$priority\"] = Array();
850: bmm_erp_project_task_board.priority_arr[\"$priority\"][\"id\"] = \"$priority_id\";
851: bmm_erp_project_task_board.priority_arr[\"$priority\"][\"color\"] = \"{$priority_color["$priority"]}\";";
852: }
853:
854: $i = 0;
855: if (is_array($component_version_list_arr))
856: foreach (array_keys($component_version_list_arr) as $key){
857: $component_name = $component_version_list_arr[$key][0];
858: $version_name = $component_version_list_arr[$key][1];
859: $component_id = $component_version_list_arr[$key][3];
860: $version_id = $component_version_list_arr[$key][4];
861: $enabled_id = $component_version_list_arr[$key][5];
862: if ($enabled_id){
863: $component_arr .= "
864: bmm_erp_project_task_board.component_arr[\"$i\"] = Array();
865: bmm_erp_project_task_board.component_arr[\"$i\"]['id'] = \"{$component_id}:{$version_id}\";
866: bmm_erp_project_task_board.component_arr[\"$i\"]['name'] = \"{$component_name}-{$version_name}\";";
867: $i++;
868: }
869: }
870:
871: $i = 0;
872: foreach (array_keys($membership_list_arr) as $key){
873: $memberships_arr .= "
874: bmm_erp_project_task_board.membership_arr[\"$i\"] = Array();
875: bmm_erp_project_task_board.membership_arr[\"$i\"]['id'] = \"{$membership_list_arr[$key]}\";
876: bmm_erp_project_task_board.membership_arr[\"$i\"]['username'] = \"$key\";";
877: $i++;
878: }
879:
880: echo " $header_arr";
881: echo " $priority_arr";
882: echo " $status_arr";
883: echo " $component_arr";
884: echo " $memberships_arr";
885:
886:
887: $initial_progression = strtoupper($this->getProgressFromPosition(1));
888: $initial_progression_id = $STATUS_LIST['PROJECT_TASK']["$initial_progression"][0];
889: echo "
890: bmm_erp_project_task_board.planning_id = ".$this->board_configuration_arr['planning_status']['status_id'].";
891: bmm_erp_project_planning_board.planning_next_id = ".$initial_progression_id.";
892: bmm_erp_project_task_board.view_config_arr = ".json_encode($this->board_configuration_arr['views']).";
893: bmm_erp_project_task_board.lang_item['type'] = '{$mainhandler->translator->translate('type','u')}';
894: bmm_erp_project_task_board.lang_item['planning'] = '{$mainhandler->translator->translate('planning','u')}';
895: bmm_erp_project_planning_board.lang_item['type'] = '{$mainhandler->translator->translate('type','u')}';
896: bmm_erp_project_task_board.default_screen = '$default_screen';
897: bmm_erp_project_task_board.project_key = '{$mainhandler->getProjectKey()}';
898: bmm_erp_project_board_config.JSONSearchOption['board_id'] = '".intval($mainhandler->getScrumBoardId())."';
899: bmm_erp_project_board_config.JSONSearchOption['component_version_id'] = '$default_component';
900: bmm_erp_project_board_config.app_url = '{$mainhandler->getApplicationUrl()}';
901: bmm_erp_project_task_board.get_project_task_board_data('$default_screen');
902: window.addEvent('domready', function() {
903: $('operations_div').style.display = 'none';
904: });
905: </script>";
906: }
907: }?>
908: