mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52:41 +01:00
Move workboard "View as Query" workflow to a separate controller
Summary: Depends on D20632. Ref T4900. As with other workflows on the board controller, this one is currently in the giant main "do everything" method. Move it to a separate controller. This makes one material improvement: previously, we built the full board and did layout on all the cards before building the query. However, we do not actually need to do this: we don't need the cards. Instead, just do layout without handing over any card PHIDs. This is slightly faster, particularly on large boards. Test Plan: - Clicked "View as Query" on a board, got a query page for the column. - Applied a custom filter, then clicked "View as Query" on a board. Got a query page merging the two filters. - Applied a custom filter, then clicked "Veiw as Query" on a board, in a subproject column. Got a query page merging the two filters, respecting the project-ness of the column. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T4900 Differential Revision: https://secure.phabricator.com/D20633
This commit is contained in:
parent
577020aea9
commit
9ea7227f0f
4 changed files with 79 additions and 42 deletions
|
@ -4198,6 +4198,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php',
|
'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php',
|
||||||
'PhabricatorProjectColumnTransactionType' => 'applications/project/xaction/column/PhabricatorProjectColumnTransactionType.php',
|
'PhabricatorProjectColumnTransactionType' => 'applications/project/xaction/column/PhabricatorProjectColumnTransactionType.php',
|
||||||
'PhabricatorProjectColumnTriggerTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnTriggerTransaction.php',
|
'PhabricatorProjectColumnTriggerTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnTriggerTransaction.php',
|
||||||
|
'PhabricatorProjectColumnViewQueryController' => 'applications/project/controller/PhabricatorProjectColumnViewQueryController.php',
|
||||||
'PhabricatorProjectConfigOptions' => 'applications/project/config/PhabricatorProjectConfigOptions.php',
|
'PhabricatorProjectConfigOptions' => 'applications/project/config/PhabricatorProjectConfigOptions.php',
|
||||||
'PhabricatorProjectConfiguredCustomField' => 'applications/project/customfield/PhabricatorProjectConfiguredCustomField.php',
|
'PhabricatorProjectConfiguredCustomField' => 'applications/project/customfield/PhabricatorProjectConfiguredCustomField.php',
|
||||||
'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php',
|
'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php',
|
||||||
|
@ -10473,6 +10474,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||||
'PhabricatorProjectColumnTransactionType' => 'PhabricatorModularTransactionType',
|
'PhabricatorProjectColumnTransactionType' => 'PhabricatorModularTransactionType',
|
||||||
'PhabricatorProjectColumnTriggerTransaction' => 'PhabricatorProjectColumnTransactionType',
|
'PhabricatorProjectColumnTriggerTransaction' => 'PhabricatorProjectColumnTransactionType',
|
||||||
|
'PhabricatorProjectColumnViewQueryController' => 'PhabricatorProjectBoardController',
|
||||||
'PhabricatorProjectConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
'PhabricatorProjectConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||||
'PhabricatorProjectConfiguredCustomField' => array(
|
'PhabricatorProjectConfiguredCustomField' => array(
|
||||||
'PhabricatorProjectStandardCustomField',
|
'PhabricatorProjectStandardCustomField',
|
||||||
|
|
|
@ -79,6 +79,8 @@ final class PhabricatorProjectApplication extends PhabricatorApplication {
|
||||||
=> 'PhabricatorProjectColumnHideController',
|
=> 'PhabricatorProjectColumnHideController',
|
||||||
'column/(?:(?P<id>\d+)/)?'
|
'column/(?:(?P<id>\d+)/)?'
|
||||||
=> 'PhabricatorProjectColumnDetailController',
|
=> 'PhabricatorProjectColumnDetailController',
|
||||||
|
'viewquery/(?P<columnID>\d+)/'
|
||||||
|
=> 'PhabricatorProjectColumnViewQueryController',
|
||||||
'import/'
|
'import/'
|
||||||
=> 'PhabricatorProjectBoardImportController',
|
=> 'PhabricatorProjectBoardImportController',
|
||||||
'reorder/'
|
'reorder/'
|
||||||
|
|
|
@ -122,46 +122,6 @@ final class PhabricatorProjectBoardViewController
|
||||||
->appendChild($content);
|
->appendChild($content);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the user wants to turn a particular column into a query, build an
|
|
||||||
// apropriate filter and redirect them to the query results page.
|
|
||||||
$query_column_id = $request->getInt('queryColumnID');
|
|
||||||
if ($query_column_id) {
|
|
||||||
$column_id_map = mpull($columns, null, 'getID');
|
|
||||||
$query_column = idx($column_id_map, $query_column_id);
|
|
||||||
if (!$query_column) {
|
|
||||||
return new Aphront404Response();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a saved query to combine the active filter on the workboard
|
|
||||||
// with the column filter. If the user currently has constraints on the
|
|
||||||
// board, we want to add a new column or project constraint, not
|
|
||||||
// completely replace the constraints.
|
|
||||||
$saved_query = $saved->newCopy();
|
|
||||||
|
|
||||||
if ($query_column->getProxyPHID()) {
|
|
||||||
$project_phids = $saved_query->getParameter('projectPHIDs');
|
|
||||||
if (!$project_phids) {
|
|
||||||
$project_phids = array();
|
|
||||||
}
|
|
||||||
$project_phids[] = $query_column->getProxyPHID();
|
|
||||||
$saved_query->setParameter('projectPHIDs', $project_phids);
|
|
||||||
} else {
|
|
||||||
$saved_query->setParameter(
|
|
||||||
'columnPHIDs',
|
|
||||||
array($query_column->getPHID()));
|
|
||||||
}
|
|
||||||
|
|
||||||
$search_engine = id(new ManiphestTaskSearchEngine())
|
|
||||||
->setViewer($viewer);
|
|
||||||
$search_engine->saveQuery($saved_query);
|
|
||||||
|
|
||||||
$query_key = $saved_query->getQueryKey();
|
|
||||||
$query_uri = new PhutilURI("/maniphest/query/{$query_key}/#R");
|
|
||||||
|
|
||||||
return id(new AphrontRedirectResponse())
|
|
||||||
->setURI($query_uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
$task_can_edit_map = id(new PhabricatorPolicyFilter())
|
$task_can_edit_map = id(new PhabricatorPolicyFilter())
|
||||||
->setViewer($viewer)
|
->setViewer($viewer)
|
||||||
->requireCapabilities(array(PhabricatorPolicyCapability::CAN_EDIT))
|
->requireCapabilities(array(PhabricatorPolicyCapability::CAN_EDIT))
|
||||||
|
@ -1004,6 +964,7 @@ final class PhabricatorProjectBoardViewController
|
||||||
|
|
||||||
$request = $this->getRequest();
|
$request = $this->getRequest();
|
||||||
$viewer = $request->getUser();
|
$viewer = $request->getUser();
|
||||||
|
$state = $this->getViewState();
|
||||||
|
|
||||||
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
||||||
$viewer,
|
$viewer,
|
||||||
|
@ -1062,8 +1023,8 @@ final class PhabricatorProjectBoardViewController
|
||||||
->setHref($batch_move_uri)
|
->setHref($batch_move_uri)
|
||||||
->setWorkflow(true);
|
->setWorkflow(true);
|
||||||
|
|
||||||
$query_uri = $request->getRequestURI();
|
$query_uri = urisprintf('viewquery/%d/', $column->getID());
|
||||||
$query_uri->replaceQueryParam('queryColumnID', $column->getID());
|
$query_uri = $state->newWorkboardURI($query_uri);
|
||||||
|
|
||||||
$column_items[] = id(new PhabricatorActionView())
|
$column_items[] = id(new PhabricatorActionView())
|
||||||
->setName(pht('View as Query'))
|
->setName(pht('View as Query'))
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorProjectColumnViewQueryController
|
||||||
|
extends PhabricatorProjectBoardController {
|
||||||
|
|
||||||
|
public function handleRequest(AphrontRequest $request) {
|
||||||
|
$viewer = $request->getViewer();
|
||||||
|
|
||||||
|
$response = $this->loadProject();
|
||||||
|
if ($response) {
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
$project = $this->getProject();
|
||||||
|
$state = $this->getViewState();
|
||||||
|
$board_uri = $state->newWorkboardURI();
|
||||||
|
|
||||||
|
// NOTE: We're performing layout without handing the "LayoutEngine" any
|
||||||
|
// object PHIDs. We only want to get access to the column object the user
|
||||||
|
// is trying to query, so we do not need to actually position any cards on
|
||||||
|
// the board.
|
||||||
|
|
||||||
|
$board_phid = $project->getPHID();
|
||||||
|
|
||||||
|
$layout_engine = id(new PhabricatorBoardLayoutEngine())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->setBoardPHIDs(array($board_phid))
|
||||||
|
->setFetchAllBoards(true)
|
||||||
|
->executeLayout();
|
||||||
|
|
||||||
|
$columns = $layout_engine->getColumns($board_phid);
|
||||||
|
$columns = mpull($columns, null, 'getID');
|
||||||
|
|
||||||
|
$column_id = $request->getURIData('columnID');
|
||||||
|
$column = idx($columns, $column_id);
|
||||||
|
if (!$column) {
|
||||||
|
return new Aphront404Response();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a saved query to combine the active filter on the workboard
|
||||||
|
// with the column filter. If the user currently has constraints on the
|
||||||
|
// board, we want to add a new column or project constraint, not
|
||||||
|
// completely replace the constraints.
|
||||||
|
$default_query = $state->getSavedQuery();
|
||||||
|
$saved_query = $default_query->newCopy();
|
||||||
|
|
||||||
|
if ($column->getProxyPHID()) {
|
||||||
|
$project_phids = $saved_query->getParameter('projectPHIDs');
|
||||||
|
if (!$project_phids) {
|
||||||
|
$project_phids = array();
|
||||||
|
}
|
||||||
|
$project_phids[] = $column->getProxyPHID();
|
||||||
|
$saved_query->setParameter('projectPHIDs', $project_phids);
|
||||||
|
} else {
|
||||||
|
$saved_query->setParameter(
|
||||||
|
'columnPHIDs',
|
||||||
|
array($column->getPHID()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$search_engine = id(new ManiphestTaskSearchEngine())
|
||||||
|
->setViewer($viewer);
|
||||||
|
|
||||||
|
$search_engine->saveQuery($saved_query);
|
||||||
|
|
||||||
|
$query_key = $saved_query->getQueryKey();
|
||||||
|
$query_uri = new PhutilURI("/maniphest/query/{$query_key}/#R");
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())
|
||||||
|
->setURI($query_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue