mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00:32:42 +01:00
Use Javelin placeholders and new sorting rules broadly; consolidate tokenizer construction code
Summary: - We have three nearly-identical blocks of Tokenizer construction code; consolidate them into Prefab. - Add placeholder support. - Augment server-side stuff to specify placeholder text. Test Plan: Verified behavior of Differential edit tokenizers, Differential comment tokenizers, Maniphest edit tokenizers, Maniphest comment tokenizers, Maniphest filter tokenizers, Differential filter tokenizers, Owners filter tokenizers, Owners edit tokenizers, Herald edit tokenizers, Audit filter tokenizers. Reviewers: btrahan Reviewed By: btrahan CC: aran, epriestley Maniphest Tasks: T772, T946 Differential Revision: https://secure.phabricator.com/D1844
This commit is contained in:
parent
b2890eeb0e
commit
43bd76336c
11 changed files with 310 additions and 291 deletions
2
externals/javelin
vendored
2
externals/javelin
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 14e180d5d316d496886730cb6a41d1b36de16ec1
|
Subproject commit fb9944cff2e2398ace77d2556f8b65edf88ebd58
|
|
@ -154,7 +154,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'aphront-typeahead-control-css' =>
|
'aphront-typeahead-control-css' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/a05236a6/rsrc/css/aphront/typeahead.css',
|
'uri' => '/res/311e8830/rsrc/css/aphront/typeahead.css',
|
||||||
'type' => 'css',
|
'type' => 'css',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
@ -357,18 +357,12 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-behavior-aphront-basic-tokenizer' =>
|
'javelin-behavior-aphront-basic-tokenizer' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/69a085d3/rsrc/js/application/core/behavior-tokenizer.js',
|
'uri' => '/res/cf049052/rsrc/js/application/core/behavior-tokenizer.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
0 => 'javelin-behavior',
|
0 => 'javelin-behavior',
|
||||||
1 => 'javelin-typeahead',
|
1 => 'phabricator-prefab',
|
||||||
2 => 'javelin-tokenizer',
|
|
||||||
3 => 'javelin-typeahead-preloaded-source',
|
|
||||||
4 => 'javelin-typeahead-ondemand-source',
|
|
||||||
5 => 'javelin-dom',
|
|
||||||
6 => 'javelin-stratcom',
|
|
||||||
7 => 'javelin-util',
|
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
|
'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
|
||||||
),
|
),
|
||||||
|
@ -488,15 +482,13 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-behavior-differential-add-reviewers-and-ccs' =>
|
'javelin-behavior-differential-add-reviewers-and-ccs' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/eb142486/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js',
|
'uri' => '/res/27be3f81/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
0 => 'javelin-behavior',
|
0 => 'javelin-behavior',
|
||||||
1 => 'javelin-dom',
|
1 => 'javelin-dom',
|
||||||
2 => 'javelin-tokenizer',
|
2 => 'phabricator-prefab',
|
||||||
3 => 'javelin-typeahead',
|
|
||||||
4 => 'javelin-typeahead-preloaded-source',
|
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js',
|
'disk' => '/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js',
|
||||||
),
|
),
|
||||||
|
@ -739,15 +731,13 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-behavior-maniphest-transaction-controls' =>
|
'javelin-behavior-maniphest-transaction-controls' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/33bd237a/rsrc/js/application/maniphest/behavior-transaction-controls.js',
|
'uri' => '/res/62465554/rsrc/js/application/maniphest/behavior-transaction-controls.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
0 => 'javelin-behavior',
|
0 => 'javelin-behavior',
|
||||||
1 => 'javelin-dom',
|
1 => 'javelin-dom',
|
||||||
2 => 'javelin-tokenizer',
|
2 => 'phabricator-prefab',
|
||||||
3 => 'javelin-typeahead',
|
|
||||||
4 => 'javelin-typeahead-preloaded-source',
|
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js',
|
'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js',
|
||||||
),
|
),
|
||||||
|
@ -1148,7 +1138,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-tokenizer' =>
|
'javelin-tokenizer' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/aa86949c/rsrc/js/javelin/lib/control/tokenizer/Tokenizer.js',
|
'uri' => '/res/a8275d0d/rsrc/js/javelin/lib/control/tokenizer/Tokenizer.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
@ -1161,7 +1151,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-typeahead' =>
|
'javelin-typeahead' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/75d4b342/rsrc/js/javelin/lib/control/typeahead/Typeahead.js',
|
'uri' => '/res/2f694700/rsrc/js/javelin/lib/control/typeahead/Typeahead.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
@ -1224,7 +1214,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-typeahead-source' =>
|
'javelin-typeahead-source' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/e99c0c1d/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadSource.js',
|
'uri' => '/res/ff342bbb/rsrc/js/javelin/lib/control/typeahead/source/TypeaheadSource.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
@ -1616,13 +1606,20 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'phabricator-prefab' =>
|
'phabricator-prefab' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/5784a112/rsrc/js/application/core/Prefab.js',
|
'uri' => '/res/956c8474/rsrc/js/application/core/Prefab.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
0 => 'javelin-install',
|
0 => 'javelin-install',
|
||||||
1 => 'javelin-util',
|
1 => 'javelin-util',
|
||||||
2 => 'javelin-dom',
|
2 => 'javelin-dom',
|
||||||
|
3 => 'javelin-typeahead',
|
||||||
|
4 => 'javelin-tokenizer',
|
||||||
|
5 => 'javelin-typeahead-preloaded-source',
|
||||||
|
6 => 'javelin-typeahead-ondemand-source',
|
||||||
|
7 => 'javelin-dom',
|
||||||
|
8 => 'javelin-stratcom',
|
||||||
|
9 => 'javelin-util',
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/core/Prefab.js',
|
'disk' => '/rsrc/js/application/core/Prefab.js',
|
||||||
),
|
),
|
||||||
|
@ -1941,74 +1938,7 @@ celerity_register_resource_map(array(
|
||||||
'uri' => '/res/pkg/09c86840/differential.pkg.css',
|
'uri' => '/res/pkg/09c86840/differential.pkg.css',
|
||||||
'type' => 'css',
|
'type' => 'css',
|
||||||
),
|
),
|
||||||
'0ed3e020' =>
|
'2af849fb' =>
|
||||||
array(
|
|
||||||
'name' => 'maniphest.pkg.js',
|
|
||||||
'symbols' =>
|
|
||||||
array(
|
|
||||||
0 => 'javelin-behavior-maniphest-batch-selector',
|
|
||||||
1 => 'javelin-behavior-maniphest-transaction-controls',
|
|
||||||
2 => 'javelin-behavior-maniphest-transaction-preview',
|
|
||||||
3 => 'javelin-behavior-maniphest-transaction-expand',
|
|
||||||
),
|
|
||||||
'uri' => '/res/pkg/0ed3e020/maniphest.pkg.js',
|
|
||||||
'type' => 'js',
|
|
||||||
),
|
|
||||||
'2b5d58e9' =>
|
|
||||||
array(
|
|
||||||
'name' => 'core.pkg.css',
|
|
||||||
'symbols' =>
|
|
||||||
array(
|
|
||||||
0 => 'phabricator-core-css',
|
|
||||||
1 => 'phabricator-core-buttons-css',
|
|
||||||
2 => 'phabricator-standard-page-view',
|
|
||||||
3 => 'aphront-dialog-view-css',
|
|
||||||
4 => 'aphront-form-view-css',
|
|
||||||
5 => 'aphront-panel-view-css',
|
|
||||||
6 => 'aphront-side-nav-view-css',
|
|
||||||
7 => 'aphront-table-view-css',
|
|
||||||
8 => 'aphront-crumbs-view-css',
|
|
||||||
9 => 'aphront-tokenizer-control-css',
|
|
||||||
10 => 'aphront-typeahead-control-css',
|
|
||||||
11 => 'aphront-list-filter-view-css',
|
|
||||||
12 => 'phabricator-directory-css',
|
|
||||||
13 => 'phabricator-jump-nav',
|
|
||||||
14 => 'phabricator-app-buttons-css',
|
|
||||||
15 => 'phabricator-remarkup-css',
|
|
||||||
16 => 'syntax-highlighting-css',
|
|
||||||
17 => 'aphront-pager-view-css',
|
|
||||||
18 => 'phabricator-transaction-view-css',
|
|
||||||
),
|
|
||||||
'uri' => '/res/pkg/2b5d58e9/core.pkg.css',
|
|
||||||
'type' => 'css',
|
|
||||||
),
|
|
||||||
'2e291441' =>
|
|
||||||
array(
|
|
||||||
'name' => 'differential.pkg.js',
|
|
||||||
'symbols' =>
|
|
||||||
array(
|
|
||||||
0 => 'phabricator-drag-and-drop-file-upload',
|
|
||||||
1 => 'phabricator-shaped-request',
|
|
||||||
2 => 'javelin-behavior-differential-feedback-preview',
|
|
||||||
3 => 'javelin-behavior-differential-edit-inline-comments',
|
|
||||||
4 => 'javelin-behavior-differential-populate',
|
|
||||||
5 => 'javelin-behavior-differential-show-more',
|
|
||||||
6 => 'javelin-behavior-differential-diff-radios',
|
|
||||||
7 => 'javelin-behavior-differential-accept-with-errors',
|
|
||||||
8 => 'javelin-behavior-differential-comment-jump',
|
|
||||||
9 => 'javelin-behavior-differential-add-reviewers-and-ccs',
|
|
||||||
10 => 'javelin-behavior-differential-keyboard-navigation',
|
|
||||||
11 => 'javelin-behavior-aphront-drag-and-drop',
|
|
||||||
12 => 'javelin-behavior-aphront-drag-and-drop-textarea',
|
|
||||||
13 => 'javelin-behavior-phabricator-object-selector',
|
|
||||||
14 => 'differential-inline-comment-editor',
|
|
||||||
15 => 'javelin-behavior-differential-dropdown-menus',
|
|
||||||
16 => 'javelin-behavior-buoyant',
|
|
||||||
),
|
|
||||||
'uri' => '/res/pkg/2e291441/differential.pkg.js',
|
|
||||||
'type' => 'js',
|
|
||||||
),
|
|
||||||
'3e7cc9b3' =>
|
|
||||||
array(
|
array(
|
||||||
'name' => 'typeahead.pkg.js',
|
'name' => 'typeahead.pkg.js',
|
||||||
'symbols' =>
|
'symbols' =>
|
||||||
|
@ -2021,7 +1951,7 @@ celerity_register_resource_map(array(
|
||||||
5 => 'javelin-tokenizer',
|
5 => 'javelin-tokenizer',
|
||||||
6 => 'javelin-behavior-aphront-basic-tokenizer',
|
6 => 'javelin-behavior-aphront-basic-tokenizer',
|
||||||
),
|
),
|
||||||
'uri' => '/res/pkg/3e7cc9b3/typeahead.pkg.js',
|
'uri' => '/res/pkg/2af849fb/typeahead.pkg.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
),
|
),
|
||||||
'4fbae2af' =>
|
'4fbae2af' =>
|
||||||
|
@ -2053,6 +1983,73 @@ celerity_register_resource_map(array(
|
||||||
'uri' => '/res/pkg/61f9d480/diffusion.pkg.css',
|
'uri' => '/res/pkg/61f9d480/diffusion.pkg.css',
|
||||||
'type' => 'css',
|
'type' => 'css',
|
||||||
),
|
),
|
||||||
|
'78e8854e' =>
|
||||||
|
array(
|
||||||
|
'name' => 'core.pkg.css',
|
||||||
|
'symbols' =>
|
||||||
|
array(
|
||||||
|
0 => 'phabricator-core-css',
|
||||||
|
1 => 'phabricator-core-buttons-css',
|
||||||
|
2 => 'phabricator-standard-page-view',
|
||||||
|
3 => 'aphront-dialog-view-css',
|
||||||
|
4 => 'aphront-form-view-css',
|
||||||
|
5 => 'aphront-panel-view-css',
|
||||||
|
6 => 'aphront-side-nav-view-css',
|
||||||
|
7 => 'aphront-table-view-css',
|
||||||
|
8 => 'aphront-crumbs-view-css',
|
||||||
|
9 => 'aphront-tokenizer-control-css',
|
||||||
|
10 => 'aphront-typeahead-control-css',
|
||||||
|
11 => 'aphront-list-filter-view-css',
|
||||||
|
12 => 'phabricator-directory-css',
|
||||||
|
13 => 'phabricator-jump-nav',
|
||||||
|
14 => 'phabricator-app-buttons-css',
|
||||||
|
15 => 'phabricator-remarkup-css',
|
||||||
|
16 => 'syntax-highlighting-css',
|
||||||
|
17 => 'aphront-pager-view-css',
|
||||||
|
18 => 'phabricator-transaction-view-css',
|
||||||
|
),
|
||||||
|
'uri' => '/res/pkg/78e8854e/core.pkg.css',
|
||||||
|
'type' => 'css',
|
||||||
|
),
|
||||||
|
'86fc0b0c' =>
|
||||||
|
array(
|
||||||
|
'name' => 'maniphest.pkg.js',
|
||||||
|
'symbols' =>
|
||||||
|
array(
|
||||||
|
0 => 'javelin-behavior-maniphest-batch-selector',
|
||||||
|
1 => 'javelin-behavior-maniphest-transaction-controls',
|
||||||
|
2 => 'javelin-behavior-maniphest-transaction-preview',
|
||||||
|
3 => 'javelin-behavior-maniphest-transaction-expand',
|
||||||
|
),
|
||||||
|
'uri' => '/res/pkg/86fc0b0c/maniphest.pkg.js',
|
||||||
|
'type' => 'js',
|
||||||
|
),
|
||||||
|
'e8b28c4a' =>
|
||||||
|
array(
|
||||||
|
'name' => 'differential.pkg.js',
|
||||||
|
'symbols' =>
|
||||||
|
array(
|
||||||
|
0 => 'phabricator-drag-and-drop-file-upload',
|
||||||
|
1 => 'phabricator-shaped-request',
|
||||||
|
2 => 'javelin-behavior-differential-feedback-preview',
|
||||||
|
3 => 'javelin-behavior-differential-edit-inline-comments',
|
||||||
|
4 => 'javelin-behavior-differential-populate',
|
||||||
|
5 => 'javelin-behavior-differential-show-more',
|
||||||
|
6 => 'javelin-behavior-differential-diff-radios',
|
||||||
|
7 => 'javelin-behavior-differential-accept-with-errors',
|
||||||
|
8 => 'javelin-behavior-differential-comment-jump',
|
||||||
|
9 => 'javelin-behavior-differential-add-reviewers-and-ccs',
|
||||||
|
10 => 'javelin-behavior-differential-keyboard-navigation',
|
||||||
|
11 => 'javelin-behavior-aphront-drag-and-drop',
|
||||||
|
12 => 'javelin-behavior-aphront-drag-and-drop-textarea',
|
||||||
|
13 => 'javelin-behavior-phabricator-object-selector',
|
||||||
|
14 => 'differential-inline-comment-editor',
|
||||||
|
15 => 'javelin-behavior-differential-dropdown-menus',
|
||||||
|
16 => 'javelin-behavior-buoyant',
|
||||||
|
),
|
||||||
|
'uri' => '/res/pkg/e8b28c4a/differential.pkg.js',
|
||||||
|
'type' => 'js',
|
||||||
|
),
|
||||||
31583232 =>
|
31583232 =>
|
||||||
array(
|
array(
|
||||||
'name' => 'maniphest.pkg.css',
|
'name' => 'maniphest.pkg.css',
|
||||||
|
@ -2092,20 +2089,20 @@ celerity_register_resource_map(array(
|
||||||
'reverse' =>
|
'reverse' =>
|
||||||
array(
|
array(
|
||||||
'aphront-attached-file-view-css' => '31583232',
|
'aphront-attached-file-view-css' => '31583232',
|
||||||
'aphront-crumbs-view-css' => '2b5d58e9',
|
'aphront-crumbs-view-css' => '78e8854e',
|
||||||
'aphront-dialog-view-css' => '2b5d58e9',
|
'aphront-dialog-view-css' => '78e8854e',
|
||||||
'aphront-form-view-css' => '2b5d58e9',
|
'aphront-form-view-css' => '78e8854e',
|
||||||
'aphront-headsup-action-list-view-css' => '09c86840',
|
'aphront-headsup-action-list-view-css' => '09c86840',
|
||||||
'aphront-list-filter-view-css' => '2b5d58e9',
|
'aphront-list-filter-view-css' => '78e8854e',
|
||||||
'aphront-pager-view-css' => '2b5d58e9',
|
'aphront-pager-view-css' => '78e8854e',
|
||||||
'aphront-panel-view-css' => '2b5d58e9',
|
'aphront-panel-view-css' => '78e8854e',
|
||||||
'aphront-side-nav-view-css' => '2b5d58e9',
|
'aphront-side-nav-view-css' => '78e8854e',
|
||||||
'aphront-table-view-css' => '2b5d58e9',
|
'aphront-table-view-css' => '78e8854e',
|
||||||
'aphront-tokenizer-control-css' => '2b5d58e9',
|
'aphront-tokenizer-control-css' => '78e8854e',
|
||||||
'aphront-typeahead-control-css' => '2b5d58e9',
|
'aphront-typeahead-control-css' => '78e8854e',
|
||||||
'differential-changeset-view-css' => '09c86840',
|
'differential-changeset-view-css' => '09c86840',
|
||||||
'differential-core-view-css' => '09c86840',
|
'differential-core-view-css' => '09c86840',
|
||||||
'differential-inline-comment-editor' => '2e291441',
|
'differential-inline-comment-editor' => 'e8b28c4a',
|
||||||
'differential-local-commits-view-css' => '09c86840',
|
'differential-local-commits-view-css' => '09c86840',
|
||||||
'differential-revision-add-comment-css' => '09c86840',
|
'differential-revision-add-comment-css' => '09c86840',
|
||||||
'differential-revision-comment-css' => '09c86840',
|
'differential-revision-comment-css' => '09c86840',
|
||||||
|
@ -2115,28 +2112,28 @@ celerity_register_resource_map(array(
|
||||||
'differential-table-of-contents-css' => '09c86840',
|
'differential-table-of-contents-css' => '09c86840',
|
||||||
'diffusion-commit-view-css' => '61f9d480',
|
'diffusion-commit-view-css' => '61f9d480',
|
||||||
'javelin-behavior' => '4fbae2af',
|
'javelin-behavior' => '4fbae2af',
|
||||||
'javelin-behavior-aphront-basic-tokenizer' => '3e7cc9b3',
|
'javelin-behavior-aphront-basic-tokenizer' => '2af849fb',
|
||||||
'javelin-behavior-aphront-drag-and-drop' => '2e291441',
|
'javelin-behavior-aphront-drag-and-drop' => 'e8b28c4a',
|
||||||
'javelin-behavior-aphront-drag-and-drop-textarea' => '2e291441',
|
'javelin-behavior-aphront-drag-and-drop-textarea' => 'e8b28c4a',
|
||||||
'javelin-behavior-aphront-form-disable-on-submit' => '95944588',
|
'javelin-behavior-aphront-form-disable-on-submit' => '95944588',
|
||||||
'javelin-behavior-buoyant' => '2e291441',
|
'javelin-behavior-buoyant' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-accept-with-errors' => '2e291441',
|
'javelin-behavior-differential-accept-with-errors' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-add-reviewers-and-ccs' => '2e291441',
|
'javelin-behavior-differential-add-reviewers-and-ccs' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-comment-jump' => '2e291441',
|
'javelin-behavior-differential-comment-jump' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-diff-radios' => '2e291441',
|
'javelin-behavior-differential-diff-radios' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-dropdown-menus' => '2e291441',
|
'javelin-behavior-differential-dropdown-menus' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-edit-inline-comments' => '2e291441',
|
'javelin-behavior-differential-edit-inline-comments' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-feedback-preview' => '2e291441',
|
'javelin-behavior-differential-feedback-preview' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-keyboard-navigation' => '2e291441',
|
'javelin-behavior-differential-keyboard-navigation' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-populate' => '2e291441',
|
'javelin-behavior-differential-populate' => 'e8b28c4a',
|
||||||
'javelin-behavior-differential-show-more' => '2e291441',
|
'javelin-behavior-differential-show-more' => 'e8b28c4a',
|
||||||
'javelin-behavior-maniphest-batch-selector' => '0ed3e020',
|
'javelin-behavior-maniphest-batch-selector' => '86fc0b0c',
|
||||||
'javelin-behavior-maniphest-transaction-controls' => '0ed3e020',
|
'javelin-behavior-maniphest-transaction-controls' => '86fc0b0c',
|
||||||
'javelin-behavior-maniphest-transaction-expand' => '0ed3e020',
|
'javelin-behavior-maniphest-transaction-expand' => '86fc0b0c',
|
||||||
'javelin-behavior-maniphest-transaction-preview' => '0ed3e020',
|
'javelin-behavior-maniphest-transaction-preview' => '86fc0b0c',
|
||||||
'javelin-behavior-phabricator-autofocus' => '95944588',
|
'javelin-behavior-phabricator-autofocus' => '95944588',
|
||||||
'javelin-behavior-phabricator-keyboard-shortcuts' => '95944588',
|
'javelin-behavior-phabricator-keyboard-shortcuts' => '95944588',
|
||||||
'javelin-behavior-phabricator-object-selector' => '2e291441',
|
'javelin-behavior-phabricator-object-selector' => 'e8b28c4a',
|
||||||
'javelin-behavior-phabricator-watch-anchor' => '95944588',
|
'javelin-behavior-phabricator-watch-anchor' => '95944588',
|
||||||
'javelin-behavior-refresh-csrf' => '95944588',
|
'javelin-behavior-refresh-csrf' => '95944588',
|
||||||
'javelin-behavior-workflow' => '95944588',
|
'javelin-behavior-workflow' => '95944588',
|
||||||
|
@ -2147,12 +2144,12 @@ celerity_register_resource_map(array(
|
||||||
'javelin-mask' => '95944588',
|
'javelin-mask' => '95944588',
|
||||||
'javelin-request' => '4fbae2af',
|
'javelin-request' => '4fbae2af',
|
||||||
'javelin-stratcom' => '4fbae2af',
|
'javelin-stratcom' => '4fbae2af',
|
||||||
'javelin-tokenizer' => '3e7cc9b3',
|
'javelin-tokenizer' => '2af849fb',
|
||||||
'javelin-typeahead' => '3e7cc9b3',
|
'javelin-typeahead' => '2af849fb',
|
||||||
'javelin-typeahead-normalizer' => '3e7cc9b3',
|
'javelin-typeahead-normalizer' => '2af849fb',
|
||||||
'javelin-typeahead-ondemand-source' => '3e7cc9b3',
|
'javelin-typeahead-ondemand-source' => '2af849fb',
|
||||||
'javelin-typeahead-preloaded-source' => '3e7cc9b3',
|
'javelin-typeahead-preloaded-source' => '2af849fb',
|
||||||
'javelin-typeahead-source' => '3e7cc9b3',
|
'javelin-typeahead-source' => '2af849fb',
|
||||||
'javelin-uri' => '4fbae2af',
|
'javelin-uri' => '4fbae2af',
|
||||||
'javelin-util' => '4fbae2af',
|
'javelin-util' => '4fbae2af',
|
||||||
'javelin-vector' => '4fbae2af',
|
'javelin-vector' => '4fbae2af',
|
||||||
|
@ -2160,23 +2157,23 @@ celerity_register_resource_map(array(
|
||||||
'maniphest-task-detail-css' => '31583232',
|
'maniphest-task-detail-css' => '31583232',
|
||||||
'maniphest-task-summary-css' => '31583232',
|
'maniphest-task-summary-css' => '31583232',
|
||||||
'maniphest-transaction-detail-css' => '31583232',
|
'maniphest-transaction-detail-css' => '31583232',
|
||||||
'phabricator-app-buttons-css' => '2b5d58e9',
|
'phabricator-app-buttons-css' => '78e8854e',
|
||||||
'phabricator-content-source-view-css' => '09c86840',
|
'phabricator-content-source-view-css' => '09c86840',
|
||||||
'phabricator-core-buttons-css' => '2b5d58e9',
|
'phabricator-core-buttons-css' => '78e8854e',
|
||||||
'phabricator-core-css' => '2b5d58e9',
|
'phabricator-core-css' => '78e8854e',
|
||||||
'phabricator-directory-css' => '2b5d58e9',
|
'phabricator-directory-css' => '78e8854e',
|
||||||
'phabricator-drag-and-drop-file-upload' => '2e291441',
|
'phabricator-drag-and-drop-file-upload' => 'e8b28c4a',
|
||||||
'phabricator-dropdown-menu' => '95944588',
|
'phabricator-dropdown-menu' => '95944588',
|
||||||
'phabricator-jump-nav' => '2b5d58e9',
|
'phabricator-jump-nav' => '78e8854e',
|
||||||
'phabricator-keyboard-shortcut' => '95944588',
|
'phabricator-keyboard-shortcut' => '95944588',
|
||||||
'phabricator-keyboard-shortcut-manager' => '95944588',
|
'phabricator-keyboard-shortcut-manager' => '95944588',
|
||||||
'phabricator-menu-item' => '95944588',
|
'phabricator-menu-item' => '95944588',
|
||||||
'phabricator-object-selector-css' => '09c86840',
|
'phabricator-object-selector-css' => '09c86840',
|
||||||
'phabricator-paste-file-upload' => '95944588',
|
'phabricator-paste-file-upload' => '95944588',
|
||||||
'phabricator-remarkup-css' => '2b5d58e9',
|
'phabricator-remarkup-css' => '78e8854e',
|
||||||
'phabricator-shaped-request' => '2e291441',
|
'phabricator-shaped-request' => 'e8b28c4a',
|
||||||
'phabricator-standard-page-view' => '2b5d58e9',
|
'phabricator-standard-page-view' => '78e8854e',
|
||||||
'phabricator-transaction-view-css' => '2b5d58e9',
|
'phabricator-transaction-view-css' => '78e8854e',
|
||||||
'syntax-highlighting-css' => '2b5d58e9',
|
'syntax-highlighting-css' => '78e8854e',
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
|
@ -128,12 +128,14 @@ final class DifferentialAddCommentView extends AphrontView {
|
||||||
'src' => '/typeahead/common/users/',
|
'src' => '/typeahead/common/users/',
|
||||||
'row' => 'add-reviewers',
|
'row' => 'add-reviewers',
|
||||||
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
||||||
|
'placeholder' => 'Type a user name...',
|
||||||
),
|
),
|
||||||
'add-ccs-tokenizer' => array(
|
'add-ccs-tokenizer' => array(
|
||||||
'actions' => array('add_ccs' => 1),
|
'actions' => array('add_ccs' => 1),
|
||||||
'src' => '/typeahead/common/mailable/',
|
'src' => '/typeahead/common/mailable/',
|
||||||
'row' => 'add-ccs',
|
'row' => 'add-ccs',
|
||||||
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
||||||
|
'placeholder' => 'Type a user or mailing list...',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'select' => 'comment-action',
|
'select' => 'comment-action',
|
||||||
|
|
|
@ -450,6 +450,7 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
||||||
'id' => 'projects-tokenizer',
|
'id' => 'projects-tokenizer',
|
||||||
'src' => '/typeahead/common/projects/',
|
'src' => '/typeahead/common/projects/',
|
||||||
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
||||||
|
'placeholder' => 'Type a project name...',
|
||||||
),
|
),
|
||||||
ManiphestTransactionType::TYPE_OWNER => array(
|
ManiphestTransactionType::TYPE_OWNER => array(
|
||||||
'id' => 'assign-tokenizer',
|
'id' => 'assign-tokenizer',
|
||||||
|
@ -457,11 +458,13 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
||||||
'value' => $default_claim,
|
'value' => $default_claim,
|
||||||
'limit' => 1,
|
'limit' => 1,
|
||||||
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
||||||
|
'placeholder' => 'Type a user name...',
|
||||||
),
|
),
|
||||||
ManiphestTransactionType::TYPE_CCS => array(
|
ManiphestTransactionType::TYPE_CCS => array(
|
||||||
'id' => 'cc-tokenizer',
|
'id' => 'cc-tokenizer',
|
||||||
'src' => '/typeahead/common/mailable/',
|
'src' => '/typeahead/common/mailable/',
|
||||||
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
||||||
|
'placeholder' => 'Type a user or mailing list...',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
|
@ -390,6 +390,7 @@ final class ManiphestTaskEditController extends ManiphestController {
|
||||||
->setLabel('Assigned To')
|
->setLabel('Assigned To')
|
||||||
->setName('assigned_to')
|
->setName('assigned_to')
|
||||||
->setValue($assigned_value)
|
->setValue($assigned_value)
|
||||||
|
->setUser($user)
|
||||||
->setDatasource('/typeahead/common/users/')
|
->setDatasource('/typeahead/common/users/')
|
||||||
->setLimit(1))
|
->setLimit(1))
|
||||||
->appendChild(
|
->appendChild(
|
||||||
|
@ -397,6 +398,7 @@ final class ManiphestTaskEditController extends ManiphestController {
|
||||||
->setLabel('CC')
|
->setLabel('CC')
|
||||||
->setName('cc')
|
->setName('cc')
|
||||||
->setValue($cc_value)
|
->setValue($cc_value)
|
||||||
|
->setUser($user)
|
||||||
->setDatasource('/typeahead/common/mailable/'))
|
->setDatasource('/typeahead/common/mailable/'))
|
||||||
->appendChild(
|
->appendChild(
|
||||||
id(new AphrontFormSelectControl())
|
id(new AphrontFormSelectControl())
|
||||||
|
|
|
@ -22,6 +22,7 @@ class AphrontFormTokenizerControl extends AphrontFormControl {
|
||||||
private $disableBehavior;
|
private $disableBehavior;
|
||||||
private $limit;
|
private $limit;
|
||||||
private $user;
|
private $user;
|
||||||
|
private $placeholder;
|
||||||
|
|
||||||
public function setDatasource($datasource) {
|
public function setDatasource($datasource) {
|
||||||
$this->datasource = $datasource;
|
$this->datasource = $datasource;
|
||||||
|
@ -47,6 +48,11 @@ class AphrontFormTokenizerControl extends AphrontFormControl {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setPlaceholder($placeholder) {
|
||||||
|
$this->placeholder = $placeholder;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
protected function renderInput() {
|
protected function renderInput() {
|
||||||
$name = $this->getName();
|
$name = $this->getName();
|
||||||
$values = nonempty($this->getValue(), array());
|
$values = nonempty($this->getValue(), array());
|
||||||
|
@ -57,6 +63,11 @@ class AphrontFormTokenizerControl extends AphrontFormControl {
|
||||||
$id = celerity_generate_unique_node_id();
|
$id = celerity_generate_unique_node_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$placeholder = null;
|
||||||
|
if (!$this->placeholder) {
|
||||||
|
$placeholder = $this->getDefaultPlaceholder();
|
||||||
|
}
|
||||||
|
|
||||||
$template = new AphrontTokenizerTemplateView();
|
$template = new AphrontTokenizerTemplateView();
|
||||||
$template->setName($name);
|
$template->setName($name);
|
||||||
$template->setID($id);
|
$template->setID($id);
|
||||||
|
@ -75,11 +86,37 @@ class AphrontFormTokenizerControl extends AphrontFormControl {
|
||||||
'limit' => $this->limit,
|
'limit' => $this->limit,
|
||||||
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
|
||||||
'username' => $username,
|
'username' => $username,
|
||||||
|
'placeholder' => $placeholder,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $template->render();
|
return $template->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getDefaultPlaceholder() {
|
||||||
|
$datasource = $this->datasource;
|
||||||
|
|
||||||
|
$matches = null;
|
||||||
|
if (!preg_match('@^/typeahead/common/(.*)/$@', $datasource, $matches)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$request = $matches[1];
|
||||||
|
|
||||||
|
$map = array(
|
||||||
|
'users' => 'Type a user name...',
|
||||||
|
'searchowner' => 'Type a user name...',
|
||||||
|
'accounts' => 'Type a user name...',
|
||||||
|
'mailable' => 'Type a user or mailing list...',
|
||||||
|
'searchproject' => 'Type a project name...',
|
||||||
|
'projects' => 'Type a project name...',
|
||||||
|
'repositories' => 'Type a repository name...',
|
||||||
|
'packages' => 'Type a package name...',
|
||||||
|
'arcanistproject' => 'Type an arc project name...',
|
||||||
|
);
|
||||||
|
|
||||||
|
return idx($map, $request);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,3 +42,7 @@ table.jx-typeahead input {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input.jx-typeahead-placeholder {
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,13 @@
|
||||||
* @requires javelin-install
|
* @requires javelin-install
|
||||||
* javelin-util
|
* javelin-util
|
||||||
* javelin-dom
|
* javelin-dom
|
||||||
|
* javelin-typeahead
|
||||||
|
* javelin-tokenizer
|
||||||
|
* javelin-typeahead-preloaded-source
|
||||||
|
* javelin-typeahead-ondemand-source
|
||||||
|
* javelin-dom
|
||||||
|
* javelin-stratcom
|
||||||
|
* javelin-util
|
||||||
* @javelin
|
* @javelin
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -22,6 +29,107 @@ JX.install('Prefab', {
|
||||||
}
|
}
|
||||||
select.value = select.value || JX.keys(map)[0];
|
select.value = select.value || JX.keys(map)[0];
|
||||||
return select;
|
return select;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a Phabricator tokenizer out of a configuration with application
|
||||||
|
* sorting, datasource and placeholder rules.
|
||||||
|
*
|
||||||
|
* - `id` Root tokenizer ID.
|
||||||
|
* - `src` Datasource URI.
|
||||||
|
* - `ondemand` Optional, use an ondemand source.
|
||||||
|
* - `value` Optional, initial value.
|
||||||
|
* - `limit` Optional, token limit.
|
||||||
|
* - `placeholder` Optional, placeholder text.
|
||||||
|
* - `username` Optional, username to sort first (i.e., viewer).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
buildTokenizer : function(config) {
|
||||||
|
var root = JX.$(config.id);
|
||||||
|
|
||||||
|
var datasource;
|
||||||
|
if (config.ondemand) {
|
||||||
|
datasource = new JX.TypeaheadOnDemandSource(config.src);
|
||||||
|
} else {
|
||||||
|
datasource = new JX.TypeaheadPreloadedSource(config.src);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort results so that the viewing user always comes up first; after
|
||||||
|
// that, prefer unixname matches to realname matches.
|
||||||
|
|
||||||
|
var sort_handler = function(value, list, cmp) {
|
||||||
|
var priority_hits = {};
|
||||||
|
var self_hits = {};
|
||||||
|
|
||||||
|
var tokens = this.tokenize(value);
|
||||||
|
|
||||||
|
for (var ii = 0; ii < list.length; ii++) {
|
||||||
|
var item = list[ii];
|
||||||
|
if (!item.priority) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.username && item.priority == config.username) {
|
||||||
|
self_hits[item.id] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var jj = 0; jj < tokens.length; jj++) {
|
||||||
|
if (item.priority.substr(0, tokens[jj].length) == tokens[jj]) {
|
||||||
|
priority_hits[item.id] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list.sort(function(u, v) {
|
||||||
|
if (self_hits[u.id] != self_hits[v.id]) {
|
||||||
|
return self_hits[v.id] ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priority_hits[u.id] != priority_hits[v.id]) {
|
||||||
|
return priority_hits[v.id] ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmp(u, v);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
datasource.setSortHandler(JX.bind(datasource, sort_handler));
|
||||||
|
datasource.setTransformer(
|
||||||
|
function(object) {
|
||||||
|
return {
|
||||||
|
name: object[0],
|
||||||
|
display: object[0],
|
||||||
|
uri: object[1],
|
||||||
|
id: object[2],
|
||||||
|
priority: object[3]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
var typeahead = new JX.Typeahead(
|
||||||
|
root,
|
||||||
|
JX.DOM.find(root, 'input', 'tokenizer-input'));
|
||||||
|
typeahead.setDatasource(datasource);
|
||||||
|
|
||||||
|
var tokenizer = new JX.Tokenizer(root);
|
||||||
|
tokenizer.setTypeahead(typeahead);
|
||||||
|
|
||||||
|
if (config.placeholder) {
|
||||||
|
tokenizer.setPlaceholder(config.placeholder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.limit) {
|
||||||
|
tokenizer.setLimit(config.limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.value) {
|
||||||
|
tokenizer.setInitialValue(config.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
JX.Stratcom.addData(root, {'tokenizer' : tokenizer});
|
||||||
|
|
||||||
|
return {
|
||||||
|
tokenizer: tokenizer
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,94 +1,9 @@
|
||||||
/**
|
/**
|
||||||
* @provides javelin-behavior-aphront-basic-tokenizer
|
* @provides javelin-behavior-aphront-basic-tokenizer
|
||||||
* @requires javelin-behavior
|
* @requires javelin-behavior
|
||||||
* javelin-typeahead
|
* phabricator-prefab
|
||||||
* javelin-tokenizer
|
|
||||||
* javelin-typeahead-preloaded-source
|
|
||||||
* javelin-typeahead-ondemand-source
|
|
||||||
* javelin-dom
|
|
||||||
* javelin-stratcom
|
|
||||||
* javelin-util
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
JX.behavior('aphront-basic-tokenizer', function(config) {
|
JX.behavior('aphront-basic-tokenizer', function(config) {
|
||||||
var root = JX.$(config.id);
|
JX.Prefab.buildTokenizer(config).tokenizer.start();
|
||||||
|
|
||||||
var datasource;
|
|
||||||
if (config.ondemand) {
|
|
||||||
datasource = new JX.TypeaheadOnDemandSource(config.src);
|
|
||||||
} else {
|
|
||||||
datasource = new JX.TypeaheadPreloadedSource(config.src);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort results so that the viewing user always comes up first; after that,
|
|
||||||
// prefer unixname matches to realname matches.
|
|
||||||
|
|
||||||
var sort_handler = function(value, list, cmp) {
|
|
||||||
var priority_hits = {};
|
|
||||||
var self_hits = {};
|
|
||||||
|
|
||||||
var tokens = this.tokenize(value);
|
|
||||||
|
|
||||||
for (var ii = 0; ii < list.length; ii++) {
|
|
||||||
var item = list[ii];
|
|
||||||
if (!item.priority) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.username && item.priority == config.username) {
|
|
||||||
self_hits[item.id] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var jj = 0; jj < tokens.length; jj++) {
|
|
||||||
if (item.priority.substr(0, tokens[jj].length) == tokens[jj]) {
|
|
||||||
priority_hits[item.id] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list.sort(function(u, v) {
|
|
||||||
if (self_hits[u.id] != self_hits[v.id]) {
|
|
||||||
return self_hits[v.id] ? 1 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priority_hits[u.id] != priority_hits[v.id]) {
|
|
||||||
return priority_hits[v.id] ? 1 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cmp(u, v);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
datasource.setSortHandler(JX.bind(datasource, sort_handler));
|
|
||||||
datasource.setTransformer(
|
|
||||||
function(object) {
|
|
||||||
return {
|
|
||||||
name : object[0],
|
|
||||||
display : object[0],
|
|
||||||
uri : object[1],
|
|
||||||
id : object[2],
|
|
||||||
priority : object[3]
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
var typeahead = new JX.Typeahead(
|
|
||||||
root,
|
|
||||||
JX.DOM.find(root, 'input', 'tokenizer-input'));
|
|
||||||
typeahead.setDatasource(datasource);
|
|
||||||
|
|
||||||
var tokenizer = new JX.Tokenizer(root);
|
|
||||||
tokenizer.setTypeahead(typeahead);
|
|
||||||
|
|
||||||
if (config.limit) {
|
|
||||||
tokenizer.setLimit(config.limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.value) {
|
|
||||||
tokenizer.setInitialValue(config.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
JX.Stratcom.addData(root, {'tokenizer' : tokenizer});
|
|
||||||
|
|
||||||
tokenizer.start();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,42 +2,22 @@
|
||||||
* @provides javelin-behavior-differential-add-reviewers-and-ccs
|
* @provides javelin-behavior-differential-add-reviewers-and-ccs
|
||||||
* @requires javelin-behavior
|
* @requires javelin-behavior
|
||||||
* javelin-dom
|
* javelin-dom
|
||||||
* javelin-tokenizer
|
* phabricator-prefab
|
||||||
* javelin-typeahead
|
|
||||||
* javelin-typeahead-preloaded-source
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
JX.behavior('differential-add-reviewers-and-ccs', function(config) {
|
JX.behavior('differential-add-reviewers-and-ccs', function(config) {
|
||||||
|
|
||||||
function buildTokenizer(id, props) {
|
|
||||||
var root = JX.$(id);
|
|
||||||
|
|
||||||
var datasource;
|
|
||||||
if (props.ondemand) {
|
|
||||||
datasource = new JX.TypeaheadOnDemandSource(props.src);
|
|
||||||
} else {
|
|
||||||
datasource = new JX.TypeaheadPreloadedSource(props.src);
|
|
||||||
}
|
|
||||||
|
|
||||||
var typeahead = new JX.Typeahead(root);
|
|
||||||
typeahead.setDatasource(datasource);
|
|
||||||
|
|
||||||
var tokenizer = new JX.Tokenizer(root);
|
|
||||||
tokenizer.setTypeahead(typeahead);
|
|
||||||
|
|
||||||
JX.Stratcom.addData(root, {'tokenizer' : tokenizer});
|
|
||||||
|
|
||||||
tokenizer.start();
|
|
||||||
|
|
||||||
return tokenizer;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dynamic = {};
|
var dynamic = {};
|
||||||
for (var k in config.dynamic) {
|
for (var k in config.dynamic) {
|
||||||
props = config.dynamic[k];
|
var props = config.dynamic[k];
|
||||||
|
props.id = k;
|
||||||
|
|
||||||
|
var tokenizer = JX.Prefab.buildTokenizer(props).tokenizer;
|
||||||
|
tokenizer.start();
|
||||||
|
|
||||||
dynamic[k] = {
|
dynamic[k] = {
|
||||||
row : JX.$(props.row),
|
row : JX.$(props.row),
|
||||||
tokenizer : buildTokenizer(k, props),
|
tokenizer : tokenizer,
|
||||||
actions : props.actions
|
actions : props.actions
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,7 @@
|
||||||
* @provides javelin-behavior-maniphest-transaction-controls
|
* @provides javelin-behavior-maniphest-transaction-controls
|
||||||
* @requires javelin-behavior
|
* @requires javelin-behavior
|
||||||
* javelin-dom
|
* javelin-dom
|
||||||
* javelin-tokenizer
|
* phabricator-prefab
|
||||||
* javelin-typeahead
|
|
||||||
* javelin-typeahead-preloaded-source
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
JX.behavior('maniphest-transaction-controls', function(config) {
|
JX.behavior('maniphest-transaction-controls', function(config) {
|
||||||
|
@ -13,35 +11,8 @@ JX.behavior('maniphest-transaction-controls', function(config) {
|
||||||
|
|
||||||
for (var k in config.tokenizers) {
|
for (var k in config.tokenizers) {
|
||||||
var tconfig = config.tokenizers[k];
|
var tconfig = config.tokenizers[k];
|
||||||
var root = JX.$(tconfig.id);
|
tokenizers[k] = JX.Prefab.buildTokenizer(tconfig).tokenizer;
|
||||||
|
tokenizers[k].start()
|
||||||
var datasource;
|
|
||||||
if (tconfig.ondemand) {
|
|
||||||
datasource = new JX.TypeaheadOnDemandSource(tconfig.src);
|
|
||||||
} else {
|
|
||||||
datasource = new JX.TypeaheadPreloadedSource(tconfig.src);
|
|
||||||
}
|
|
||||||
|
|
||||||
var typeahead = new JX.Typeahead(root);
|
|
||||||
typeahead.setDatasource(datasource);
|
|
||||||
|
|
||||||
var tokenizer = new JX.Tokenizer(root);
|
|
||||||
tokenizer.setTypeahead(typeahead);
|
|
||||||
|
|
||||||
if (tconfig.limit) {
|
|
||||||
tokenizer.setLimit(tconfig.limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
tokenizer.start();
|
|
||||||
|
|
||||||
|
|
||||||
if (tconfig.value) {
|
|
||||||
for (var jj in tconfig.value) {
|
|
||||||
tokenizer.addToken(jj, tconfig.value[jj]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tokenizers[k] = tokenizer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JX.DOM.listen(
|
JX.DOM.listen(
|
||||||
|
|
Loading…
Reference in a new issue