diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1053,6 +1053,7 @@ 'HarbormasterBuildPlanDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildPlanDatasource.php', 'HarbormasterBuildPlanDefaultEditCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultEditCapability.php', 'HarbormasterBuildPlanDefaultViewCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultViewCapability.php', + 'HarbormasterBuildPlanEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php', 'HarbormasterBuildPlanEditor' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditor.php', 'HarbormasterBuildPlanPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPlanPHIDType.php', 'HarbormasterBuildPlanQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanQuery.php', @@ -5202,6 +5203,7 @@ 'HarbormasterBuildPlanDatasource' => 'PhabricatorTypeaheadDatasource', 'HarbormasterBuildPlanDefaultEditCapability' => 'PhabricatorPolicyCapability', 'HarbormasterBuildPlanDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'HarbormasterBuildPlanEditEngine' => 'PhabricatorEditEngine', 'HarbormasterBuildPlanEditor' => 'PhabricatorApplicationTransactionEditor', 'HarbormasterBuildPlanPHIDType' => 'PhabricatorPHIDType', 'HarbormasterBuildPlanQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', @@ -5283,7 +5285,7 @@ 'HarbormasterPlanDisableController' => 'HarbormasterPlanController', 'HarbormasterPlanEditController' => 'HarbormasterPlanController', 'HarbormasterPlanListController' => 'HarbormasterPlanController', - 'HarbormasterPlanRunController' => 'HarbormasterController', + 'HarbormasterPlanRunController' => 'HarbormasterPlanController', 'HarbormasterPlanViewController' => 'HarbormasterPlanController', 'HarbormasterPrototypeBuildStepGroup' => 'HarbormasterBuildStepGroup', 'HarbormasterPublishFragmentBuildStepImplementation' => 'HarbormasterBuildStepImplementation', @@ -5296,10 +5298,10 @@ 'HarbormasterScratchTable' => 'HarbormasterDAO', 'HarbormasterSendMessageConduitAPIMethod' => 'HarbormasterConduitAPIMethod', 'HarbormasterSleepBuildStepImplementation' => 'HarbormasterBuildStepImplementation', - 'HarbormasterStepAddController' => 'HarbormasterController', - 'HarbormasterStepDeleteController' => 'HarbormasterController', - 'HarbormasterStepEditController' => 'HarbormasterController', - 'HarbormasterStepViewController' => 'HarbormasterController', + 'HarbormasterStepAddController' => 'HarbormasterPlanController', + 'HarbormasterStepDeleteController' => 'HarbormasterPlanController', + 'HarbormasterStepEditController' => 'HarbormasterPlanController', + 'HarbormasterStepViewController' => 'HarbormasterPlanController', 'HarbormasterTargetEngine' => 'Phobject', 'HarbormasterTargetWorker' => 'HarbormasterWorker', 'HarbormasterTestBuildStepGroup' => 'HarbormasterBuildStepGroup', diff --git a/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php b/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php --- a/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php +++ b/src/applications/harbormaster/application/PhabricatorHarbormasterApplication.php @@ -76,9 +76,9 @@ => 'HarbormasterBuildActionController', ), 'plan/' => array( - '(?:query/(?P[^/]+)/)?' - => 'HarbormasterPlanListController', - 'edit/(?:(?P\d+)/)?' => 'HarbormasterPlanEditController', + $this->getQueryRoutePattern() => 'HarbormasterPlanListController', + $this->getEditRoutePattern('edit/') + => 'HarbormasterPlanEditController', 'order/(?:(?P\d+)/)?' => 'HarbormasterPlanOrderController', 'disable/(?P\d+)/' => 'HarbormasterPlanDisableController', 'run/(?P\d+)/' => 'HarbormasterPlanRunController', diff --git a/src/applications/harbormaster/controller/HarbormasterBuildableListController.php b/src/applications/harbormaster/controller/HarbormasterBuildableListController.php --- a/src/applications/harbormaster/controller/HarbormasterBuildableListController.php +++ b/src/applications/harbormaster/controller/HarbormasterBuildableListController.php @@ -7,34 +7,21 @@ } public function handleRequest(AphrontRequest $request) { - $controller = id(new PhabricatorApplicationSearchController()) - ->setQueryKey($request->getURIData('queryKey')) - ->setSearchEngine(new HarbormasterBuildableSearchEngine()) - ->setNavigation($this->buildSideNavView()); + $items = array(); - return $this->delegateToController($controller); - } - - public function buildSideNavView($for_app = false) { - $user = $this->getRequest()->getUser(); - - $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - - id(new HarbormasterBuildableSearchEngine()) - ->setViewer($user) - ->addNavigationItems($nav->getMenu()); + $items[] = id(new PHUIListItemView()) + ->setType(PHUIListItemView::TYPE_LABEL) + ->setName(pht('Build Plans')); - $nav->addLabel(pht('Build Plans')); - $nav->addFilter('plan/', pht('Manage Build Plans')); - - $nav->selectFilter(null); - - return $nav; - } + $items[] = id(new PHUIListItemView()) + ->setType(PHUIListItemView::TYPE_LINK) + ->setName(pht('Manage Build Plans')) + ->setHref($this->getApplicationURI('plan/')); - public function buildApplicationMenu() { - return $this->buildSideNavView(true)->getMenu(); + return id(new HarbormasterBuildableSearchEngine()) + ->setController($this) + ->setNavigationItems($items) + ->buildResponse(); } } diff --git a/src/applications/harbormaster/controller/HarbormasterController.php b/src/applications/harbormaster/controller/HarbormasterController.php --- a/src/applications/harbormaster/controller/HarbormasterController.php +++ b/src/applications/harbormaster/controller/HarbormasterController.php @@ -2,6 +2,11 @@ abstract class HarbormasterController extends PhabricatorController { + public function buildApplicationMenu() { + return $this->newApplicationMenu() + ->setSearchEngine(new HarbormasterBuildableSearchEngine()); + } + protected function addBuildableCrumb( PHUICrumbsView $crumbs, HarbormasterBuildable $buildable) { diff --git a/src/applications/harbormaster/controller/HarbormasterPlanController.php b/src/applications/harbormaster/controller/HarbormasterPlanController.php --- a/src/applications/harbormaster/controller/HarbormasterPlanController.php +++ b/src/applications/harbormaster/controller/HarbormasterPlanController.php @@ -2,6 +2,11 @@ abstract class HarbormasterPlanController extends HarbormasterController { + public function buildApplicationMenu() { + return $this->newApplicationMenu() + ->setSearchEngine(new HarbormasterBuildPlanSearchEngine()); + } + protected function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); diff --git a/src/applications/harbormaster/controller/HarbormasterPlanEditController.php b/src/applications/harbormaster/controller/HarbormasterPlanEditController.php --- a/src/applications/harbormaster/controller/HarbormasterPlanEditController.php +++ b/src/applications/harbormaster/controller/HarbormasterPlanEditController.php @@ -3,146 +3,9 @@ final class HarbormasterPlanEditController extends HarbormasterPlanController { public function handleRequest(AphrontRequest $request) { - $viewer = $this->getViewer(); - - $id = $request->getURIData('id'); - if ($id) { - $plan = id(new HarbormasterBuildPlanQuery()) - ->setViewer($viewer) - ->withIDs(array($id)) - ->requireCapabilities( - array( - PhabricatorPolicyCapability::CAN_VIEW, - PhabricatorPolicyCapability::CAN_EDIT, - )) - ->executeOne(); - if (!$plan) { - return new Aphront404Response(); - } - } else { - $this->requireApplicationCapability( - HarbormasterCreatePlansCapability::CAPABILITY); - - $plan = HarbormasterBuildPlan::initializeNewBuildPlan($viewer); - } - - $e_name = true; - $v_name = $plan->getName(); - $v_view = $plan->getViewPolicy(); - $v_edit = $plan->getEditPolicy(); - $validation_exception = null; - if ($request->isFormPost()) { - $xactions = array(); - - $v_name = $request->getStr('name'); - $v_view = $request->getStr('viewPolicy'); - $v_edit = $request->getStr('editPolicy'); - - $e_name = null; - - $type_name = HarbormasterBuildPlanTransaction::TYPE_NAME; - $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; - $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; - - $xactions[] = id(new HarbormasterBuildPlanTransaction()) - ->setTransactionType($type_name) - ->setNewValue($v_name); - - $xactions[] = id(new HarbormasterBuildPlanTransaction()) - ->setTransactionType($type_view) - ->setNewValue($v_view); - - $xactions[] = id(new HarbormasterBuildPlanTransaction()) - ->setTransactionType($type_edit) - ->setNewValue($v_edit); - - $editor = id(new HarbormasterBuildPlanEditor()) - ->setActor($viewer) - ->setContinueOnNoEffect(true) - ->setContentSourceFromRequest($request); - - try { - $editor->applyTransactions($plan, $xactions); - return id(new AphrontRedirectResponse()) - ->setURI($this->getApplicationURI('plan/'.$plan->getID().'/')); - } catch (PhabricatorApplicationTransactionValidationException $ex) { - $validation_exception = $ex; - - $e_name = $validation_exception->getShortMessage( - HarbormasterBuildPlanTransaction::TYPE_NAME); - } - - } - - $is_new = (!$plan->getID()); - if ($is_new) { - $title = pht('New Build Plan'); - $cancel_uri = $this->getApplicationURI('plan/'); - $save_button = pht('Create Build Plan'); - } else { - $id = $plan->getID(); - - $title = pht('Edit Build Plan'); - $cancel_uri = $this->getApplicationURI('plan/'.$plan->getID().'/'); - $save_button = pht('Save Build Plan'); - } - - $policies = id(new PhabricatorPolicyQuery()) - ->setViewer($viewer) - ->setObject($plan) - ->execute(); - - $form = id(new AphrontFormView()) - ->setUser($viewer) - ->appendControl( - id(new AphrontFormTextControl()) - ->setLabel(pht('Plan Name')) - ->setName('name') - ->setError($e_name) - ->setValue($v_name)) - ->appendControl( - id(new AphrontFormPolicyControl()) - ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) - ->setPolicyObject($plan) - ->setPolicies($policies) - ->setValue($v_view) - ->setName('viewPolicy')) - ->appendControl( - id(new AphrontFormPolicyControl()) - ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) - ->setPolicyObject($plan) - ->setPolicies($policies) - ->setValue($v_edit) - ->setName('editPolicy')) - ->appendControl( - id(new AphrontFormSubmitControl()) - ->setValue($save_button) - ->addCancelButton($cancel_uri)); - - $box = id(new PHUIObjectBoxView()) - ->setHeaderText($title) - ->setValidationException($validation_exception) - ->setForm($form); - - $crumbs = $this->buildApplicationCrumbs(); - if ($is_new) { - $crumbs->addTextCrumb(pht('New Build Plan')); - } else { - $id = $plan->getID(); - $crumbs->addTextCrumb( - pht('Plan %d', $id), - $this->getApplicationURI("plan/{$id}/")); - $crumbs->addTextCrumb(pht('Edit')); - } - - return $this->buildApplicationPage( - array( - $crumbs, - $box, - ), - array( - 'title' => $title, - )); + return id(new HarbormasterBuildPlanEditEngine()) + ->setController($this) + ->buildResponse(); } } diff --git a/src/applications/harbormaster/controller/HarbormasterPlanListController.php b/src/applications/harbormaster/controller/HarbormasterPlanListController.php --- a/src/applications/harbormaster/controller/HarbormasterPlanListController.php +++ b/src/applications/harbormaster/controller/HarbormasterPlanListController.php @@ -7,53 +7,19 @@ } public function handleRequest(AphrontRequest $request) { - $controller = id(new PhabricatorApplicationSearchController()) - ->setQueryKey($request->getURIData('queryKey')) - ->setSearchEngine(new HarbormasterBuildPlanSearchEngine()) - ->setNavigation($this->buildSideNavView()); - - return $this->delegateToController($controller); - } - - public function buildSideNavView($for_app = false) { - $user = $this->getRequest()->getUser(); - - $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - - if ($for_app) { - $nav->addFilter('new/', pht('New Build Plan')); - } - - id(new HarbormasterBuildPlanSearchEngine()) - ->setViewer($user) - ->addNavigationItems($nav->getMenu()); - - $nav->selectFilter(null); - - return $nav; - } - - public function buildApplicationMenu() { - return $this->buildSideNavView(true)->getMenu(); + return id(new HarbormasterBuildPlanSearchEngine()) + ->setController($this) + ->buildResponse(); } protected function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); - $can_create = $this->hasApplicationCapability( - HarbormasterCreatePlansCapability::CAPABILITY); - - $crumbs->addAction( - id(new PHUIListItemView()) - ->setName(pht('New Build Plan')) - ->setHref($this->getApplicationURI('plan/edit/')) - ->setDisabled(!$can_create) - ->setWorkflow(!$can_create) - ->setIcon('fa-plus-square')); + id(new HarbormasterBuildPlanEditEngine()) + ->setViewer($this->getViewer()) + ->addActionToCrumbs($crumbs); return $crumbs; } - } diff --git a/src/applications/harbormaster/controller/HarbormasterPlanRunController.php b/src/applications/harbormaster/controller/HarbormasterPlanRunController.php --- a/src/applications/harbormaster/controller/HarbormasterPlanRunController.php +++ b/src/applications/harbormaster/controller/HarbormasterPlanRunController.php @@ -1,6 +1,6 @@ getViewer(); diff --git a/src/applications/harbormaster/controller/HarbormasterStepAddController.php b/src/applications/harbormaster/controller/HarbormasterStepAddController.php --- a/src/applications/harbormaster/controller/HarbormasterStepAddController.php +++ b/src/applications/harbormaster/controller/HarbormasterStepAddController.php @@ -1,6 +1,7 @@ getViewer(); diff --git a/src/applications/harbormaster/controller/HarbormasterStepDeleteController.php b/src/applications/harbormaster/controller/HarbormasterStepDeleteController.php --- a/src/applications/harbormaster/controller/HarbormasterStepDeleteController.php +++ b/src/applications/harbormaster/controller/HarbormasterStepDeleteController.php @@ -1,6 +1,7 @@ getViewer(); diff --git a/src/applications/harbormaster/controller/HarbormasterStepEditController.php b/src/applications/harbormaster/controller/HarbormasterStepEditController.php --- a/src/applications/harbormaster/controller/HarbormasterStepEditController.php +++ b/src/applications/harbormaster/controller/HarbormasterStepEditController.php @@ -1,6 +1,7 @@ getViewer(); diff --git a/src/applications/harbormaster/controller/HarbormasterStepViewController.php b/src/applications/harbormaster/controller/HarbormasterStepViewController.php --- a/src/applications/harbormaster/controller/HarbormasterStepViewController.php +++ b/src/applications/harbormaster/controller/HarbormasterStepViewController.php @@ -1,6 +1,7 @@ getViewer(); diff --git a/src/applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php b/src/applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php new file mode 100644 --- /dev/null +++ b/src/applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php @@ -0,0 +1,89 @@ +getViewer(); + return HarbormasterBuildPlan::initializeNewBuildPlan($viewer); + } + + protected function newObjectQuery() { + return new HarbormasterBuildPlanQuery(); + } + + protected function getObjectCreateTitleText($object) { + return pht('Create Build Plan'); + } + + protected function getObjectCreateButtonText($object) { + return pht('Create Build Plan'); + } + + protected function getObjectEditTitleText($object) { + return pht('Edit Build Plan: %s', $object->getName()); + } + + protected function getObjectEditShortText($object) { + return pht('Edit Build Plan'); + } + + protected function getObjectCreateShortText() { + return pht('Create Build Plan'); + } + + protected function getEditorURI() { + return '/harbormaster/plan/edit/'; + } + + protected function getObjectCreateCancelURI($object) { + return '/harbormaster/plan/'; + } + + protected function getObjectViewURI($object) { + $id = $object->getID(); + return "/harbormaster/plan/{$id}/"; + } + + protected function getCreateNewObjectPolicy() { + return $this->getApplication()->getPolicy( + HarbormasterCreatePlansCapability::CAPABILITY); + } + + protected function buildCustomEditFields($object) { + return array( + id(new PhabricatorTextEditField()) + ->setKey('name') + ->setLabel(pht('Name')) + ->setIsRequired(true) + ->setTransactionType(HarbormasterBuildPlanTransaction::TYPE_NAME) + ->setDescription(pht('The build plan name.')) + ->setConduitDescription(pht('Rename the plan.')) + ->setConduitTypeDescription(pht('New plan name.')) + ->setValue($object->getName()), + ); + } + +} diff --git a/src/applications/harbormaster/editor/HarbormasterBuildPlanEditor.php b/src/applications/harbormaster/editor/HarbormasterBuildPlanEditor.php --- a/src/applications/harbormaster/editor/HarbormasterBuildPlanEditor.php +++ b/src/applications/harbormaster/editor/HarbormasterBuildPlanEditor.php @@ -90,7 +90,7 @@ $error = new PhabricatorApplicationTransactionValidationError( $type, pht('Required'), - pht('Plan name is required.'), + pht('You must choose a name for your build plan.'), last($xactions)); $error->setIsMissingFieldError(true);