~raulraat/eventum/sortable

« back to all changes in this revision

Viewing changes to lib/eventum/class.issue.php

  • Committer: Raul Raat
  • Date: 2009-09-11 14:12:25 UTC
  • Revision ID: raulraat@gmail.com-20090911141225-1laoetikruqz3j2l
- update order when assigning, unasssigning, and closing issue

Show diffs side-by-side

added added

removed removed

Lines of Context:
1389
1389
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
1390
1390
            return -1;
1391
1391
        } else {
 
1392
                Issue::moveOrderForAllUsers($issue_id, 1000);
1392
1393
            $prj_id = self::getProjectID($issue_id);
1393
1394
 
1394
1395
            // record the change
1856
1857
    {
1857
1858
        $issue_id = Misc::escapeInteger($issue_id);
1858
1859
        $assignee_usr_id = Misc::escapeInteger($assignee_usr_id);
 
1860
 
 
1861
        $order = 1;
 
1862
        // move all orders down to free "order space" for this new association
 
1863
        $stmt = "UPDATE 
 
1864
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
 
1865
                 SET
 
1866
                    isu_order = isu_order + 1
 
1867
                 WHERE
 
1868
                    isu_usr_id = " . $assignee_usr_id . " AND
 
1869
                    isu_order >= " .$order;
 
1870
        $res = DB_Helper::getInstance()->query($stmt);
 
1871
        if (PEAR::isError($res)) {
 
1872
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
 
1873
            return -1;
 
1874
        }
 
1875
 
 
1876
        // insert the new association
1859
1877
        $stmt = "INSERT INTO
1860
1878
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
1861
1879
                 (
1862
1880
                    isu_iss_id,
1863
1881
                    isu_usr_id,
1864
 
                    isu_assigned_date
 
1882
                    isu_assigned_date,
 
1883
                    isu_order
1865
1884
                 ) VALUES (
1866
1885
                    $issue_id,
1867
1886
                    $assignee_usr_id,
1868
 
                    '" . Date_Helper::getCurrentDateGMT() . "'
 
1887
                    '" . Date_Helper::getCurrentDateGMT() . "',
 
1888
                    $order
1869
1889
                 )";
1870
1890
        $res = DB_Helper::getInstance()->query($stmt);
1871
1891
        if (PEAR::isError($res)) {
1895
1915
        if (is_array($issue_id)) {
1896
1916
            $issue_id = implode(", ", $issue_id);
1897
1917
        }
 
1918
        $deleted_order_list = Issue::getDeleteUserAssociationOrderList($issue_id);
1898
1919
        $stmt = "DELETE FROM
1899
1920
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
1900
1921
                 WHERE
1925
1946
    {
1926
1947
        $issue_id = Misc::escapeInteger($issue_id);
1927
1948
        $usr_id = Misc::escapeInteger($usr_id);
 
1949
        $delete_order_list = Issue::getDeleteUserAssociationOrderList($issue_id, $usr_id);
1928
1950
        $stmt = "DELETE FROM
1929
1951
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
1930
1952
                 WHERE
1939
1961
                History::add($issue_id, Auth::getUserID(), History::getTypeID('user_unassociated'),
1940
1962
                    User::getFullName($usr_id) . ' removed from issue by ' . User::getFullName(Auth::getUserID()));
1941
1963
            }
 
1964
            Issue::rearrangeDeleteUserAssociationOrderList($delete_order_list);
1942
1965
            return 1;
1943
1966
        }
1944
1967
    }
2398
2421
    {
2399
2422
        $sort_by = self::getParam('sort_by');
2400
2423
        $sort_order = self::getParam('sort_order');
 
2424
        $users = Issue::getParam('users');
 
2425
        if (empty($users) && ($sort_by == 'isu_order')) { 
 
2426
            // Sorting by isu_order is impossible when no user specified
 
2427
            unset($sort_by);
 
2428
            unset($sort_order);
 
2429
        }
2401
2430
        $rows = self::getParam('rows');
2402
2431
        $hide_closed = self::getParam('hide_closed');
2403
2432
        if ($hide_closed === '') {
4315
4344
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
4316
4345
            return -1;
4317
4346
        }
 
4347
        Issue::moveOrderForAllUsers($issue_id, 1);
4318
4348
    }
4319
4349
 
4320
4350
 
4409
4439
        return $order_list;
4410
4440
    }
4411
4441
 
 
4442
 
 
4443
 
 
4444
    /**
 
4445
     * Reorders user's issues as requested by user
 
4446
     * @access public
 
4447
     * @param $usr_id User to be reordered
 
4448
     * @param $issue_id Issue or array of issues to be moved
 
4449
     * @param $neworder The new order of the issues
 
4450
     * @return void
 
4451
     */
 
4452
    function reorderUserIssues($usr_id, $issue_id, $neworder)
 
4453
    {
 
4454
        if (!isset($usr_id) || !isset($issue_id) || !isset($neworder)) {
 
4455
            return false;
 
4456
        }
 
4457
        if (!is_numeric($usr_id) || !is_numeric($neworder)) {
 
4458
            return false;
 
4459
        }
 
4460
        $usr_id = Misc::escapeInteger($usr_id);
 
4461
        $issue_id = Misc::escapeInteger($issue_id);
 
4462
        $neworder = Misc::escapeInteger($neworder);
 
4463
        if (is_array($issue_id)) {
 
4464
            $issue_count = count($issue_id);
 
4465
            $issue_id_str = implode(", ", $issue_id);
 
4466
        } else {
 
4467
            $issue_count = 1;
 
4468
            $issue_id_str = $issue_id;
 
4469
            $issue_id = array($issue_id);
 
4470
        }
 
4471
        // do a nasty pretending to be deleting stuff so that reordering happens as if these elements were deleted
 
4472
        $orderlist = Issue::getDeleteUserAssociationOrderList($issue_id_str, $usr_id);
 
4473
        Issue::rearrangeDeleteUserAssociationOrderList($orderlist);
 
4474
        // move down the orders to free the "order space" needed
 
4475
        $stmt = "UPDATE 
 
4476
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
 
4477
                 SET
 
4478
                    isu_order = isu_order + " . $issue_count . "
 
4479
                 WHERE
 
4480
                    isu_usr_id =  " . $usr_id . " AND
 
4481
                    isu_order >= " . $neworder;
 
4482
        $res = DB_Helper::getInstance()->query($stmt);
 
4483
        if (PEAR::isError($res)) {
 
4484
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
 
4485
            return -1;
 
4486
        }
 
4487
        //update the order for the issues being moved
 
4488
        $i = 0;
 
4489
        foreach ($issue_id as $iss_id) {
 
4490
            $stmt = "UPDATE
 
4491
                        " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
 
4492
                     SET
 
4493
                        isu_order = " . ($neworder + $i) . "
 
4494
                     WHERE
 
4495
                        isu_usr_id = $usr_id AND
 
4496
                        isu_iss_id = $iss_id";
 
4497
            $res = DB_Helper::getInstance()->query($stmt);
 
4498
            if (PEAR::isError($res)) {
 
4499
                Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
 
4500
                return -1;
 
4501
            }
 
4502
            $i++;
 
4503
        }
 
4504
    }
 
4505
 
 
4506
    /**
 
4507
     * Method used to get the order list to be rearranged
 
4508
     * 
 
4509
     * @access  private
 
4510
     * @param   string $issue_id The issue ID or a comma seperated list of IDs already prepared for giving to mysql
 
4511
     * @param   string $usr_id The user to remove. When not specified, all users are taken as to be removed for that issue
 
4512
     * @return  mixed delete order list to be rearranged. Used as a parameter to the method of rearranging the order.
 
4513
     */
 
4514
    function getDeleteUserAssociationOrderList($issue_id, $usr_id = "")
 
4515
    {
 
4516
        // find all affected associantion orders
 
4517
        $stmt = "SELECT isu_usr_id, isu_order FROM
 
4518
                    " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
 
4519
                 WHERE
 
4520
                 isu_iss_id IN ($issue_id)";
 
4521
        if (!empty($usr_id)) {
 
4522
            $stmt.= " AND isu_usr_id IN ($usr_id)";
 
4523
        }
 
4524
        $stmt.= "ORDER BY isu_order";
 
4525
        $res = DB_Helper::getInstance()->getAll($stmt, DB_FETCHMODE_ASSOC);
 
4526
        if (PEAR::isError($res)) {
 
4527
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
 
4528
            return -1;
 
4529
        } else {
 
4530
            $deleted_orders = array();
 
4531
            foreach ($res as $row) {
 
4532
                if (empty($deleted_orders[$row['isu_usr_id']])) {
 
4533
                    $deleted_orders[$row['isu_usr_id']] = array();
 
4534
                }
 
4535
                $deleted_orders[$row['isu_usr_id']] [] = $row['isu_order'];
 
4536
            }
 
4537
            return $deleted_orders;
 
4538
        }
 
4539
    }
 
4540
 
 
4541
    /**
 
4542
     *
 
4543
     * Method used to rearrange order list in the db according to known deleted records
 
4544
     *
 
4545
     * @access  private
 
4546
     * @param   mixed  deleteorder list
 
4547
     * @return void
 
4548
     */
 
4549
    function rearrangeDeleteUserAssociationOrderList($delete_order_list)
 
4550
    {
 
4551
        if (empty($delete_order_list) || (!is_array($delete_order_list))) {
 
4552
            return -1;
 
4553
        }
 
4554
        foreach ($delete_order_list as $isu_usr_id => $orders) {
 
4555
            for ($i = 0; $i < count($orders); $i++) { // traverse all deleted orders
 
4556
                // move the orders after them up to take the "order space" of the deleted records
 
4557
                $stmt = "UPDATE
 
4558
                            " . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
 
4559
                         SET
 
4560
                            isu_order = isu_order - " . ($i+1) . "
 
4561
                         WHERE
 
4562
                            isu_usr_id = $isu_usr_id AND
 
4563
                            isu_order > " . $orders[$i];
 
4564
                if ($i < count($orders) - 1) {
 
4565
                    $stmt.=  " AND
 
4566
                            isu_order < " . $orders[$i+1];
 
4567
                }
 
4568
                $res = DB_Helper::getInstance()->query($stmt);
 
4569
                if (PEAR::isError($res)) {
 
4570
                    Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
 
4571
                    return -1;
 
4572
                }
 
4573
            }
 
4574
        }
 
4575
        return 1;
 
4576
    }
 
4577
 
 
4578
    /**
 
4579
     * Change issue order for all users to new sortnr
 
4580
     * @access public
 
4581
     * @param integer $issue_id The ID of the issue
 
4582
     * @param integer $neworder New position id for the issue
 
4583
     * @return void
 
4584
     */
 
4585
    function moveOrderForAllUsers($issue_id, $neworder)
 
4586
    {
 
4587
        // Move the issue to the top priority for the ppl it's assigned to
 
4588
        $stmt = "SELECT isu_usr_id FROM
 
4589
                    "  . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "issue_user
 
4590
                 WHERE
 
4591
                    isu_iss_id = " . Misc::escapeInteger($issue_id);
 
4592
        $res = DB_Helper::getInstance()->getAll($stmt, DB_FETCHMODE_ASSOC);
 
4593
        if (PEAR::isError($res)) {
 
4594
            Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
 
4595
            return -1;
 
4596
        }
 
4597
        foreach ($res as $row) {
 
4598
            Issue::reorderUserIssues($row["isu_usr_id"], $issue_id, $neworder);
 
4599
        }
 
4600
    }
 
4601
 
4412
4602
    /**
4413
4603
     * Sets the assignees for the issue
4414
4604
     *