diff --git a/src/applications/almanac/controller/AlmanacBindingEditController.php b/src/applications/almanac/controller/AlmanacBindingEditController.php index f20011ded9..5f1fe30043 100644 --- a/src/applications/almanac/controller/AlmanacBindingEditController.php +++ b/src/applications/almanac/controller/AlmanacBindingEditController.php @@ -1,123 +1,133 @@ getViewer(); $id = $request->getURIData('id'); if ($id) { $binding = id(new AlmanacBindingQuery()) ->setViewer($viewer) ->withIDs(array($id)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$binding) { return new Aphront404Response(); } $service = $binding->getService(); $is_new = false; $service_uri = $service->getURI(); $cancel_uri = $binding->getURI(); $title = pht('Edit Binding'); $save_button = pht('Save Changes'); } else { $service = id(new AlmanacServiceQuery()) ->setViewer($viewer) ->withIDs(array($request->getStr('serviceID'))) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); $binding = AlmanacBinding::initializeNewBinding($service); $is_new = true; $service_uri = $service->getURI(); $cancel_uri = $service_uri; $title = pht('Create Binding'); $save_button = pht('Create Binding'); } $v_interface = array(); if ($binding->getInterfacePHID()) { $v_interface = array($binding->getInterfacePHID()); } $e_interface = true; $validation_exception = null; if ($request->isFormPost()) { $v_interface = $request->getArr('interfacePHIDs'); $type_interface = AlmanacBindingTransaction::TYPE_INTERFACE; $xactions = array(); $xactions[] = id(new AlmanacBindingTransaction()) ->setTransactionType($type_interface) ->setNewValue(head($v_interface)); $editor = id(new AlmanacBindingEditor()) ->setActor($viewer) ->setContentSourceFromRequest($request) ->setContinueOnNoEffect(true); try { $editor->applyTransactions($binding, $xactions); $binding_uri = $binding->getURI(); return id(new AphrontRedirectResponse())->setURI($binding_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_interface = $ex->getShortMessage($type_interface); } } $form = id(new AphrontFormView()) ->setUser($viewer) ->appendControl( id(new AphrontFormTokenizerControl()) ->setName('interfacePHIDs') ->setLabel(pht('Interface')) ->setLimit(1) ->setDatasource(new AlmanacInterfaceDatasource()) ->setValue($v_interface) ->setError($e_interface)) ->appendChild( id(new AphrontFormSubmitControl()) ->addCancelButton($cancel_uri) ->setValue($save_button)); $box = id(new PHUIObjectBoxView()) ->setValidationException($validation_exception) - ->setHeaderText($title) + ->setHeaderText(pht('Binding')) + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->appendChild($form); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb($service->getName(), $service_uri); if ($is_new) { $crumbs->addTextCrumb(pht('Create Binding')); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Create Binding')) + ->setHeaderIcon('fa-plus-square'); } else { $crumbs->addTextCrumb(pht('Edit Binding')); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Create Binding')) + ->setHeaderIcon('fa-pencil'); } + $crumbs->setBorder(true); + + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter(array( + $box, + )); return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) - ->appendChild( - array( - $box, - )); - + ->appendChild($view); } } diff --git a/src/applications/almanac/controller/AlmanacConsoleController.php b/src/applications/almanac/controller/AlmanacConsoleController.php index 9b83db9daa..cd9ebf610a 100644 --- a/src/applications/almanac/controller/AlmanacConsoleController.php +++ b/src/applications/almanac/controller/AlmanacConsoleController.php @@ -1,79 +1,86 @@ getViewer(); $menu = id(new PHUIObjectItemListView()) ->setUser($viewer); $menu->addItem( id(new PHUIObjectItemView()) ->setHeader(pht('Devices')) ->setHref($this->getApplicationURI('device/')) ->setIcon('fa-server') ->addAttribute( pht( 'Create an inventory of physical and virtual hosts and '. 'devices.'))); $menu->addItem( id(new PHUIObjectItemView()) ->setHeader(pht('Services')) ->setHref($this->getApplicationURI('service/')) ->setIcon('fa-plug') ->addAttribute( pht( 'Create and update services, and map them to interfaces on '. 'devices.'))); $menu->addItem( id(new PHUIObjectItemView()) ->setHeader(pht('Networks')) ->setHref($this->getApplicationURI('network/')) ->setIcon('fa-globe') ->addAttribute( pht( 'Manage public and private networks.'))); $menu->addItem( id(new PHUIObjectItemView()) ->setHeader(pht('Namespaces')) ->setHref($this->getApplicationURI('namespace/')) ->setIcon('fa-asterisk') ->addAttribute( pht('Control who can create new named services and devices.'))); $docs_uri = PhabricatorEnv::getDoclink( 'Almanac User Guide'); $menu->addItem( id(new PHUIObjectItemView()) ->setHeader(pht('Documentation')) ->setHref($docs_uri) ->setIcon('fa-book') ->addAttribute(pht('Browse documentation for Almanac.'))); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Console')); + $crumbs->setBorder(true); $box = id(new PHUIObjectBoxView()) - ->setHeaderText(pht('Console')) ->setObjectList($menu); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Almanac Console')) + ->setHeaderIcon('fa-server'); + + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter(array( + $box, + )); + return $this->newPage() ->setTitle(pht('Almanac Console')) ->setCrumbs($crumbs) - ->appendChild( - array( - $box, - )); + ->appendChild($view); } } diff --git a/src/applications/almanac/controller/AlmanacInterfaceEditController.php b/src/applications/almanac/controller/AlmanacInterfaceEditController.php index 6d750bfbf5..d223360003 100644 --- a/src/applications/almanac/controller/AlmanacInterfaceEditController.php +++ b/src/applications/almanac/controller/AlmanacInterfaceEditController.php @@ -1,154 +1,166 @@ getViewer(); $id = $request->getURIData('id'); if ($id) { $interface = id(new AlmanacInterfaceQuery()) ->setViewer($viewer) ->withIDs(array($id)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$interface) { return new Aphront404Response(); } $device = $interface->getDevice(); $is_new = false; $title = pht('Edit Interface'); $save_button = pht('Save Changes'); } else { $device = id(new AlmanacDeviceQuery()) ->setViewer($viewer) ->withIDs(array($request->getStr('deviceID'))) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$device) { return new Aphront404Response(); } $interface = AlmanacInterface::initializeNewInterface(); $is_new = true; $title = pht('Create Interface'); $save_button = pht('Create Interface'); } $device_uri = $device->getURI(); $cancel_uri = $device_uri; $v_network = $interface->getNetworkPHID(); $v_address = $interface->getAddress(); $e_address = true; $v_port = $interface->getPort(); $validation_exception = null; if ($request->isFormPost()) { $v_network = $request->getStr('networkPHID'); $v_address = $request->getStr('address'); $v_port = $request->getStr('port'); $type_interface = AlmanacDeviceTransaction::TYPE_INTERFACE; $address = AlmanacAddress::newFromParts($v_network, $v_address, $v_port); $xaction = id(new AlmanacDeviceTransaction()) ->setTransactionType($type_interface) ->setNewValue($address->toDictionary()); if ($interface->getID()) { $xaction->setOldValue(array( 'id' => $interface->getID(), ) + $interface->toAddress()->toDictionary()); } else { $xaction->setOldValue(array()); } $xactions = array(); $xactions[] = $xaction; $editor = id(new AlmanacDeviceEditor()) ->setActor($viewer) ->setContentSourceFromRequest($request) ->setContinueOnNoEffect(true) ->setContinueOnMissingFields(true); try { $editor->applyTransactions($device, $xactions); $device_uri = $device->getURI(); return id(new AphrontRedirectResponse())->setURI($device_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_address = $ex->getShortMessage($type_interface); } } $networks = id(new AlmanacNetworkQuery()) ->setViewer($viewer) ->execute(); $form = id(new AphrontFormView()) ->setUser($viewer) ->appendChild( id(new AphrontFormSelectControl()) ->setLabel(pht('Network')) ->setName('networkPHID') ->setValue($v_network) ->setOptions(mpull($networks, 'getName', 'getPHID'))) ->appendChild( id(new AphrontFormTextControl()) ->setLabel(pht('Address')) ->setName('address') ->setValue($v_address) ->setError($e_address)) ->appendChild( id(new AphrontFormTextControl()) ->setLabel(pht('Port')) ->setName('port') ->setValue($v_port) ->setError($e_address)) ->appendChild( id(new AphrontFormSubmitControl()) ->addCancelButton($cancel_uri) ->setValue($save_button)); $box = id(new PHUIObjectBoxView()) ->setValidationException($validation_exception) - ->setHeaderText($title) + ->setHeaderText(pht('Interface')) + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setForm($form); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb($device->getName(), $device_uri); if ($is_new) { $crumbs->addTextCrumb(pht('Create Interface')); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Create Interface')) + ->setHeaderIcon('fa-plus-square'); } else { $crumbs->addTextCrumb(pht('Edit Interface')); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Edit Interface')) + ->setHeaderIcon('fa-pencil'); } + $crumbs->setBorder(true); + + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter(array( + $box, + )); return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) - ->appendChild( - array( - $box, - )); + ->appendChild($view); + } } diff --git a/src/applications/almanac/controller/AlmanacServiceEditController.php b/src/applications/almanac/controller/AlmanacServiceEditController.php index b09deaa95d..710e27a966 100644 --- a/src/applications/almanac/controller/AlmanacServiceEditController.php +++ b/src/applications/almanac/controller/AlmanacServiceEditController.php @@ -1,100 +1,112 @@ setController($this); $id = $request->getURIData('id'); if (!$id) { $this->requireApplicationCapability( AlmanacCreateServicesCapability::CAPABILITY); $list_uri = $this->getApplicationURI('service/'); $service_type = $request->getStr('serviceType'); $service_types = AlmanacServiceType::getAllServiceTypes(); if (empty($service_types[$service_type])) { return $this->buildServiceTypeResponse($list_uri); } $engine ->addContextParameter('serviceType', $service_type) ->setServiceType($service_type); } return $engine->buildResponse(); } private function buildServiceTypeResponse($cancel_uri) { $service_types = AlmanacServiceType::getAllServiceTypes(); $request = $this->getRequest(); $viewer = $this->getViewer(); $e_service = null; $errors = array(); if ($request->isFormPost()) { $e_service = pht('Required'); $errors[] = pht( 'To create a new service, you must select a service type.'); } list($can_cluster, $cluster_link) = $this->explainApplicationCapability( AlmanacManageClusterServicesCapability::CAPABILITY, pht('You have permission to create cluster services.'), pht('You do not have permission to create new cluster services.')); $type_control = id(new AphrontFormRadioButtonControl()) ->setLabel(pht('Service Type')) ->setName('serviceType') ->setError($e_service); foreach ($service_types as $service_type) { $is_cluster = $service_type->isClusterServiceType(); $is_disabled = ($is_cluster && !$can_cluster); if ($is_cluster) { $extra = $cluster_link; } else { $extra = null; } $type_control->addButton( $service_type->getServiceTypeConstant(), $service_type->getServiceTypeName(), array( $service_type->getServiceTypeDescription(), $extra, ), $is_disabled ? 'disabled' : null, $is_disabled); } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Create Service')); + $crumbs->setBorder(true); $title = pht('Choose Service Type'); + $header = id(new PHUIHeaderView()) + ->setHeader(pht('Create Service')) + ->setHeaderIcon('fa-plus-square'); $form = id(new AphrontFormView()) ->setUser($viewer) ->appendChild($type_control) ->appendChild( id(new AphrontFormSubmitControl()) ->setValue(pht('Continue')) ->addCancelButton($cancel_uri)); $box = id(new PHUIObjectBoxView()) ->setFormErrors($errors) - ->setHeaderText($title) + ->setHeaderText(pht('Service')) + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setForm($form); + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter(array( + $box, + )); + return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) - ->appendChild($box); + ->appendChild($view); + } }