protected function loadPage() { $table = new PhabricatorProjectColumn(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
private function buildActionView(PhabricatorProjectColumn $column) { $viewer = $this->getRequest()->getUser(); $id = $column->getID(); $project_id = $this->getProject()->getID(); $base_uri = '/board/' . $project_id . '/'; $actions = id(new PhabricatorActionListView())->setUser($viewer); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $column, PhabricatorPolicyCapability::CAN_EDIT); $actions->addAction(id(new PhabricatorActionView())->setName(pht('Edit Column'))->setIcon('fa-pencil')->setHref($this->getApplicationURI($base_uri . 'edit/' . $id . '/'))->setDisabled(!$can_edit)->setWorkflow(!$can_edit)); return $actions; }
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) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); $project_id = $request->getURIData('projectID'); $project = id(new PhabricatorProjectQuery())->setViewer($viewer)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->withIDs(array($project_id))->needImages(true)->executeOne(); if (!$project) { return new Aphront404Response(); } $this->setProject($project); $is_new = $id ? false : true; if (!$is_new) { $column = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$column) { return new Aphront404Response(); } } else { $column = PhabricatorProjectColumn::initializeNewColumn($viewer); } $e_name = null; $e_limit = null; $v_limit = $column->getPointLimit(); $v_name = $column->getName(); $validation_exception = null; $base_uri = '/board/' . $project_id . '/'; if ($is_new) { // we want to go back to the board $view_uri = $this->getApplicationURI($base_uri); } else { $view_uri = $this->getApplicationURI($base_uri . 'column/' . $id . '/'); } if ($request->isFormPost()) { $v_name = $request->getStr('name'); $v_limit = $request->getStr('limit'); if ($is_new) { $column->setProjectPHID($project->getPHID()); $column->attachProject($project); $columns = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withProjectPHIDs(array($project->getPHID()))->execute(); $new_sequence = 1; if ($columns) { $values = mpull($columns, 'getSequence'); $new_sequence = max($values) + 1; } $column->setSequence($new_sequence); } $xactions = array(); $type_name = PhabricatorProjectColumnTransaction::TYPE_NAME; $xactions[] = id(new PhabricatorProjectColumnTransaction())->setTransactionType($type_name)->setNewValue($v_name); $type_limit = PhabricatorProjectColumnTransaction::TYPE_LIMIT; $xactions[] = id(new PhabricatorProjectColumnTransaction())->setTransactionType($type_limit)->setNewValue($v_limit); try { $editor = id(new PhabricatorProjectColumnTransactionEditor())->setActor($viewer)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request)->applyTransactions($column, $xactions); return id(new AphrontRedirectResponse())->setURI($view_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $e_name = $ex->getShortMessage($type_name); $e_limit = $ex->getShortMessage($type_limit); $validation_exception = $ex; } } $form = new AphrontFormView(); $form->setUser($request->getUser())->appendChild(id(new AphrontFormTextControl())->setValue($v_name)->setLabel(pht('Name'))->setName('name')->setError($e_name)->setCaption(pht('This will be displayed as the header of the column.')))->appendChild(id(new AphrontFormTextControl())->setValue($v_limit)->setLabel(pht('Point Limit'))->setName('limit')->setError($e_limit)->setCaption(pht('Maximum number of points of tasks allowed in the column.'))); if ($is_new) { $title = pht('Create Column'); $submit = pht('Create Column'); } else { $title = pht('Edit %s', $column->getDisplayName()); $submit = pht('Save Column'); } $form->appendChild(id(new AphrontFormSubmitControl())->setValue($submit)->addCancelButton($view_uri)); $form_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setValidationException($validation_exception)->setForm($form); $nav = $this->buildIconNavView($project); $nav->appendChild($form_box); return $this->buildApplicationPage($nav, array('title' => $title)); }
private function buildColumnMenu(PhabricatorProject $project, PhabricatorProjectColumn $column) { $request = $this->getRequest(); $viewer = $request->getUser(); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $project, PhabricatorPolicyCapability::CAN_EDIT); $column_items = array(); $column_items[] = id(new PhabricatorActionView())->setIcon('fa-plus')->setName(pht('Create Task...'))->setHref('/maniphest/task/create/')->addSigil('column-add-task')->setMetadata(array('columnPHID' => $column->getPHID()))->setDisabled(!$can_edit); $edit_uri = $this->getApplicationURI('board/' . $this->id . '/column/' . $column->getID() . '/'); $column_items[] = id(new PhabricatorActionView())->setIcon('fa-pencil')->setName(pht('Edit Column'))->setHref($edit_uri)->setDisabled(!$can_edit)->setWorkflow(!$can_edit); $can_hide = $can_edit && !$column->isDefaultColumn(); $hide_uri = 'board/' . $this->id . '/hide/' . $column->getID() . '/'; $hide_uri = $this->getApplicationURI($hide_uri); $hide_uri = $this->getURIWithState($hide_uri); if (!$column->isHidden()) { $column_items[] = id(new PhabricatorActionView())->setName(pht('Hide Column'))->setIcon('fa-eye-slash')->setHref($hide_uri)->setDisabled(!$can_hide)->setWorkflow(true); } else { $column_items[] = id(new PhabricatorActionView())->setName(pht('Show Column'))->setIcon('fa-eye')->setHref($hide_uri)->setDisabled(!$can_hide)->setWorkflow(true); } $column_menu = id(new PhabricatorActionListView())->setUser($viewer); foreach ($column_items as $item) { $column_menu->addAction($item); } $column_button = id(new PHUIIconView())->setIconFont('fa-caret-down')->setHref('#')->addSigil('boards-dropdown-menu')->setMetadata(array('items' => hsprintf('%s', $column_menu))); return $column_button; }
<?php // Was PhabricatorEdgeConfig::TYPE_COLUMN_HAS_OBJECT $type_has_object = 44; $column = new PhabricatorProjectColumn(); $conn_w = $column->establishConnection('w'); $rows = queryfx_all($conn_w, 'SELECT src, dst FROM %T WHERE type = %d', PhabricatorEdgeConfig::TABLE_NAME_EDGE, $type_has_object); $cols = array(); foreach ($rows as $row) { $cols[$row['src']][] = $row['dst']; } $sql = array(); foreach ($cols as $col_phid => $obj_phids) { echo pht("Migrating column '%s'...", $col_phid) . "\n"; $column = id(new PhabricatorProjectColumn())->loadOneWhere('phid = %s', $col_phid); if (!$column) { echo pht("Column '%s' does not exist.", $col_phid) . "\n"; continue; } $sequence = 0; foreach ($obj_phids as $obj_phid) { $sql[] = qsprintf($conn_w, '(%s, %s, %s, %d)', $column->getProjectPHID(), $column->getPHID(), $obj_phid, $sequence++); } } echo pht('Inserting rows...') . "\n"; foreach (PhabricatorLiskDAO::chunkSQL($sql) as $chunk) { queryfx($conn_w, 'INSERT INTO %T (boardPHID, columnPHID, objectPHID, sequence) VALUES %Q', id(new PhabricatorProjectColumnPosition())->getTableName(), $chunk); } echo pht('Done.') . "\n";
<?php $table = new PhabricatorProjectColumn(); $conn_w = $table->establishConnection('w'); foreach (new LiskMigrationIterator($table) as $column) { $id = $column->getID(); echo pht('Adjusting column %d...', $id) . "\n"; if ($column->getSequence() == 0) { $properties = $column->getProperties(); $properties['isDefault'] = true; queryfx($conn_w, 'UPDATE %T SET properties = %s WHERE id = %d', $table->getTableName(), json_encode($properties), $id); } } echo pht('Done.') . "\n";
private function buildInitializeContent(PhabricatorProject $project) { $request = $this->getRequest(); $viewer = $this->getViewer(); $type = $request->getStr('initialize-type'); $id = $project->getID(); $profile_uri = $this->getApplicationURI("profile/{$id}/"); $board_uri = $this->getApplicationURI("board/{$id}/"); $import_uri = $this->getApplicationURI("board/{$id}/import/"); $set_default = $request->getBool('default'); if ($set_default) { $this->getProfilePanelEngine()->adjustDefault(PhabricatorProject::PANEL_WORKBOARD); } if ($request->isFormPost()) { if ($type == 'backlog-only') { $column = PhabricatorProjectColumn::initializeNewColumn($viewer)->setSequence(0)->setProperty('isDefault', true)->setProjectPHID($project->getPHID())->save(); $project->setHasWorkboard(1)->save(); return id(new AphrontRedirectResponse())->setURI($board_uri); } else { return id(new AphrontRedirectResponse())->setURI($import_uri); } } $new_selector = id(new AphrontFormRadioButtonControl())->setLabel(pht('Columns'))->setName('initialize-type')->setValue('backlog-only')->addButton('backlog-only', pht('New Empty Board'), pht('Create a new board with just a backlog column.'))->addButton('import', pht('Import Columns'), pht('Import board columns from another project.')); $default_checkbox = id(new AphrontFormCheckboxControl())->setLabel(pht('Make Default'))->addCheckbox('default', 1, pht('Make the workboard the default view for this project.'), true); $form = id(new AphrontFormView())->setUser($viewer)->appendRemarkupInstructions(pht('The workboard for this project has not been created yet.'))->appendControl($new_selector)->appendControl($default_checkbox)->appendControl(id(new AphrontFormSubmitControl())->addCancelButton($profile_uri)->setValue(pht('Create Workboard'))); $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Create Workboard'))->setForm($form); return $box; }
private function refreshColumn(PhabricatorUser $viewer, PhabricatorProjectColumn $column) { $results = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withIDs(array($column->getID()))->execute(); if ($results) { return head($results); } else { return null; } }
private function loadColumns(array $boards) { $viewer = $this->getViewer(); $columns = id(new PhabricatorProjectColumnQuery())->setViewer($viewer)->withProjectPHIDs(array_keys($boards))->execute(); $columns = msort($columns, 'getOrderingKey'); $columns = mpull($columns, null, 'getPHID'); $need_children = array(); foreach ($boards as $phid => $board) { if ($board->getHasMilestones() || $board->getHasSubprojects()) { $need_children[] = $phid; } } if ($need_children) { $children = id(new PhabricatorProjectQuery())->setViewer($viewer)->withParentProjectPHIDs($need_children)->execute(); $children = mpull($children, null, 'getPHID'); $children = mgroup($children, 'getParentProjectPHID'); } else { $children = array(); } $columns = mgroup($columns, 'getProjectPHID'); foreach ($boards as $board_phid => $board) { $board_columns = idx($columns, $board_phid, array()); // If the project has milestones, create any missing columns. if ($board->getHasMilestones() || $board->getHasSubprojects()) { $child_projects = idx($children, $board_phid, array()); if ($board_columns) { $next_sequence = last($board_columns)->getSequence() + 1; } else { $next_sequence = 1; } $proxy_columns = mpull($board_columns, null, 'getProxyPHID'); foreach ($child_projects as $child_phid => $child) { if (isset($proxy_columns[$child_phid])) { continue; } $new_column = PhabricatorProjectColumn::initializeNewColumn($viewer)->attachProject($board)->attachProxy($child)->setSequence($next_sequence++)->setProjectPHID($board_phid)->setProxyPHID($child_phid); $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); $new_column->save(); unset($unguarded); $board_columns[$new_column->getPHID()] = $new_column; } } $board_columns = msort($board_columns, 'getOrderingKey'); $columns[$board_phid] = $board_columns; } foreach ($columns as $board_phid => $board_columns) { foreach ($board_columns as $board_column) { $column_phid = $board_column->getPHID(); $this->columnMap[$column_phid] = $board_column; } } return $columns; }
private function addColumn(PhabricatorUser $viewer, PhabricatorProject $project, $sequence) { $project->setHasWorkboard(1)->save(); return PhabricatorProjectColumn::initializeNewColumn($viewer)->setSequence(0)->setProperty('isDefault', $sequence == 0)->setProjectPHID($project->getPHID())->save(); }