public function renderContextualDescription(PhabricatorConfigOption $option, AphrontRequest $request)
 {
     switch ($option->getKey()) {
         case 'asana.workspace-id':
             break;
         case 'asana.project-ids':
             return $this->renderContextualProjectDescription($option, $request);
         default:
             return parent::renderContextualDescription($option, $request);
     }
     $viewer = $request->getUser();
     $provider = PhabricatorAsanaAuthProvider::getAsanaProvider();
     if (!$provider) {
         return null;
     }
     $account = id(new PhabricatorExternalAccountQuery())->setViewer($viewer)->withUserPHIDs(array($viewer->getPHID()))->withAccountTypes(array($provider->getProviderType()))->withAccountDomains(array($provider->getProviderDomain()))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne();
     if (!$account) {
         return null;
     }
     $token = $provider->getOAuthAccessToken($account);
     if (!$token) {
         return null;
     }
     try {
         $workspaces = id(new PhutilAsanaFuture())->setAccessToken($token)->setRawAsanaQuery('workspaces')->resolve();
     } catch (Exception $ex) {
         return null;
     }
     if (!$workspaces) {
         return null;
     }
     $out = array();
     $out[] = pht('| Workspace ID | Workspace Name |');
     $out[] = '| ------------ | -------------- |';
     foreach ($workspaces as $workspace) {
         $out[] = sprintf('| `%s` | `%s` |', $workspace['id'], $workspace['name']);
     }
     $out = implode("\n", $out);
     $out = pht("The Asana Workspaces your linked account has access to are:\n\n%s", $out);
     return PhabricatorMarkupEngine::renderOneObject(id(new PhabricatorMarkupOneOff())->setContent($out), 'default', $viewer);
 }