1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-03-28 04:00:17 +01:00

Modularize dashboard layout modes (one column, two columns, etc)

Summary:
Depends on D20405. Ref T13272. Currently, the `PhabricatorDashboardLayoutConfig` class uses a lot of `switch()` statements to define layout modes.

Although I'm not planning to add thousands of new layout modes, this (and upcoming changes) can be made substantially cleaner by using a standard modular approach.

(This doesn't fully remove `PhabricatorDashboardLayoutConfig` yet, but that will happen soon.)

Test Plan: Edited a dashboard, saw the same layout modes as before.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13272

Differential Revision: https://secure.phabricator.com/D20406
This commit is contained in:
epriestley 2019-04-12 08:34:43 -07:00
parent d0078570cc
commit 0381eed6e6
10 changed files with 181 additions and 12 deletions

View file

@ -2910,6 +2910,7 @@ phutil_register_library_map(array(
'PhabricatorDashboardApplication' => 'applications/dashboard/application/PhabricatorDashboardApplication.php',
'PhabricatorDashboardApplicationInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardApplicationInstallWorkflow.php',
'PhabricatorDashboardArchiveController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardArchiveController.php',
'PhabricatorDashboardColumn' => 'applications/dashboard/layoutconfig/PhabricatorDashboardColumn.php',
'PhabricatorDashboardConsoleController' => 'applications/dashboard/controller/PhabricatorDashboardConsoleController.php',
'PhabricatorDashboardController' => 'applications/dashboard/controller/PhabricatorDashboardController.php',
'PhabricatorDashboardDAO' => 'applications/dashboard/storage/PhabricatorDashboardDAO.php',
@ -2919,6 +2920,8 @@ phutil_register_library_map(array(
'PhabricatorDashboardEditController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardEditController.php',
'PhabricatorDashboardEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardEditEngine.php',
'PhabricatorDashboardFavoritesInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardFavoritesInstallWorkflow.php',
'PhabricatorDashboardFullLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardFullLayoutMode.php',
'PhabricatorDashboardHalfLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardHalfLayoutMode.php',
'PhabricatorDashboardHomeInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardHomeInstallWorkflow.php',
'PhabricatorDashboardIconSet' => 'applications/dashboard/icon/PhabricatorDashboardIconSet.php',
'PhabricatorDashboardIconTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardIconTransaction.php',
@ -2926,12 +2929,14 @@ phutil_register_library_map(array(
'PhabricatorDashboardInstallController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardInstallController.php',
'PhabricatorDashboardInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardInstallWorkflow.php',
'PhabricatorDashboardLayoutConfig' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutConfig.php',
'PhabricatorDashboardLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutMode.php',
'PhabricatorDashboardLayoutTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardLayoutTransaction.php',
'PhabricatorDashboardListController' => 'applications/dashboard/controller/PhabricatorDashboardListController.php',
'PhabricatorDashboardMovePanelController' => 'applications/dashboard/controller/PhabricatorDashboardMovePanelController.php',
'PhabricatorDashboardNameTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardNameTransaction.php',
'PhabricatorDashboardNgrams' => 'applications/dashboard/storage/PhabricatorDashboardNgrams.php',
'PhabricatorDashboardObjectInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardObjectInstallWorkflow.php',
'PhabricatorDashboardOneThirdLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardOneThirdLayoutMode.php',
'PhabricatorDashboardPanel' => 'applications/dashboard/storage/PhabricatorDashboardPanel.php',
'PhabricatorDashboardPanelArchiveController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelArchiveController.php',
'PhabricatorDashboardPanelContainerIndexEngineExtension' => 'applications/dashboard/engineextension/PhabricatorDashboardPanelContainerIndexEngineExtension.php',
@ -3006,6 +3011,7 @@ phutil_register_library_map(array(
'PhabricatorDashboardTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardTransactionEditor.php',
'PhabricatorDashboardTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardTransactionQuery.php',
'PhabricatorDashboardTransactionType' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardTransactionType.php',
'PhabricatorDashboardTwoThirdsLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardTwoThirdsLayoutMode.php',
'PhabricatorDashboardViewController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardViewController.php',
'PhabricatorDataCacheSpec' => 'applications/cache/spec/PhabricatorDataCacheSpec.php',
'PhabricatorDataNotAttachedException' => 'infrastructure/storage/lisk/PhabricatorDataNotAttachedException.php',
@ -8904,6 +8910,7 @@ phutil_register_library_map(array(
'PhabricatorDashboardApplication' => 'PhabricatorApplication',
'PhabricatorDashboardApplicationInstallWorkflow' => 'PhabricatorDashboardInstallWorkflow',
'PhabricatorDashboardArchiveController' => 'PhabricatorDashboardController',
'PhabricatorDashboardColumn' => 'Phobject',
'PhabricatorDashboardConsoleController' => 'PhabricatorDashboardController',
'PhabricatorDashboardController' => 'PhabricatorController',
'PhabricatorDashboardDAO' => 'PhabricatorLiskDAO',
@ -8913,6 +8920,8 @@ phutil_register_library_map(array(
'PhabricatorDashboardEditController' => 'PhabricatorDashboardController',
'PhabricatorDashboardEditEngine' => 'PhabricatorEditEngine',
'PhabricatorDashboardFavoritesInstallWorkflow' => 'PhabricatorDashboardApplicationInstallWorkflow',
'PhabricatorDashboardFullLayoutMode' => 'PhabricatorDashboardLayoutMode',
'PhabricatorDashboardHalfLayoutMode' => 'PhabricatorDashboardLayoutMode',
'PhabricatorDashboardHomeInstallWorkflow' => 'PhabricatorDashboardApplicationInstallWorkflow',
'PhabricatorDashboardIconSet' => 'PhabricatorIconSet',
'PhabricatorDashboardIconTransaction' => 'PhabricatorDashboardTransactionType',
@ -8920,12 +8929,14 @@ phutil_register_library_map(array(
'PhabricatorDashboardInstallController' => 'PhabricatorDashboardController',
'PhabricatorDashboardInstallWorkflow' => 'Phobject',
'PhabricatorDashboardLayoutConfig' => 'Phobject',
'PhabricatorDashboardLayoutMode' => 'Phobject',
'PhabricatorDashboardLayoutTransaction' => 'PhabricatorDashboardTransactionType',
'PhabricatorDashboardListController' => 'PhabricatorDashboardController',
'PhabricatorDashboardMovePanelController' => 'PhabricatorDashboardController',
'PhabricatorDashboardNameTransaction' => 'PhabricatorDashboardTransactionType',
'PhabricatorDashboardNgrams' => 'PhabricatorSearchNgrams',
'PhabricatorDashboardObjectInstallWorkflow' => 'PhabricatorDashboardInstallWorkflow',
'PhabricatorDashboardOneThirdLayoutMode' => 'PhabricatorDashboardLayoutMode',
'PhabricatorDashboardPanel' => array(
'PhabricatorDashboardDAO',
'PhabricatorApplicationTransactionInterface',
@ -9015,6 +9026,7 @@ phutil_register_library_map(array(
'PhabricatorDashboardTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
'PhabricatorDashboardTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'PhabricatorDashboardTransactionType' => 'PhabricatorModularTransactionType',
'PhabricatorDashboardTwoThirdsLayoutMode' => 'PhabricatorDashboardLayoutMode',
'PhabricatorDashboardViewController' => 'PhabricatorDashboardProfileController',
'PhabricatorDataCacheSpec' => 'PhabricatorCacheSpec',
'PhabricatorDataNotAttachedException' => 'Exception',

View file

@ -67,6 +67,8 @@ final class PhabricatorDashboardEditEngine
}
protected function buildCustomEditFields($object) {
$layout_options = PhabricatorDashboardLayoutMode::getLayoutModeMap();
$fields = array(
id(new PhabricatorTextEditField())
->setKey('name')
@ -96,8 +98,7 @@ final class PhabricatorDashboardEditEngine
->setConduitTypeDescription(pht('New dashboard layout mode.'))
->setTransactionType(
PhabricatorDashboardLayoutTransaction::TRANSACTIONTYPE)
->setOptions(
PhabricatorDashboardLayoutConfig::getLayoutModeSelectOptions())
->setOptions($layout_options)
->setValue($object->getRawLayoutMode()),
);

View file

@ -0,0 +1,27 @@
<?php
final class PhabricatorDashboardColumn
extends Phobject {
private $columnKey;
private $classes = array();
public function setColumnKey($column_key) {
$this->columnKey = $column_key;
return $this;
}
public function getColumnKey() {
return $this->columnKey;
}
public function addClass($class) {
$this->classes[] = $class;
return $this;
}
public function getClasses() {
return $this->classes;
}
}

View file

@ -0,0 +1,23 @@
<?php
final class PhabricatorDashboardFullLayoutMode
extends PhabricatorDashboardLayoutMode {
const LAYOUTMODE = 'layout-mode-full';
public function getLayoutModeOrder() {
return 0;
}
public function getLayoutModeName() {
return pht('One Column: 100%%');
}
public function getLayoutModeColumns() {
return array(
$this->newColumn()
->setColumnKey('main'),
);
}
}

View file

@ -0,0 +1,27 @@
<?php
final class PhabricatorDashboardHalfLayoutMode
extends PhabricatorDashboardLayoutMode {
const LAYOUTMODE = 'layout-mode-half-and-half';
public function getLayoutModeOrder() {
return 500;
}
public function getLayoutModeName() {
return pht('Two Columns: 50%%/50%%');
}
public function getLayoutModeColumns() {
return array(
$this->newColumn()
->setColumnKey('left')
->addClass('half'),
$this->newColumn()
->setColumnKey('right')
->addClass('half'),
);
}
}

View file

@ -107,15 +107,6 @@ final class PhabricatorDashboardLayoutConfig extends Phobject {
return $class;
}
public static function getLayoutModeSelectOptions() {
return array(
self::MODE_FULL => pht('One full-width column'),
self::MODE_HALF_AND_HALF => pht('Two columns, 1/2 and 1/2'),
self::MODE_THIRD_AND_THIRDS => pht('Two columns, 1/3 and 2/3'),
self::MODE_THIRDS_AND_THIRD => pht('Two columns, 2/3 and 1/3'),
);
}
public static function newFromDictionary(array $dict) {
$layout_config = id(new PhabricatorDashboardLayoutConfig())
->setLayoutMode(idx($dict, 'layoutMode', self::MODE_FULL));

View file

@ -0,0 +1,34 @@
<?php
abstract class PhabricatorDashboardLayoutMode
extends Phobject {
final public function getLayoutModeKey() {
return $this->getPhobjectClassConstant('LAYOUTMODE', 32);
}
public function getLayoutModeOrder() {
return 1000;
}
abstract public function getLayoutModeName();
abstract public function getLayoutModeColumns();
final protected function newColumn() {
return new PhabricatorDashboardColumn();
}
final public static function getAllLayoutModes() {
return id(new PhutilClassMapQuery())
->setAncestorClass(__CLASS__)
->setUniqueMethod('getLayoutModeKey')
->setSortMethod('getLayoutModeOrder')
->execute();
}
final public static function getLayoutModeMap() {
$modes = self::getAllLayoutModes();
return mpull($modes, 'getLayoutModeName', 'getLayoutModeKey');
}
}

View file

@ -0,0 +1,27 @@
<?php
final class PhabricatorDashboardOneThirdLayoutMode
extends PhabricatorDashboardLayoutMode {
const LAYOUTMODE = 'layout-mode-third-and-thirds';
public function getLayoutModeOrder() {
return 700;
}
public function getLayoutModeName() {
return pht('Two Columns: 33%%/66%%');
}
public function getLayoutModeColumns() {
return array(
$this->newColumn()
->setColumnKey('left')
->addClass('third'),
$this->newColumn()
->setColumnKey('right')
->addClass('thirds'),
);
}
}

View file

@ -0,0 +1,27 @@
<?php
final class PhabricatorDashboardTwoThirdsLayoutMode
extends PhabricatorDashboardLayoutMode {
const LAYOUTMODE = 'layout-mode-thirds-and-third';
public function getLayoutModeOrder() {
return 600;
}
public function getLayoutModeName() {
return pht('Two Columns: 66%%/33%%');
}
public function getLayoutModeColumns() {
return array(
$this->newColumn()
->setColumnKey('left')
->addClass('thirds'),
$this->newColumn()
->setColumnKey('right')
->addClass('third'),
);
}
}

View file

@ -26,7 +26,7 @@ final class PhabricatorDashboardLayoutTransaction
public function validateTransactions($object, array $xactions) {
$errors = array();
$mode_map = PhabricatorDashboardLayoutConfig::getLayoutModeSelectOptions();
$mode_map = PhabricatorDashboardLayoutMode::getLayoutModeMap();
$old_value = $object->getRawLayoutMode();
foreach ($xactions as $xaction) {