mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-05 11:28:25 +01:00
Make browse action available for dynamic/JS-driven tokenizers
Summary: Ref T5750. This makes browse work for all of the dynamic tokenizers in Herald, Policies, batch editor, etc. Test Plan: Used tokenizers in Herald, Policies, Batch editor. Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T5750 Differential Revision: https://secure.phabricator.com/D12442
This commit is contained in:
parent
a641601407
commit
a4261f41c2
14 changed files with 95 additions and 78 deletions
|
@ -605,9 +605,12 @@ final class HeraldRuleController extends HeraldController {
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($sources as $key => $source) {
|
foreach ($sources as $key => $source) {
|
||||||
|
$source->setViewer($this->getViewer());
|
||||||
|
|
||||||
$sources[$key] = array(
|
$sources[$key] = array(
|
||||||
'uri' => $source->getDatasourceURI(),
|
'uri' => $source->getDatasourceURI(),
|
||||||
'placeholder' => $source->getPlaceholderText(),
|
'placeholder' => $source->getPlaceholderText(),
|
||||||
|
'browseURI' => $source->getBrowseURI(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,6 @@
|
||||||
final class PhabricatorMailingListDatasource
|
final class PhabricatorMailingListDatasource
|
||||||
extends PhabricatorTypeaheadDatasource {
|
extends PhabricatorTypeaheadDatasource {
|
||||||
|
|
||||||
public function isBrowsable() {
|
|
||||||
// TODO: Make this browsable if we don't delete it before then.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPlaceholderText() {
|
public function getPlaceholderText() {
|
||||||
return pht('Type a mailing list name...');
|
return pht('Type a mailing list name...');
|
||||||
}
|
}
|
||||||
|
@ -20,11 +15,10 @@ final class PhabricatorMailingListDatasource
|
||||||
$viewer = $this->getViewer();
|
$viewer = $this->getViewer();
|
||||||
$raw_query = $this->getRawQuery();
|
$raw_query = $this->getRawQuery();
|
||||||
|
|
||||||
$results = array();
|
$query = id(new PhabricatorMailingListQuery());
|
||||||
|
$lists = $this->executeQuery($query);
|
||||||
|
|
||||||
$lists = id(new PhabricatorMailingListQuery())
|
$results = array();
|
||||||
->setViewer($viewer)
|
|
||||||
->execute();
|
|
||||||
foreach ($lists as $list) {
|
foreach ($lists as $list) {
|
||||||
$results[] = id(new PhabricatorTypeaheadResult())
|
$results[] = id(new PhabricatorTypeaheadResult())
|
||||||
->setName($list->getName())
|
->setName($list->getName())
|
||||||
|
@ -32,7 +26,10 @@ final class PhabricatorMailingListDatasource
|
||||||
->setPHID($list->getPHID());
|
->setPHID($list->getPHID());
|
||||||
}
|
}
|
||||||
|
|
||||||
return $results;
|
// TODO: It would be slightly preferable to do this as part of the query,
|
||||||
|
// this is just simpler for the moment.
|
||||||
|
|
||||||
|
return $this->filterResultsAgainstTokens($results);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,9 @@ final class ManiphestBatchEditController extends ManiphestController {
|
||||||
|
|
||||||
$projects_source = new PhabricatorProjectDatasource();
|
$projects_source = new PhabricatorProjectDatasource();
|
||||||
$mailable_source = new PhabricatorMetaMTAMailableDatasource();
|
$mailable_source = new PhabricatorMetaMTAMailableDatasource();
|
||||||
|
$mailable_source->setViewer($user);
|
||||||
$owner_source = new PhabricatorTypeaheadOwnerDatasource();
|
$owner_source = new PhabricatorTypeaheadOwnerDatasource();
|
||||||
|
$owner_source->setViewer($user);
|
||||||
|
|
||||||
require_celerity_resource('maniphest-batch-editor');
|
require_celerity_resource('maniphest-batch-editor');
|
||||||
Javelin::initBehavior(
|
Javelin::initBehavior(
|
||||||
|
@ -77,15 +79,18 @@ final class ManiphestBatchEditController extends ManiphestController {
|
||||||
'project' => array(
|
'project' => array(
|
||||||
'src' => $projects_source->getDatasourceURI(),
|
'src' => $projects_source->getDatasourceURI(),
|
||||||
'placeholder' => $projects_source->getPlaceholderText(),
|
'placeholder' => $projects_source->getPlaceholderText(),
|
||||||
|
'browseURI' => $projects_source->getBrowseURI(),
|
||||||
),
|
),
|
||||||
'owner' => array(
|
'owner' => array(
|
||||||
'src' => $owner_source->getDatasourceURI(),
|
'src' => $owner_source->getDatasourceURI(),
|
||||||
'placeholder' => $owner_source->getPlaceholderText(),
|
'placeholder' => $owner_source->getPlaceholderText(),
|
||||||
|
'browseURI' => $owner_source->getBrowseURI(),
|
||||||
'limit' => 1,
|
'limit' => 1,
|
||||||
),
|
),
|
||||||
'cc' => array(
|
'cc' => array(
|
||||||
'src' => $mailable_source->getDatasourceURI(),
|
'src' => $mailable_source->getDatasourceURI(),
|
||||||
'placeholder' => $mailable_source->getPlaceholderText(),
|
'placeholder' => $mailable_source->getPlaceholderText(),
|
||||||
|
'browseURI' => $mailable_source->getBrowseURI(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'input' => 'batch-form-actions',
|
'input' => 'batch-form-actions',
|
||||||
|
|
|
@ -40,13 +40,7 @@ final class PhabricatorLegalpadSignaturePolicyRule
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getValueControlTemplate() {
|
public function getValueControlTemplate() {
|
||||||
$datasource = new LegalpadDocumentDatasource();
|
return $this->getDatasourceTemplate(new LegalpadDocumentDatasource());
|
||||||
|
|
||||||
return array(
|
|
||||||
'markup' => new AphrontTokenizerTemplateView(),
|
|
||||||
'uri' => $datasource->getDatasourceURI(),
|
|
||||||
'placeholder' => $datasource->getPlaceholderText(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRuleOrder() {
|
public function getRuleOrder() {
|
||||||
|
|
|
@ -22,6 +22,16 @@ abstract class PhabricatorPolicyRule {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getDatasourceTemplate(
|
||||||
|
PhabricatorTypeaheadDatasource $datasource) {
|
||||||
|
return array(
|
||||||
|
'markup' => new AphrontTokenizerTemplateView(),
|
||||||
|
'uri' => $datasource->getDatasourceURI(),
|
||||||
|
'placeholder' => $datasource->getPlaceholderText(),
|
||||||
|
'browseURI' => $datasource->getBrowseURI(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function getRuleOrder() {
|
public function getRuleOrder() {
|
||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,13 +38,7 @@ final class PhabricatorProjectsPolicyRule extends PhabricatorPolicyRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getValueControlTemplate() {
|
public function getValueControlTemplate() {
|
||||||
$projects_source = new PhabricatorProjectDatasource();
|
return $this->getDatasourceTemplate(new PhabricatorProjectDatasource());
|
||||||
|
|
||||||
return array(
|
|
||||||
'markup' => new AphrontTokenizerTemplateView(),
|
|
||||||
'uri' => $projects_source->getDatasourceURI(),
|
|
||||||
'placeholder' => $projects_source->getPlaceholderText(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRuleOrder() {
|
public function getRuleOrder() {
|
||||||
|
|
|
@ -20,13 +20,7 @@ final class PhabricatorUsersPolicyRule extends PhabricatorPolicyRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getValueControlTemplate() {
|
public function getValueControlTemplate() {
|
||||||
$users_datasource = new PhabricatorPeopleDatasource();
|
return $this->getDatasourceTemplate(new PhabricatorPeopleDatasource());
|
||||||
|
|
||||||
return array(
|
|
||||||
'markup' => new AphrontTokenizerTemplateView(),
|
|
||||||
'uri' => $users_datasource->getDatasourceURI(),
|
|
||||||
'placeholder' => $users_datasource->getPlaceholderText(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRuleOrder() {
|
public function getRuleOrder() {
|
||||||
|
|
|
@ -67,16 +67,15 @@ final class AphrontTokenizerTemplateView extends AphrontView {
|
||||||
$content[] = $input;
|
$content[] = $input;
|
||||||
$content[] = phutil_tag('div', array('style' => 'clear: both;'), '');
|
$content[] = phutil_tag('div', array('style' => 'clear: both;'), '');
|
||||||
|
|
||||||
$container = phutil_tag(
|
$container = javelin_tag(
|
||||||
'div',
|
'div',
|
||||||
array(
|
array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
'class' => 'jx-tokenizer-container',
|
'class' => 'jx-tokenizer-container',
|
||||||
|
'sigil' => 'tokenizer-container',
|
||||||
),
|
),
|
||||||
$content);
|
$content);
|
||||||
|
|
||||||
$browse = null;
|
|
||||||
if ($this->browseURI) {
|
|
||||||
$icon = id(new PHUIIconView())
|
$icon = id(new PHUIIconView())
|
||||||
->setIconFont('fa-list-ul');
|
->setIconFont('fa-list-ul');
|
||||||
|
|
||||||
|
@ -90,12 +89,18 @@ final class AphrontTokenizerTemplateView extends AphrontView {
|
||||||
->setColor(PHUIButtonView::GREY)
|
->setColor(PHUIButtonView::GREY)
|
||||||
->setSize(PHUIButtonView::SMALL)
|
->setSize(PHUIButtonView::SMALL)
|
||||||
->setText(pht('Browse...'));
|
->setText(pht('Browse...'));
|
||||||
|
|
||||||
|
$classes = array();
|
||||||
|
$classes[] = 'jx-tokenizer-frame';
|
||||||
|
|
||||||
|
if ($this->browseURI) {
|
||||||
|
$classes[] = 'has-browse';
|
||||||
}
|
}
|
||||||
|
|
||||||
$frame = javelin_tag(
|
$frame = javelin_tag(
|
||||||
'table',
|
'table',
|
||||||
array(
|
array(
|
||||||
'class' => 'jx-tokenizer-frame',
|
'class' => implode(' ', $classes),
|
||||||
'sigil' => 'tokenizer-frame',
|
'sigil' => 'tokenizer-frame',
|
||||||
),
|
),
|
||||||
phutil_tag(
|
phutil_tag(
|
||||||
|
|
|
@ -109,7 +109,15 @@ a.jx-tokenizer-token:hover {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jx-tokenizer-frame-input {
|
.jx-tokenizer-frame .jx-tokenizer-frame-browse {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-browse .jx-tokenizer-frame-browse {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jx-tokenizer-frame td.jx-tokenizer-frame-input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ JX.install('Tokenizer', {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._frame) {
|
if (this._frame) {
|
||||||
|
JX.DOM.alterClass(this._frame, 'has-browse', !!this.getBrowseURI());
|
||||||
JX.DOM.listen(
|
JX.DOM.listen(
|
||||||
this._frame,
|
this._frame,
|
||||||
'click',
|
'click',
|
||||||
|
|
|
@ -277,25 +277,21 @@ JX.install('HeraldRuleEditor', {
|
||||||
},
|
},
|
||||||
|
|
||||||
_newTokenizer : function(type) {
|
_newTokenizer : function(type) {
|
||||||
var template = JX.$N(
|
|
||||||
'div',
|
|
||||||
JX.$H(this._config.template.markup));
|
|
||||||
template = template.firstChild;
|
|
||||||
template.id = '';
|
|
||||||
|
|
||||||
var tokenizerConfig = {
|
var tokenizerConfig = {
|
||||||
root : template,
|
|
||||||
src : this._config.template.source[type].uri,
|
src : this._config.template.source[type].uri,
|
||||||
placeholder: this._config.template.source[type].placeholder,
|
placeholder: this._config.template.source[type].placeholder,
|
||||||
|
browseURI: this._config.template.source[type].browseURI,
|
||||||
icons : this._config.template.icons,
|
icons : this._config.template.icons,
|
||||||
username : this._config.username
|
username : this._config.username
|
||||||
};
|
};
|
||||||
|
|
||||||
var build = JX.Prefab.buildTokenizer(tokenizerConfig);
|
var build = JX.Prefab.newTokenizerFromTemplate(
|
||||||
|
this._config.template.markup,
|
||||||
|
tokenizerConfig);
|
||||||
build.tokenizer.start();
|
build.tokenizer.start();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
template,
|
build.node,
|
||||||
function() {
|
function() {
|
||||||
return build.tokenizer.getTokens();
|
return build.tokenizer.getTokens();
|
||||||
},
|
},
|
||||||
|
|
|
@ -136,18 +136,14 @@ JX.behavior('maniphest-batch-editor', function(config) {
|
||||||
});
|
});
|
||||||
|
|
||||||
function build_tokenizer(tconfig) {
|
function build_tokenizer(tconfig) {
|
||||||
var template = JX.$N('div', JX.$H(config.tokenizerTemplate)).firstChild;
|
var built = JX.Prefab.newTokenizerFromTemplate(
|
||||||
template.id = '';
|
config.tokenizerTemplate,
|
||||||
|
JX.copy({}, tconfig));
|
||||||
var build_config = JX.copy({}, tconfig);
|
|
||||||
build_config.root = template;
|
|
||||||
|
|
||||||
var built = JX.Prefab.buildTokenizer(build_config);
|
|
||||||
built.tokenizer.start();
|
built.tokenizer.start();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
object: built.tokenizer,
|
object: built.tokenizer,
|
||||||
template: template
|
template: built.node
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,17 +118,20 @@ JX.behavior('policy-rule-editor', function(config) {
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'tokenizer':
|
case 'tokenizer':
|
||||||
node = JX.$H(template.markup).getNode();
|
|
||||||
node.id = '';
|
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
root: node,
|
|
||||||
src: template.uri,
|
src: template.uri,
|
||||||
placeholder: template.placeholder,
|
placeholder: template.placeholder,
|
||||||
|
browseURI: template.browseURI,
|
||||||
limit: template.limit
|
limit: template.limit
|
||||||
};
|
};
|
||||||
|
|
||||||
var tokenizer = JX.Prefab.buildTokenizer(options).tokenizer;
|
var build = JX.Prefab.newTokenizerFromTemplate(
|
||||||
|
template.markup,
|
||||||
|
options);
|
||||||
|
|
||||||
|
node = build.node;
|
||||||
|
|
||||||
|
var tokenizer = build.tokenizer;
|
||||||
tokenizer.start();
|
tokenizer.start();
|
||||||
|
|
||||||
get_fn = function() { return JX.keys(tokenizer.getTokens()); };
|
get_fn = function() { return JX.keys(tokenizer.getTokens()); };
|
||||||
|
|
|
@ -31,6 +31,17 @@ JX.install('Prefab', {
|
||||||
return select;
|
return select;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
newTokenizerFromTemplate: function(markup, config) {
|
||||||
|
var template = JX.$H(markup).getFragment().firstChild;
|
||||||
|
var container = JX.DOM.find(template, 'div', 'tokenizer-container');
|
||||||
|
|
||||||
|
container.id = '';
|
||||||
|
config.root = container;
|
||||||
|
|
||||||
|
var build = JX.Prefab.buildTokenizer(config);
|
||||||
|
build.node = template;
|
||||||
|
return build;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build a Phabricator tokenizer out of a configuration with application
|
* Build a Phabricator tokenizer out of a configuration with application
|
||||||
|
|
Loading…
Add table
Reference in a new issue