/**
  * This is enforced in @{class:PhabricatorProjectTransactionEditor}. We use
  * this logic to render a better form for users hitting this case.
  */
 private function userCannotLeave(PhabricatorProject $project)
 {
     $viewer = $this->getViewer();
     return $project->getIsMembershipLocked() && !PhabricatorPolicyFilter::hasCapability($viewer, $project, PhabricatorPolicyCapability::CAN_EDIT);
 }
 private function buildActions(PhabricatorProject $project)
 {
     $viewer = $this->getViewer();
     $id = $project->getID();
     $view = id(new PhabricatorActionListView())->setUser($viewer);
     $is_locked = $project->getIsMembershipLocked();
     $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $project, PhabricatorPolicyCapability::CAN_EDIT);
     $supports_edit = $project->supportsEditMembers();
     $can_join = $supports_edit && PhabricatorPolicyFilter::hasCapability($viewer, $project, PhabricatorPolicyCapability::CAN_JOIN);
     $can_leave = $supports_edit && (!$is_locked || $can_edit);
     $viewer_phid = $viewer->getPHID();
     if (!$project->isUserMember($viewer_phid)) {
         $view->addAction(id(new PhabricatorActionView())->setHref('/project/update/' . $project->getID() . '/join/')->setIcon('fa-plus')->setDisabled(!$can_join)->setWorkflow(true)->setName(pht('Join Project')));
     } else {
         $view->addAction(id(new PhabricatorActionView())->setHref('/project/update/' . $project->getID() . '/leave/')->setIcon('fa-times')->setDisabled(!$can_leave)->setWorkflow(true)->setName(pht('Leave Project')));
     }
     if (!$project->isUserWatcher($viewer->getPHID())) {
         $view->addAction(id(new PhabricatorActionView())->setWorkflow(true)->setHref('/project/watch/' . $project->getID() . '/')->setIcon('fa-eye')->setName(pht('Watch Project')));
     } else {
         $view->addAction(id(new PhabricatorActionView())->setWorkflow(true)->setHref('/project/unwatch/' . $project->getID() . '/')->setIcon('fa-eye-slash')->setName(pht('Unwatch Project')));
     }
     $can_silence = $project->isUserMember($viewer_phid);
     $is_silenced = $this->isProjectSilenced($project);
     if ($is_silenced) {
         $silence_text = pht('Enable Mail');
     } else {
         $silence_text = pht('Disable Mail');
     }
     $view->addAction(id(new PhabricatorActionView())->setName($silence_text)->setIcon('fa-envelope-o')->setHref("/project/silence/{$id}/")->setWorkflow(true)->setDisabled(!$can_silence));
     $can_add = $can_edit && $supports_edit;
     $view->addAction(id(new PhabricatorActionView())->setName(pht('Add Members'))->setIcon('fa-user-plus')->setHref("/project/members/{$id}/add/")->setWorkflow(true)->setDisabled(!$can_add));
     $can_lock = $can_edit && $supports_edit && $this->hasApplicationCapability(ProjectCanLockProjectsCapability::CAPABILITY);
     if ($is_locked) {
         $lock_name = pht('Unlock Project');
         $lock_icon = 'fa-unlock';
     } else {
         $lock_name = pht('Lock Project');
         $lock_icon = 'fa-lock';
     }
     $view->addAction(id(new PhabricatorActionView())->setName($lock_name)->setIcon($lock_icon)->setHref($this->getApplicationURI("lock/{$id}/"))->setDisabled(!$can_lock)->setWorkflow(true));
     return $view;
 }