Christopher Johnson (WMDE) has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/268324

Change subject: updates to 6bb24e1d0cbd76573c7dbd0fcb95f9959acfd9ab 03.02.2016
......................................................................

updates to 6bb24e1d0cbd76573c7dbd0fcb95f9959acfd9ab 03.02.2016

Change-Id: I052b2cc894e3605619cd921fa362b1a3485db6ae
---
M rsrc/behavior-events-table.js
M rsrc/behavior-sprint-boards.js
M rsrc/behavior-sprint-history-table.js
M rsrc/behavior-tasks-table.js
M rsrc/dataTables.css
M rsrc/phui-workboard-view.css
M src/__phutil_library_map__.php
M src/controller/SprintProjectController.php
M src/controller/SprintProjectProfileController.php
M src/controller/board/SprintBoardMoveController.php
M src/controller/board/SprintBoardViewController.php
R src/profilepanel/SprintProjectDetailsProfilePanel.php
M src/profilepanel/SprintProjectWorkboardProfilePanel.php
M src/query/SprintQuery.php
M src/storage/SprintListDataProvider.php
M src/storage/TaskTableDataProvider.php
M src/view/SprintBoardTaskCard.php
M src/view/SprintUIObjectBoxView.php
18 files changed, 309 insertions(+), 215 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/phabricator/extensions/Sprint 
refs/changes/24/268324/1

diff --git a/rsrc/behavior-events-table.js b/rsrc/behavior-events-table.js
index 071b41b..38a6b09 100644
--- a/rsrc/behavior-events-table.js
+++ b/rsrc/behavior-events-table.js
@@ -12,7 +12,7 @@
             ],
             "dom": 'T<"clear">lfrtip',
             "tableTools": {
-                "sSwfPath": "/rsrc/sprint/copy_csv_xls.swf",
+                "sSwfPath": "webroot-static/copy_csv_xls.swf",
                 "aButtons": [
                     {
                         "sExtends": "copy",
diff --git a/rsrc/behavior-sprint-boards.js b/rsrc/behavior-sprint-boards.js
index df13207..13432f1 100644
--- a/rsrc/behavior-sprint-boards.js
+++ b/rsrc/behavior-sprint-boards.js
@@ -227,7 +227,9 @@
 
         for (ii = 0; ii < cols.length; ii++) {
             var list = new JX.DraggableList('project-card', cols[ii])
-                .setFindItemsHandler(JX.bind(null, finditems, cols[ii]));
+                .setFindItemsHandler(JX.bind(null, finditems, cols[ii]))
+                .setOuterContainer(JX.$(config.boardID))
+                .setCanDragX(true);
 
             list.listen('didSend', JX.bind(list, onupdate, cols[ii]));
             list.listen('didReceive', JX.bind(list, onupdate, cols[ii]));
@@ -245,6 +247,9 @@
         for (ii = 0; ii < lists.length; ii++) {
             lists[ii].setGroup(lists);
         }
+    }
+
+    function setup() {
 
         JX.Stratcom.listen(
             'click',
@@ -332,6 +337,9 @@
                     statics.boardID = new_config.boardID;
                 }
                 update_statics(new_config);
+                if (data.fromServer) {
+                    init_board();
+                }
             });
         return true;
     }
diff --git a/rsrc/behavior-sprint-history-table.js 
b/rsrc/behavior-sprint-history-table.js
index 7e9161c..a44c8fd 100644
--- a/rsrc/behavior-sprint-history-table.js
+++ b/rsrc/behavior-sprint-history-table.js
@@ -17,7 +17,7 @@
             ],
             "dom": 'T<"clear">lfrtip',
             "tableTools": {
-                "sSwfPath": "/rsrc/sprint/copy_csv_xls.swf",
+                "sSwfPath": "webroot-static/copy_csv_xls.swf",
                 "aButtons": [
                     {
                         "sExtends": "copy",
diff --git a/rsrc/behavior-tasks-table.js b/rsrc/behavior-tasks-table.js
index dfa0d25..def2857 100644
--- a/rsrc/behavior-tasks-table.js
+++ b/rsrc/behavior-tasks-table.js
@@ -20,7 +20,7 @@
             ],
             "dom": 'T<"clear">lfrtip',
             "tableTools": {
-                "sSwfPath": "/rsrc/sprint/copy_csv_xls.swf",
+                "sSwfPath": "webroot-static/copy_csv_xls.swf",
                 "aButtons": [
                     {
                         "sExtends": "copy",
diff --git a/rsrc/dataTables.css b/rsrc/dataTables.css
index cfc48c6..61c4a41 100644
--- a/rsrc/dataTables.css
+++ b/rsrc/dataTables.css
@@ -40,19 +40,19 @@
     *cursor: hand;
 }
 table.dataTable thead .sorting {
-    background: url(/rsrc/sprint/sort_both.png) no-repeat center right;
+    background: url('webroot-static/sort_both.png') no-repeat center right;
 }
 table.dataTable thead .sorting_asc {
-    background: url(/rsrc/sprint/sort_asc.png) no-repeat center right;
+    background: url('webroot-static/sort_asc.png') no-repeat center right;
 }
 table.dataTable thead .sorting_desc {
-    background: url(/rsrc/sprint/sort_desc.png) no-repeat center right;
+    background: url('webroot-static/sort_desc.png') no-repeat center right;
 }
 table.dataTable thead .sorting_asc_disabled {
-    background: url(/rsrc/sprint/sort_asc_disabled.png) no-repeat center right;
+    background: url('webroot-static/sort_asc_disabled.png') no-repeat center 
right;
 }
 table.dataTable thead .sorting_desc_disabled {
-    background: url(/rsrc/sprint//sort_desc_disabled.png) no-repeat center 
right;
+    background: url('webroot-static/sort_desc_disabled.png') no-repeat center 
right;
 }
 table.dataTable tbody tr {
     background-color: white;
diff --git a/rsrc/phui-workboard-view.css b/rsrc/phui-workboard-view.css
index b48b478..702452b 100644
--- a/rsrc/phui-workboard-view.css
+++ b/rsrc/phui-workboard-view.css
@@ -146,6 +146,7 @@
 }
 
 .phui-card-list-key {
+    width: 75%;
     color: {$bluetext};
     font-weight: bold;
     overflow: hidden;
@@ -154,6 +155,7 @@
 
 .phui-card-list-value {
     color: {$darkgreytext};
+    float: right;
 }
 
 .device-desktop .phui-card-list-key {
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
index de567d0..b5d65da 100644
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -65,7 +65,7 @@
     'SprintPoints' => 'util/SprintPoints.php',
     'SprintProjectController' => 'controller/SprintProjectController.php',
     'SprintProjectCustomField' => 'customfield/SprintProjectCustomField.php',
-    'SprintProjectDetailsProfilePanel' => 
'engine/SprintProjectDetailsProfilePanel.php',
+    'SprintProjectDetailsProfilePanel' => 
'profilepanel/SprintProjectDetailsProfilePanel.php',
     'SprintProjectProfileController' => 
'controller/SprintProjectProfileController.php',
     'SprintProjectProfilePanelEngine' => 
'engine/SprintProjectProfilePanelEngine.php',
     'SprintProjectViewController' => 
'controller/SprintProjectViewController.php',
diff --git a/src/controller/SprintProjectController.php 
b/src/controller/SprintProjectController.php
index 52a9eef..fb3ec27 100644
--- a/src/controller/SprintProjectController.php
+++ b/src/controller/SprintProjectController.php
@@ -18,7 +18,9 @@
     $viewer = $this->getViewer();
     $request = $this->getRequest();
 
-    $id = $request->getURIData('id');
+    $id = nonempty(
+        $request->getURIData('projectID'),
+        $request->getURIData('id'));
     $slug = $request->getURIData('slug');
 
     if ($slug) {
@@ -33,6 +35,7 @@
         ->setViewer($viewer)
         ->needMembers(true)
         ->needWatchers(true)
+        ->needWatchers(true)
         ->needImages(true)
         ->needSlugs(true);
 
diff --git a/src/controller/SprintProjectProfileController.php 
b/src/controller/SprintProjectProfileController.php
index 46d00a2..6e6139d 100644
--- a/src/controller/SprintProjectProfileController.php
+++ b/src/controller/SprintProjectProfileController.php
@@ -19,6 +19,13 @@
     $id = $project->getID();
 
     $picture = $project->getProfileImageURI();
+    $icon = $project->getDisplayIconIcon();
+    $icon_name = $project->getDisplayIconName();
+    $tag = id(new PHUITagView())
+        ->setIcon($icon)
+        ->setName($icon_name)
+        ->addClass('project-view-header-tag')
+        ->setType(PHUITagView::TYPE_SHADE);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($project->getName())
diff --git a/src/controller/board/SprintBoardMoveController.php 
b/src/controller/board/SprintBoardMoveController.php
index 45cd4cf..f7d2f1f 100644
--- a/src/controller/board/SprintBoardMoveController.php
+++ b/src/controller/board/SprintBoardMoveController.php
@@ -19,7 +19,6 @@
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
-          PhabricatorPolicyCapability::CAN_EDIT,
         ))
       ->withIDs(array($id))
       ->executeOne();
@@ -28,9 +27,10 @@
     }
     $is_sprint = $this->isSprint($project);
 
-    $object = id(new PhabricatorObjectQuery())
+    $object = id(new ManiphestTaskQuery())
       ->setViewer($viewer)
       ->withPHIDs(array($object_phid))
+      ->needProjectPHIDs(true)
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
@@ -97,6 +97,7 @@
       $tasks = id(new ManiphestTaskQuery())
         ->setViewer($viewer)
         ->withPHIDs($task_phids)
+        ->needProjectPHIDs(true)
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
@@ -165,8 +166,10 @@
           ->setTask($object)
           ->setOwner($owner)
           ->setCanEdit(true)
+          ->setProject($project)
           ->getItem();
     }
+    $card->addClass('phui-workcard');
 
     return id(new AphrontAjaxResponse())->setContent(
       array('task' => $card));
diff --git a/src/controller/board/SprintBoardViewController.php 
b/src/controller/board/SprintBoardViewController.php
index 7b4f757..3ce36c6 100755
--- a/src/controller/board/SprintBoardViewController.php
+++ b/src/controller/board/SprintBoardViewController.php
@@ -18,53 +18,17 @@
   }
 
   public function handleRequest(AphrontRequest $request) {
-    $viewer = $request->getViewer();
-    $id = $request->getURIData('id');
+    $viewer = $request->getUser();
 
-    $show_hidden = $request->getBool('hidden');
-    $this->showHidden = $show_hidden;
-
-    $project = id(new PhabricatorProjectQuery())
-      ->setViewer($viewer)
-      ->needImages(true);
-    $id = $request->getURIData('id');
-    $slug = $request->getURIData('slug');
-    if ($slug) {
-      $project->withSlugs(array($slug));
-    } else {
-      $project->withIDs(array($id));
-    }
-    $project = $project->executeOne();
-    if (!$project) {
-      return new Aphront404Response();
+    $response = $this->loadProject();
+    if ($response) {
+      return $response;
     }
 
-    $this->setProject($project);
-    $this->id = $project->getID();
-    $is_sprint = $this->isSprint($project);
+    $project = $this->getProject();
 
-    $sort_key = $request->getStr('order');
-    switch ($sort_key) {
-      case PhabricatorProjectColumn::ORDER_NATURAL:
-      case PhabricatorProjectColumn::ORDER_PRIORITY:
-        break;
-      default:
-        $sort_key = PhabricatorProjectColumn::DEFAULT_ORDER;
-        break;
-    }
-    $this->sortKey = $sort_key;
-
-    $column_query = id(new PhabricatorProjectColumnQuery())
-      ->setViewer($viewer)
-      ->withProjectPHIDs(array($project->getPHID()));
-
-    if (!$show_hidden) {
-      $column_query->withStatuses(
-        array(PhabricatorProjectColumn::STATUS_ACTIVE));
-    }
-
-    $columns = $column_query->execute();
-    $columns = mpull($columns, null, 'getSequence');
+    $this->readRequestState();
+    $columns = $this->loadColumns($project);
 
     // TODO: Expand the checks here if we add the ability
     // to hide the Backlog column
@@ -74,33 +38,32 @@
           $project,
           PhabricatorPolicyCapability::CAN_EDIT);
       if (!$can_edit) {
-        return $this->noAccessDialog($project);
+        $content = $this->buildNoAccessContent($project);
+      } else {
+        $content = $this->buildInitializeContent($project);
       }
-      switch ($request->getStr('initialize-type')) {
-        case 'backlog-only':
-          $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
-            $column = PhabricatorProjectColumn::initializeNewColumn($viewer)
-              ->setSequence(0)
-              ->setProperty('isDefault', true)
-              ->setProjectPHID($project->getPHID())
-              ->save();
-            $column->attachProject($project);
-            $columns[0] = $column;
-          unset($unguarded);
-          break;
-        case 'import':
-          return id(new AphrontRedirectResponse())
-            ->setURI(
-              $this->getApplicationURI('board/'.$project->getID().'/import/'));
-          break;
-        default:
-          return $this->initializeWorkboardDialog($project);
-          break;
+
+      if ($content instanceof AphrontResponse) {
+        return $content;
       }
+
+      $nav = $this->getProfileMenu();
+      $nav->selectFilter(PhabricatorProject::PANEL_WORKBOARD);
+
+      $crumbs = $this->buildApplicationCrumbs();
+      $crumbs->addTextCrumb(pht('Workboard'));
+
+      return $this->newPage()
+          ->setTitle(
+              array(
+                  pht('Workboard'),
+                  $project->getName(),
+              ))
+          ->setNavigation($nav)
+          ->setCrumbs($crumbs)
+          ->appendChild($content);
     }
-
-    ksort($columns);
-
+    $is_sprint = $this->isSprint($project);
     $board_uri = $this->getApplicationURI('board/'.$project->getID().'/');
 
     $engine = id(new ManiphestTaskSearchEngine())
@@ -297,7 +260,7 @@
           'boardID' => $board_id,
           'projectPHID' => $project->getPHID(),
           'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'),
-          'createURI' => '/maniphest/task/create/',
+          'createURI' => $this->getCreateURI(),
           'order' => $this->sortKey,
       );
       $this->initBehavior(
@@ -345,6 +308,7 @@
         ->setFlush(true)
         ->setAllowEmptyList(true)
         ->addSigil('project-column')
+        ->setItemClass('phui-workcard')
         ->setMetadata(
           array(
             'columnPHID' => $column->getPHID(),
@@ -370,6 +334,7 @@
         } else {
           $cards->addItem(id(new ProjectBoardTaskCard())
               ->setViewer($viewer)
+              ->setProject($project)
               ->setTask($task)
               ->setOwner($owner)
               ->setCanEdit($can_edit)
@@ -382,7 +347,7 @@
 
     $sort_menu = $this->buildSortMenu(
       $viewer,
-      $sort_key);
+      $this->sortKey);
 
     $filter_menu = $this->buildFilterMenu(
       $viewer,
@@ -390,7 +355,7 @@
       $engine,
       $query_key);
 
-    $manage_menu = $this->buildManageMenu($project, $show_hidden);
+    $manage_menu = $this->buildManageMenu($project, $this->showHidden);
 
     $header_link = phutil_tag(
       'a',
@@ -399,39 +364,72 @@
       ),
       $project->getName());
 
-    $header = id(new PHUIHeaderView())
-      ->setHeader($header_link)
-      ->setUser($viewer)
-      ->setNoBackground(true)
-      ->addActionLink($sort_menu)
-      ->addActionLink($filter_menu)
-      ->addActionLink($manage_menu)
-      ->setPolicyObject($project);
-
-    $header_box = id(new PHUIBoxView())
-      ->appendChild($header)
-      ->addClass('project-board-header');
-
     $board_box = id(new PHUIBoxView())
       ->appendChild($board)
       ->addClass('project-board-wrapper');
 
     $nav = $this->getProfileMenu();
 
+    $crumbs = $this->buildApplicationCrumbs();
+    $crumbs->addTextCrumb(pht('Workboard'));
+    $crumbs->setBorder(true);
+
+    $crumbs->addAction($sort_menu);
+    $crumbs->addAction($filter_menu);
+    $crumbs->addAction($manage_menu);
+
     return $this->newPage()
         ->setTitle(pht('%s Board', $project->getName()))
         ->setPageObjectPHIDs(array($project->getPHID()))
         ->setShowFooter(false)
         ->setNavigation($nav)
+        ->setCrumbs($crumbs)
         ->addQuicksandConfig(
             array(
                 'boardConfig' => $behavior_config,
             ))
         ->appendChild(
             array(
-                $header_box,
                 $board_box,
             ));
+  }
+
+  private function readRequestState() {
+    $request = $this->getRequest();
+    $project = $this->getProject();
+
+    $this->showHidden = $request->getBool('hidden');
+    $this->id = $project->getID();
+
+    $sort_key = $request->getStr('order');
+    switch ($sort_key) {
+      case PhabricatorProjectColumn::ORDER_NATURAL:
+      case PhabricatorProjectColumn::ORDER_PRIORITY:
+        break;
+      default:
+        $sort_key = PhabricatorProjectColumn::DEFAULT_ORDER;
+        break;
+    }
+    $this->sortKey = $sort_key;
+  }
+
+  private function loadColumns(PhabricatorProject $project) {
+    $viewer = $this->getViewer();
+
+    $column_query = id(new PhabricatorProjectColumnQuery())
+        ->setViewer($viewer)
+        ->withProjectPHIDs(array($project->getPHID()));
+
+    if (!$this->showHidden) {
+      $column_query->withStatuses(
+          array(PhabricatorProjectColumn::STATUS_ACTIVE));
+    }
+
+    $columns = $column_query->execute();
+    $columns = mpull($columns, null, 'getSequence');
+    ksort($columns);
+
+    return $columns;
   }
 
   private function buildSortMenu(
@@ -439,7 +437,7 @@
     $sort_key) {
 
     $sort_icon = id(new PHUIIconView())
-      ->setIconFont('fa-sort-amount-asc bluegrey');
+        ->setIcon('fa-sort-amount-asc bluegrey');
 
     $named = array(
       PhabricatorProjectColumn::ORDER_NATURAL => pht('Natural'),
@@ -472,16 +470,15 @@
       $sort_menu->addAction($item);
     }
 
-    $sort_button = id(new PHUIButtonView())
-      ->setText(pht('Sort: %s', $active_order))
-      ->setIcon($sort_icon)
-      ->setTag('a')
-      ->setHref('#')
-      ->addSigil('boards-dropdown-menu')
-      ->setMetadata(
-        array(
-          'items' => hsprintf('%s', $sort_menu),
-        ));
+    $sort_button = id(new PHUIListItemView())
+        ->setName(pht('Sort: %s', $active_order))
+        ->setIcon('fa-sort-amount-asc')
+        ->setHref('#')
+        ->addSigil('boards-dropdown-menu')
+        ->setMetadata(
+            array(
+                'items' => hsprintf('%s', $sort_menu),
+            ));
 
     return $sort_button;
   }
@@ -490,9 +487,6 @@
     $custom_query,
     PhabricatorApplicationSearchEngine $engine,
     $query_key) {
-
-    $filter_icon = id(new PHUIIconView())
-      ->setIconFont('fa-search-plus bluegrey');
 
     $named = array(
       'open' => pht('Open Tasks'),
@@ -550,16 +544,15 @@
       $filter_menu->addAction($item);
     }
 
-    $filter_button = id(new PHUIButtonView())
-      ->setText(pht('Filter: %s', $active_filter))
-      ->setIcon($filter_icon)
-      ->setTag('a')
-      ->setHref('#')
-      ->addSigil('boards-dropdown-menu')
-      ->setMetadata(
-        array(
-          'items' => hsprintf('%s', $filter_menu),
-        ));
+    $filter_button = id(new PHUIListItemView())
+        ->setName(pht('Filter: %s', $active_filter))
+        ->setIcon('fa-search')
+        ->setHref('#')
+        ->addSigil('boards-dropdown-menu')
+        ->setMetadata(
+            array(
+                'items' => hsprintf('%s', $filter_menu),
+            ));
 
     return $filter_button;
   }
@@ -575,9 +568,6 @@
       $viewer,
       $project,
       PhabricatorPolicyCapability::CAN_EDIT);
-
-    $manage_icon = id(new PHUIIconView())
-      ->setIconFont('fa-cog bluegrey');
 
     $manage_items = array();
 
@@ -631,16 +621,15 @@
       $manage_menu->addAction($item);
     }
 
-    $manage_button = id(new PHUIButtonView())
-      ->setText(pht('Manage Board'))
-      ->setIcon($manage_icon)
-      ->setTag('a')
-      ->setHref('#')
-      ->addSigil('boards-dropdown-menu')
-      ->setMetadata(
-        array(
-          'items' => hsprintf('%s', $manage_menu),
-        ));
+    $manage_button = id(new PHUIListItemView())
+        ->setName(pht('Manage Board'))
+        ->setIcon('fa-cog')
+        ->setHref('#')
+        ->addSigil('boards-dropdown-menu')
+        ->setMetadata(
+            array(
+                'items' => hsprintf('%s', $manage_menu),
+            ));
 
     return $manage_button;
   }
@@ -650,7 +639,7 @@
     PhabricatorProjectColumn $column) {
 
     $request = $this->getRequest();
-    $viewer = $request->getViewer();
+    $viewer = $request->getUser();
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
@@ -662,13 +651,12 @@
     $column_items[] = id(new PhabricatorActionView())
       ->setIcon('fa-plus')
       ->setName(pht('Create Task...'))
-      ->setHref('/maniphest/task/create/')
+      ->setHref($this->getCreateURI())
       ->addSigil('column-add-task')
       ->setMetadata(
         array(
           'columnPHID' => $column->getPHID(),
-        ))
-      ->setDisabled(!$can_edit);
+        ));
 
     $batch_edit_uri = $request->getRequestURI();
     $batch_edit_uri->setQueryParam('batch', $column->getID());
@@ -683,15 +671,13 @@
       ->setHref($batch_edit_uri)
       ->setDisabled(!$can_batch_edit);
 
-    $edit_uri = $this->getApplicationURI(
-      'board/'.$this->id.'/column/'.$column->getID().'/');
+    $detail_uri = $this->getApplicationURI(
+        'board/'.$this->id.'/column/'.$column->getID().'/');
 
     $column_items[] = id(new PhabricatorActionView())
-      ->setIcon('fa-pencil')
-      ->setName(pht('Edit Column'))
-      ->setHref($edit_uri)
-      ->setDisabled(!$can_edit)
-      ->setWorkflow(!$can_edit);
+        ->setIcon('fa-columns')
+        ->setName(pht('Column Details'))
+        ->setHref($detail_uri);
 
     $can_hide = ($can_edit && !$column->isDefaultColumn());
     $hide_uri = 'board/'.$this->id.'/hide/'.$column->getID().'/';
@@ -721,7 +707,7 @@
     }
 
     $column_button = id(new PHUIIconView())
-      ->setIconFont('fa-caret-down')
+      ->setIcon('fa-caret-down')
       ->setHref('#')
       ->addSigil('boards-dropdown-menu')
       ->setMetadata(
@@ -732,35 +718,7 @@
     return $column_button;
   }
 
-  private function initializeWorkboardDialog(PhabricatorProject $project) {
-
-    $instructions = pht('This workboard has not been setup yet.');
-    $new_selector = id(new AphrontFormRadioButtonControl())
-      ->setName('initialize-type')
-      ->setValue('backlog-only')
-      ->addButton(
-        'backlog-only',
-        pht('New Empty Board'),
-        pht('Create a new board with just a backlog column.'))
-      ->addButton(
-        'import',
-        pht('Import Columns'),
-        pht('Import board columns from another project.'));
-
-    $dialog = id(new AphrontDialogView())
-      ->setUser($this->getRequest()->getUser())
-      ->setTitle(pht('New Workboard'))
-      ->addSubmitButton('Continue')
-      
->addCancelButton($this->getApplicationURI('view/'.$project->getID().'/'))
-      ->appendParagraph($instructions)
-      ->appendChild($new_selector);
-
-    return id(new AphrontDialogResponse())
-      ->setDialog($dialog);
-  }
-
-
-  /**
+   /**
    * Add current state parameters (like order and the visibility of hidden
    * columns) to a URI.
    *
@@ -796,4 +754,116 @@
         'sprint');
   }
 
+  private function getCreateURI() {
+    $viewer = $this->getViewer();
+
+    // TODO: This should be cleaned up, but maybe we're going to make options
+    // for each column or board?
+    $edit_config = id(new ManiphestEditEngine())
+        ->setViewer($viewer)
+        ->loadDefaultEditConfiguration();
+    if ($edit_config) {
+      $form_key = $edit_config->getIdentifier();
+      $create_uri = "/maniphest/task/edit/form/{$form_key}/";
+    } else {
+      $create_uri = '/maniphest/task/edit/';
+    }
+
+    return $create_uri;
+  }
+
+
+  private function buildInitializeContent(PhabricatorProject $project) {
+    $request = $this->getRequest();
+    $viewer = $this->getViewer();
+
+    $type = $request->getStr('initialize-type');
+
+    $id = $project->getID();
+
+    $profile_uri = $this->getApplicationURI("profile/{$id}/");
+    $board_uri = $this->getApplicationURI("board/{$id}/");
+    $import_uri = $this->getApplicationURI("board/{$id}/import/");
+
+    $set_default = $request->getBool('default');
+    if ($set_default) {
+      $this
+          ->getProfilePanelEngine()
+          ->adjustDefault(PhabricatorProject::PANEL_WORKBOARD);
+    }
+
+    if ($request->isFormPost()) {
+      if ($type == 'backlog-only') {
+        $column = PhabricatorProjectColumn::initializeNewColumn($viewer)
+            ->setSequence(0)
+            ->setProperty('isDefault', true)
+            ->setProjectPHID($project->getPHID())
+            ->save();
+
+        $project->setHasWorkboard(1)->save();
+
+        return id(new AphrontRedirectResponse())
+            ->setURI($board_uri);
+      } else {
+        return id(new AphrontRedirectResponse())
+            ->setURI($import_uri);
+      }
+    }
+
+    $new_selector = id(new AphrontFormRadioButtonControl())
+        ->setLabel(pht('Columns'))
+        ->setName('initialize-type')
+        ->setValue('backlog-only')
+        ->addButton(
+            'backlog-only',
+            pht('New Empty Board'),
+            pht('Create a new board with just a backlog column.'))
+        ->addButton(
+            'import',
+            pht('Import Columns'),
+            pht('Import board columns from another project.'));
+
+    $default_checkbox = id(new AphrontFormCheckboxControl())
+        ->setLabel(pht('Make Default'))
+        ->addCheckbox(
+            'default',
+            1,
+            pht('Make the workboard the default view for this project.'),
+            true);
+
+    $form = id(new AphrontFormView())
+        ->setUser($viewer)
+        ->appendRemarkupInstructions(
+            pht('The workboard for this project has not been created yet.'))
+        ->appendControl($new_selector)
+        ->appendControl($default_checkbox)
+        ->appendControl(
+            id(new AphrontFormSubmitControl())
+                ->addCancelButton($profile_uri)
+                ->setValue(pht('Create Workboard')));
+
+    $box = id(new PHUIObjectBoxView())
+        ->setHeaderText(pht('Create Workboard'))
+        ->setForm($form);
+
+    return $box;
+  }
+
+  private function buildNoAccessContent(PhabricatorProject $project) {
+    $viewer = $this->getViewer();
+
+    $id = $project->getID();
+
+    $profile_uri = $this->getApplicationURI("profile/{$id}/");
+
+    return $this->newDialog()
+        ->setTitle(pht('Unable to Create Workboard'))
+        ->appendParagraph(
+            pht(
+                'The workboard for this project has not been created yet, '.
+                'but you do not have permission to create it. Only users '.
+                'who can edit this project can create a workboard for it.'))
+        ->addCancelButton($profile_uri);
+  }
+
 }
diff --git a/src/engine/SprintProjectDetailsProfilePanel.php 
b/src/profilepanel/SprintProjectDetailsProfilePanel.php
similarity index 96%
rename from src/engine/SprintProjectDetailsProfilePanel.php
rename to src/profilepanel/SprintProjectDetailsProfilePanel.php
index a468e56..2684a4b 100644
--- a/src/engine/SprintProjectDetailsProfilePanel.php
+++ b/src/profilepanel/SprintProjectDetailsProfilePanel.php
@@ -3,6 +3,7 @@
 final class SprintProjectDetailsProfilePanel
     extends PhabricatorProfilePanel {
 
+  const PANEL_PROFILE = 'sprint.profile';
   const PANELKEY = 'sprint.details';
 
   public function getPanelTypeName() {
diff --git a/src/profilepanel/SprintProjectWorkboardProfilePanel.php 
b/src/profilepanel/SprintProjectWorkboardProfilePanel.php
index d1a8a1e..370be21 100644
--- a/src/profilepanel/SprintProjectWorkboardProfilePanel.php
+++ b/src/profilepanel/SprintProjectWorkboardProfilePanel.php
@@ -3,6 +3,7 @@
 final class SprintProjectWorkboardProfilePanel
     extends PhabricatorProfilePanel {
 
+  const PANEL_WORKBOARD = 'project.workboard';
   const PANELKEY = 'sprint.workboard';
 
   public function getPanelTypeName() {
diff --git a/src/query/SprintQuery.php b/src/query/SprintQuery.php
index 05bb5b3..9cc1865 100644
--- a/src/query/SprintQuery.php
+++ b/src/query/SprintQuery.php
@@ -45,24 +45,29 @@
       $start = idx($aux_fields, 'isdc:sprint:startdate')
           ->getProxy()->getFieldValue();
     if (is_null($start)) {
- //     $help = pht('To do this, go to the Project Edit Details Page');
- //     throw new BurndownException("The project \"".$this->project->getName()
- //         ."\" is not set up for Sprint because "
- //         ."it has not been assigned a start date\n", $help);
     return PhabricatorTime::getNow() - 1209600;
     } else {
       return $start;
     }
   }
 
+  public function getPointsField($task) {
+    $field_list = PhabricatorCustomField::getObjectFields($task,
+        PhabricatorCustomField::ROLE_EDIT);
+    $points_field = $this->getAuxFields($field_list);
+    return $points_field;
+  }
+
+  public function getPoints($points_field) {
+    $points = idx($points_field, 'isdc:sprint:storypoints')
+        ->getProxy()->getFieldValue();
+    return $points;
+  }
+
   public function getEndDate($aux_fields) {
     $end = idx($aux_fields, 'isdc:sprint:enddate')
         ->getProxy()->getFieldValue();
     if (is_null($end)) {
-//      $help = pht('To do this, go to the Project Edit Details Page');
-//      throw new BurndownException("The project \"".$this->project->getName()
-//          ."\" is not set up for Sprint because "
-//          ."it has not been assigned an end date\n", $help);
       return PhabricatorTime::getNow() + 1209600;
     } else {
       return $end;
diff --git a/src/storage/SprintListDataProvider.php 
b/src/storage/SprintListDataProvider.php
index 012e092..89e2072 100644
--- a/src/storage/SprintListDataProvider.php
+++ b/src/storage/SprintListDataProvider.php
@@ -90,7 +90,7 @@
 
   private function getEditProjectDetailsIcon() {
     $image = id(new PHUIIconView())
-        ->setIconFont('fa-fire', 'orange')
+        ->setIcon('fa-fire', 'orange')
         ->setText('Burndown');
     return $image;
   }
diff --git a/src/storage/TaskTableDataProvider.php 
b/src/storage/TaskTableDataProvider.php
index 39439d1..df2b232 100644
--- a/src/storage/TaskTableDataProvider.php
+++ b/src/storage/TaskTableDataProvider.php
@@ -243,14 +243,14 @@
     $image = id(new PHUIIconView())
         ->addSigil($sigil)
         ->setMetadata($meta)
-        ->setIconFont('fa-wrench', 'green')
+        ->setIcon('fa-wrench', 'green')
         ->setText('Blocker');
     return $image;
   }
 
   private function getIconforBlocked() {
     $image = id(new PHUIIconView())
-        ->setIconFont('fa-lock', 'red')
+        ->setIcon('fa-lock', 'red')
         ->setText('Blocked');
     return $image;
   }
diff --git a/src/view/SprintBoardTaskCard.php b/src/view/SprintBoardTaskCard.php
index a3614c5..5ded557 100644
--- a/src/view/SprintBoardTaskCard.php
+++ b/src/view/SprintBoardTaskCard.php
@@ -20,6 +20,10 @@
     return $this;
   }
 
+  public function getProject() {
+    return $this->project;
+  }
+
   public function getViewer() {
     return $this->viewer;
   }
@@ -82,34 +86,29 @@
     }
 
   public function getItem() {
-    require_celerity_resource('phui-workboard-view-css', 'sprint');
 
     $query = id(new SprintQuery())
         ->setProject($this->project)
         ->setViewer($this->viewer);
     $task = $this->getTask();
+    $owner = $this->getOwner();
     $task_phid = $task->getPHID();
     $can_edit = $this->getCanEdit();
+    $viewer = $this->getViewer();
     $this->points = $query->getStoryPointsForTask($task_phid);
-
 
     $color_map = ManiphestTaskPriority::getColorMap();
     $bar_color = idx($color_map, $task->getPriority(), 'grey');
 
-    if (!(is_null($this->owner))) {
-      $ownerimage = $this->renderHandleIcon($this->owner);
-    } else {
-      $ownerimage = null;
-    }
-
     $card = id(new PHUIObjectItemView())
+      ->setObject($task)
+      ->setUser($viewer)
       ->setObjectName('T'.$task->getID())
       ->setHeader($task->getTitle())
       ->setGrippable($can_edit)
       ->setHref('/T'.$task->getID())
       ->addSigil('project-card')
       ->setDisabled($task->isClosed())
-      ->setImageIcon($ownerimage)
       ->setMetadata(
         array(
           'objectPHID' => $task_phid,
@@ -126,25 +125,20 @@
       ->setBarColor($bar_color)
       ->addAttribute($this->getCardAttributes());
 
+    if ($owner) {
+      $card->addHandleIcon($owner, $owner->getName());
+    }
+
+    $project_phids = array_fuse($task->getProjectPHIDs());
+    unset($project_phids[$this->project->getPHID()]);
+
+    if ($project_phids) {
+      $handle_list = $viewer->loadHandles($project_phids);
+      $tag_list = id(new PHUIHandleTagListView())
+          ->setSlim(true)
+          ->setHandles($handle_list);
+      $card->addAttribute($tag_list);
+    }
     return $card;
-  }
-
-  private function renderHandleIcon(PhabricatorObjectHandle $handle) {
-    $ownername = $handle->getName();
-    $ownerlink = '/p/'.$ownername.'/';
-    $image_uri = 'background-image: url('.$handle->getImageURI().')';
-    $sigil = 'has-tooltip';
-    $meta  = array(
-        'tip' => pht($ownername),
-        'size' => 200,
-        'align' => 'E',
-    );
-    $image = id(new SprintHandleIconView())
-        ->addSigil($sigil)
-        ->setMetadata($meta)
-        ->setHref($ownerlink)
-        ->setIconStyle($image_uri);
-
-    return $image;
   }
 }
diff --git a/src/view/SprintUIObjectBoxView.php 
b/src/view/SprintUIObjectBoxView.php
index 309fca1..0c11df4 100644
--- a/src/view/SprintUIObjectBoxView.php
+++ b/src/view/SprintUIObjectBoxView.php
@@ -258,7 +258,7 @@
     if ($this->actionListID) {
       $icon_id = celerity_generate_unique_node_id();
       $icon = id(new PHUIIconView())
-        ->setIconFont('fa-bars');
+        ->setIcon('fa-bars');
       $meta = array(
         'map' => array(
           $this->actionListID => 'phabricator-action-list-toggle',

-- 
To view, visit https://gerrit.wikimedia.org/r/268324
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I052b2cc894e3605619cd921fa362b1a3485db6ae
Gerrit-PatchSet: 1
Gerrit-Project: phabricator/extensions/Sprint
Gerrit-Branch: master
Gerrit-Owner: Christopher Johnson (WMDE) <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to