1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-23 22:10:55 +01:00

Rename project -> product on edit/create UIs

Summary: Ref T3092. Ref T3549. Modernize the product creation and edit UIs and make them say "product" instead of "project".

Test Plan:
  - Created products.
  - Edited products.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T3092, T3549

Differential Revision: https://secure.phabricator.com/D8636
This commit is contained in:
epriestley 2014-03-29 09:16:40 -07:00
parent 98b0b5e62b
commit 8c88180ee1
4 changed files with 94 additions and 106 deletions

View file

@ -2516,6 +2516,8 @@ phutil_register_library_map(array(
'ReleephPHIDTypeRequest' => 'applications/releeph/phid/ReleephPHIDTypeRequest.php',
'ReleephProductActionController' => 'applications/releeph/controller/project/ReleephProductActionController.php',
'ReleephProductController' => 'applications/releeph/controller/project/ReleephProductController.php',
'ReleephProductCreateController' => 'applications/releeph/controller/project/ReleephProductCreateController.php',
'ReleephProductEditController' => 'applications/releeph/controller/project/ReleephProductEditController.php',
'ReleephProductEditor' => 'applications/releeph/editor/ReleephProductEditor.php',
'ReleephProductHistoryController' => 'applications/releeph/controller/project/ReleephProductHistoryController.php',
'ReleephProductListController' => 'applications/releeph/controller/project/ReleephProductListController.php',
@ -2525,8 +2527,6 @@ phutil_register_library_map(array(
'ReleephProductViewController' => 'applications/releeph/controller/project/ReleephProductViewController.php',
'ReleephProject' => 'applications/releeph/storage/ReleephProject.php',
'ReleephProjectController' => 'applications/releeph/controller/ReleephProjectController.php',
'ReleephProjectCreateController' => 'applications/releeph/controller/project/ReleephProjectCreateController.php',
'ReleephProjectEditController' => 'applications/releeph/controller/project/ReleephProjectEditController.php',
'ReleephProjectQuery' => 'applications/releeph/query/ReleephProjectQuery.php',
'ReleephReasonFieldSpecification' => 'applications/releeph/field/specification/ReleephReasonFieldSpecification.php',
'ReleephRequest' => 'applications/releeph/storage/ReleephRequest.php',
@ -5491,6 +5491,8 @@ phutil_register_library_map(array(
'ReleephPHIDTypeRequest' => 'PhabricatorPHIDType',
'ReleephProductActionController' => 'ReleephProductController',
'ReleephProductController' => 'ReleephController',
'ReleephProductCreateController' => 'ReleephProjectController',
'ReleephProductEditController' => 'ReleephProductController',
'ReleephProductEditor' => 'PhabricatorApplicationTransactionEditor',
'ReleephProductHistoryController' => 'ReleephProductController',
'ReleephProductListController' =>
@ -5512,8 +5514,6 @@ phutil_register_library_map(array(
1 => 'PhabricatorPolicyInterface',
),
'ReleephProjectController' => 'ReleephController',
'ReleephProjectCreateController' => 'ReleephProjectController',
'ReleephProjectEditController' => 'ReleephProjectController',
'ReleephProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'ReleephReasonFieldSpecification' => 'ReleephFieldSpecification',
'ReleephRequest' =>

View file

@ -36,10 +36,10 @@ final class PhabricatorApplicationReleeph extends PhabricatorApplication {
'' => 'ReleephProductListController',
'project/' => array(
'(?:query/(?P<queryKey>[^/]+)/)?' => 'ReleephProductListController',
'create/' => 'ReleephProjectCreateController',
'create/' => 'ReleephProductCreateController',
'(?P<projectID>[1-9]\d*)/' => array(
'(?:query/(?P<queryKey>[^/]+)/)?' => 'ReleephProductViewController',
'edit/' => 'ReleephProjectEditController',
'edit/' => 'ReleephProductEditController',
'cutbranch/' => 'ReleephBranchCreateController',
'action/(?P<action>.+)/' => 'ReleephProductActionController',
'history/' => 'ReleephProductHistoryController',

View file

@ -1,6 +1,6 @@
<?php
final class ReleephProjectCreateController extends ReleephProjectController {
final class ReleephProductCreateController extends ReleephProjectController {
public function processRequest() {
$request = $this->getRequest();
@ -18,7 +18,7 @@ final class ReleephProjectCreateController extends ReleephProjectController {
if (!$name) {
$e_name = pht('Required');
$errors[] = pht(
'Your Releeph project should have a simple descriptive name.');
'Your product should have a simple, descriptive name.');
}
if (!$trunk_branch) {
@ -31,7 +31,7 @@ final class ReleephProjectCreateController extends ReleephProjectController {
$pr_repository = $arc_project->loadRepository();
if (!$errors) {
$releeph_project = id(new ReleephProject())
$releeph_product = id(new ReleephProject())
->setName($name)
->setTrunkBranch($trunk_branch)
->setRepositoryPHID($pr_repository->getPHID())
@ -40,21 +40,20 @@ final class ReleephProjectCreateController extends ReleephProjectController {
->setIsActive(1);
try {
$releeph_project->save();
$releeph_product->save();
return id(new AphrontRedirectResponse())
->setURI($releeph_project->getURI());
->setURI($releeph_product->getURI());
} catch (AphrontQueryDuplicateKeyException $ex) {
$e_name = pht('Not Unique');
$errors[] = pht(
'Another project already uses this name.');
$errors[] = pht('Another product already uses this name.');
}
}
}
$arc_project_options = $this->getArcProjectSelectOptions($arc_projects);
$project_name_input = id(new AphrontFormTextControl())
$product_name_input = id(new AphrontFormTextControl())
->setLabel(pht('Name'))
->setDisableAutocomplete(true)
->setName('name')
@ -79,14 +78,14 @@ final class ReleephProjectCreateController extends ReleephProjectController {
$branch_name_preview = id(new ReleephBranchPreviewView())
->setLabel(pht('Example Branch'))
->addControl('projectName', $project_name_input)
->addControl('projectName', $product_name_input)
->addControl('arcProjectID', $arc_project_input)
->addStatic('template', '')
->addStatic('isSymbolic', false);
$form = id(new AphrontFormView())
->setUser($request->getUser())
->appendChild($project_name_input)
->appendChild($product_name_input)
->appendChild($arc_project_input)
->appendChild(
id(new AphrontFormTextControl())
@ -100,15 +99,15 @@ final class ReleephProjectCreateController extends ReleephProjectController {
->appendChild(
id(new AphrontFormSubmitControl())
->addCancelButton('/releeph/project/')
->setValue(pht('Create')));
->setValue(pht('Create Release Product')));
$form_box = id(new PHUIObjectBoxView())
->setHeaderText(pht('Create New Project'))
->setHeaderText(pht('Create New Product'))
->setFormErrors($errors)
->setForm($form);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('New Project'));
$crumbs->addTextCrumb(pht('New Product'));
return $this->buildApplicationPage(
array(
@ -116,7 +115,7 @@ final class ReleephProjectCreateController extends ReleephProjectController {
$form_box,
),
array(
'title' => pht('Create New Project'),
'title' => pht('Create New Product'),
'device' => true,
));
}

View file

@ -1,43 +1,61 @@
<?php
final class ReleephProjectEditController extends ReleephProjectController {
final class ReleephProductEditController extends ReleephProductController {
private $productID;
public function willProcessRequest(array $data) {
$this->productID = $data['projectID'];
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$product = id(new ReleephProjectQuery())
->setViewer($viewer)
->withIDs(array($this->productID))
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
))
->executeOne();
if (!$product) {
return new Aphront404Response();
}
$this->setProduct($product);
$e_name = true;
$e_trunk_branch = true;
$e_branch_template = false;
$errors = array();
$project_name = $request->getStr('name',
$this->getReleephProject()->getName());
$product_name = $request->getStr('name', $product->getName());
$trunk_branch = $request->getStr('trunkBranch',
$this->getReleephProject()->getTrunkBranch());
$trunk_branch = $request->getStr('trunkBranch', $product->getTrunkBranch());
$branch_template = $request->getStr('branchTemplate');
if ($branch_template === null) {
$branch_template =
$this->getReleephProject()->getDetail('branchTemplate');
$branch_template = $product->getDetail('branchTemplate');
}
$pick_failure_instructions = $request->getStr('pickFailureInstructions',
$this->getReleephProject()->getDetail('pick_failure_instructions'));
$product->getDetail('pick_failure_instructions'));
$test_paths = $request->getStr('testPaths');
if ($test_paths !== null) {
$test_paths = array_filter(explode("\n", $test_paths));
} else {
$test_paths = $this->getReleephProject()->getDetail('testPaths', array());
$test_paths = $product->getDetail('testPaths', array());
}
$arc_project_id = $this->getReleephProject()->getArcanistProjectID();
$arc_project_id = $product->getArcanistProjectID();
if ($request->isFormPost()) {
$pusher_phids = $request->getArr('pushers');
if (!$project_name) {
if (!$product_name) {
$e_name = pht('Required');
$errors[] =
pht('Your releeph project should have a simple descriptive name');
pht('Your releeph product should have a simple descriptive name.');
}
if (!$trunk_branch) {
@ -46,14 +64,14 @@ final class ReleephProjectEditController extends ReleephProjectController {
pht('You must specify which branch you will be picking from.');
}
$other_releeph_projects = id(new ReleephProject())
->loadAllWhere('id <> %d', $this->getReleephProject()->getID());
$other_releeph_project_names = mpull($other_releeph_projects,
$other_releeph_products = id(new ReleephProject())
->loadAllWhere('id != %d', $product->getID());
$other_releeph_product_names = mpull($other_releeph_products,
'getName', 'getID');
if (in_array($project_name, $other_releeph_project_names)) {
$errors[] = pht("Releeph project name %s is already taken",
$project_name);
if (in_array($product_name, $other_releeph_product_names)) {
$errors[] = pht("Releeph product name %s is already taken",
$product_name);
}
foreach ($test_paths as $test_path) {
@ -65,7 +83,7 @@ final class ReleephProjectEditController extends ReleephProjectController {
}
}
$project = $this->getReleephProject()
$product
->setTrunkBranch($trunk_branch)
->setDetail('pushers', $pusher_phids)
->setDetail('pick_failure_instructions', $pick_failure_instructions)
@ -78,7 +96,7 @@ final class ReleephProjectEditController extends ReleephProjectController {
if ($branch_template) {
list($branch_name, $template_errors) = id(new ReleephBranchTemplate())
->setCommitHandle($fake_commit_handle)
->setReleephProjectName($project_name)
->setReleephProjectName($product_name)
->interpolate($branch_template);
if ($template_errors) {
@ -90,29 +108,15 @@ final class ReleephProjectEditController extends ReleephProjectController {
}
if (!$errors) {
$project->save();
$product->save();
return id(new AphrontRedirectResponse())
->setURI('/releeph/project/');
return id(new AphrontRedirectResponse())->setURI($product->getURI());
}
}
$error_view = null;
if ($errors) {
$error_view = new AphrontErrorView();
$error_view->setErrors($errors);
}
$projects = mpull(
id(new PhabricatorProject())->loadAll(),
'getName',
'getID');
$projects[0] = '-'; // no project associated, that's ok
$pusher_phids = $request->getArr(
'pushers',
$this->getReleephProject()->getDetail('pushers', array()));
$product->getDetail('pushers', array()));
$handles = id(new PhabricatorHandleQuery())
->setViewer($request->getUser())
@ -121,33 +125,32 @@ final class ReleephProjectEditController extends ReleephProjectController {
$pusher_handles = array_select_keys($handles, $pusher_phids);
$basic_inset = id(new AphrontFormInsetView())
->setTitle(pht('Basics'))
$form = id(new AphrontFormView())
->setUser($request->getUser())
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Name'))
->setName('name')
->setValue($project_name)
->setValue($product_name)
->setError($e_name)
->setCaption(pht('A name like "Thrift" but not "Thrift releases".')))
->appendChild(
id(new AphrontFormStaticControl())
->setLabel(pht('Repository'))
->setValue(
$this
->getReleephProject()
$product
->loadPhabricatorRepository()
->getName()))
->appendChild(
id(new AphrontFormStaticControl())
->setLabel(pht('Arc Project'))
->setValue(
$this->getReleephProject()->loadArcanistProject()->getName()))
$product->loadArcanistProject()->getName()))
->appendChild(
id(new AphrontFormStaticControl())
->setLabel(pht('Releeph Project PHID'))
->setValue(
$this->getReleephProject()->getPHID()))
$product->getPHID()))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Trunk'))
@ -172,29 +175,10 @@ final class ReleephProjectEditController extends ReleephProjectController {
'in this project. One string per line. '.
'Examples: \'__tests__\', \'/javatests/\'...')));
$pushers_inset = id(new AphrontFormInsetView())
->setTitle(pht('Pushers'))
->appendChild(
pht('Pushers are allowed to approve Releeph requests to be committed. '.
'to this project\'s branches. If you leave this blank then anyone '.
'is allowed to approve requests.'))
->appendChild(
id(new AphrontFormTokenizerControl())
->setLabel(pht('Pushers'))
->setName('pushers')
->setDatasource('/typeahead/common/users/')
->setValue($pusher_handles));
// Build the Template inset
$help_markup = PhabricatorMarkupEngine::renderOneObject(
id(new PhabricatorMarkupOneOff())->setContent($this->getBranchHelpText()),
'default',
$request->getUser());
$branch_template_input = id(new AphrontFormTextControl())
->setName('branchTemplate')
->setValue($branch_template)
->setLabel('Template')
->setLabel('Branch Template')
->setError($e_branch_template)
->setCaption(
pht("Leave this blank to use your installation's default."));
@ -204,22 +188,18 @@ final class ReleephProjectEditController extends ReleephProjectController {
->addControl('template', $branch_template_input)
->addStatic('arcProjectID', $arc_project_id)
->addStatic('isSymbolic', false)
->addStatic('projectName', $this->getReleephProject()->getName());
->addStatic('projectName', $product->getName());
$template_inset = id(new AphrontFormInsetView())
->setTitle(pht('Branch Cutting'))
$form
->appendChild(
pht('Provide a pattern for creating new branches.'))
id(new AphrontFormTokenizerControl())
->setLabel(pht('Pushers'))
->setName('pushers')
->setDatasource('/typeahead/common/users/')
->setValue($pusher_handles))
->appendChild($branch_template_input)
->appendChild($branch_template_preview)
->appendChild($help_markup);
// Build the form
$form = id(new AphrontFormView())
->setUser($request->getUser())
->appendChild($basic_inset)
->appendChild($pushers_inset)
->appendChild($template_inset);
->appendRemarkupInstructions($this->getBranchHelpText());
$form
->appendChild(
@ -227,14 +207,23 @@ final class ReleephProjectEditController extends ReleephProjectController {
->addCancelButton('/releeph/project/')
->setValue(pht('Save')));
$panel = id(new AphrontPanelView())
->setHeader(pht('Edit Releeph Project'))
->appendChild($form)
->setWidth(AphrontPanelView::WIDTH_FORM);
$box = id(new PHUIObjectBoxView())
->setHeaderText(pht('Edit Releeph Product'))
->setFormErrors($errors)
->appendChild($form);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Edit Product'));
return $this->buildStandardPageResponse(
array($error_view, $panel),
array('title' => pht('Edit Releeph Project')));
array(
$crumbs,
$box,
),
array(
'title' => pht('Edit Releeph Product'),
'device' => true,
));
}
private function getBranchHelpText() {
@ -244,7 +233,7 @@ final class ReleephProjectEditController extends ReleephProjectController {
| Code | Meaning
| ----- | -------
| `%P` | The name of your project, with spaces changed to "-".
| `%P` | The name of your product, with spaces changed to "-".
| `%p` | Like %P, but all lowercase.
| `%Y` | The four digit year associated with the branch date.
| `%m` | The two digit month.
@ -263,7 +252,7 @@ Use a directory to separate your release branches from other branches:
releases/%Y-%M-%d-%v
=> releases/2012-30-16-rHERGE32cd512a52b7
Include a second hierarchy if you share your repository with other projects:
Include a second hierarchy if you share your repository with other products:
lang=none
releases/%P/%p-release-%Y%m%d-%V