mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00:32:42 +01:00
Show more in Application Detail and List view
Summary: Update the Application Detail view and List View to show a unified set of Badges (Deprecated, etc.), show PHIDs and Monograms on the Application Detail view, allow Applications to register Monograms. Example of the page /applications/view/PhabricatorDiffusionApplication/: {F393393} T15568 Test Plan: 1. Visit /applications/ and see Deprecated badges etc. 2. Visit various Configure buttons from that list and see Monograms, Badges, PHIDs etc. 3. Enjoy screenshots in the comments of this Diff Reviewers: O1 Blessed Committers, valerio.bozzolan, avivey, speck Reviewed By: O1 Blessed Committers, valerio.bozzolan, avivey, speck Subscribers: avivey, speck, tobiaswiese, valerio.bozzolan, Cigaryno Differential Revision: https://we.phorge.it/D25362
This commit is contained in:
parent
a741f5d65c
commit
1b49165ddd
26 changed files with 189 additions and 6 deletions
|
@ -61,6 +61,21 @@ abstract class PhabricatorApplication
|
||||||
return pht('%s Application', $this->getName());
|
return pht('%s Application', $this->getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensions are allowed to register multi-character monograms.
|
||||||
|
* The name "Monogram" is actually a bit of a misnomer,
|
||||||
|
* but we're keeping it due to the history.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getMonograms() {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isDeprecated() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
final public function isInstalled() {
|
final public function isInstalled() {
|
||||||
if (!$this->canUninstall()) {
|
if (!$this->canUninstall()) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -28,6 +28,10 @@ final class PhabricatorCalendarApplication extends PhabricatorApplication {
|
||||||
return "\xE2\x8C\xA8";
|
return "\xE2\x8C\xA8";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('E');
|
||||||
|
}
|
||||||
|
|
||||||
public function getApplicationGroup() {
|
public function getApplicationGroup() {
|
||||||
return self::GROUP_UTILITIES;
|
return self::GROUP_UTILITIES;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ final class PhabricatorChatLogApplication extends PhabricatorApplication {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getShortDescription() {
|
public function getShortDescription() {
|
||||||
return pht('(Deprecated)');
|
return pht('IRC Logs');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getIcon() {
|
public function getIcon() {
|
||||||
|
@ -22,6 +22,10 @@ final class PhabricatorChatLogApplication extends PhabricatorApplication {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isDeprecated() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public function getTitleGlyph() {
|
public function getTitleGlyph() {
|
||||||
return "\xE0\xBC\x84";
|
return "\xE0\xBC\x84";
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@ final class PhabricatorConpherenceApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('Z');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/Z(?P<id>[1-9]\d*)'
|
'/Z(?P<id>[1-9]\d*)'
|
||||||
|
|
|
@ -36,6 +36,10 @@ final class PhabricatorCountdownApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('C');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/C(?P<id>[1-9]\d*)' => 'PhabricatorCountdownViewController',
|
'/C(?P<id>[1-9]\d*)' => 'PhabricatorCountdownViewController',
|
||||||
|
|
|
@ -30,6 +30,10 @@ final class PhabricatorDashboardApplication extends PhabricatorApplication {
|
||||||
return 0.160;
|
return 0.160;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('W');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
$menu_rules = $this->getProfileMenuRouting(
|
$menu_rules = $this->getProfileMenuRouting(
|
||||||
'PhabricatorDashboardPortalViewController');
|
'PhabricatorDashboardPortalViewController');
|
||||||
|
|
|
@ -42,6 +42,10 @@ final class PhabricatorDifferentialApplication
|
||||||
'engineers to review, discuss and approve changes to software.');
|
'engineers to review, discuss and approve changes to software.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('D');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/D(?P<id>[1-9]\d*)' => array(
|
'/D(?P<id>[1-9]\d*)' => array(
|
||||||
|
|
|
@ -44,6 +44,11 @@ final class PhabricatorDiffusionApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
// This is a special case, as r and R mean different things.
|
||||||
|
return array('r', 'R');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
$repository_routes = array(
|
$repository_routes = array(
|
||||||
'/' => array(
|
'/' => array(
|
||||||
|
|
|
@ -67,6 +67,10 @@ final class PhabricatorFilesApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('F');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/F(?P<id>[1-9]\d*)(?:\$(?P<lines>\d+(?:-\d+)?))?'
|
'/F(?P<id>[1-9]\d*)(?:\$(?P<lines>\d+(?:-\d+)?))?'
|
||||||
|
|
|
@ -36,6 +36,10 @@ final class PhabricatorFundApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('I');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/I(?P<id>[1-9]\d*)' => 'FundInitiativeViewController',
|
'/I(?P<id>[1-9]\d*)' => 'FundInitiativeViewController',
|
||||||
|
|
|
@ -51,6 +51,10 @@ final class PhabricatorHarbormasterApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('B');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/B(?P<id>[1-9]\d*)' => 'HarbormasterBuildableViewController',
|
'/B(?P<id>[1-9]\d*)' => 'HarbormasterBuildableViewController',
|
||||||
|
|
|
@ -49,6 +49,10 @@ final class PhabricatorHeraldApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('H');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/H(?P<id>[1-9]\d*)' => 'HeraldRuleViewController',
|
'/H(?P<id>[1-9]\d*)' => 'HeraldRuleViewController',
|
||||||
|
|
|
@ -48,6 +48,10 @@ final class PhabricatorLegalpadApplication extends PhabricatorApplication {
|
||||||
'open source projects keep track of Contributor License Agreements.');
|
'open source projects keep track of Contributor License Agreements.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('L');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/L(?P<id>\d+)' => 'LegalpadDocumentSignController',
|
'/L(?P<id>\d+)' => 'LegalpadDocumentSignController',
|
||||||
|
|
|
@ -42,6 +42,10 @@ final class PhabricatorManiphestApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('T');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/T(?P<id>[1-9]\d*)' => 'ManiphestTaskDetailController',
|
'/T(?P<id>[1-9]\d*)' => 'ManiphestTaskDetailController',
|
||||||
|
|
|
@ -38,6 +38,30 @@ final class PhabricatorApplicationDetailViewController
|
||||||
$header->setStatus('fa-ban', 'dark', pht('Uninstalled'));
|
$header->setStatus('fa-ban', 'dark', pht('Uninstalled'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!$selected->isFirstParty()) {
|
||||||
|
$header->addTag(id(new PHUITagView())
|
||||||
|
->setName('Extension')
|
||||||
|
->setIcon('fa-plug')
|
||||||
|
->setColor(PHUITagView::COLOR_INDIGO)
|
||||||
|
->setType(PHUITagView::TYPE_SHADE));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($selected->isPrototype()) {
|
||||||
|
$header->addTag(id(new PHUITagView())
|
||||||
|
->setName('Prototype')
|
||||||
|
->setIcon('fa-exclamation-circle')
|
||||||
|
->setColor(PHUITagView::COLOR_ORANGE)
|
||||||
|
->setType(PHUITagView::TYPE_SHADE));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($selected->isDeprecated()) {
|
||||||
|
$header->addTag(id(new PHUITagView())
|
||||||
|
->setName('Deprecated')
|
||||||
|
->setIcon('fa-exclamation-triangle')
|
||||||
|
->setColor(PHUITagView::COLOR_RED)
|
||||||
|
->setType(PHUITagView::TYPE_SHADE));
|
||||||
|
}
|
||||||
|
|
||||||
$timeline = $this->buildTransactionTimeline(
|
$timeline = $this->buildTransactionTimeline(
|
||||||
$selected,
|
$selected,
|
||||||
new PhabricatorApplicationApplicationTransactionQuery());
|
new PhabricatorApplicationApplicationTransactionQuery());
|
||||||
|
@ -95,6 +119,27 @@ final class PhabricatorApplicationDetailViewController
|
||||||
phutil_tag('em', array(), $application->getFlavorText()));
|
phutil_tag('em', array(), $application->getFlavorText()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$phids = PhabricatorPHIDType::getAllTypesForApplication(
|
||||||
|
get_class($application));
|
||||||
|
|
||||||
|
$user_friendly_phids = array();
|
||||||
|
foreach ($phids as $phid => $type) {
|
||||||
|
$user_friendly_phids[] = "PHID-{$phid} ({$type->getTypeName()})";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user_friendly_phids) {
|
||||||
|
$properties->addProperty(
|
||||||
|
'PHIDs',
|
||||||
|
phutil_implode_html(phutil_tag('br'), $user_friendly_phids));
|
||||||
|
}
|
||||||
|
|
||||||
|
$monograms = $application->getMonograms();
|
||||||
|
if ($monograms) {
|
||||||
|
$properties->addProperty(
|
||||||
|
'Monograms',
|
||||||
|
phutil_implode_html(', ', $monograms));
|
||||||
|
}
|
||||||
|
|
||||||
if ($application->isPrototype()) {
|
if ($application->isPrototype()) {
|
||||||
$proto_href = PhabricatorEnv::getDoclink(
|
$proto_href = PhabricatorEnv::getDoclink(
|
||||||
'User Guide: Prototype Applications');
|
'User Guide: Prototype Applications');
|
||||||
|
|
|
@ -231,13 +231,13 @@ final class PhabricatorAppSearchEngine
|
||||||
->setSideColumn($configure);
|
->setSideColumn($configure);
|
||||||
|
|
||||||
if (!$application->isFirstParty()) {
|
if (!$application->isFirstParty()) {
|
||||||
$tag = id(new PHUITagView())
|
$extension_tag = id(new PHUITagView())
|
||||||
->setName(pht('Extension'))
|
->setName(pht('Extension'))
|
||||||
->setIcon('fa-puzzle-piece')
|
->setIcon('fa-plug')
|
||||||
->setColor(PHUITagView::COLOR_BLUE)
|
->setColor(PHUITagView::COLOR_INDIGO)
|
||||||
->setType(PHUITagView::TYPE_SHADE)
|
->setType(PHUITagView::TYPE_SHADE)
|
||||||
->setSlimShady(true);
|
->setSlimShady(true);
|
||||||
$item->addAttribute($tag);
|
$item->addAttribute($extension_tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($application->isPrototype()) {
|
if ($application->isPrototype()) {
|
||||||
|
@ -250,6 +250,16 @@ final class PhabricatorAppSearchEngine
|
||||||
$item->addAttribute($prototype_tag);
|
$item->addAttribute($prototype_tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($application->isDeprecated()) {
|
||||||
|
$deprecated_tag = id(new PHUITagView())
|
||||||
|
->setName(pht('Deprecated'))
|
||||||
|
->setIcon('fa-exclamation-triangle')
|
||||||
|
->setColor(PHUITagView::COLOR_RED)
|
||||||
|
->setType(PHUITagView::TYPE_SHADE)
|
||||||
|
->setSlimShady(true);
|
||||||
|
$item->addAttribute($deprecated_tag);
|
||||||
|
}
|
||||||
|
|
||||||
$item->addAttribute($description);
|
$item->addAttribute($description);
|
||||||
|
|
||||||
if ($application->getBaseURI() && $application->isInstalled()) {
|
if ($application->getBaseURI() && $application->isInstalled()) {
|
||||||
|
|
|
@ -45,6 +45,10 @@ final class PhabricatorOwnersApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('O');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/owners/' => array(
|
'/owners/' => array(
|
||||||
|
|
|
@ -34,6 +34,10 @@ final class PhabricatorPassphraseApplication extends PhabricatorApplication {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('K');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/K(?P<id>\d+)' => 'PassphraseCredentialViewController',
|
'/K(?P<id>\d+)' => 'PassphraseCredentialViewController',
|
||||||
|
|
|
@ -32,6 +32,10 @@ final class PhabricatorPasteApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('P');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/P(?P<id>[1-9]\d*)(?:\$(?P<lines>\d+(?:-\d+)?))?'
|
'/P(?P<id>[1-9]\d*)(?:\$(?P<lines>\d+(?:-\d+)?))?'
|
||||||
|
|
|
@ -31,6 +31,10 @@ final class PhabricatorPhameApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('J');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/J(?P<id>[1-9]\d*)' => 'PhamePostViewController',
|
'/J(?P<id>[1-9]\d*)' => 'PhamePostViewController',
|
||||||
|
|
|
@ -205,4 +205,28 @@ abstract class PhabricatorPHIDType extends Phobject {
|
||||||
return $installed_types;
|
return $installed_types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all PHID types of applications installed for a given viewer.
|
||||||
|
*
|
||||||
|
* @param PhabricatorUser Viewing user.
|
||||||
|
* @return dict<string, PhabricatorPHIDType> Map of constants to installed
|
||||||
|
* types.
|
||||||
|
*/
|
||||||
|
public static function getAllTypesForApplication(
|
||||||
|
string $application) {
|
||||||
|
$all_types = self::getAllTypes();
|
||||||
|
|
||||||
|
$application_types = array();
|
||||||
|
|
||||||
|
foreach ($all_types as $key => $type) {
|
||||||
|
if ($type->getPHIDTypeApplicationClass() != $application) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$application_types[$key] = $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $application_types;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,10 @@ final class PhabricatorPholioApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('M');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/M(?P<id>[1-9]\d*)(?:/(?P<imageID>\d+)/)?' => 'PholioMockViewController',
|
'/M(?P<id>[1-9]\d*)(?:/(?P<imageID>\d+)/)?' => 'PholioMockViewController',
|
||||||
|
|
|
@ -37,6 +37,10 @@ final class PhabricatorPhurlApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('U');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/U(?P<id>[1-9]\d*)/?' => 'PhabricatorPhurlURLViewController',
|
'/U(?P<id>[1-9]\d*)/?' => 'PhabricatorPhurlURLViewController',
|
||||||
|
|
|
@ -47,6 +47,10 @@ final class PhabricatorPonderApplication extends PhabricatorApplication {
|
||||||
pht('Learn More')));
|
pht('Learn More')));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('Q');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/Q(?P<id>[1-9]\d*)'
|
'/Q(?P<id>[1-9]\d*)'
|
||||||
|
|
|
@ -45,6 +45,10 @@ final class PhabricatorSlowvoteApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('V');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/V(?P<id>[1-9]\d*)' => 'PhabricatorSlowvotePollController',
|
'/V(?P<id>[1-9]\d*)' => 'PhabricatorSlowvotePollController',
|
||||||
|
|
|
@ -49,6 +49,10 @@ final class PhabricatorSpacesApplication extends PhabricatorApplication {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMonograms() {
|
||||||
|
return array('S');
|
||||||
|
}
|
||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/S(?P<id>[1-9]\d*)' => 'PhabricatorSpacesViewController',
|
'/S(?P<id>[1-9]\d*)' => 'PhabricatorSpacesViewController',
|
||||||
|
|
Loading…
Reference in a new issue