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