public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); $saved->setParameter('status', $request->getArr('status')); $saved->setParameter('order', $request->getArr('order')); return $saved; }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getUser(); $package = id(new PhabricatorOwnersPackageQuery())->setViewer($viewer)->withIDs(array($request->getURIData('id')))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->needPaths(true)->executeOne(); if (!$package) { return new Aphront404Response(); } if ($request->isFormPost()) { $paths = $request->getArr('path'); $repos = $request->getArr('repo'); $excludes = $request->getArr('exclude'); $path_refs = array(); foreach ($paths as $key => $path) { if (!isset($repos[$key])) { throw new Exception(pht('No repository PHID for path "%s"!', $key)); } if (!isset($excludes[$key])) { throw new Exception(pht('No exclusion value for path "%s"!', $key)); } $path_refs[] = array('repositoryPHID' => $repos[$key], 'path' => $path, 'excluded' => (int) $excludes[$key]); } $type_paths = PhabricatorOwnersPackageTransaction::TYPE_PATHS; $xactions = array(); $xactions[] = id(new PhabricatorOwnersPackageTransaction())->setTransactionType($type_paths)->setNewValue($path_refs); $editor = id(new PhabricatorOwnersPackageTransactionEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true); $editor->applyTransactions($package, $xactions); return id(new AphrontRedirectResponse())->setURI($package->getURI()); } else { $paths = $package->getPaths(); $path_refs = mpull($paths, 'getRef'); } $repos = id(new PhabricatorRepositoryQuery())->setViewer($viewer)->execute(); $default_paths = array(); foreach ($repos as $repo) { $default_path = $repo->getDetail('default-owners-path'); if ($default_path) { $default_paths[$repo->getPHID()] = $default_path; } } $repos = mpull($repos, 'getDisplayName', 'getPHID'); asort($repos); $template = new AphrontTypeaheadTemplateView(); $template = $template->render(); Javelin::initBehavior('owners-path-editor', array('root' => 'path-editor', 'table' => 'paths', 'add_button' => 'addpath', 'repositories' => $repos, 'input_template' => $template, 'pathRefs' => $path_refs, 'completeURI' => '/diffusion/services/path/complete/', 'validateURI' => '/diffusion/services/path/validate/', 'repositoryDefaultPaths' => $default_paths)); require_celerity_resource('owners-path-editor-css'); $cancel_uri = $package->getURI(); $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new PHUIFormInsetView())->setTitle(pht('Paths'))->addDivAttributes(array('id' => 'path-editor'))->setRightButton(javelin_tag('a', array('href' => '#', 'class' => 'button green', 'sigil' => 'addpath', 'mustcapture' => true), pht('Add New Path')))->setDescription(pht('Specify the files and directories which comprise ' . 'this package.'))->setContent(javelin_tag('table', array('class' => 'owners-path-editor-table', 'sigil' => 'paths'), '')))->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($cancel_uri)->setValue(pht('Save Paths'))); $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Paths'))->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setForm($form); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb($package->getName(), $this->getApplicationURI('package/' . $package->getID() . '/')); $crumbs->addTextCrumb(pht('Edit Paths')); $crumbs->setBorder(true); $header = id(new PHUIHeaderView())->setHeader(pht('Edit Paths: %s', $package->getName()))->setHeaderIcon('fa-pencil'); $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter($box); $title = array($package->getName(), pht('Edit Paths')); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); $saved->setParameter('callsigns', $request->getStrList('callsigns')); $saved->setParameter('status', $request->getStr('status')); $saved->setParameter('order', $request->getStr('order')); $saved->setParameter('hosted', $request->getStr('hosted')); $saved->setParameter('types', $request->getArr('types')); $saved->setParameter('name', $request->getStr('name')); $saved->setParameter('anyProjectPHIDs', $request->getArr('anyProjects')); return $saved; }
public function readValueFromRequest(AphrontRequest $request) { $value = array(); $names = $request->getArr($this->getFieldKey() . '_name'); $panels = $request->getArr($this->getFieldKey() . '_panelID'); foreach ($names as $idx => $name) { $panel_id = idx($panels, $idx); if (strlen($name) && $panel_id) { $value[] = array('name' => $name, 'panelID' => $panel_id); } } $this->setFieldValue($value); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $engine = id(new PhabricatorProjectEditEngine())->setController($this); $this->setEngine($engine); $id = $request->getURIData('id'); if (!$id) { // This capability is checked again later, but checking it here // explicitly gives us a better error message. $this->requireApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY); $parent_id = head($request->getArr('parent')); if (!$parent_id) { $parent_id = $request->getStr('parent'); } if ($parent_id) { $is_milestone = false; } else { $parent_id = head($request->getArr('milestone')); if (!$parent_id) { $parent_id = $request->getStr('milestone'); } $is_milestone = true; } if ($parent_id) { $query = id(new PhabricatorProjectQuery())->setViewer($viewer)->needImages(true)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT)); if (ctype_digit($parent_id)) { $query->withIDs(array($parent_id)); } else { $query->withPHIDs(array($parent_id)); } $parent = $query->executeOne(); if ($is_milestone) { if (!$parent->supportsMilestones()) { $cancel_uri = "/project/subprojects/{$parent_id}/"; return $this->newDialog()->setTitle(pht('No Milestones'))->appendParagraph(pht('You can not add milestones to this project.'))->addCancelButton($cancel_uri); } $engine->setMilestoneProject($parent); } else { if (!$parent->supportsSubprojects()) { $cancel_uri = "/project/subprojects/{$parent_id}/"; return $this->newDialog()->setTitle(pht('No Subprojects'))->appendParagraph(pht('You can not add subprojects to this project.'))->addCancelButton($cancel_uri); } $engine->setParentProject($parent); } $this->setProject($parent); } } return $engine->buildResponse(); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $project_id = $request->getURIData('projectID'); $project = id(new PhabricatorProjectQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->withIDs(array($project_id))->executeOne(); if (!$project) { return new Aphront404Response(); } $this->setProject($project); $columns = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withProjectPHIDs(array($project->getPHID()))->execute(); if ($columns) { return new Aphront400Response(); } $project_id = $project->getID(); $board_uri = $this->getApplicationURI("board/{$project_id}/"); if ($request->isFormPost()) { $import_phid = $request->getArr('importProjectPHID'); $import_phid = reset($import_phid); $import_columns = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withProjectPHIDs(array($import_phid))->execute(); if (!$import_columns) { return new Aphront400Response(); } $table = id(new PhabricatorProjectColumn())->openTransaction(); foreach ($import_columns as $import_column) { if ($import_column->isHidden()) { continue; } $new_column = PhabricatorProjectColumn::initializeNewColumn($viewer)->setSequence($import_column->getSequence())->setProjectPHID($project->getPHID())->setName($import_column->getName())->setProperties($import_column->getProperties())->save(); } $table->saveTransaction(); return id(new AphrontRedirectResponse())->setURI($board_uri); } $proj_selector = id(new AphrontFormTokenizerControl())->setName('importProjectPHID')->setUser($viewer)->setDatasource(id(new PhabricatorProjectDatasource())->setParameters(array('mustHaveColumns' => true))->setLimit(1)); return $this->newDialog()->setTitle(pht('Import Columns'))->setWidth(AphrontDialogView::WIDTH_FORM)->appendParagraph(pht('Choose a project to import columns from:'))->appendChild($proj_selector)->addCancelButton($board_uri)->addSubmitButton(pht('Import')); }
public function handleRequest(AphrontRequest $request) { $response = $this->loadDiffusionContextForEdit(); if ($response) { return $response; } $viewer = $this->getViewer(); $drequest = $this->getDiffusionRequest(); $repository = $drequest->getRepository(); if (!$repository->supportsAutomation()) { return new Aphront404Response(); } $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); $v_blueprints = $repository->getHumanReadableDetail('automation.blueprintPHIDs'); if ($request->isFormPost()) { $v_blueprints = $request->getArr('blueprintPHIDs'); $xactions = array(); $template = id(new PhabricatorRepositoryTransaction()); $type_blueprints = PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS; $xactions[] = id(clone $template)->setTransactionType($type_blueprints)->setNewValue($v_blueprints); id(new PhabricatorRepositoryEditor())->setContinueOnNoEffect(true)->setContentSourceFromRequest($request)->setActor($viewer)->applyTransactions($repository, $xactions); return id(new AphrontRedirectResponse())->setURI($edit_uri); } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Edit Automation')); $title = pht('Edit %s', $repository->getName()); $form = id(new AphrontFormView())->setUser($viewer)->appendRemarkupInstructions(pht("Configure **Repository Automation** to allow Phabricator to " . "write to this repository." . "\n\n" . "IMPORTANT: This feature is new, experimental, and not supported. " . "Use it at your own risk."))->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Use Blueprints'))->setName('blueprintPHIDs')->setValue($v_blueprints)->setDatasource(new DrydockBlueprintDatasource()))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Save'))->addCancelButton($edit_uri)); $object_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setForm($form); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($object_box); }
public function handleRequest(AphrontRequest $request) { $user = $request->getViewer(); $id = $request->getURIData('id'); if ($id) { $question = id(new PonderQuestionQuery())->setViewer($user)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$question) { return new Aphront404Response(); } $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs($question->getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); $v_projects = array_reverse($v_projects); } else { $question = id(new PonderQuestion())->setStatus(PonderQuestionStatus::STATUS_OPEN)->setAuthorPHID($user->getPHID())->setVoteCount(0)->setAnswerCount(0)->setHeat(0.0); $v_projects = array(); } $v_title = $question->getTitle(); $v_content = $question->getContent(); $errors = array(); $e_title = true; if ($request->isFormPost()) { $v_title = $request->getStr('title'); $v_content = $request->getStr('content'); $v_projects = $request->getArr('projects'); $len = phutil_utf8_strlen($v_title); if ($len < 1) { $errors[] = pht('Title must not be empty.'); $e_title = pht('Required'); } else { if ($len > 255) { $errors[] = pht('Title is too long.'); $e_title = pht('Too Long'); } } if (!$errors) { $template = id(new PonderQuestionTransaction()); $xactions = array(); $xactions[] = id(clone $template)->setTransactionType(PonderQuestionTransaction::TYPE_TITLE)->setNewValue($v_title); $xactions[] = id(clone $template)->setTransactionType(PonderQuestionTransaction::TYPE_CONTENT)->setNewValue($v_content); $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; $xactions[] = id(new PonderQuestionTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $proj_edge_type)->setNewValue(array('=' => array_fuse($v_projects))); $editor = id(new PonderQuestionEditor())->setActor($user)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true); $editor->applyTransactions($question, $xactions); return id(new AphrontRedirectResponse())->setURI('/Q' . $question->getID()); } } $form = id(new AphrontFormView())->setUser($user)->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Question'))->setName('title')->setValue($v_title)->setError($e_title))->appendChild(id(new PhabricatorRemarkupControl())->setUser($user)->setName('content')->setID('content')->setValue($v_content)->setLabel(pht('Description'))->setUser($user)); $form->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Projects'))->setName('projects')->setValue($v_projects)->setDatasource(new PhabricatorProjectDatasource())); $form->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($this->getApplicationURI())->setValue(pht('Ask Away!'))); $preview = id(new PHUIRemarkupPreviewPanel())->setHeader(pht('Question Preview'))->setControlID('content')->setPreviewURI($this->getApplicationURI('preview/')); $form_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Ask New Question'))->setFormErrors($errors)->setForm($form); $crumbs = $this->buildApplicationCrumbs(); $id = $question->getID(); if ($id) { $crumbs->addTextCrumb("Q{$id}", "/Q{$id}"); $crumbs->addTextCrumb(pht('Edit')); } else { $crumbs->addTextCrumb(pht('Ask Question')); } return $this->buildApplicationPage(array($crumbs, $form_box, $preview), array('title' => pht('Ask New Question'))); }
public function handleRequest(AphrontRequest $request) { $this->viewer = $request->getViewer(); if ($request->isFormPost()) { $uri = $request->getRequestURI(); $project = head($request->getArr('set_project')); $project = nonempty($project, null); $uri = $uri->alter('project', $project); $window = $request->getStr('set_window'); $uri = $uri->alter('window', $window); return id(new AphrontRedirectResponse())->setURI($uri); } $error_box = null; $history_model = id(new SprintHistoryDataProvider())->setViewer($this->viewer)->setRequest($request)->execute(); try { $sprintlist_table = id(new SprintHistoryTableView())->setViewer($this->viewer)->setRequest($request)->setTableData($history_model)->render(); } catch (Exception $e) { $error_box = $this->getErrorBox($e); } $can_create = $this->hasApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY); $crumbs = $this->buildSprintApplicationCrumbs($can_create); $crumbs->addTextCrumb(pht('Task Project History')); $help = id(new PHUIBoxView())->appendChild(phutil_tag('p', array(), 'This is a history of tasks and logs when a project was added or removed'))->appendChild(phutil_tag('br', array(), ''))->appendChild(phutil_tag('p', array(), 'NOTE: The tasks are selected from the current tasks in the project. Tasks previously removed will not appear!'))->addMargin(PHUI::MARGIN_LARGE); $nav = $this->buildNavMenu(); $this->view = $nav->selectFilter($this->view, 'history'); $nav->appendChild(array($error_box, $crumbs, $help, $sprintlist_table)); return $this->buildApplicationPage($nav, array('title' => array(pht('Task Project History')), 'device' => true)); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $phids = $request->getArr('phids'); $handles = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs($phids)->execute(); $objects = id(new PhabricatorObjectQuery())->setViewer($viewer)->withPHIDs($phids)->execute(); $cards = array(); foreach ($phids as $phid) { $handle = $handles[$phid]; $object = $objects[$phid]; $hovercard = id(new PhabricatorHovercardView())->setUser($viewer)->setObjectHandle($handle); if ($object) { $hovercard->setObject($object); } // Send it to the other side of the world, thanks to PhutilEventEngine $event = new PhabricatorEvent(PhabricatorEventType::TYPE_UI_DIDRENDERHOVERCARD, array('hovercard' => $hovercard, 'handle' => $handle, 'object' => $object)); $event->setUser($viewer); PhutilEventEngine::dispatchEvent($event); $cards[$phid] = $hovercard; } // Browser-friendly for non-Ajax requests if (!$request->isAjax()) { foreach ($cards as $key => $hovercard) { $cards[$key] = phutil_tag('div', array('class' => 'ml'), $hovercard); } return $this->buildApplicationPage($cards, array('device' => false)); } else { return id(new AphrontAjaxResponse())->setContent(array('cards' => $cards)); } }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $phid = head($request->getArr('macro')); $above = $request->getStr('above'); $below = $request->getStr('below'); $e_macro = true; $errors = array(); if ($request->isDialogFormPost()) { if (!$phid) { $e_macro = pht('Required'); $errors[] = pht('Macro name is required.'); } else { $macro = id(new PhabricatorMacroQuery())->setViewer($viewer)->withPHIDs(array($phid))->executeOne(); if (!$macro) { $e_macro = pht('Invalid'); $errors[] = pht('No such macro.'); } } if (!$errors) { $options = new PhutilSimpleOptions(); $data = array('src' => $macro->getName(), 'above' => $above, 'below' => $below); $string = $options->unparse($data, $escape = '}'); $result = array('text' => "{meme, {$string}}"); return id(new AphrontAjaxResponse())->setContent($result); } } $view = id(new AphrontFormView())->setUser($viewer)->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Macro'))->setName('macro')->setLimit(1)->setDatasource(new PhabricatorMacroDatasource())->setError($e_macro))->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Above'))->setName('above')->setValue($above))->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Below'))->setName('below')->setValue($below)); $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle(pht('Create Meme'))->appendForm($view)->addCancelButton('/')->addSubmitButton(pht('Llama Diorama')); return id(new AphrontDialogResponse())->setDialog($dialog); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); if ($id) { $account = id(new PhortuneAccountQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$account) { return new Aphront404Response(); } $is_new = false; } else { $account = PhortuneAccount::initializeNewAccount($viewer); $account->attachMemberPHIDs(array($viewer->getPHID())); $is_new = true; } $v_name = $account->getName(); $e_name = true; $v_members = $account->getMemberPHIDs(); $e_members = null; $validation_exception = null; if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_members = $request->getArr('memberPHIDs'); $type_name = PhortuneAccountTransaction::TYPE_NAME; $type_edge = PhabricatorTransactions::TYPE_EDGE; $xactions = array(); $xactions[] = id(new PhortuneAccountTransaction())->setTransactionType($type_name)->setNewValue($v_name); $xactions[] = id(new PhortuneAccountTransaction())->setTransactionType($type_edge)->setMetadataValue('edge:type', PhortuneAccountHasMemberEdgeType::EDGECONST)->setNewValue(array('=' => array_fuse($v_members))); $editor = id(new PhortuneAccountEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true); try { $editor->applyTransactions($account, $xactions); $account_uri = $this->getApplicationURI($account->getID() . '/'); return id(new AphrontRedirectResponse())->setURI($account_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_name = $ex->getShortMessage($type_name); $e_members = $ex->getShortMessage($type_edge); } } $crumbs = $this->buildApplicationCrumbs(); $crumbs->setBorder(true); if ($is_new) { $cancel_uri = $this->getApplicationURI('account/'); $crumbs->addTextCrumb(pht('Accounts'), $cancel_uri); $crumbs->addTextCrumb(pht('Create Account')); $title = pht('Create Payment Account'); $submit_button = pht('Create Account'); } else { $cancel_uri = $this->getApplicationURI($account->getID() . '/'); $crumbs->addTextCrumb($account->getName(), $cancel_uri); $crumbs->addTextCrumb(pht('Edit')); $title = pht('Edit %s', $account->getName()); $submit_button = pht('Save Changes'); } $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name))->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorPeopleDatasource())->setLabel(pht('Members'))->setName('memberPHIDs')->setValue($v_members)->setError($e_members))->appendChild(id(new AphrontFormSubmitControl())->setValue($submit_button)->addCancelButton($cancel_uri)); $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Account'))->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setValidationException($validation_exception)->setForm($form); $header = id(new PHUIHeaderView())->setHeader($title)->setHeaderIcon('fa-pencil'); $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter(array($box)); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $book_name = $request->getURIData('book'); $book = id(new DivinerBookQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->needProjectPHIDs(true)->withNames(array($book_name))->executeOne(); if (!$book) { return new Aphront404Response(); } $view_uri = '/book/' . $book->getName() . '/'; if ($request->isFormPost()) { $v_projects = $request->getArr('projectPHIDs'); $v_view = $request->getStr('viewPolicy'); $v_edit = $request->getStr('editPolicy'); $xactions = array(); $xactions[] = id(new DivinerLiveBookTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorProjectObjectHasProjectEdgeType::EDGECONST)->setNewValue(array('=' => array_fuse($v_projects))); $xactions[] = id(new DivinerLiveBookTransaction())->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)->setNewValue($v_view); $xactions[] = id(new DivinerLiveBookTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)->setNewValue($v_edit); id(new DivinerLiveBookEditor())->setContinueOnNoEffect(true)->setContentSourceFromRequest($request)->setActor($viewer)->applyTransactions($book, $xactions); return id(new AphrontRedirectResponse())->setURI($view_uri); } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Edit Basics')); $title = pht('Edit %s', $book->getTitle()); $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($book)->execute(); $view_capability = PhabricatorPolicyCapability::CAN_VIEW; $edit_capability = PhabricatorPolicyCapability::CAN_EDIT; $form = id(new AphrontFormView())->setUser($viewer)->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectDatasource())->setName('projectPHIDs')->setLabel(pht('Projects'))->setValue($book->getProjectPHIDs()))->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new DiffusionRepositoryDatasource())->setName('repositoryPHIDs')->setLabel(pht('Repository'))->setDisableBehavior(true)->setLimit(1)->setValue($book->getRepositoryPHID() ? array($book->getRepositoryPHID()) : null))->appendChild(id(new AphrontFormPolicyControl())->setName('viewPolicy')->setPolicyObject($book)->setCapability($view_capability)->setPolicies($policies)->setCaption($book->describeAutomaticCapability($view_capability)))->appendChild(id(new AphrontFormPolicyControl())->setName('editPolicy')->setPolicyObject($book)->setCapability($edit_capability)->setPolicies($policies)->setCaption($book->describeAutomaticCapability($edit_capability)))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Save'))->addCancelButton($view_uri)); $object_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setForm($form); $timeline = $this->buildTransactionTimeline($book, new DivinerLiveBookTransactionQuery()); $timeline->setShouldTerminate(true); return $this->buildApplicationPage(array($crumbs, $object_box, $timeline), 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))->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'); 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(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($view); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $user = id(new PhabricatorPeopleQuery())->setViewer($viewer)->withIDs(array($id))->executeOne(); if (!$user) { return new Aphront404Response(); } $view_uri = '/p/' . $user->getUsername(); if ($request->isFormPost()) { $badge_phids = $request->getArr('badgePHIDs'); $badges = id(new PhabricatorBadgesQuery())->setViewer($viewer)->withPHIDs($badge_phids)->needRecipients(true)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_EDIT, PhabricatorPolicyCapability::CAN_VIEW))->execute(); if (!$badges) { return new Aphront404Response(); } $award_phids = array($user->getPHID()); foreach ($badges as $badge) { $xactions = array(); $xactions[] = id(new PhabricatorBadgesTransaction())->setTransactionType(PhabricatorBadgesTransaction::TYPE_AWARD)->setNewValue($award_phids); $editor = id(new PhabricatorBadgesEditor($badge))->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->applyTransactions($badge, $xactions); } return id(new AphrontRedirectResponse())->setURI($view_uri); } $form = id(new AphrontFormView())->setUser($viewer)->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Badge'))->setName('badgePHIDs')->setDatasource(id(new PhabricatorBadgesDatasource())->setParameters(array('recipientPHID' => $user->getPHID())))); $dialog = $this->newDialog()->setTitle(pht('Grant Badge'))->appendForm($form)->addCancelButton($view_uri)->addSubmitButton(pht('Award')); return $dialog; }
protected function getValueFromSubmit(AphrontRequest $request, $key) { // TODO: Maybe move this unusual read somewhere else so subclassing this // correctly is easier? $this->originalValue = $request->getArr($key . '.original'); return parent::getValueFromSubmit($request, $key); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $project = id(new PhabricatorProjectQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$project) { return new Aphront404Response(); } $this->setProject($project); $done_uri = "/project/members/{$id}/"; if (!$project->supportsEditMembers()) { $copy = pht('Parent projects and milestones do not support adding ' . 'members. You can add members directly to any non-parent subproject.'); return $this->newDialog()->setTitle(pht('Unsupported Project'))->appendParagraph($copy)->addCancelButton($done_uri); } if ($request->isFormPost()) { $member_phids = $request->getArr('memberPHIDs'); $type_member = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST; $xactions = array(); $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $type_member)->setNewValue(array('+' => array_fuse($member_phids))); $editor = id(new PhabricatorProjectTransactionEditor($project))->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->applyTransactions($project, $xactions); return id(new AphrontRedirectResponse())->setURI($done_uri); } $form = id(new AphrontFormView())->setUser($viewer)->appendControl(id(new AphrontFormTokenizerControl())->setName('memberPHIDs')->setLabel(pht('Members'))->setDatasource(new PhabricatorPeopleDatasource())); return $this->newDialog()->setTitle(pht('Add Members'))->appendForm($form)->addCancelButton($done_uri)->addSubmitButton(pht('Add Members')); }
protected function processDiffusionRequest(AphrontRequest $request) { $user = $request->getUser(); $drequest = $this->getDiffusionRequest(); $callsign = $drequest->getRepository()->getCallsign(); $repository = $drequest->getRepository(); $commit = $drequest->loadCommit(); $data = $commit->loadCommitData(); $page_title = pht('Edit Diffusion Commit'); if (!$commit) { return new Aphront404Response(); } $commit_phid = $commit->getPHID(); $edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; $current_proj_phids = PhabricatorEdgeQuery::loadDestinationPHIDs($commit_phid, $edge_type); if ($request->isFormPost()) { $xactions = array(); $proj_phids = $request->getArr('projects'); $xactions[] = id(new PhabricatorAuditTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', $edge_type)->setNewValue(array('=' => array_fuse($proj_phids))); $editor = id(new PhabricatorAuditEditor())->setActor($user)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request); $xactions = $editor->applyTransactions($commit, $xactions); return id(new AphrontRedirectResponse())->setURI('/r' . $callsign . $commit->getCommitIdentifier()); } $tokenizer_id = celerity_generate_unique_node_id(); $form = id(new AphrontFormView())->setUser($user)->setAction($request->getRequestURI()->getPath())->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Projects'))->setName('projects')->setValue($current_proj_phids)->setID($tokenizer_id)->setCaption(javelin_tag('a', array('href' => '/project/create/', 'mustcapture' => true, 'sigil' => 'project-create'), pht('Create New Project')))->setDatasource(new PhabricatorProjectDatasource())); $reason = $data->getCommitDetail('autocloseReason', false); $reason = PhabricatorRepository::BECAUSE_AUTOCLOSE_FORCED; if ($reason !== false) { switch ($reason) { case PhabricatorRepository::BECAUSE_REPOSITORY_IMPORTING: $desc = pht('No, Repository Importing'); break; case PhabricatorRepository::BECAUSE_AUTOCLOSE_DISABLED: $desc = pht('No, Autoclose Disabled'); break; case PhabricatorRepository::BECAUSE_NOT_ON_AUTOCLOSE_BRANCH: $desc = pht('No, Not On Autoclose Branch'); break; case PhabricatorRepository::BECAUSE_AUTOCLOSE_FORCED: $desc = pht('Yes, Forced Via bin/repository CLI Tool.'); break; case null: $desc = pht('Yes'); break; default: $desc = pht('Unknown'); break; } $doc_href = PhabricatorEnv::getDoclink('Diffusion User Guide: Autoclose'); $doc_link = phutil_tag('a', array('href' => $doc_href, 'target' => '_blank'), pht('Learn More')); $form->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Autoclose?'))->setValue(array($desc, " · ", $doc_link))); } Javelin::initBehavior('project-create', array('tokenizerID' => $tokenizer_id)); $submit = id(new AphrontFormSubmitControl())->setValue(pht('Save'))->addCancelButton('/r' . $callsign . $commit->getCommitIdentifier()); $form->appendChild($submit); $crumbs = $this->buildCrumbs(array('commit' => true)); $crumbs->addTextCrumb(pht('Edit')); $form_box = id(new PHUIObjectBoxView())->setHeaderText($page_title)->setForm($form); return $this->buildApplicationPage(array($crumbs, $form_box), array('title' => $page_title)); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); if ($id) { $post = id(new PhamePostQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$post) { return new Aphront404Response(); } $blog_id = $post->getBlog()->getID(); } else { $blog_id = head($request->getArr('blog')); if (!$blog_id) { $blog_id = $request->getStr('blog'); } } $query = id(new PhameBlogQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT)); if (ctype_digit($blog_id)) { $query->withIDs(array($blog_id)); } else { $query->withPHIDs(array($blog_id)); } $blog = $query->executeOne(); if (!$blog) { return new Aphront404Response(); } $this->setBlog($blog); return id(new PhamePostEditEngine())->setController($this)->setBlog($blog)->buildResponse(); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); if ($request->isFormPost()) { $uri = $request->getRequestURI(); $project = head($request->getArr('set_project')); $project = nonempty($project, null); $uri = $uri->alter('project', $project); $window = $request->getStr('set_window'); $uri = $uri->alter('window', $window); return id(new AphrontRedirectResponse())->setURI($uri); } $nav = $this->buildNavMenu(); $this->view = $nav->selectFilter($this->view, 'List'); switch ($this->view) { case 'list': case 'user': case 'project': $core = id(new SprintReportOpenTasksView())->setUser($viewer)->setRequest($request)->setView($this->view); break; case 'burn': $core = id(new SprintReportBurnUpView())->setUser($viewer)->setRequest($request); break; case 'history': $core = id(new SprintHistoryTableView())->setUser($viewer)->setRequest($request); break; default: return new Aphront404Response(); } $can_create = $this->hasApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY); $nav->appendChild($core); $nav->setCrumbs($this->buildSprintApplicationCrumbs($can_create)->setBorder(true)->addTextCrumb(pht('Reports'))); return $this->buildApplicationPage($nav, array('title' => pht('Sprint Reports'), 'device' => false)); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); if (!$request->isFormPost()) { return new Aphront403Response(); } $commit_phid = $request->getStr('commit'); $commit = id(new DiffusionCommitQuery())->setViewer($viewer)->withPHIDs(array($commit_phid))->needAuditRequests(true)->executeOne(); if (!$commit) { return new Aphront404Response(); } $xactions = array(); // make sure we only add auditors or ccs if the action matches $action = $request->getStr('action'); switch ($action) { case PhabricatorAuditActionConstants::ADD_AUDITORS: $auditors = $request->getArr('auditors'); $xactions[] = id(new PhabricatorAuditTransaction())->setTransactionType(PhabricatorAuditActionConstants::ADD_AUDITORS)->setNewValue(array_fuse($auditors)); break; case PhabricatorAuditActionConstants::ADD_CCS: $xactions[] = id(new PhabricatorAuditTransaction())->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS)->setNewValue(array('+' => $request->getArr('ccs'))); break; case PhabricatorAuditActionConstants::COMMENT: // We'll deal with this below. break; default: $xactions[] = id(new PhabricatorAuditTransaction())->setTransactionType(PhabricatorAuditActionConstants::ACTION)->setNewValue($action); break; } $content = $request->getStr('content'); if (strlen($content)) { $xactions[] = id(new PhabricatorAuditTransaction())->setTransactionType(PhabricatorTransactions::TYPE_COMMENT)->attachComment(id(new PhabricatorAuditTransactionComment())->setCommitPHID($commit->getPHID())->setContent($content)); } $inlines = PhabricatorAuditInlineComment::loadDraftComments($viewer, $commit->getPHID()); foreach ($inlines as $inline) { $xactions[] = id(new PhabricatorAuditTransaction())->setTransactionType(PhabricatorAuditActionConstants::INLINE)->attachComment($inline->getTransactionComment()); } id(new PhabricatorAuditEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnMissingFields(true)->applyTransactions($commit, $xactions); $draft = id(new PhabricatorDraft())->loadOneWhere('authorPHID = %s AND draftKey = %s', $viewer->getPHID(), 'diffusion-audit-' . $commit->getID()); if ($draft) { $draft->delete(); } $monogram = $commit->getRepository()->getMonogram(); $identifier = $commit->getCommitIdentifier(); $uri = '/' . $monogram . $identifier; return id(new AphrontRedirectResponse())->setURI($uri); }
public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); $saved->setParameter('colors', $request->getArr('colors')); $saved->setParameter('group', $request->getStr('group')); $saved->setParameter('objectFilter', $request->getStr('objectFilter')); return $saved; }
protected function getParameterValue(AphrontRequest $request, $key) { $list = $request->getArr($key, null); if ($list === null) { $list = $request->getStrList($key); } return $list; }
public function processRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $user = $this->getUser(); $preferences = $this->getPreferences(); $value_email = PhabricatorEmailTagsSetting::VALUE_EMAIL; $errors = array(); if ($request->isFormPost()) { $new_tags = $request->getArr('mailtags'); $mailtags = $preferences->getPreference('mailtags', array()); $all_tags = $this->getAllTags($user); foreach ($all_tags as $key => $label) { $mailtags[$key] = (int) idx($new_tags, $key, $value_email); } $this->writeSetting($preferences, PhabricatorEmailTagsSetting::SETTINGKEY, $mailtags); return id(new AphrontRedirectResponse())->setURI($this->getPanelURI('?saved=true')); } $mailtags = $preferences->getSettingValue(PhabricatorEmailTagsSetting::SETTINGKEY); $form = id(new AphrontFormView())->setUser($viewer); $form->appendRemarkupInstructions(pht('You can adjust **Application Settings** here to customize when ' . 'you are emailed and notified.' . "\n\n" . "| Setting | Effect\n" . "| ------- | -------\n" . "| Email | You will receive an email and a notification, but the " . "notification will be marked \"read\".\n" . "| Notify | You will receive an unread notification only.\n" . "| Ignore | You will receive nothing.\n" . "\n\n" . 'If an update makes several changes (like adding CCs to a task, ' . 'closing it, and adding a comment) you will receive the strongest ' . 'notification any of the changes is configured to deliver.' . "\n\n" . 'These preferences **only** apply to objects you are connected to ' . '(for example, Revisions where you are a reviewer or tasks you are ' . 'CC\'d on). To receive email alerts when other objects are created, ' . 'configure [[ /herald/ | Herald Rules ]].')); $editors = $this->getAllEditorsWithTags($user); // Find all the tags shared by more than one application, and put them // in a "common" group. $all_tags = array(); foreach ($editors as $editor) { foreach ($editor->getMailTagsMap() as $tag => $name) { if (empty($all_tags[$tag])) { $all_tags[$tag] = array('count' => 0, 'name' => $name); } $all_tags[$tag]['count']; } } $common_tags = array(); foreach ($all_tags as $tag => $info) { if ($info['count'] > 1) { $common_tags[$tag] = $info['name']; } } // Build up the groups of application-specific options. $tag_groups = array(); foreach ($editors as $editor) { $tag_groups[] = array($editor->getEditorObjectsDescription(), array_diff_key($editor->getMailTagsMap(), $common_tags)); } // Sort them, then put "Common" at the top. $tag_groups = isort($tag_groups, 0); if ($common_tags) { array_unshift($tag_groups, array(pht('Common'), $common_tags)); } // Finally, build the controls. foreach ($tag_groups as $spec) { list($label, $map) = $spec; $control = $this->buildMailTagControl($label, $map, $mailtags); $form->appendChild($control); } $form->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Save Preferences'))); $form_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Email Preferences'))->setFormSaved($request->getStr('saved'))->setFormErrors($errors)->setForm($form); return $form_box; }
public function handleRequest(AphrontRequest $request) { $response = $this->loadDiffusionContextForEdit(); if ($response) { return $response; } $viewer = $request->getUser(); $drequest = $this->getDiffusionRequest(); $repository = $drequest->getRepository(); $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); $v_name = $repository->getName(); $v_desc = $repository->getDetail('description'); $v_slug = $repository->getRepositorySlug(); $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs($repository->getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); $e_name = true; $e_slug = null; $errors = array(); $validation_exception = null; if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_desc = $request->getStr('description'); $v_projects = $request->getArr('projectPHIDs'); $v_slug = $request->getStr('slug'); if (!strlen($v_name)) { $e_name = pht('Required'); $errors[] = pht('Repository name is required.'); } else { $e_name = null; } if (!$errors) { $xactions = array(); $template = id(new PhabricatorRepositoryTransaction()); $type_name = PhabricatorRepositoryTransaction::TYPE_NAME; $type_desc = PhabricatorRepositoryTransaction::TYPE_DESCRIPTION; $type_edge = PhabricatorTransactions::TYPE_EDGE; $type_slug = PhabricatorRepositoryTransaction::TYPE_SLUG; $xactions[] = id(clone $template)->setTransactionType($type_name)->setNewValue($v_name); $xactions[] = id(clone $template)->setTransactionType($type_desc)->setNewValue($v_desc); $xactions[] = id(clone $template)->setTransactionType($type_slug)->setNewValue($v_slug); $xactions[] = id(clone $template)->setTransactionType($type_edge)->setMetadataValue('edge:type', PhabricatorProjectObjectHasProjectEdgeType::EDGECONST)->setNewValue(array('=' => array_fuse($v_projects))); $editor = id(new PhabricatorRepositoryEditor())->setContinueOnNoEffect(true)->setContentSourceFromRequest($request)->setActor($viewer); try { $editor->applyTransactions($repository, $xactions); return id(new AphrontRedirectResponse())->setURI($edit_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_slug = $ex->getShortMessage($type_slug); } } } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Edit Basics')); $title = pht('Edit %s', $repository->getName()); $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name))->appendChild(id(new AphrontFormTextControl())->setName('slug')->setLabel(pht('Short Name'))->setValue($v_slug)->setError($e_slug))->appendChild(id(new PhabricatorRemarkupControl())->setUser($viewer)->setName('description')->setLabel(pht('Description'))->setValue($v_desc))->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectDatasource())->setName('projectPHIDs')->setLabel(pht('Projects'))->setValue($v_projects))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Save'))->addCancelButton($edit_uri))->appendChild(id(new PHUIFormDividerControl()))->appendRemarkupInstructions($this->getReadmeInstructions()); $object_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setValidationException($validation_exception)->setForm($form)->setFormErrors($errors); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($object_box); }
protected function processDiffusionRequest(AphrontRequest $request) { $user = $request->getUser(); $drequest = $this->diffusionRequest; $repository = $drequest->getRepository(); $repository = id(new PhabricatorRepositoryQuery())->setViewer($user)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->needProjectPHIDs(true)->withIDs(array($repository->getID()))->executeOne(); if (!$repository) { return new Aphront404Response(); } $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); $v_name = $repository->getName(); $v_desc = $repository->getDetail('description'); $v_clone_name = $repository->getDetail('clone-name'); $e_name = true; $errors = array(); if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_desc = $request->getStr('description'); $v_projects = $request->getArr('projectPHIDs'); if ($repository->isHosted()) { $v_clone_name = $request->getStr('cloneName'); } if (!strlen($v_name)) { $e_name = pht('Required'); $errors[] = pht('Repository name is required.'); } else { $e_name = null; } if (!$errors) { $xactions = array(); $template = id(new PhabricatorRepositoryTransaction()); $type_name = PhabricatorRepositoryTransaction::TYPE_NAME; $type_desc = PhabricatorRepositoryTransaction::TYPE_DESCRIPTION; $type_edge = PhabricatorTransactions::TYPE_EDGE; $type_clone_name = PhabricatorRepositoryTransaction::TYPE_CLONE_NAME; $xactions[] = id(clone $template)->setTransactionType($type_name)->setNewValue($v_name); $xactions[] = id(clone $template)->setTransactionType($type_desc)->setNewValue($v_desc); $xactions[] = id(clone $template)->setTransactionType($type_clone_name)->setNewValue($v_clone_name); $xactions[] = id(clone $template)->setTransactionType($type_edge)->setMetadataValue('edge:type', PhabricatorProjectObjectHasProjectEdgeType::EDGECONST)->setNewValue(array('=' => array_fuse($v_projects))); id(new PhabricatorRepositoryEditor())->setContinueOnNoEffect(true)->setContentSourceFromRequest($request)->setActor($user)->applyTransactions($repository, $xactions); return id(new AphrontRedirectResponse())->setURI($edit_uri); } } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Edit Basics')); $title = pht('Edit %s', $repository->getName()); $form = id(new AphrontFormView())->setUser($user)->appendChild(id(new AphrontFormTextControl())->setName('name')->setLabel(pht('Name'))->setValue($v_name)->setError($e_name)); if ($repository->isHosted()) { $form->appendChild(id(new AphrontFormTextControl())->setName('cloneName')->setLabel(pht('Clone/Checkout As'))->setValue($v_clone_name)->setCaption(pht('Optional directory name to use when cloning or checking out ' . 'this repository.'))); } $form->appendChild(id(new PhabricatorRemarkupControl())->setUser($user)->setName('description')->setLabel(pht('Description'))->setValue($v_desc))->appendControl(id(new AphrontFormTokenizerControl())->setDatasource(new PhabricatorProjectDatasource())->setName('projectPHIDs')->setLabel(pht('Projects'))->setValue($repository->getProjectPHIDs()))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Save'))->addCancelButton($edit_uri))->appendChild(id(new PHUIFormDividerControl()))->appendRemarkupInstructions($this->getReadmeInstructions()); $object_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setForm($form)->setFormErrors($errors); return $this->buildApplicationPage(array($crumbs, $object_box), array('title' => $title)); }
public function testRequestDataAccess() { $r = new AphrontRequest('http://example.com/', '/'); $r->setRequestData(array('str_empty' => '', 'str' => 'derp', 'str_true' => 'true', 'str_false' => 'false', 'zero' => '0', 'one' => '1', 'arr_empty' => array(), 'arr_num' => array(1, 2, 3), 'comma' => ',', 'comma_1' => 'a, b', 'comma_2' => ' ,a ,, b ,,,, ,, ', 'comma_3' => '0', 'comma_4' => 'a, a, b, a', 'comma_5' => "a\nb, c\n\nd\n\n\n,\n")); $this->assertEqual(1, $r->getInt('one')); $this->assertEqual(0, $r->getInt('zero')); $this->assertEqual(null, $r->getInt('does-not-exist')); $this->assertEqual(0, $r->getInt('str_empty')); $this->assertEqual(true, $r->getBool('one')); $this->assertEqual(false, $r->getBool('zero')); $this->assertEqual(true, $r->getBool('str_true')); $this->assertEqual(false, $r->getBool('str_false')); $this->assertEqual(true, $r->getBool('str')); $this->assertEqual(null, $r->getBool('does-not-exist')); $this->assertEqual(false, $r->getBool('str_empty')); $this->assertEqual('derp', $r->getStr('str')); $this->assertEqual('', $r->getStr('str_empty')); $this->assertEqual(null, $r->getStr('does-not-exist')); $this->assertEqual(array(), $r->getArr('arr_empty')); $this->assertEqual(array(1, 2, 3), $r->getArr('arr_num')); $this->assertEqual(null, $r->getArr('str_empty', null)); $this->assertEqual(null, $r->getArr('str_true', null)); $this->assertEqual(null, $r->getArr('does-not-exist', null)); $this->assertEqual(array(), $r->getArr('does-not-exist')); $this->assertEqual(array(), $r->getStrList('comma')); $this->assertEqual(array('a', 'b'), $r->getStrList('comma_1')); $this->assertEqual(array('a', 'b'), $r->getStrList('comma_2')); $this->assertEqual(array('0'), $r->getStrList('comma_3')); $this->assertEqual(array('a', 'a', 'b', 'a'), $r->getStrList('comma_4')); $this->assertEqual(array('a', 'b', 'c', 'd'), $r->getStrList('comma_5')); $this->assertEqual(array(), $r->getStrList('does-not-exist')); $this->assertEqual(null, $r->getStrList('does-not-exist', null)); $this->assertEqual(true, $r->getExists('str')); $this->assertEqual(false, $r->getExists('does-not-exist')); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $id = $request->getURIData('id'); $revision = id(new DifferentialRevisionQuery())->withIDs(array($id))->setViewer($viewer)->needActiveDiffs(true)->executeOne(); if (!$revision) { return new Aphront404Response(); } $detail_uri = "/D{$id}"; $op = new DrydockLandRepositoryOperation(); $barrier = $op->getBarrierToLanding($viewer, $revision); if ($barrier) { return $this->newDialog()->setTitle($barrier['title'])->appendParagraph($barrier['body'])->addCancelButton($detail_uri); } $diff = $revision->getActiveDiff(); $repository = $revision->getRepository(); $default_ref = $this->loadDefaultRef($repository, $diff); if ($default_ref) { $v_ref = array($default_ref->getPHID()); } else { $v_ref = array(); } $e_ref = true; $errors = array(); if ($request->isFormPost()) { $v_ref = $request->getArr('refPHIDs'); $ref_phid = head($v_ref); if (!strlen($ref_phid)) { $e_ref = pht('Required'); $errors[] = pht('You must select a branch to land this revision onto.'); } else { $ref = $this->newRefQuery($repository)->withPHIDs(array($ref_phid))->executeOne(); if (!$ref) { $e_ref = pht('Invalid'); $errors[] = pht('You must select a branch from this repository to land this ' . 'revision onto.'); } } if (!$errors) { // NOTE: The operation is locked to the current active diff, so if the // revision is updated before the operation applies nothing sneaky // occurs. $target = 'branch:' . $ref->getRefName(); $operation = DrydockRepositoryOperation::initializeNewOperation($op)->setAuthorPHID($viewer->getPHID())->setObjectPHID($revision->getPHID())->setRepositoryPHID($repository->getPHID())->setRepositoryTarget($target)->setProperty('differential.diffPHID', $diff->getPHID()); $operation->save(); $operation->scheduleUpdate(); return id(new AphrontRedirectResponse())->setURI($detail_uri); } } $ref_datasource = id(new DiffusionRefDatasource())->setParameters(array('repositoryPHIDs' => array($repository->getPHID()), 'refTypes' => $this->getTargetableRefTypes())); $form = id(new AphrontFormView())->setUser($viewer)->appendRemarkupInstructions(pht('In theory, this will do approximately what `arc land` would do. ' . 'In practice, you will have a riveting adventure instead.'))->appendControl(id(new AphrontFormTokenizerControl())->setLabel(pht('Onto Branch'))->setName('refPHIDs')->setLimit(1)->setError($e_ref)->setValue($v_ref)->setDatasource($ref_datasource))->appendRemarkupInstructions(pht('(WARNING) THIS FEATURE IS EXPERIMENTAL AND DANGEROUS! USE IT AT ' . 'YOUR OWN RISK!')); return $this->newDialog()->setWidth(AphrontDialogView::WIDTH_FORM)->setTitle(pht('Land Revision'))->setErrors($errors)->appendForm($form)->addCancelButton($detail_uri)->addSubmitButton(pht('Mutate Repository Unpredictably')); }
public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $phids = $request->getArr('phids'); $handles = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs($phids)->execute(); $objects = id(new PhabricatorObjectQuery())->setViewer($viewer)->withPHIDs($phids)->execute(); $objects = mpull($objects, null, 'getPHID'); $extensions = PhabricatorHovercardEngineExtension::getAllEnabledExtensions(); $extension_maps = array(); foreach ($extensions as $key => $extension) { $extension->setViewer($viewer); $extension_phids = array(); foreach ($objects as $phid => $object) { if ($extension->canRenderObjectHovercard($object)) { $extension_phids[$phid] = $phid; } } $extension_maps[$key] = $extension_phids; } $extension_data = array(); foreach ($extensions as $key => $extension) { $extension_phids = $extension_maps[$key]; if (!$extension_phids) { unset($extensions[$key]); continue; } $extension_data[$key] = $extension->willRenderHovercards(array_select_keys($objects, $extension_phids)); } $cards = array(); foreach ($phids as $phid) { $handle = $handles[$phid]; $object = $objects[$phid]; $hovercard = id(new PhabricatorHovercardView())->setUser($viewer)->setObjectHandle($handle); if ($object) { $hovercard->setObject($object); foreach ($extension_maps as $key => $extension_phids) { if (isset($extension_phids[$phid])) { $extensions[$key]->renderHovercard($hovercard, $handle, $object, $extension_data[$key]); } } } $cards[$phid] = $hovercard; } if ($request->isAjax()) { return id(new AphrontAjaxResponse())->setContent(array('cards' => $cards)); } foreach ($cards as $key => $hovercard) { $cards[$key] = phutil_tag('div', array('class' => 'ml'), $hovercard); } return $this->newPage()->appendChild($cards)->setShowFooter(false); }