Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14077676
D20808.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Referenced Files
None
Subscribers
None
D20808.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -397,7 +397,7 @@
'rsrc/js/application/files/behavior-icon-composer.js' => '38a6cedb',
'rsrc/js/application/files/behavior-launch-icon-composer.js' => 'a17b84f1',
'rsrc/js/application/harbormaster/behavior-harbormaster-log.js' => 'b347a301',
- 'rsrc/js/application/herald/HeraldRuleEditor.js' => '27daef73',
+ 'rsrc/js/application/herald/HeraldRuleEditor.js' => '2633bef7',
'rsrc/js/application/herald/PathTypeahead.js' => 'ad486db3',
'rsrc/js/application/herald/herald-rule-editor.js' => '0922e81d',
'rsrc/js/application/maniphest/behavior-batch-selector.js' => '139ef688',
@@ -571,7 +571,7 @@
'global-drag-and-drop-css' => '1d2713a4',
'harbormaster-css' => '8dfe16b2',
'herald-css' => '648d39e2',
- 'herald-rule-editor' => '27daef73',
+ 'herald-rule-editor' => '2633bef7',
'herald-test-css' => 'e004176f',
'inline-comment-summary-css' => '81eb368d',
'javelin-aphlict' => '022516b4',
@@ -1117,7 +1117,7 @@
'javelin-json',
'phabricator-draggable-list',
),
- '27daef73' => array(
+ '2633bef7' => array(
'multirow-row-manager',
'javelin-install',
'javelin-util',
diff --git a/src/applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php b/src/applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php
--- a/src/applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php
+++ b/src/applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php
@@ -96,4 +96,8 @@
return $record->getTarget();
}
+ public function isActionAvailable() {
+ return id(new PhabricatorHarbormasterApplication())->isInstalled();
+ }
+
}
diff --git a/src/applications/herald/action/HeraldAction.php b/src/applications/herald/action/HeraldAction.php
--- a/src/applications/herald/action/HeraldAction.php
+++ b/src/applications/herald/action/HeraldAction.php
@@ -405,4 +405,8 @@
return array();
}
+ public function isActionAvailable() {
+ return true;
+ }
+
}
diff --git a/src/applications/herald/adapter/HeraldAdapter.php b/src/applications/herald/adapter/HeraldAdapter.php
--- a/src/applications/herald/adapter/HeraldAdapter.php
+++ b/src/applications/herald/adapter/HeraldAdapter.php
@@ -373,6 +373,16 @@
return $field->getFieldGroupKey();
}
+ public function isFieldAvailable($field_key) {
+ $field = $this->getFieldImplementation($field_key);
+
+ if (!$field) {
+ return null;
+ }
+
+ return $field->isFieldAvailable();
+ }
+
/* -( Conditions )--------------------------------------------------------- */
@@ -765,6 +775,16 @@
return $action->getActionGroupKey();
}
+ public function isActionAvailable($action_key) {
+ $action = $this->getActionImplementation($action_key);
+
+ if (!$action) {
+ return null;
+ }
+
+ return $action->isActionAvailable();
+ }
+
public function getActions($rule_type) {
$actions = array();
foreach ($this->getActionsForRuleType($rule_type) as $key => $action) {
diff --git a/src/applications/herald/controller/HeraldRuleController.php b/src/applications/herald/controller/HeraldRuleController.php
--- a/src/applications/herald/controller/HeraldRuleController.php
+++ b/src/applications/herald/controller/HeraldRuleController.php
@@ -684,7 +684,10 @@
$group_map = array();
foreach ($field_map as $field_key => $field_name) {
$group_key = $adapter->getFieldGroupKey($field_key);
- $group_map[$group_key][$field_key] = $field_name;
+ $group_map[$group_key][$field_key] = array(
+ 'name' => $field_name,
+ 'available' => $adapter->isFieldAvailable($field_key),
+ );
}
return $this->getGroups(
@@ -696,7 +699,10 @@
$group_map = array();
foreach ($action_map as $action_key => $action_name) {
$group_key = $adapter->getActionGroupKey($action_key);
- $group_map[$group_key][$action_key] = $action_name;
+ $group_map[$group_key][$action_key] = array(
+ 'name' => $action_name,
+ 'available' => $adapter->isActionAvailable($action_key),
+ );
}
return $this->getGroups(
diff --git a/src/applications/herald/field/HeraldField.php b/src/applications/herald/field/HeraldField.php
--- a/src/applications/herald/field/HeraldField.php
+++ b/src/applications/herald/field/HeraldField.php
@@ -241,4 +241,8 @@
return false;
}
+ public function isFieldAvailable() {
+ return true;
+ }
+
}
diff --git a/src/applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php b/src/applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php
--- a/src/applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php
+++ b/src/applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php
@@ -130,4 +130,9 @@
'Require document signatures: %s.',
$this->renderHandleList($value));
}
+
+ public function isActionAvailable() {
+ return id(new PhabricatorLegalpadApplication())->isInstalled();
+ }
+
}
diff --git a/webroot/rsrc/js/application/herald/HeraldRuleEditor.js b/webroot/rsrc/js/application/herald/HeraldRuleEditor.js
--- a/webroot/rsrc/js/application/herald/HeraldRuleEditor.js
+++ b/webroot/rsrc/js/application/herald/HeraldRuleEditor.js
@@ -350,8 +350,10 @@
sigil: 'field-select'
};
- var field_select = this._renderGroupSelect(groups, attrs);
- field_select.value = this._config.conditions[row_id][0];
+ var field_select = this._renderGroupSelect(
+ groups,
+ attrs,
+ this._config.conditions[row_id][0]);
var field_cell = JX.$N('td', {sigil: 'field-cell'}, field_select);
@@ -367,18 +369,38 @@
}
},
- _renderGroupSelect: function(groups, attrs) {
+ _renderGroupSelect: function(groups, attrs, value) {
var optgroups = [];
for (var ii = 0; ii < groups.length; ii++) {
var group = groups[ii];
var options = [];
for (var k in group.options) {
- options.push(JX.$N('option', {value: k}, group.options[k]));
+ var option = group.options[k];
+
+ var name = option.name;
+ var available = option.available;
+
+ // See T7961. If the option is not marked as "available", we only
+ // include it in the dropdown if the dropdown already has it as a
+ // value. We want to hide options provided by applications which are
+ // not installed, but do not want to break existing rules.
+
+ if (available || (k === value)) {
+ options.push(JX.$N('option', {value: k}, name));
+ }
}
- optgroups.push(JX.$N('optgroup', {label: group.label}, options));
+ if (options.length) {
+ optgroups.push(JX.$N('optgroup', {label: group.label}, options));
+ }
+ }
+
+ var select = JX.$N('select', attrs, optgroups);
+
+ if (value !== undefined) {
+ select.value = value;
}
- return JX.$N('select', attrs, optgroups);
+ return select;
},
_newAction : function(data) {
@@ -402,8 +424,10 @@
sigil: 'action-select'
};
- var action_select = this._renderGroupSelect(groups, attrs);
- action_select.value = action[0];
+ var action_select = this._renderGroupSelect(
+ groups,
+ attrs,
+ action[0]);
var action_cell = JX.$N('td', {sigil: 'action-cell'}, action_select);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 23, 12:52 AM (17 h, 32 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6776483
Default Alt Text
D20808.diff (7 KB)
Attached To
Mode
D20808: Don't present users with Herald fields/actions for uninstalled applications, unless the rule already uses them
Attached
Detach File
Event Timeline
Log In to Comment