diff --git a/src/applications/phrequent/controller/PhrequentTrackController.php b/src/applications/phrequent/controller/PhrequentTrackController.php --- a/src/applications/phrequent/controller/PhrequentTrackController.php +++ b/src/applications/phrequent/controller/PhrequentTrackController.php @@ -15,18 +15,90 @@ $request = $this->getRequest(); $user = $request->getUser(); + $phid = $this->phid; + $handle = id(new PhabricatorHandleQuery()) + ->setViewer($user) + ->withPHIDs(array($phid)) + ->executeOne(); + if (!$this->isStartingTracking() && !$this->isStoppingTracking()) { throw new Exception('Unrecognized verb: ' . $this->verb); } - if ($this->isStartingTracking()) { - $this->startTracking($user, $this->phid); - } else if ($this->isStoppingTracking()) { - $this->stopTracking($user, $this->phid); + switch ($this->verb) { + case 'start': + $button_text = pht('Start Tracking'); + $title_text = pht('Start Tracking Time'); + $inner_text = pht('What time did you start working?'); + $action_text = pht('Start Timer'); + $label_text = pht('Start Time'); + break; + case 'stop': + $button_text = pht('Stop Tracking'); + $title_text = pht('Stop Tracking Time'); + $inner_text = pht('What time did you stop working?'); + $action_text = pht('Stop Timer'); + $label_text = pht('Stop Time'); + break; } - return id(new AphrontRedirectResponse()); + $epoch_control = id(new AphrontFormDateControl()) + ->setUser($user) + ->setName('epoch') + ->setLabel($action_text) + ->setValue(time()); + + $err = array(); + + if ($request->isDialogFormPost()) { + $timestamp = $epoch_control->readValueFromRequest($request); + $note = $request->getStr('note'); + + if (!$epoch_control->isValid() || $timestamp > time()) { + $err[] = pht('Invalid date, please enter a valid non-future date'); + } + + if (!$err) { + if ($this->isStartingTracking()) { + $this->startTracking($user, $this->phid, $timestamp); + } else if ($this->isStoppingTracking()) { + $this->stopTracking($user, $this->phid, $timestamp, $note); + } + return id(new AphrontRedirectResponse()); + } + + } + + $dialog = $this->newDialog() + ->setTitle($title_text) + ->setWidth(AphrontDialogView::WIDTH_FORM); + + if ($err) { + $dialog->setErrors($err); + } + + $form = new PHUIFormLayoutView(); + $form + ->appendChild(hsprintf( + "

%s


", $inner_text)); + + $form->appendChild($epoch_control); + + if ($this->isStoppingTracking()) { + $form + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Note')) + ->setName('note')); + } + + $dialog->appendChild($form); + + $dialog->addCancelButton($handle->getURI()); + $dialog->addSubmitButton($action_text); + + return $dialog; } private function isStartingTracking() { @@ -37,15 +109,15 @@ return $this->verb === 'stop'; } - private function startTracking($user, $phid) { + private function startTracking($user, $phid, $timestamp) { $usertime = new PhrequentUserTime(); - $usertime->setDateStarted(time()); + $usertime->setDateStarted($timestamp); $usertime->setUserPHID($user->getPHID()); $usertime->setObjectPHID($phid); $usertime->save(); } - private function stopTracking($user, $phid) { + private function stopTracking($user, $phid, $timestamp, $note) { if (!PhrequentUserTimeQuery::isUserTrackingObject($user, $phid)) { // Don't do anything, it's not being tracked. return; @@ -57,13 +129,16 @@ queryfx( $conn, 'UPDATE %T usertime '. - 'SET usertime.dateEnded = UNIX_TIMESTAMP() '. + 'SET usertime.dateEnded = %d, '. + 'usertime.note = %s '. 'WHERE usertime.userPHID = %s '. 'AND usertime.objectPHID = %s '. 'AND usertime.dateEnded IS NULL '. 'ORDER BY usertime.dateStarted, usertime.id DESC '. 'LIMIT 1', $usertime_dao->getTableName(), + $timestamp, + $note, $user->getPHID(), $phid); }