Path: blob/master/src/applications/doorkeeper/option/PhabricatorAsanaConfigOptions.php
12256 views
<?php12final class PhabricatorAsanaConfigOptions3extends PhabricatorApplicationConfigOptions {45public function getName() {6return pht('Integration with Asana');7}89public function getDescription() {10return pht('Asana integration options.');11}1213public function getIcon() {14return 'fa-exchange';15}1617public function getGroup() {18return 'core';19}2021public function getOptions() {22return array(23$this->newOption('asana.workspace-id', 'string', null)24->setSummary(pht('Asana Workspace ID to publish into.'))25->setDescription(26pht(27'To enable synchronization into Asana, enter an Asana Workspace '.28'ID here.'.29"\n\n".30"NOTE: This feature is new and experimental.")),31$this->newOption('asana.project-ids', 'wild', null)32->setSummary(pht('Optional Asana projects to use as application tags.'))33->setDescription(34pht(35'When %s creates tasks in Asana, it can add the tasks '.36'to Asana projects based on which application the corresponding '.37'object in %s comes from. For example, you can add code '.38'reviews in Asana to a "Differential" project.'.39"\n\n".40'NOTE: This feature is new and experimental.',41PlatformSymbols::getPlatformServerName(),42PlatformSymbols::getPlatformServerName())),43);44}4546public function renderContextualDescription(47PhabricatorConfigOption $option,48AphrontRequest $request) {4950switch ($option->getKey()) {51case 'asana.workspace-id':52break;53case 'asana.project-ids':54return $this->renderContextualProjectDescription($option, $request);55default:56return parent::renderContextualDescription($option, $request);57}5859$viewer = $request->getUser();6061$provider = PhabricatorAsanaAuthProvider::getAsanaProvider();62if (!$provider) {63return null;64}6566$account = id(new PhabricatorExternalAccountQuery())67->setViewer($viewer)68->withUserPHIDs(array($viewer->getPHID()))69->withProviderConfigPHIDs(70array(71$provider->getProviderConfigPHID(),72))73->requireCapabilities(74array(75PhabricatorPolicyCapability::CAN_VIEW,76PhabricatorPolicyCapability::CAN_EDIT,77))78->executeOne();79if (!$account) {80return null;81}8283$token = $provider->getOAuthAccessToken($account);84if (!$token) {85return null;86}8788try {89$workspaces = id(new PhutilAsanaFuture())90->setAccessToken($token)91->setRawAsanaQuery('workspaces')92->resolve();93} catch (Exception $ex) {94return null;95}9697if (!$workspaces) {98return null;99}100101$out = array();102$out[] = sprintf(103'| %s | %s |',104pht('Workspace ID'),105pht('Workspace Name'));106$out[] = '| ------------ | -------------- |';107foreach ($workspaces as $workspace) {108$out[] = sprintf(109'| `%s` | `%s` |',110$workspace['gid'],111$workspace['name']);112}113114$out = implode("\n", $out);115116$out = pht(117"The Asana Workspaces your linked account has access to are:\n\n%s",118$out);119120return new PHUIRemarkupView($viewer, $out);121}122123private function renderContextualProjectDescription(124PhabricatorConfigOption $option,125AphrontRequest $request) {126127$viewer = $request->getUser();128129$publishers = id(new PhutilClassMapQuery())130->setAncestorClass('DoorkeeperFeedStoryPublisher')131->execute();132133$out = array();134$out[] = pht(135'To specify projects to add tasks to, enter a JSON map with publisher '.136'class names as keys and a list of project IDs as values. For example, '.137'to put Differential tasks into Asana projects with IDs `123` and '.138'`456`, enter:'.139"\n\n".140" lang=txt\n".141" {\n".142" \"DifferentialDoorkeeperRevisionFeedStoryPublisher\" : [123, 456]\n".143" }\n");144145$out[] = pht('Available publishers class names are:');146foreach ($publishers as $publisher) {147$out[] = ' - `'.get_class($publisher).'`';148}149150$out[] = pht(151'You can find an Asana project ID by clicking the project in Asana and '.152'then examining the URL:'.153"\n\n".154" lang=txt\n".155" https://app.asana.com/0/12345678901234567890/111111111111111111\n".156" ^^^^^^^^^^^^^^^^^^^^\n".157" This is the ID to use.\n");158159$out = implode("\n", $out);160161return new PHUIRemarkupView($viewer, $out);162}163164}165166167