Пример #1
0
 /**
  * GET /backlog
  * GET /backlog/@filter
  * GET /backlog/@filter/@groupid
  *
  * @param \Base $f3
  * @param array $params
  */
 public function index($f3, $params)
 {
     if (empty($params["filter"])) {
         $params["filter"] = "groups";
     }
     if (empty($params["groupid"])) {
         $params["groupid"] = "";
     }
     // Get list of all users in the user's groups
     if ($params["filter"] == "groups") {
         $group_model = new \Model\User\Group();
         if (!empty($params["groupid"]) && is_numeric($params["groupid"])) {
             //Get users list from a specific Group
             $users_result = $group_model->find(array("group_id = ?", $params["groupid"]));
         } else {
             //Get users list from all groups that you are in
             $groups_result = $group_model->find(array("user_id = ?", $this->_userId));
             $filter_users = array($this->_userId);
             foreach ($groups_result as $g) {
                 $filter_users[] = $g["group_id"];
             }
             $groups = implode(",", $filter_users);
             $users_result = $group_model->find("group_id IN ({$groups})");
         }
         foreach ($users_result as $u) {
             $filter_users[] = $u["user_id"];
         }
     } elseif ($params["filter"] == "me") {
         //Just get your own id
         $filter_users = array($this->_userId);
     }
     $filter_string = empty($filter_users) ? "" : "AND owner_id IN (" . implode(",", $filter_users) . ")";
     $f3->set("filter", $params["filter"]);
     $sprint_model = new \Model\Sprint();
     $sprints = $sprint_model->find(array("end_date >= ?", $this->now(false)), array("order" => "start_date ASC"));
     $issue = new \Model\Issue\Detail();
     $sprint_details = array();
     foreach ($sprints as $sprint) {
         $projects = $issue->find(array("deleted_date IS NULL AND sprint_id = ? AND type_id = ? {$filter_string}", $sprint->id, $f3->get("issue_type.project")), array('order' => 'priority DESC, due_date'));
         $sprint_details[] = $sprint->cast() + array("projects" => $projects);
     }
     $large_projects = $f3->get("db.instance")->exec("SELECT parent_id FROM issue WHERE parent_id IS NOT NULL AND type_id = ?", $f3->get("issue_type.project"));
     $large_project_ids = array();
     foreach ($large_projects as $p) {
         $large_project_ids[] = $p["parent_id"];
     }
     // Load backlog
     if (!empty($large_project_ids)) {
         $large_project_ids = implode(",", $large_project_ids);
         $unset_projects = $issue->find(array("deleted_date IS NULL AND sprint_id IS NULL AND type_id = ? AND status_closed = '0' AND id NOT IN ({$large_project_ids}) {$filter_string}", $f3->get("issue_type.project")), array('order' => 'priority DESC, due_date'));
     } else {
         $unset_projects = $issue->find(array("deleted_date IS NULL AND sprint_id IS NULL AND type_id = ? AND status_closed = '0' {$filter_string}", $f3->get("issue_type.project")), array('order' => 'priority DESC, due_date'));
     }
     // Filter projects into sorted and unsorted arrays if filtering by group
     if (!empty($params["groupid"])) {
         // Add sorted projects
         $backlog = array();
         $sortModel = new \Model\Issue\Backlog();
         $sortModel->load(array("user_id = ?", $params["groupid"]));
         $sortArray = array();
         if ($sortModel->id) {
             $sortArray = json_decode($sortModel->issues);
             foreach ($sortArray as $id) {
                 foreach ($unset_projects as $p) {
                     if ($p->id == $id) {
                         $backlog[] = $p;
                     }
                 }
             }
         }
         // Add remaining projects
         $unsorted = array();
         foreach ($unset_projects as $p) {
             if (!in_array($p->id, $sortArray)) {
                 $unsorted[] = $p;
             }
         }
     } else {
         $backlog = $unset_projects;
     }
     $groups = new \Model\User();
     $f3->set("groups", $groups->getAllGroups());
     $f3->set("groupid", $params["groupid"]);
     $f3->set("sprints", $sprint_details);
     $f3->set("backlog", $backlog);
     $f3->set("unsorted", $unsorted);
     $f3->set("title", $f3->get("dict.backlog"));
     $f3->set("menuitem", "backlog");
     $this->_render("backlog/index.html");
 }
Пример #2
0
 /**
  * View a taskboard
  *
  * @param \Base $f3
  * @param array $params
  */
 public function index($f3, $params)
 {
     $sprint = new \Model\Sprint();
     // Load current sprint if no sprint ID is given
     if (!intval($params["id"])) {
         $localDate = date('Y-m-d', \Helper\View::instance()->utc2local());
         $sprint->load(array("? BETWEEN start_date AND end_date", $localDate));
         if (!$sprint->id) {
             $f3->error(404);
             return;
         }
     }
     // Default to showing group tasks
     if (empty($params["filter"])) {
         $params["filter"] = "groups";
     }
     // Load the requested sprint
     if (!$sprint->id) {
         $sprint->load($params["id"]);
         if (!$sprint->id) {
             $f3->error(404);
             return;
         }
     }
     $f3->set("sprint", $sprint);
     $f3->set("title", $sprint->name . " " . date('n/j', strtotime($sprint->start_date)) . "-" . date('n/j', strtotime($sprint->end_date)));
     $f3->set("menuitem", "backlog");
     // Get list of all users in the user's groups
     $filter_users = $this->_filterUsers($params);
     // Load issue statuses
     $status = new \Model\Issue\Status();
     $statuses = $status->find(array('taskboard > 0'), array('order' => 'taskboard_sort ASC'));
     $mapped_statuses = array();
     $visible_status_ids = array();
     $column_count = 0;
     foreach ($statuses as $s) {
         $visible_status_ids[] = $s->id;
         $mapped_statuses[$s->id] = $s;
         $column_count += $s->taskboard;
     }
     $visible_status_ids = implode(",", $visible_status_ids);
     $f3->set("statuses", $mapped_statuses);
     $f3->set("column_count", $column_count);
     // Load issue priorities
     $priority = new \Model\Issue\Priority();
     $f3->set("priorities", $priority->find(null, array("order" => "value DESC"), $f3->get("cache_expire.db")));
     // Load project list
     $issue = new \Model\Issue\Detail();
     // Find all visible tasks
     $tasks = $issue->find(array("sprint_id = ? AND type_id != ? AND deleted_date IS NULL AND status IN ({$visible_status_ids})" . (empty($filter_users) ? "" : " AND owner_id IN (" . implode(",", $filter_users) . ")"), $sprint->id, $f3->get("issue_type.project")), array("order" => "priority DESC"));
     $task_ids = array();
     $parent_ids = array(0);
     foreach ($tasks as $task) {
         $task_ids[] = $task->id;
         if ($task->parent_id) {
             $parent_ids[] = $task->parent_id;
         }
     }
     $task_ids_str = implode(",", $task_ids);
     $parent_ids_str = implode(",", $parent_ids);
     $f3->set("tasks", $task_ids_str);
     // Find all visible projects or parent tasks
     $projects = $issue->find(array("id IN ({$parent_ids_str}) OR (sprint_id = ? AND type_id = ? AND deleted_date IS NULL" . (empty($filter_users) ? ")" : " AND owner_id IN (" . implode(",", $filter_users) . "))"), $sprint->id, $f3->get("issue_type.project")), array("order" => "owner_id ASC, priority DESC"));
     // Sort projects if a filter is given
     if (!empty($params["filter"]) && is_numeric($params["filter"])) {
         $sortModel = new \Model\Issue\Backlog();
         $sortModel->load(array("user_id = ? AND sprint_id = ?", $params["filter"], $sprint->id));
         $sortArray = array();
         if ($sortModel->id) {
             $sortArray = json_decode($sortModel->issues);
             usort($projects, function (\Model\Issue $a, \Model\Issue $b) use($sortArray) {
                 $ka = array_search($a->id, $sortArray);
                 $kb = array_search($b->id, $sortArray);
                 if ($ka === false && $kb !== false) {
                     return -1;
                 }
                 if ($ka !== false && $kb === false) {
                     return 1;
                 }
                 if ($ka === $kb) {
                     return 0;
                 }
                 if ($ka > $kb) {
                     return 1;
                 }
                 if ($ka < $kb) {
                     return -1;
                 }
             });
         }
     }
     // Build multidimensional array of all tasks and projects
     $taskboard = array();
     foreach ($projects as $project) {
         // Build array of statuses to put tasks under
         $columns = array();
         foreach ($statuses as $status) {
             $columns[$status["id"]] = array();
         }
         // Add current project's tasks
         foreach ($tasks as $task) {
             if ($task->parent_id == $project->id || $project->id == 0 && (!$task->parent_id || !in_array($task->parent_id, $parent_ids))) {
                 $columns[$task->status][] = $task;
             }
         }
         // Add hierarchical structure to taskboard array
         $taskboard[] = array("project" => $project, "columns" => $columns);
     }
     $f3->set("taskboard", array_values($taskboard));
     $f3->set("filter", $params["filter"]);
     // Get user list for select
     $users = new \Model\User();
     $f3->set("users", $users->getAll());
     $f3->set("groups", $users->getAllGroups());
     $this->_render("taskboard/index.html");
 }
Пример #3
0
 /**
  * View a taskboard
  */
 public function index($f3, $params)
 {
     // Require a valid numeric sprint ID
     if (!intval($params["id"])) {
         $f3->error(404);
         return;
     }
     // Default to showing group tasks
     if (empty($params["filter"])) {
         $params["filter"] = "groups";
     }
     // Load the requested sprint
     $sprint = new \Model\Sprint();
     $sprint->load($params["id"]);
     if (!$sprint->id) {
         $f3->error(404);
         return;
     }
     $f3->set("sprint", $sprint);
     $f3->set("title", $sprint->name . " " . date('n/j', strtotime($sprint->start_date)) . "-" . date('n/j', strtotime($sprint->end_date)));
     $f3->set("menuitem", "backlog");
     // Get list of all users in the user's groups
     $filter_users = $this->_filterUsers($params);
     // Load issue statuses
     $status = new \Model\Issue\Status();
     $statuses = $status->find(array('taskboard > 0'), null, $f3->get("cache_expire.db"));
     $mapped_statuses = array();
     $visible_status_ids = array();
     $column_count = 0;
     foreach ($statuses as $s) {
         $visible_status_ids[] = $s->id;
         $mapped_statuses[$s->id] = $s;
         $column_count += $s->taskboard;
     }
     $visible_status_ids = implode(",", $visible_status_ids);
     $f3->set("statuses", $mapped_statuses);
     $f3->set("column_count", $column_count);
     // Load issue priorities
     $priority = new \Model\Issue\Priority();
     $f3->set("priorities", $priority->find(null, array("order" => "value DESC"), $f3->get("cache_expire.db")));
     // Load project list
     $issue = new \Model\Issue\Detail();
     // Find all visible tasks
     $tasks = $issue->find(array("sprint_id = ? AND type_id != ? AND deleted_date IS NULL AND status IN ({$visible_status_ids})" . (empty($filter_users) ? "" : " AND owner_id IN (" . implode(",", $filter_users) . ")"), $sprint->id, $f3->get("issue_type.project")), array("order" => "priority DESC"));
     $task_ids = array();
     $parent_ids = array(0);
     foreach ($tasks as $task) {
         $task_ids[] = $task->id;
         if ($task->parent_id) {
             $parent_ids[] = $task->parent_id;
         }
     }
     $task_ids_str = implode(",", $task_ids);
     $parent_ids_str = implode(",", $parent_ids);
     $f3->set("tasks", $task_ids_str);
     // Find all visible projects or parent tasks
     $projects = $issue->find(array("id IN ({$parent_ids_str}) OR (sprint_id = ? AND type_id = ? AND deleted_date IS NULL" . (empty($filter_users) ? ")" : " AND owner_id IN (" . implode(",", $filter_users) . "))"), $sprint->id, $f3->get("issue_type.project")), array("order" => "owner_id ASC"));
     // Build multidimensional array of all tasks and projects
     $taskboard = array();
     foreach ($projects as $project) {
         // Build array of statuses to put tasks under
         $columns = array();
         foreach ($statuses as $status) {
             $columns[$status["id"]] = array();
         }
         // Add current project's tasks
         foreach ($tasks as $task) {
             if ($task->parent_id == $project->id || $project->id == 0 && (!$task->parent_id || !in_array($task->parent_id, $parent_ids))) {
                 $columns[$task->status][] = $task;
             }
         }
         // Add hierarchical structure to taskboard array
         $taskboard[] = array("project" => $project, "columns" => $columns);
     }
     $f3->set("taskboard", array_values($taskboard));
     $f3->set("filter", $params["filter"]);
     // Get user list for select
     $users = new \Model\User();
     $f3->set("users", $users->getAll());
     $f3->set("groups", $users->getAllGroups());
     $this->_render("taskboard/index.html");
 }
Пример #4
0
 /**
  * GET /issues
  * Display a sortable, filterable issue list
  *
  * @param  \Base  $f3
  */
 public function index($f3)
 {
     $issues = new \Model\Issue\Detail();
     // Get filter
     $args = $f3->get("GET");
     list($filter, $filter_str) = $this->_buildFilter();
     // Load type if a type_id was passed
     $type = new \Model\Issue\Type();
     if (!empty($args["type_id"])) {
         $type->load($args["type_id"]);
         if ($type->id) {
             $f3->set("title", $f3->get("dict.issues") . " - " . $f3->get("dict.by_type") . ": " . $type->name);
             $f3->set("type", $type);
         }
     } else {
         $f3->set("title", $f3->get("dict.issues"));
     }
     $status = new \Model\Issue\Status();
     $f3->set("statuses", $status->find(null, null, $f3->get("cache_expire.db")));
     $priority = new \Model\Issue\Priority();
     $f3->set("priorities", $priority->find(null, array("order" => "value DESC"), $f3->get("cache_expire.db")));
     $f3->set("types", $type->find(null, null, $f3->get("cache_expire.db")));
     $sprint = new \Model\Sprint();
     $f3->set("sprints", $sprint->find(array("end_date >= ?", date("Y-m-d")), array("order" => "start_date ASC")));
     $f3->set("old_sprints", $sprint->find(array("end_date < ?", date("Y-m-d")), array("order" => "start_date ASC")));
     $users = new \Model\User();
     $f3->set("users", $users->getAll());
     $f3->set("deleted_users", $users->getAllDeleted());
     $f3->set("groups", $users->getAllGroups());
     if (empty($args["page"])) {
         $args["page"] = 0;
     }
     $issue_page = $issues->paginate($args["page"], 50, $filter_str);
     $f3->set("issues", $issue_page);
     // Pass filter string for pagination
     $filter_get = http_build_query($filter);
     if (!empty($orderby)) {
         $filter_get .= "&orderby=" . $orderby;
     }
     if ($issue_page["count"] > 7) {
         if ($issue_page["pos"] <= 3) {
             $min = 0;
         } else {
             $min = $issue_page["pos"] - 3;
         }
         if ($issue_page["pos"] < $issue_page["count"] - 3) {
             $max = $issue_page["pos"] + 3;
         } else {
             $max = $issue_page["count"] - 1;
         }
     } else {
         $min = 0;
         $max = $issue_page["count"] - 1;
     }
     $f3->set("pages", range($min, $max));
     $f3->set("filter_get", $filter_get);
     $f3->set("menuitem", "browse");
     $f3->set("heading_links_enabled", true);
     $f3->set("show_filters", true);
     $f3->set("show_export", true);
     $this->_render("issues/index.html");
 }