public function handleRequest(AphrontRequest $request) { $user = $request->getUser(); $query = id(new PhabricatorProjectQuery())->setViewer($user)->needMembers(true)->needWatchers(true)->needImages(true)->needSlugs(true); $id = $request->getURIData('id'); $slug = $request->getURIData('slug'); if ($slug) { $query->withSlugs(array($slug)); } else { $query->withIDs(array($id)); } $project = $query->executeOne(); if (!$project) { return new Aphront404Response(); } if ($slug && $slug != $project->getPrimarySlug()) { return id(new AphrontRedirectResponse())->setURI('/tag/' . $project->getPrimarySlug() . '/'); } $query = new PhabricatorFeedQuery(); $query->setFilterPHIDs(array($project->getPHID())); $query->setLimit(50); $query->setViewer($request->getUser()); $stories = $query->execute(); $feed = $this->renderStories($stories); $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Project Activity'))->appendChild($feed); $nav = $this->buildIconNavView($project); $nav->selectFilter("feed/{$id}/"); $nav->appendChild($box); return $this->buildApplicationPage($nav, array('title' => $project->getName())); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $querykey = $request->getURIData('queryKey'); $merchant_id = $request->getURIData('merchantID'); $account_id = $request->getURIData('accountID'); $engine = new PhortuneSubscriptionSearchEngine(); if ($merchant_id) { $merchant = id(new PhortuneMerchantQuery())->setViewer($viewer)->withIDs(array($merchant_id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$merchant) { return new Aphront404Response(); } $this->merchant = $merchant; $viewer->grantAuthority($merchant); $engine->setMerchant($merchant); } else { if ($account_id) { $account = id(new PhortuneAccountQuery())->setViewer($viewer)->withIDs(array($account_id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$account) { return new Aphront404Response(); } $this->account = $account; $engine->setAccount($account); } else { return new Aphront404Response(); } } $controller = id(new PhabricatorApplicationSearchController())->setQueryKey($querykey)->setSearchEngine($engine)->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getUser(); $space = id(new PhabricatorSpacesNamespaceQuery())->setViewer($viewer)->withIDs(array($request->getURIData('id')))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$space) { return new Aphront404Response(); } $is_archive = $request->getURIData('action') == 'archive'; $cancel_uri = '/' . $space->getMonogram(); if ($request->isFormPost()) { $type_archive = PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE; $xactions = array(); $xactions[] = id(new PhabricatorSpacesNamespaceTransaction())->setTransactionType($type_archive)->setNewValue($is_archive ? 1 : 0); $editor = id(new PhabricatorSpacesNamespaceEditor())->setActor($viewer)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->setContentSourceFromRequest($request); $editor->applyTransactions($space, $xactions); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } $body = array(); if ($is_archive) { $title = pht('Archive Space: %s', $space->getNamespaceName()); $body[] = pht('If you archive this Space, you will no longer be able to create ' . 'new objects inside it.'); $body[] = pht('Existing objects in this Space will be hidden from query results ' . 'by default.'); $button = pht('Archive Space'); } else { $title = pht('Activate Space: %s', $space->getNamespaceName()); $body[] = pht('If you activate this space, you will be able to create objects ' . 'inside it again.'); $body[] = pht('Existing objects will no longer be hidden from query results.'); $button = pht('Activate Space'); } $dialog = $this->newDialog()->setTitle($title)->addCancelButton($cancel_uri)->addSubmitButton($button); foreach ($body as $paragraph) { $dialog->appendParagraph($paragraph); } return $dialog; }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $id = $request->getURIData('id'); $event = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->withIDs(array($id))->executeOne(); if (!$event) { return new Aphront404Response(); } $response = $this->newImportedEventResponse($event); if ($response) { return $response; } $cancel_uri = $event->getURI(); if (!$event->getIsUserAttending($viewer->getPHID())) { return $this->newDialog()->setTitle(pht('Not Attending Event'))->appendParagraph(pht('You can not change your display availability for events you ' . 'are not attending.'))->addCancelButton($cancel_uri); } // TODO: This endpoint currently only works via AJAX. It would be vaguely // nice to provide a plain HTML version of the workflow where we return // a dialog with a vanilla <select /> in it for cases where all the JS // breaks. $request->validateCSRF(); $invitee = $event->getInviteeForPHID($viewer->getPHID()); $map = PhabricatorCalendarEventInvitee::getAvailabilityMap(); $new_availability = $request->getURIData('availability'); if (isset($map[$new_availability])) { $invitee->setAvailability($new_availability)->save(); // Invalidate the availability cache. $viewer->writeAvailabilityCache(array(), null); } return id(new AphrontRedirectResponse())->setURI($cancel_uri); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $status = $request->getURIData('status'); $question = id(new PonderQuestionQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$question) { return new Aphront404Response(); } switch ($status) { case 'open': $status = PonderQuestionStatus::STATUS_OPEN; break; case 'close': $status = PonderQuestionStatus::STATUS_CLOSED; break; default: return new Aphront400Response(); } $xactions = array(); $xactions[] = id(new PonderQuestionTransaction())->setTransactionType(PonderQuestionTransaction::TYPE_STATUS)->setNewValue($status); $editor = id(new PonderQuestionEditor())->setActor($viewer)->setContentSourceFromRequest($request); $editor->applyTransactions($question, $xactions); return id(new AphrontRedirectResponse())->setURI('/Q' . $question->getID()); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $phid = $request->getURIData('phid'); $capability = $request->getURIData('capability'); $object = id(new PhabricatorObjectQuery())->setViewer($viewer)->withPHIDs(array($phid))->executeOne(); if (!$object) { return new Aphront404Response(); } $policies = PhabricatorPolicyQuery::loadPolicies($viewer, $object); $policy = idx($policies, $capability); if (!$policy) { return new Aphront404Response(); } $handle = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs(array($phid))->executeOne(); $object_name = $handle->getName(); $object_uri = nonempty($handle->getURI(), '/'); $dialog = id(new AphrontDialogView())->setUser($viewer)->setClass('aphront-access-dialog aphront-policy-explain-dialog')->setTitle(pht('Policy Details: %s', $object_name))->addCancelButton($object_uri, pht('Done')); $space_section = $this->buildSpaceSection($object, $policy, $capability); $extended_section = $this->buildExtendedSection($object, $capability); $exceptions_section = $this->buildExceptionsSection($object, $capability); $object_section = $this->buildObjectSection($object, $policy, $capability, $handle); $dialog->appendChild(array($space_section, $extended_section, $exceptions_section, $object_section)); return $dialog; }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $blueprint = id(new DrydockBlueprintQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$blueprint) { return new Aphront404Response(); } $is_disable = $request->getURIData('action') == 'disable'; $id = $blueprint->getID(); $cancel_uri = $this->getApplicationURI("blueprint/{$id}/"); if ($request->isFormPost()) { $xactions = array(); $xactions[] = id(new DrydockBlueprintTransaction())->setTransactionType(DrydockBlueprintTransaction::TYPE_DISABLED)->setNewValue($is_disable ? 1 : 0); $editor = id(new DrydockBlueprintEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->applyTransactions($blueprint, $xactions); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } if ($is_disable) { $title = pht('Disable Blueprint'); $body = pht('If you disable this blueprint, Drydock will no longer use it to ' . 'allocate new resources. Existing resources will not be affected.'); $button = pht('Disable Blueprint'); } else { $title = pht('Enable Blueprint'); $body = pht('If you enable this blueprint, Drydock will start using it to ' . 'allocate new resources.'); $button = pht('Enable Blueprint'); } return $this->newDialog()->setTitle($title)->appendParagraph($body)->addCancelButton($cancel_uri)->addSubmitButton($button); }
public function handleRequest(AphrontRequest $request) { $engine_key = $request->getURIData('engineKey'); $this->setEngineKey($engine_key); $key = $request->getURIData('key'); $viewer = $this->getViewer(); $config = id(new PhabricatorEditEngineConfigurationQuery())->setViewer($viewer)->withEngineKeys(array($engine_key))->withIdentifiers(array($key))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$config) { return id(new Aphront404Response()); } $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; if ($request->isFormPost()) { $xactions = array(); $locks = $request->getArr('locks'); $type_locks = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS; $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())->setTransactionType($type_locks)->setNewValue($locks); $editor = id(new PhabricatorEditEngineConfigurationEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true); $editor->applyTransactions($config, $xactions); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } $engine = $config->getEngine(); $fields = $engine->getFieldsForConfig($config); $help = pht(<<<EOTEXT **Locked** fields are visible in the form, but their values can not be changed by the user. **Hidden** fields are not visible in the form. Any assigned default values are still respected, even if the field is locked or hidden. EOTEXT ); $form = id(new AphrontFormView())->setUser($viewer)->appendRemarkupInstructions($help); $locks = $config->getFieldLocks(); $lock_visible = PhabricatorEditEngineConfiguration::LOCK_VISIBLE; $lock_locked = PhabricatorEditEngineConfiguration::LOCK_LOCKED; $lock_hidden = PhabricatorEditEngineConfiguration::LOCK_HIDDEN; $map = array($lock_visible => pht('Visible'), $lock_locked => pht("🔒 Locked"), $lock_hidden => pht("✘ Hidden")); foreach ($fields as $field) { if (!$field->getIsLockable()) { continue; } $key = $field->getKey(); $label = $field->getLabel(); if (!strlen($label)) { $label = $key; } if ($field->getIsHidden()) { $value = $lock_hidden; } else { if ($field->getIsLocked()) { $value = $lock_locked; } else { $value = $lock_visible; } } $form->appendControl(id(new AphrontFormSelectControl())->setName('locks[' . $key . ']')->setLabel($label)->setValue($value)->setOptions($map)); } return $this->newDialog()->setTitle(pht('Lock / Hide Fields'))->setWidth(AphrontDialogView::WIDTH_FORM)->appendForm($form)->addSubmitButton(pht('Save Changes'))->addCancelButton($cancel_uri); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $dblob = $request->getURIData('dblob'); $fragment = id(new PhragmentFragmentQuery())->setViewer($viewer)->withPaths(array($dblob))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if ($fragment === null) { return new Aphront404Response(); } $version = id(new PhragmentFragmentVersionQuery())->setViewer($viewer)->withFragmentPHIDs(array($fragment->getPHID()))->withIDs(array($id))->executeOne(); if ($version === null) { return new Aphront404Response(); } if ($request->isDialogFormPost()) { $file_phid = $version->getFilePHID(); $file = null; if ($file_phid !== null) { $file = id(new PhabricatorFileQuery())->setViewer($viewer)->withPHIDs(array($file_phid))->executeOne(); if ($file === null) { throw new Exception(pht('The file associated with this version was not found.')); } } if ($file === null) { $fragment->deleteFile($viewer); } else { $fragment->updateFromFile($viewer, $file); } return id(new AphrontRedirectResponse())->setURI($this->getApplicationURI('/history/' . $dblob)); } return $this->createDialog($fragment, $version); }
public function handleRequest(AphrontRequest $request) { $user = $request->getUser(); $query = id(new PhabricatorProjectQuery())->setViewer($user)->needMembers(true)->needWatchers(true)->needImages(true)->needSlugs(true); $id = $request->getURIData('id'); $slug = $request->getURIData('slug'); if ($slug) { $query->withSlugs(array($slug)); } else { $query->withIDs(array($id)); } $project = $query->executeOne(); if (!$project) { return new Aphront404Response(); } if ($slug && $slug != $project->getPrimarySlug()) { return id(new AphrontRedirectResponse())->setURI('/tag/' . $project->getPrimarySlug() . '/'); } require_celerity_resource('phabricator-profile-css'); $query = new PhabricatorFeedQuery(); $query->setFilterPHIDs(array($project->getPHID())); $query->setLimit(50); $query->setViewer($request->getUser()); $stories = $query->execute(); $feed = $this->renderStories($stories); $content = phutil_tag_div('phabricator-project-feed', $feed); $nav = $this->buildIconNavView($project); $nav->selectFilter("feed/{$id}/"); $nav->appendChild($content); return $this->buildApplicationPage($nav, array('title' => $project->getName())); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $this->database = $request->getURIData('database'); $this->table = $request->getURIData('table'); $this->column = $request->getURIData('column'); $this->key = $request->getURIData('key'); $query = $this->buildSchemaQuery(); $actual = $query->loadActualSchema(); $expect = $query->loadExpectedSchema(); $comp = $query->buildComparisonSchema($expect, $actual); if ($this->column) { return $this->renderColumn($comp, $expect, $actual, $this->database, $this->table, $this->column); } else { if ($this->key) { return $this->renderKey($comp, $expect, $actual, $this->database, $this->table, $this->key); } else { if ($this->table) { return $this->renderTable($comp, $expect, $actual, $this->database, $this->table); } else { if ($this->database) { return $this->renderDatabase($comp, $expect, $actual, $this->database); } else { return $this->renderServer($comp, $expect, $actual); } } } } }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $id = $request->getURIData('id'); $key = $request->getURIData('key'); if ($id) { $user = id(new PhabricatorPeopleQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$user) { return new Aphront404Response(); } $this->user = $user; } else { $this->user = $viewer; } $panels = $this->buildPanels(); $nav = $this->renderSideNav($panels); $key = $nav->selectFilter($key, head($panels)->getPanelKey()); $panel = $panels[$key]; $panel->setUser($this->getUser()); $panel->setViewer($viewer); $response = $panel->processRequest($request); if ($response instanceof AphrontResponse) { return $response; } $crumbs = $this->buildApplicationCrumbs(); if (!$this->isSelf()) { $crumbs->addTextCrumb($this->getUser()->getUsername(), '/p/' . $this->getUser()->getUsername() . '/'); } $crumbs->addTextCrumb($panel->getPanelName()); $nav->appendChild(array($crumbs, $response)); return $this->buildApplicationPage($nav, array('title' => $panel->getPanelName())); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $project_id = $request->getURIData('projectID'); $project = id(new PhabricatorProjectQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW))->withIDs(array($project_id))->needImages(true)->executeOne(); if (!$project) { return new Aphront404Response(); } $this->setProject($project); $column = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW))->executeOne(); if (!$column) { return new Aphront404Response(); } $timeline = $this->buildTransactionTimeline($column, new PhabricatorProjectColumnTransactionQuery()); $timeline->setShouldTerminate(true); $title = pht('%s', $column->getDisplayName()); $header = $this->buildHeaderView($column); $actions = $this->buildActionView($column); $properties = $this->buildPropertyView($column, $actions); $box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties); $nav = $this->buildIconNavView($project); $nav->appendChild($box); $nav->appendChild($timeline); return $this->buildApplicationPage($nav, array('title' => $title)); }
public function handleRequest(AphrontRequest $request) { $engine_key = $request->getURIData('engineKey'); $this->setEngineKey($engine_key); $key = $request->getURIData('key'); $viewer = $this->getViewer(); $config = id(new PhabricatorEditEngineConfigurationQuery())->setViewer($viewer)->withEngineKeys(array($engine_key))->withIdentifiers(array($key))->executeOne(); if (!$config) { return id(new Aphront404Response()); } $is_concrete = (bool) $config->getID(); $actions = $this->buildActionView($config); $properties = $this->buildPropertyView($config)->setActionList($actions); $header = id(new PHUIHeaderView())->setUser($viewer)->setPolicyObject($config)->setHeader(pht('Edit Form: %s', $config->getDisplayName())); $box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties); $crumbs = $this->buildApplicationCrumbs(); if ($is_concrete) { $crumbs->addTextCrumb(pht('Form %d', $config->getID())); } else { $crumbs->addTextCrumb(pht('Builtin')); } if ($is_concrete) { $timeline = $this->buildTransactionTimeline($config, new PhabricatorEditEngineConfigurationTransactionQuery()); $timeline->setShouldTerminate(true); } else { $timeline = null; } return $this->newPage()->setCrumbs($crumbs)->appendChild(array($box, $timeline)); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $post = id(new PhamePostQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$post) { return new Aphront404Response(); } $cancel_uri = $post->getViewURI(); $action = $request->getURIData('action'); $is_publish = $action == 'publish'; if ($request->isFormPost()) { $xactions = array(); if ($is_publish) { $new_value = PhameConstants::VISIBILITY_PUBLISHED; } else { $new_value = PhameConstants::VISIBILITY_DRAFT; } $xactions[] = id(new PhamePostTransaction())->setTransactionType(PhamePostTransaction::TYPE_VISIBILITY)->setNewValue($new_value); id(new PhamePostEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->applyTransactions($post, $xactions); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } if ($is_publish) { $title = pht('Publish Post'); $body = pht('This post will go live once you publish it.'); $button = pht('Publish'); } else { $title = pht('Unpublish Post'); $body = pht('This post will revert to draft status and no longer be visible ' . 'to other users.'); $button = pht('Unpublish'); } return $this->newDialog()->setTitle($title)->appendParagraph($body)->addSubmitButton($button)->addCancelButton($cancel_uri); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $action = $request->getURIData('action'); $rule = id(new HeraldRuleQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$rule) { return new Aphront404Response(); } if ($rule->isGlobalRule()) { $this->requireApplicationCapability(HeraldManageGlobalRulesCapability::CAPABILITY); } $view_uri = $this->getApplicationURI("rule/{$id}/"); $is_disable = $action === 'disable'; if ($request->isFormPost()) { $xaction = id(new HeraldRuleTransaction())->setTransactionType(HeraldRuleTransaction::TYPE_DISABLE)->setNewValue($is_disable); id(new HeraldRuleEditor())->setActor($viewer)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request)->applyTransactions($rule, array($xaction)); return id(new AphrontRedirectResponse())->setURI($view_uri); } if ($is_disable) { $title = pht('Really archive this rule?'); $body = pht('This rule will no longer activate.'); $button = pht('Archive Rule'); } else { $title = pht('Really activate this rule?'); $body = pht('This rule will become active again.'); $button = pht('Activate Rule'); } $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle($title)->appendChild($body)->addSubmitButton($button)->addCancelButton($view_uri); return id(new AphrontDialogResponse())->setDialog($dialog); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $project_id = $request->getURIData('projectID'); $project = id(new PhabricatorProjectQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW))->withIDs(array($project_id))->needImages(true)->executeOne(); if (!$project) { return new Aphront404Response(); } $this->setProject($project); $project_id = $project->getID(); $column = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW))->executeOne(); if (!$column) { return new Aphront404Response(); } $timeline = $this->buildTransactionTimeline($column, new PhabricatorProjectColumnTransactionQuery()); $timeline->setShouldTerminate(true); $title = $column->getDisplayName(); $header = $this->buildHeaderView($column); $actions = $this->buildActionView($column); $properties = $this->buildPropertyView($column, $actions); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Workboard'), "/project/board/{$project_id}/"); $crumbs->addTextCrumb(pht('Column: %s', $title)); $box = id(new PHUIObjectBoxView())->setHeader($header)->addPropertyList($properties); $nav = $this->getProfileMenu(); return $this->newPage()->setTitle($title)->setNavigation($nav)->setCrumbs($crumbs)->appendChild(array($box, $timeline)); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $issue = $request->getURIData('key'); $verb = $request->getURIData('verb'); $issue_uri = $this->getApplicationURI('issue/' . $issue . '/'); if ($request->isDialogFormPost()) { $this->manageApplication($issue); return id(new AphrontRedirectResponse())->setURI($issue_uri); } if ($verb == 'ignore') { $title = pht('Really ignore this setup issue?'); $submit_title = pht('Ignore'); $body = pht("You can ignore an issue if you don't want to fix it, or plan to " . "fix it later. Ignored issues won't appear on every page but will " . "still be shown in the list of open issues."); } else { if ($verb == 'unignore') { $title = pht('Unignore this setup issue?'); $submit_title = pht('Unignore'); $body = pht('This issue will no longer be suppressed, and will return to its ' . 'rightful place as a global setup warning.'); } else { throw new Exception(pht('Unrecognized verb: %s', $verb)); } } $dialog = id(new AphrontDialogView())->setUser($request->getUser())->setTitle($title)->appendChild($body)->addSubmitButton($submit_title)->addCancelButton($issue_uri); return id(new AphrontDialogResponse())->setDialog($dialog); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $phid = $request->getURIData('phid'); $action = $request->getURIData('action'); if (!$request->isFormPost()) { return new Aphront400Response(); } switch ($action) { case 'add': $is_add = true; break; case 'delete': $is_add = false; break; default: return new Aphront400Response(); } $handle = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs(array($phid))->executeOne(); if (phid_get_type($phid) == PhabricatorProjectProjectPHIDType::TYPECONST) { // TODO: This is a big hack, but a weak argument for adding some kind // of "load for role" feature to ObjectQuery, and also not a really great // argument for adding some kind of "load extra stuff" feature to // SubscriberInterface. Do this for now and wait for the best way forward // to become more clear? $object = id(new PhabricatorProjectQuery())->setViewer($viewer)->withPHIDs(array($phid))->needWatchers(true)->executeOne(); } else { $object = id(new PhabricatorObjectQuery())->setViewer($viewer)->withPHIDs(array($phid))->executeOne(); } if (!$object instanceof PhabricatorSubscribableInterface) { return $this->buildErrorResponse(pht('Bad Object'), pht('This object is not subscribable.'), $handle->getURI()); } if ($object->isAutomaticallySubscribed($viewer->getPHID())) { return $this->buildErrorResponse(pht('Automatically Subscribed'), pht('You are automatically subscribed to this object.'), $handle->getURI()); } if ($object instanceof PhabricatorApplicationTransactionInterface) { if ($is_add) { $xaction_value = array('+' => array($viewer->getPHID())); } else { $xaction_value = array('-' => array($viewer->getPHID())); } $xaction = id($object->getApplicationTransactionTemplate())->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS)->setNewValue($xaction_value); $editor = id($object->getApplicationTransactionEditor())->setActor($viewer)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->setContentSourceFromRequest($request); $editor->applyTransactions($object->getApplicationTransactionObject(), array($xaction)); } else { // TODO: Eventually, get rid of this once everything implements // PhabriatorApplicationTransactionInterface. $editor = id(new PhabricatorSubscriptionsEditor())->setActor($viewer)->setObject($object); if ($is_add) { $editor->subscribeExplicit(array($viewer->getPHID()), $explicit = true); } else { $editor->unsubscribe(array($viewer->getPHID())); } $editor->save(); } // TODO: We should just render the "Unsubscribe" action and swap it out // in the document for Ajax requests. return id(new AphrontReloadResponse())->setURI($handle->getURI()); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $sequence = $request->getURIData('sequence'); $timeline = null; $event = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->withIDs(array($id))->executeOne(); if (!$event) { return new Aphront404Response(); } if ($sequence) { $result = $this->getEventAtIndexForGhostPHID($viewer, $event->getPHID(), $sequence); if ($result) { $parent_event = $event; $event = $result; $event->attachParentEvent($parent_event); return id(new AphrontRedirectResponse())->setURI('/E' . $result->getID()); } else { if ($sequence && $event->getIsRecurring()) { $parent_event = $event; $event = $event->generateNthGhost($sequence, $viewer); $event->attachParentEvent($parent_event); } else { if ($sequence) { return new Aphront404Response(); } } } $title = $event->getMonogram() . ' (' . $sequence . ')'; $page_title = $title . ' ' . $event->getName(); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb($title, '/' . $event->getMonogram() . '/' . $sequence); } else { $title = 'E' . $event->getID(); $page_title = $title . ' ' . $event->getName(); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb($title); $crumbs->setBorder(true); } if (!$event->getIsGhostEvent()) { $timeline = $this->buildTransactionTimeline($event, new PhabricatorCalendarEventTransactionQuery()); } $header = $this->buildHeaderView($event); $actions = $this->buildActionView($event); $properties = $this->buildPropertyListView($event); $details = $this->buildPropertySection($event); $description = $this->buildDescriptionView($event); $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); $add_comment_header = $is_serious ? pht('Add Comment') : pht('Add To Plate'); $draft = PhabricatorDraft::newFromUserAndKey($viewer, $event->getPHID()); if ($sequence) { $comment_uri = $this->getApplicationURI('/event/comment/' . $event->getID() . '/' . $sequence . '/'); } else { $comment_uri = $this->getApplicationURI('/event/comment/' . $event->getID() . '/'); } $add_comment_form = id(new PhabricatorApplicationTransactionCommentView())->setUser($viewer)->setObjectPHID($event->getPHID())->setDraft($draft)->setHeaderText($add_comment_header)->setAction($comment_uri)->setSubmitButtonName(pht('Add Comment')); $view = id(new PHUITwoColumnView())->setHeader($header)->setMainColumn($timeline)->setPropertyList($properties)->addPropertySection(pht('DETAILS'), $details)->addPropertySection(pht('DESCRIPTION'), $description)->setActionList($actions); return $this->newPage()->setTitle($page_title)->setCrumbs($crumbs)->setPageObjectPHIDs(array($event->getPHID()))->appendChild(array($view)); }
public function handleRequest(AphrontRequest $request) { $action = $request->getURIData('action'); $id = $request->getURIData('requestID'); $viewer = $request->getViewer(); $request->validateCSRF(); $pull = id(new ReleephRequestQuery())->setViewer($viewer)->withIDs(array($id))->executeOne(); if (!$pull) { return new Aphront404Response(); } $branch = $pull->getBranch(); $product = $branch->getProduct(); $origin_uri = '/' . $pull->getMonogram(); $editor = id(new ReleephRequestTransactionalEditor())->setActor($viewer)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request); $xactions = array(); switch ($action) { case 'want': case 'pass': static $action_map = array('want' => ReleephRequest::INTENT_WANT, 'pass' => ReleephRequest::INTENT_PASS); $intent = $action_map[$action]; $xactions[] = id(new ReleephRequestTransaction())->setTransactionType(ReleephRequestTransaction::TYPE_USER_INTENT)->setMetadataValue('isAuthoritative', $product->isAuthoritative($viewer))->setNewValue($intent); break; case 'mark-manually-picked': case 'mark-manually-reverted': if ($pull->getRequestUserPHID() === $viewer->getPHID() || $product->isAuthoritative($viewer)) { // We're all good! } else { throw new Exception(pht("Bug! Only pushers or the requestor can manually change a " . "request's in-branch status!")); } if ($action === 'mark-manually-picked') { $in_branch = 1; $intent = ReleephRequest::INTENT_WANT; } else { $in_branch = 0; $intent = ReleephRequest::INTENT_PASS; } $xactions[] = id(new ReleephRequestTransaction())->setTransactionType(ReleephRequestTransaction::TYPE_USER_INTENT)->setMetadataValue('isManual', true)->setMetadataValue('isAuthoritative', true)->setNewValue($intent); $xactions[] = id(new ReleephRequestTransaction())->setTransactionType(ReleephRequestTransaction::TYPE_MANUAL_IN_BRANCH)->setNewValue($in_branch); break; default: throw new Exception(pht('Unknown or unimplemented action %s.', $action)); } $editor->applyTransactions($pull, $xactions); if ($request->getBool('render')) { $field_list = PhabricatorCustomField::getObjectFields($pull, PhabricatorCustomField::ROLE_VIEW); $field_list->setViewer($viewer)->readFieldsFromStorage($pull); // TODO: This should be more modern and general. $engine = id(new PhabricatorMarkupEngine())->setViewer($viewer); foreach ($field_list->getFields() as $field) { if ($field->shouldMarkup()) { $field->setMarkupEngine($engine); } } $engine->process(); $pull_box = id(new ReleephRequestView())->setUser($viewer)->setCustomFields($field_list)->setPullRequest($pull)->setIsListView(true); return id(new AphrontAjaxResponse())->setContent(array('markup' => hsprintf('%s', $pull_box))); } return id(new AphrontRedirectResponse())->setURI($origin_uri); }
public function handleRequest(AphrontRequest $request) { $user = $request->getUser(); $phid = $request->getURIData('phid'); $attach_type = $request->getURIData('type'); $action = $request->getURIData('action', self::ACTION_ATTACH); $handle = id(new PhabricatorHandleQuery())->setViewer($user)->withPHIDs(array($phid))->executeOne(); $object_type = $handle->getType(); $object = id(new PhabricatorObjectQuery())->setViewer($user)->withPHIDs(array($phid))->executeOne(); if (!$object) { return new Aphront404Response(); } $edge_type = null; switch ($action) { case self::ACTION_EDGE: case self::ACTION_DEPENDENCIES: case self::ACTION_BLOCKS: case self::ACTION_ATTACH: $edge_type = $this->getEdgeType($object_type, $attach_type); break; } if ($request->isFormPost()) { $phids = explode(';', $request->getStr('phids')); $phids = array_filter($phids); $phids = array_values($phids); if ($edge_type) { if (!$object instanceof PhabricatorApplicationTransactionInterface) { throw new Exception(pht('Expected object ("%s") to implement interface "%s".', get_class($object), 'PhabricatorApplicationTransactionInterface')); } $old_phids = PhabricatorEdgeQuery::loadDestinationPHIDs($phid, $edge_type); $add_phids = $phids; $rem_phids = array_diff($old_phids, $add_phids); $txn_editor = $object->getApplicationTransactionEditor()->setActor($user)->setContentSourceFromRequest($request)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true); $txn_template = $object->getApplicationTransactionTemplate()->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $edge_type)->setNewValue(array('+' => array_fuse($add_phids), '-' => array_fuse($rem_phids))); try { $txn_editor->applyTransactions($object->getApplicationTransactionObject(), array($txn_template)); } catch (PhabricatorEdgeCycleException $ex) { $this->raiseGraphCycleException($ex); } return id(new AphrontReloadResponse())->setURI($handle->getURI()); } else { return $this->performMerge($object, $handle, $phids); } } else { if ($edge_type) { $phids = PhabricatorEdgeQuery::loadDestinationPHIDs($phid, $edge_type); } else { // This is a merge. $phids = array(); } } $strings = $this->getStrings($attach_type, $action); $handles = $this->loadViewerHandles($phids); $obj_dialog = new PhabricatorObjectSelectorDialog(); $obj_dialog->setUser($user)->setHandles($handles)->setFilters($this->getFilters($strings, $attach_type))->setSelectedFilter($strings['selected'])->setExcluded($phid)->setCancelURI($handle->getURI())->setSearchURI('/search/select/' . $attach_type . '/' . $action . '/')->setTitle($strings['title'])->setHeader($strings['header'])->setButtonText($strings['button'])->setInstructions($strings['instructions']); $dialog = $obj_dialog->buildDialog(); return id(new AphrontDialogResponse())->setDialog($dialog); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $aid = $request->getURIData('aid'); $bid = $request->getURIData('bid'); // If "aid" is "x", then it means the user wants to generate // a patch of an empty file to the version specified by "bid". $ids = array($aid, $bid); if ($aid === 'x') { $ids = array($bid); } $versions = id(new PhragmentFragmentVersionQuery())->setViewer($viewer)->withIDs($ids)->execute(); $version_a = null; if ($aid !== 'x') { $version_a = idx($versions, $aid, null); if ($version_a === null) { return new Aphront404Response(); } } $version_b = idx($versions, $bid, null); if ($version_b === null) { return new Aphront404Response(); } $file_phids = array(); if ($version_a !== null) { $file_phids[] = $version_a->getFilePHID(); } $file_phids[] = $version_b->getFilePHID(); $files = id(new PhabricatorFileQuery())->setViewer($viewer)->withPHIDs($file_phids)->execute(); $files = mpull($files, null, 'getPHID'); $file_a = null; if ($version_a != null) { $file_a = idx($files, $version_a->getFilePHID(), null); } $file_b = idx($files, $version_b->getFilePHID(), null); $patch = PhragmentPatchUtil::calculatePatch($file_a, $file_b); if ($patch === null) { // There are no differences between the two files, so we output // an empty patch. $patch = ''; } $a_sequence = 'x'; if ($version_a !== null) { $a_sequence = $version_a->getSequence(); } $name = $version_b->getFragment()->getName() . '.' . $a_sequence . '.' . $version_b->getSequence() . '.patch'; $return = $version_b->getURI(); if ($request->getExists('return')) { $return = $request->getStr('return'); } $result = PhabricatorFile::buildFromFileDataOrHash($patch, array('name' => $name, 'mime-type' => 'text/plain', 'ttl' => time() + 60 * 60 * 24)); $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); $result->attachToObject($version_b->getFragmentPHID()); unset($unguarded); return id(new AphrontRedirectResponse())->setURI($result->getDownloadURI($return)); }
public function handleRequest(AphrontRequest $request) { $engine_key = $request->getURIData('engineKey'); $this->setEngineKey($engine_key); $key = $request->getURIData('key'); $viewer = $this->getViewer(); $config = id(new PhabricatorEditEngineConfigurationQuery())->setViewer($viewer)->withEngineKeys(array($engine_key))->withIdentifiers(array($key))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$config) { return id(new Aphront404Response()); } $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; $engine = $config->getEngine(); $fields = $engine->getFieldsForConfig($config); foreach ($fields as $key => $field) { if (!$field->getIsDefaultable()) { unset($fields[$key]); continue; } } foreach ($fields as $field) { $field->setIsEditDefaults(true); } if ($request->isFormPost()) { $xactions = array(); foreach ($fields as $field) { $field->readValueFromSubmit($request); } $type = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT; $xactions = array(); foreach ($fields as $field) { $new_value = $field->getValueForDefaults(); $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())->setTransactionType($type)->setMetadataValue('field.key', $field->getKey())->setNewValue($new_value); } $editor = id(new PhabricatorEditEngineConfigurationEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true); $editor->applyTransactions($config, $xactions); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } $title = pht('Edit Form Defaults'); $form = id(new AphrontFormView())->setUser($viewer); foreach ($fields as $field) { $field->appendToForm($form); } $form->appendControl(id(new AphrontFormSubmitControl())->setValue(pht('Save Defaults'))->addCancelButton($cancel_uri)); $info = id(new PHUIInfoView())->setSeverity(PHUIInfoView::SEVERITY_WARNING)->setErrors(array(pht('You are editing the default values for this form.'))); $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Form'))->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setForm($form); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Form %d', $config->getID()), $cancel_uri); $crumbs->addTextCrumb(pht('Edit Defaults')); $crumbs->setBorder(true); $header = id(new PHUIHeaderView())->setHeader(pht('Edit Form Defaults'))->setHeaderIcon('fa-pencil'); $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter(array($info, $box)); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
protected function getRepositoryIdentifierFromRequest(AphrontRequest $request) { $identifier = $request->getURIData('repositoryCallsign'); if (strlen($identifier)) { return $identifier; } $id = $request->getURIData('repositoryID'); if (strlen($id)) { return (int) $id; } return null; }
public function handleRequest(AphrontRequest $request) { $year = $request->getURIData('year'); $month = $request->getURIData('month'); $day = $request->getURIData('day'); $engine = new PhabricatorCalendarEventSearchEngine(); if ($month && $year) { $engine->setCalendarYearAndMonthAndDay($year, $month, $day); } $controller = id(new PhabricatorApplicationSearchController())->setQueryKey($request->getURIData('queryKey'))->setSearchEngine($engine)->setNavigation($this->buildSideNav()); return $this->delegateToController($controller); }
public function handleRequest(AphrontRequest $request) { $this->id = $request->getURIData('id'); $action = $request->getURIData('action'); $request = $this->getRequest(); $viewer = $request->getViewer(); $declined_status = PhabricatorCalendarEventInvitee::STATUS_DECLINED; $attending_status = PhabricatorCalendarEventInvitee::STATUS_ATTENDING; $event = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->withIDs(array($this->id))->executeOne(); if (!$event) { return new Aphront404Response(); } $cancel_uri = '/E' . $event->getID(); $validation_exception = null; $is_attending = $event->getIsUserAttending($viewer->getPHID()); if ($request->isFormPost()) { $new_status = null; switch ($action) { case self::ACTION_ACCEPT: $new_status = $attending_status; break; case self::ACTION_JOIN: if ($is_attending) { $new_status = $declined_status; } else { $new_status = $attending_status; } break; case self::ACTION_DECLINE: $new_status = $declined_status; break; } $new_status = array($viewer->getPHID() => $new_status); $xaction = id(new PhabricatorCalendarEventTransaction())->setTransactionType(PhabricatorCalendarEventTransaction::TYPE_INVITE)->setNewValue($new_status); $editor = id(new PhabricatorCalendarEventEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true); try { $editor->applyTransactions($event, array($xaction)); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; } } if ($action == self::ACTION_JOIN && !$is_attending || $action == self::ACTION_ACCEPT) { $title = pht('Join Event'); $paragraph = pht('Would you like to join this event?'); $submit = pht('Join'); } else { $title = pht('Decline Event'); $paragraph = pht('Would you like to decline this event?'); $submit = pht('Decline'); } return $this->newDialog()->setTitle($title)->setValidationException($validation_exception)->appendParagraph($paragraph)->addCancelButton($cancel_uri)->addSubmitButton($submit); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $id = $request->getURIData('id'); $event = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->withIDs(array($id))->executeOne(); if (!$event) { return new Aphront404Response(); } $response = $this->newImportedEventResponse($event); if ($response) { return $response; } $cancel_uri = $event->getURI(); $action = $request->getURIData('action'); switch ($action) { case 'accept': $is_join = true; break; case 'decline': $is_join = false; break; default: $is_join = !$event->getIsUserAttending($viewer->getPHID()); break; } $validation_exception = null; if ($request->isFormPost()) { if ($is_join) { $xaction_type = PhabricatorCalendarEventAcceptTransaction::TRANSACTIONTYPE; } else { $xaction_type = PhabricatorCalendarEventDeclineTransaction::TRANSACTIONTYPE; } $xaction = id(new PhabricatorCalendarEventTransaction())->setTransactionType($xaction_type)->setNewValue(true); $editor = id(new PhabricatorCalendarEventEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true); try { $editor->applyTransactions($event, array($xaction)); return id(new AphrontRedirectResponse())->setURI($cancel_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; } } if ($is_join) { $title = pht('Join Event'); $paragraph = pht('Would you like to join this event?'); $submit = pht('Join'); } else { $title = pht('Decline Event'); $paragraph = pht('Would you like to decline this event?'); $submit = pht('Decline'); } return $this->newDialog()->setTitle($title)->setValidationException($validation_exception)->appendParagraph($paragraph)->addCancelButton($cancel_uri)->addSubmitButton($submit); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('branchID'); $querykey = $request->getURIData('queryKey'); $branch = id(new ReleephBranchQuery())->setViewer($viewer)->withIDs(array($id))->executeOne(); if (!$branch) { return new Aphront404Response(); } $this->setBranch($branch); $controller = id(new PhabricatorApplicationSearchController())->setPreface($this->renderPreface())->setQueryKey($querykey)->setSearchEngine($this->getSearchEngine())->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $revision_id = $request->getURIData('id'); $strategy_class = $request->getURIData('strategy'); $revision = id(new DifferentialRevisionQuery())->withIDs(array($revision_id))->setViewer($viewer)->executeOne(); if (!$revision) { return new Aphront404Response(); } if (is_subclass_of($strategy_class, 'DifferentialLandingStrategy')) { $this->pushStrategy = newv($strategy_class, array()); } else { throw new Exception(pht("Strategy type must be a valid class name and must subclass " . "%s. '%s' is not a subclass of %s", 'DifferentialLandingStrategy', $strategy_class, 'DifferentialLandingStrategy')); } if ($request->isDialogFormPost()) { $response = null; $text = ''; try { $response = $this->attemptLand($revision, $request); $title = pht('Success!'); $text = pht('Revision was successfully landed.'); } catch (Exception $ex) { $title = pht('Failed to land revision'); if ($ex instanceof PhutilProxyException) { $text = hsprintf('%s:<br><pre>%s</pre>', $ex->getMessage(), $ex->getPreviousException()->getMessage()); } else { $text = phutil_tag('pre', array(), $ex->getMessage()); } $text = id(new PHUIInfoView())->appendChild($text); } if ($response instanceof AphrontDialogView) { $dialog = $response; } else { $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle($title)->appendChild(phutil_tag('p', array(), $text))->addCancelButton('/D' . $revision_id, pht('Done')); } return id(new AphrontDialogResponse())->setDialog($dialog); } $is_disabled = $this->pushStrategy->isActionDisabled($viewer, $revision, $revision->getRepository()); if ($is_disabled) { if (is_string($is_disabled)) { $explain = $is_disabled; } else { $explain = pht('This action is not currently enabled.'); } $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle(pht("Can't land revision"))->appendChild($explain)->addCancelButton('/D' . $revision_id); return id(new AphrontDialogResponse())->setDialog($dialog); } $prompt = hsprintf('%s<br><br>%s', pht('This will squash and rebase revision %s, and push it to ' . 'the default / master branch.', $revision_id), pht('It is an experimental feature and may not work.')); $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle(pht('Land Revision %s?', $revision_id))->appendChild($prompt)->setSubmitURI($request->getRequestURI())->addSubmitButton(pht('Land it!'))->addCancelButton('/D' . $revision_id); return id(new AphrontDialogResponse())->setDialog($dialog); }