mirror of
https://we.phorge.it/source/phorge.git
synced 2025-01-05 12:21:02 +01:00
Organize bulk edit actions into nice groups
Summary: Ref T13025. We're getting kind of a lot of actions, so put them in nice groups so they're easier to work with. Test Plan: {F5386038} Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13025 Differential Revision: https://secure.phabricator.com/D18880
This commit is contained in:
parent
ae1b07bcfb
commit
7a43181337
12 changed files with 194 additions and 18 deletions
|
@ -476,7 +476,7 @@ return array(
|
||||||
'rsrc/js/core/behavior-audio-source.js' => '59b251eb',
|
'rsrc/js/core/behavior-audio-source.js' => '59b251eb',
|
||||||
'rsrc/js/core/behavior-autofocus.js' => '7319e029',
|
'rsrc/js/core/behavior-autofocus.js' => '7319e029',
|
||||||
'rsrc/js/core/behavior-badge-view.js' => '8ff5e24c',
|
'rsrc/js/core/behavior-badge-view.js' => '8ff5e24c',
|
||||||
'rsrc/js/core/behavior-bulk-editor.js' => '5e178556',
|
'rsrc/js/core/behavior-bulk-editor.js' => '66a6def1',
|
||||||
'rsrc/js/core/behavior-choose-control.js' => '327a00d1',
|
'rsrc/js/core/behavior-choose-control.js' => '327a00d1',
|
||||||
'rsrc/js/core/behavior-copy.js' => 'b0b8f86d',
|
'rsrc/js/core/behavior-copy.js' => 'b0b8f86d',
|
||||||
'rsrc/js/core/behavior-detect-timezone.js' => '4c193c96',
|
'rsrc/js/core/behavior-detect-timezone.js' => '4c193c96',
|
||||||
|
@ -595,7 +595,7 @@ return array(
|
||||||
'javelin-behavior-audio-source' => '59b251eb',
|
'javelin-behavior-audio-source' => '59b251eb',
|
||||||
'javelin-behavior-audit-preview' => 'd835b03a',
|
'javelin-behavior-audit-preview' => 'd835b03a',
|
||||||
'javelin-behavior-badge-view' => '8ff5e24c',
|
'javelin-behavior-badge-view' => '8ff5e24c',
|
||||||
'javelin-behavior-bulk-editor' => '5e178556',
|
'javelin-behavior-bulk-editor' => '66a6def1',
|
||||||
'javelin-behavior-bulk-job-reload' => 'edf8a145',
|
'javelin-behavior-bulk-job-reload' => 'edf8a145',
|
||||||
'javelin-behavior-calendar-month-view' => 'fe33e256',
|
'javelin-behavior-calendar-month-view' => 'fe33e256',
|
||||||
'javelin-behavior-choose-control' => '327a00d1',
|
'javelin-behavior-choose-control' => '327a00d1',
|
||||||
|
@ -1391,15 +1391,6 @@ return array(
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
),
|
),
|
||||||
'5e178556' => array(
|
|
||||||
'javelin-behavior',
|
|
||||||
'javelin-dom',
|
|
||||||
'javelin-util',
|
|
||||||
'phabricator-prefab',
|
|
||||||
'multirow-row-manager',
|
|
||||||
'javelin-json',
|
|
||||||
'phuix-form-control-view',
|
|
||||||
),
|
|
||||||
'5e2634b9' => array(
|
'5e2634b9' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-aphlict',
|
'javelin-aphlict',
|
||||||
|
@ -1436,6 +1427,14 @@ return array(
|
||||||
'javelin-workflow',
|
'javelin-workflow',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
),
|
),
|
||||||
|
'66a6def1' => array(
|
||||||
|
'javelin-behavior',
|
||||||
|
'javelin-dom',
|
||||||
|
'javelin-util',
|
||||||
|
'multirow-row-manager',
|
||||||
|
'javelin-json',
|
||||||
|
'phuix-form-control-view',
|
||||||
|
),
|
||||||
'680ea2c8' => array(
|
'680ea2c8' => array(
|
||||||
'javelin-install',
|
'javelin-install',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
|
|
|
@ -2203,6 +2203,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorBuiltinFileCachePurger' => 'applications/cache/purger/PhabricatorBuiltinFileCachePurger.php',
|
'PhabricatorBuiltinFileCachePurger' => 'applications/cache/purger/PhabricatorBuiltinFileCachePurger.php',
|
||||||
'PhabricatorBuiltinPatchList' => 'infrastructure/storage/patch/PhabricatorBuiltinPatchList.php',
|
'PhabricatorBuiltinPatchList' => 'infrastructure/storage/patch/PhabricatorBuiltinPatchList.php',
|
||||||
'PhabricatorBulkContentSource' => 'infrastructure/daemon/contentsource/PhabricatorBulkContentSource.php',
|
'PhabricatorBulkContentSource' => 'infrastructure/daemon/contentsource/PhabricatorBulkContentSource.php',
|
||||||
|
'PhabricatorBulkEditGroup' => 'applications/transactions/bulk/PhabricatorBulkEditGroup.php',
|
||||||
'PhabricatorBulkEngine' => 'applications/transactions/bulk/PhabricatorBulkEngine.php',
|
'PhabricatorBulkEngine' => 'applications/transactions/bulk/PhabricatorBulkEngine.php',
|
||||||
'PhabricatorCacheDAO' => 'applications/cache/storage/PhabricatorCacheDAO.php',
|
'PhabricatorCacheDAO' => 'applications/cache/storage/PhabricatorCacheDAO.php',
|
||||||
'PhabricatorCacheEngine' => 'applications/system/engine/PhabricatorCacheEngine.php',
|
'PhabricatorCacheEngine' => 'applications/system/engine/PhabricatorCacheEngine.php',
|
||||||
|
@ -7499,6 +7500,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorBuiltinFileCachePurger' => 'PhabricatorCachePurger',
|
'PhabricatorBuiltinFileCachePurger' => 'PhabricatorCachePurger',
|
||||||
'PhabricatorBuiltinPatchList' => 'PhabricatorSQLPatchList',
|
'PhabricatorBuiltinPatchList' => 'PhabricatorSQLPatchList',
|
||||||
'PhabricatorBulkContentSource' => 'PhabricatorContentSource',
|
'PhabricatorBulkContentSource' => 'PhabricatorContentSource',
|
||||||
|
'PhabricatorBulkEditGroup' => 'Phobject',
|
||||||
'PhabricatorBulkEngine' => 'Phobject',
|
'PhabricatorBulkEngine' => 'Phobject',
|
||||||
'PhabricatorCacheDAO' => 'PhabricatorLiskDAO',
|
'PhabricatorCacheDAO' => 'PhabricatorLiskDAO',
|
||||||
'PhabricatorCacheEngine' => 'Phobject',
|
'PhabricatorCacheEngine' => 'Phobject',
|
||||||
|
|
|
@ -218,7 +218,7 @@ final class ManiphestTaskResultListView extends ManiphestView {
|
||||||
'disabled' => 'disabled',
|
'disabled' => 'disabled',
|
||||||
'class' => 'disabled',
|
'class' => 'disabled',
|
||||||
),
|
),
|
||||||
pht("Batch Edit Selected \xC2\xBB"));
|
pht("Bulk Edit Selected \xC2\xBB"));
|
||||||
|
|
||||||
$export = javelin_tag(
|
$export = javelin_tag(
|
||||||
'a',
|
'a',
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorBulkEditGroup
|
||||||
|
extends Phobject {
|
||||||
|
|
||||||
|
private $key;
|
||||||
|
private $label;
|
||||||
|
|
||||||
|
public function setKey($key) {
|
||||||
|
$this->key = $key;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getKey() {
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLabel($label) {
|
||||||
|
$this->label = $label;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLabel() {
|
||||||
|
return $this->label;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -299,6 +299,29 @@ abstract class PhabricatorBulkEngine extends Phobject {
|
||||||
->setViewer($viewer);
|
->setViewer($viewer);
|
||||||
|
|
||||||
$edit_map = $edit_engine->newBulkEditMap();
|
$edit_map = $edit_engine->newBulkEditMap();
|
||||||
|
$groups = $edit_engine->newBulkEditGroupMap();
|
||||||
|
|
||||||
|
$spec = array();
|
||||||
|
$option_groups = igroup($edit_map, 'group');
|
||||||
|
foreach ($groups as $group_key => $group) {
|
||||||
|
$options = idx($option_groups, $group_key, array());
|
||||||
|
if (!$options) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$option_map = array();
|
||||||
|
foreach ($options as $option) {
|
||||||
|
$option_map[] = array(
|
||||||
|
'key' => $option['xaction'],
|
||||||
|
'label' => $option['label'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$spec[] = array(
|
||||||
|
'label' => $group->getLabel(),
|
||||||
|
'options' => $option_map,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
require_celerity_resource('phui-bulk-editor-css');
|
require_celerity_resource('phui-bulk-editor-css');
|
||||||
|
|
||||||
|
@ -308,6 +331,9 @@ abstract class PhabricatorBulkEngine extends Phobject {
|
||||||
'rootNodeID' => $this->getRootFormID(),
|
'rootNodeID' => $this->getRootFormID(),
|
||||||
'inputNodeID' => $input_id,
|
'inputNodeID' => $input_id,
|
||||||
'edits' => $edit_map,
|
'edits' => $edit_map,
|
||||||
|
'optgroups' => array(
|
||||||
|
'groups' => $spec,
|
||||||
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
$cancel_uri = $this->getCancelURI();
|
$cancel_uri = $this->getCancelURI();
|
||||||
|
|
|
@ -181,6 +181,11 @@ abstract class PhabricatorEditEngine
|
||||||
$field
|
$field
|
||||||
->setViewer($viewer)
|
->setViewer($viewer)
|
||||||
->setObject($object);
|
->setObject($object);
|
||||||
|
|
||||||
|
$group_key = $field->getBulkEditGroupKey();
|
||||||
|
if ($group_key === null) {
|
||||||
|
$field->setBulkEditGroupKey('extension');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$extension_fields = mpull($extension_fields, null, 'getKey');
|
$extension_fields = mpull($extension_fields, null, 'getKey');
|
||||||
|
@ -2424,6 +2429,60 @@ abstract class PhabricatorEditEngine
|
||||||
|
|
||||||
/* -( Bulk Edits )--------------------------------------------------------- */
|
/* -( Bulk Edits )--------------------------------------------------------- */
|
||||||
|
|
||||||
|
final public function newBulkEditGroupMap() {
|
||||||
|
$groups = $this->newBulkEditGroups();
|
||||||
|
|
||||||
|
$map = array();
|
||||||
|
foreach ($groups as $group) {
|
||||||
|
$key = $group->getKey();
|
||||||
|
|
||||||
|
if (isset($map[$key])) {
|
||||||
|
throw new Exception(
|
||||||
|
pht(
|
||||||
|
'Two bulk edit groups have the same key ("%s"). Each bulk edit '.
|
||||||
|
'group must have a unique key.',
|
||||||
|
$key));
|
||||||
|
}
|
||||||
|
|
||||||
|
$map[$key] = $group;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->isEngineExtensible()) {
|
||||||
|
$extensions = PhabricatorEditEngineExtension::getAllEnabledExtensions();
|
||||||
|
} else {
|
||||||
|
$extensions = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($extensions as $extension) {
|
||||||
|
$extension_groups = $extension->newBulkEditGroups($this);
|
||||||
|
foreach ($extension_groups as $group) {
|
||||||
|
$key = $group->getKey();
|
||||||
|
|
||||||
|
if (isset($map[$key])) {
|
||||||
|
throw new Exception(
|
||||||
|
pht(
|
||||||
|
'Extension "%s" defines a bulk edit group with the same key '.
|
||||||
|
'("%s") as the main editor or another extension. Each bulk '.
|
||||||
|
'edit group must have a unique key.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$map[$key] = $group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function newBulkEditGroups() {
|
||||||
|
return array(
|
||||||
|
id(new PhabricatorBulkEditGroup())
|
||||||
|
->setKey('default')
|
||||||
|
->setLabel(pht('Primary Fields')),
|
||||||
|
id(new PhabricatorBulkEditGroup())
|
||||||
|
->setKey('extension')
|
||||||
|
->setLabel(pht('Support Applications')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
final public function newBulkEditMap() {
|
final public function newBulkEditMap() {
|
||||||
$config = $this->loadDefaultConfiguration();
|
$config = $this->loadDefaultConfiguration();
|
||||||
|
@ -2434,6 +2493,7 @@ abstract class PhabricatorEditEngine
|
||||||
|
|
||||||
$object = $this->newEditableObject();
|
$object = $this->newEditableObject();
|
||||||
$fields = $this->buildEditFields($object);
|
$fields = $this->buildEditFields($object);
|
||||||
|
$groups = $this->newBulkEditGroupMap();
|
||||||
|
|
||||||
$edit_types = $this->getBulkEditTypesFromFields($fields);
|
$edit_types = $this->getBulkEditTypesFromFields($fields);
|
||||||
|
|
||||||
|
@ -2449,9 +2509,24 @@ abstract class PhabricatorEditEngine
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$group_key = $type->getBulkEditGroupKey();
|
||||||
|
if (!$group_key) {
|
||||||
|
$group_key = 'default';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($groups[$group_key])) {
|
||||||
|
throw new Exception(
|
||||||
|
pht(
|
||||||
|
'Field "%s" has a bulk edit group key ("%s") with no '.
|
||||||
|
'corresponding bulk edit group.',
|
||||||
|
$key,
|
||||||
|
$group_key));
|
||||||
|
}
|
||||||
|
|
||||||
$map[] = array(
|
$map[] = array(
|
||||||
'label' => $bulk_label,
|
'label' => $bulk_label,
|
||||||
'xaction' => $key,
|
'xaction' => $key,
|
||||||
|
'group' => $group_key,
|
||||||
'control' => array(
|
'control' => array(
|
||||||
'type' => $bulk_type->getPHUIXControlType(),
|
'type' => $bulk_type->getPHUIXControlType(),
|
||||||
'spec' => (object)$bulk_type->getPHUIXControlSpecification(),
|
'spec' => (object)$bulk_type->getPHUIXControlSpecification(),
|
||||||
|
|
|
@ -18,6 +18,7 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
private $controlID;
|
private $controlID;
|
||||||
private $controlInstructions;
|
private $controlInstructions;
|
||||||
private $bulkEditLabel;
|
private $bulkEditLabel;
|
||||||
|
private $bulkEditGroupKey;
|
||||||
|
|
||||||
private $description;
|
private $description;
|
||||||
private $conduitDescription;
|
private $conduitDescription;
|
||||||
|
@ -75,6 +76,15 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
return $this->bulkEditLabel;
|
return $this->bulkEditLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setBulkEditGroupKey($key) {
|
||||||
|
$this->bulkEditGroupKey = $key;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBulkEditGroupKey() {
|
||||||
|
return $this->bulkEditGroupKey;
|
||||||
|
}
|
||||||
|
|
||||||
public function setViewer(PhabricatorUser $viewer) {
|
public function setViewer(PhabricatorUser $viewer) {
|
||||||
$this->viewer = $viewer;
|
$this->viewer = $viewer;
|
||||||
return $this;
|
return $this;
|
||||||
|
|
|
@ -15,6 +15,7 @@ abstract class PhabricatorEditType extends Phobject {
|
||||||
|
|
||||||
private $bulkParameterType;
|
private $bulkParameterType;
|
||||||
private $bulkEditLabel;
|
private $bulkEditLabel;
|
||||||
|
private $bulkEditGroupKey;
|
||||||
|
|
||||||
public function setLabel($label) {
|
public function setLabel($label) {
|
||||||
$this->label = $label;
|
$this->label = $label;
|
||||||
|
@ -38,6 +39,19 @@ abstract class PhabricatorEditType extends Phobject {
|
||||||
return $this->getEditField()->getBulkEditLabel();
|
return $this->getEditField()->getBulkEditLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setBulkEditGroupKey($key) {
|
||||||
|
$this->bulkEditGroupKey = $key;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBulkEditGroupKey() {
|
||||||
|
if ($this->bulkEditGroupKey !== null) {
|
||||||
|
return $this->bulkEditGroupKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->getEditField()->getBulkEditGroupKey();
|
||||||
|
}
|
||||||
|
|
||||||
public function setEditType($edit_type) {
|
public function setEditType($edit_type) {
|
||||||
$this->editType = $edit_type;
|
$this->editType = $edit_type;
|
||||||
return $this;
|
return $this;
|
||||||
|
|
|
@ -33,6 +33,14 @@ final class PhabricatorCommentEditEngineExtension
|
||||||
return (bool)$comment;
|
return (bool)$comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function newBulkEditGroups(PhabricatorEditEngine $engine) {
|
||||||
|
return array(
|
||||||
|
id(new PhabricatorBulkEditGroup())
|
||||||
|
->setKey('comments')
|
||||||
|
->setLabel(pht('Comments')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function buildCustomEditFields(
|
public function buildCustomEditFields(
|
||||||
PhabricatorEditEngine $engine,
|
PhabricatorEditEngine $engine,
|
||||||
PhabricatorApplicationTransactionInterface $object) {
|
PhabricatorApplicationTransactionInterface $object) {
|
||||||
|
@ -47,6 +55,7 @@ final class PhabricatorCommentEditEngineExtension
|
||||||
->setKey(self::EDITKEY)
|
->setKey(self::EDITKEY)
|
||||||
->setLabel(pht('Comments'))
|
->setLabel(pht('Comments'))
|
||||||
->setBulkEditLabel(pht('Add comment'))
|
->setBulkEditLabel(pht('Add comment'))
|
||||||
|
->setBulkEditGroupKey('comments')
|
||||||
->setAliases(array('comments'))
|
->setAliases(array('comments'))
|
||||||
->setIsHidden(true)
|
->setIsHidden(true)
|
||||||
->setIsReorderable(false)
|
->setIsReorderable(false)
|
||||||
|
|
|
@ -32,6 +32,10 @@ abstract class PhabricatorEditEngineExtension extends Phobject {
|
||||||
PhabricatorEditEngine $engine,
|
PhabricatorEditEngine $engine,
|
||||||
PhabricatorApplicationTransactionInterface $object);
|
PhabricatorApplicationTransactionInterface $object);
|
||||||
|
|
||||||
|
public function newBulkEditGroups(PhabricatorEditEngine $engine) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
final public static function getAllExtensions() {
|
final public static function getAllExtensions() {
|
||||||
return id(new PhutilClassMapQuery())
|
return id(new PhutilClassMapQuery())
|
||||||
->setAncestorClass(__CLASS__)
|
->setAncestorClass(__CLASS__)
|
||||||
|
|
|
@ -23,6 +23,14 @@ final class PhabricatorCustomFieldEditEngineExtension
|
||||||
return ($object instanceof PhabricatorCustomFieldInterface);
|
return ($object instanceof PhabricatorCustomFieldInterface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function newBulkEditGroups(PhabricatorEditEngine $engine) {
|
||||||
|
return array(
|
||||||
|
id(new PhabricatorBulkEditGroup())
|
||||||
|
->setKey('custom')
|
||||||
|
->setLabel(pht('Custom Fields')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function buildCustomEditFields(
|
public function buildCustomEditFields(
|
||||||
PhabricatorEditEngine $engine,
|
PhabricatorEditEngine $engine,
|
||||||
PhabricatorApplicationTransactionInterface $object) {
|
PhabricatorApplicationTransactionInterface $object) {
|
||||||
|
@ -43,6 +51,11 @@ final class PhabricatorCustomFieldEditEngineExtension
|
||||||
foreach ($field_list->getFields() as $field) {
|
foreach ($field_list->getFields() as $field) {
|
||||||
$edit_fields = $field->getEditEngineFields($engine);
|
$edit_fields = $field->getEditEngineFields($engine);
|
||||||
foreach ($edit_fields as $edit_field) {
|
foreach ($edit_fields as $edit_field) {
|
||||||
|
$group_key = $edit_field->getBulkEditGroupKey();
|
||||||
|
if ($group_key === null) {
|
||||||
|
$edit_field->setBulkEditGroupKey('custom');
|
||||||
|
}
|
||||||
|
|
||||||
$results[] = $edit_field;
|
$results[] = $edit_field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
* @requires javelin-behavior
|
* @requires javelin-behavior
|
||||||
* javelin-dom
|
* javelin-dom
|
||||||
* javelin-util
|
* javelin-util
|
||||||
* phabricator-prefab
|
|
||||||
* multirow-row-manager
|
* multirow-row-manager
|
||||||
* javelin-json
|
* javelin-json
|
||||||
* phuix-form-control-view
|
* phuix-form-control-view
|
||||||
|
@ -31,11 +30,9 @@ JX.behavior('bulk-editor', function(config) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderRow() {
|
function renderRow() {
|
||||||
var action_select = JX.Prefab.renderSelect(
|
var action_select = new JX.PHUIXFormControl()
|
||||||
option_map,
|
.setControl('optgroups', config.optgroups)
|
||||||
null,
|
.getRawInputNode();
|
||||||
null,
|
|
||||||
option_order);
|
|
||||||
|
|
||||||
var cell = JX.$N('td', {className: 'bulk-edit-input'});
|
var cell = JX.$N('td', {className: 'bulk-edit-input'});
|
||||||
var vfunc = null;
|
var vfunc = null;
|
||||||
|
|
Loading…
Reference in a new issue