Path: blob/master/src/applications/daemon/controller/PhabricatorDaemonBulkJobMonitorController.php
12256 views
<?php12final class PhabricatorDaemonBulkJobMonitorController3extends PhabricatorDaemonBulkJobController {45public function handleRequest(AphrontRequest $request) {6$viewer = $this->getViewer();78$job = id(new PhabricatorWorkerBulkJobQuery())9->setViewer($viewer)10->withIDs(array($request->getURIData('id')))11->executeOne();12if (!$job) {13return new Aphront404Response();14}1516// If the user clicks "Continue" on a completed job, take them back to17// whatever application sent them here.18if ($request->getStr('done')) {19if ($request->isFormPost()) {20$done_uri = $job->getDoneURI();21return id(new AphrontRedirectResponse())->setURI($done_uri);22}23}2425$title = pht('Bulk Job %d', $job->getID());2627if ($job->getStatus() == PhabricatorWorkerBulkJob::STATUS_CONFIRM) {28$can_edit = PhabricatorPolicyFilter::hasCapability(29$viewer,30$job,31PhabricatorPolicyCapability::CAN_EDIT);3233if ($can_edit) {34if ($request->isFormPost()) {35$type_status = PhabricatorWorkerBulkJobTransaction::TYPE_STATUS;3637$xactions = array();38$xactions[] = id(new PhabricatorWorkerBulkJobTransaction())39->setTransactionType($type_status)40->setNewValue(PhabricatorWorkerBulkJob::STATUS_WAITING);4142$editor = id(new PhabricatorWorkerBulkJobEditor())43->setActor($viewer)44->setContentSourceFromRequest($request)45->setContinueOnMissingFields(true)46->applyTransactions($job, $xactions);4748return id(new AphrontRedirectResponse())49->setURI($job->getMonitorURI());50} else {51$dialog = $this->newDialog()52->setTitle(pht('Confirm Bulk Job'));5354$confirm = $job->getDescriptionForConfirm();55$confirm = (array)$confirm;56foreach ($confirm as $paragraph) {57$dialog->appendParagraph($paragraph);58}5960$dialog61->appendParagraph(62pht('Start work on this bulk job?'))63->addCancelButton($job->getManageURI(), pht('Details'))64->addSubmitButton(pht('Start Work'));6566return $dialog;67}68} else {69return $this->newDialog()70->setTitle(pht('Waiting For Confirmation'))71->appendParagraph(72pht(73'This job is waiting for confirmation before work begins.'))74->addCancelButton($job->getManageURI(), pht('Details'));75}76}777879$dialog = $this->newDialog()80->setTitle(pht('%s: %s', $title, $job->getStatusName()))81->addCancelButton($job->getManageURI(), pht('Details'));8283switch ($job->getStatus()) {84case PhabricatorWorkerBulkJob::STATUS_WAITING:85$dialog->appendParagraph(86pht('This job is waiting for tasks to be queued.'));87break;88case PhabricatorWorkerBulkJob::STATUS_RUNNING:89$dialog->appendParagraph(90pht('This job is running.'));91break;92case PhabricatorWorkerBulkJob::STATUS_COMPLETE:93$dialog->appendParagraph(94pht('This job is complete.'));95break;96}9798$counts = $job->loadTaskStatusCounts();99if ($counts) {100$dialog->appendParagraph($this->renderProgress($counts));101}102103switch ($job->getStatus()) {104case PhabricatorWorkerBulkJob::STATUS_COMPLETE:105$dialog->addHiddenInput('done', true);106$dialog->addSubmitButton(pht('Continue'));107break;108default:109Javelin::initBehavior('bulk-job-reload');110break;111}112113return $dialog;114}115116private function renderProgress(array $counts) {117$this->requireResource('bulk-job-css');118119$states = array(120PhabricatorWorkerBulkTask::STATUS_DONE => array(121'class' => 'bulk-job-progress-slice-green',122),123PhabricatorWorkerBulkTask::STATUS_RUNNING => array(124'class' => 'bulk-job-progress-slice-blue',125),126PhabricatorWorkerBulkTask::STATUS_WAITING => array(127'class' => 'bulk-job-progress-slice-empty',128),129PhabricatorWorkerBulkTask::STATUS_FAIL => array(130'class' => 'bulk-job-progress-slice-red',131),132);133134$total = array_sum($counts);135$offset = 0;136$bars = array();137foreach ($states as $state => $spec) {138$size = idx($counts, $state, 0);139if (!$size) {140continue;141}142143$classes = array();144$classes[] = 'bulk-job-progress-slice';145$classes[] = $spec['class'];146147$width = ($size / $total);148$bars[] = phutil_tag(149'div',150array(151'class' => implode(' ', $classes),152'style' =>153'left: '.sprintf('%.2f%%', 100 * $offset).'; '.154'width: '.sprintf('%.2f%%', 100 * $width).';',155),156'');157158$offset += $width;159}160161return phutil_tag(162'div',163array(164'class' => 'bulk-job-progress-bar',165),166$bars);167}168169}170171172