@@ -10,11 +10,13 @@ JX.behavior('phabricator-object-selector', function(config) {
10
10
var n = 0 ;
11
11
12
12
var phids = { } ;
13
+ var display = [ ] ;
14
+
13
15
var handles = config . handles ;
14
16
for ( var k in handles ) {
15
17
phids [ k ] = true ;
16
18
}
17
- var button_list = { } ;
19
+
18
20
var query_timer = null ;
19
21
var query_delay = 50 ;
20
22
@@ -41,37 +43,82 @@ JX.behavior('phabricator-object-selector', function(config) {
41
43
return ;
42
44
}
43
45
44
- var display = [ ] ;
45
- button_list = { } ;
46
+ display = [ ] ;
46
47
for ( var k in r ) {
47
48
handles [ r [ k ] . phid ] = r [ k ] ;
48
- display . push ( renderHandle ( r [ k ] , true ) ) ;
49
+ display . push ( { phid : r [ k ] . phid } ) ;
49
50
}
50
51
51
- if ( ! display . length ) {
52
- display = renderNote ( 'No results.' ) ;
53
- }
54
-
55
- JX . DOM . setContent ( JX . $ ( config . results ) , display ) ;
52
+ redrawList ( true ) ;
56
53
}
57
54
58
55
function redrawAttached ( ) {
59
- var display = [ ] ;
56
+ var attached = [ ] ;
60
57
61
58
for ( var k in phids ) {
62
- display . push ( renderHandle ( handles [ k ] , false ) ) ;
59
+ attached . push ( renderHandle ( handles [ k ] , false ) . item ) ;
63
60
}
64
61
65
- if ( ! display . length ) {
66
- display = renderNote ( 'Nothing attached.' ) ;
62
+ if ( ! attached . length ) {
63
+ attached = renderNote ( 'Nothing attached.' ) ;
67
64
}
68
65
69
- JX . DOM . setContent ( JX . $ ( config . current ) , display ) ;
66
+ JX . DOM . setContent ( JX . $ ( config . current ) , attached ) ;
70
67
phid_input . value = JX . keys ( phids ) . join ( ';' ) ;
71
68
}
72
69
73
- function renderHandle ( h , attach ) {
70
+ function redrawList ( rebuild ) {
71
+ var ii ;
72
+ var content ;
73
+
74
+ if ( rebuild ) {
75
+ if ( display . length ) {
76
+ var handle ;
77
+
78
+ content = [ ] ;
79
+ for ( ii = 0 ; ii < display . length ; ii ++ ) {
80
+ handle = handles [ display [ ii ] . phid ] ;
81
+
82
+ display [ ii ] . node = renderHandle ( handle , true ) ;
83
+ content . push ( display [ ii ] . node . item ) ;
84
+ }
85
+ } else {
86
+ content = renderNote ( 'No results.' ) ;
87
+ }
88
+
89
+ JX . DOM . setContent ( JX . $ ( config . results ) , content ) ;
90
+ }
91
+
92
+ var phid ;
93
+ var is_disabled ;
94
+ var button ;
95
+
96
+ var at_maximum = ! canSelectMore ( ) ;
97
+
98
+ for ( ii = 0 ; ii < display . length ; ii ++ ) {
99
+ phid = display [ ii ] . phid ;
100
+
101
+ is_disabled = false ;
102
+
103
+ // If this object is already selected, you can not select it again.
104
+ if ( phids . hasOwnProperty ( phid ) ) {
105
+ is_disabled = true ;
106
+ }
107
+
108
+ // If the maximum number of objects are already selected, you can
109
+ // not select more.
110
+ if ( at_maximum ) {
111
+ is_disabled = true ;
112
+ }
113
+
114
+ button = display [ ii ] . node . button ;
115
+ JX . DOM . alterClass ( button , 'disabled' , is_disabled ) ;
116
+ button . disabled = is_disabled ;
117
+ }
118
+
119
+ }
74
120
121
+ function renderHandle ( h , attach ) {
75
122
var some_icon = JX . $N (
76
123
'span' ,
77
124
{ className : 'phui-icon-view phui-font-fa ' +
@@ -111,15 +158,10 @@ JX.behavior('phabricator-object-selector', function(config) {
111
158
meta : { handle : h , table :table } } ,
112
159
cells ) ) ;
113
160
114
- if ( attach ) {
115
- button_list [ h . phid ] = select_object_button ;
116
- if ( h . phid in phids ) {
117
- JX . DOM . alterClass ( select_object_button , 'disabled' , true ) ;
118
- select_object_button . disabled = true ;
119
- }
120
- }
121
-
122
- return table ;
161
+ return {
162
+ item : table ,
163
+ button : select_object_button
164
+ } ;
123
165
}
124
166
125
167
function renderNote ( note ) {
@@ -138,6 +180,18 @@ JX.behavior('phabricator-object-selector', function(config) {
138
180
. send ( ) ;
139
181
}
140
182
183
+ function canSelectMore ( ) {
184
+ if ( ! config . maximum ) {
185
+ return true ;
186
+ }
187
+
188
+ if ( JX . keys ( phids ) . length < config . maximum ) {
189
+ return true ;
190
+ }
191
+
192
+ return false ;
193
+ }
194
+
141
195
JX . DOM . listen (
142
196
JX . $ ( config . results ) ,
143
197
'click' ,
@@ -151,10 +205,13 @@ JX.behavior('phabricator-object-selector', function(config) {
151
205
return ;
152
206
}
153
207
208
+ if ( ! canSelectMore ( ) ) {
209
+ return ;
210
+ }
211
+
154
212
phids [ phid ] = true ;
155
- JX . DOM . alterClass ( button_list [ phid ] , 'disabled' , true ) ;
156
- button_list [ phid ] . disabled = true ;
157
213
214
+ redrawList ( false ) ;
158
215
redrawAttached ( ) ;
159
216
} ) ;
160
217
@@ -170,13 +227,7 @@ JX.behavior('phabricator-object-selector', function(config) {
170
227
171
228
delete phids [ phid ] ;
172
229
173
- // NOTE: We may not have a button in the button list, if this result is
174
- // not visible in the current search results.
175
- if ( button_list [ phid ] ) {
176
- JX . DOM . alterClass ( button_list [ phid ] , 'disabled' , false ) ;
177
- button_list [ phid ] . disabled = false ;
178
- }
179
-
230
+ redrawList ( false ) ;
180
231
redrawAttached ( ) ;
181
232
} ) ;
182
233
@@ -205,6 +256,7 @@ JX.behavior('phabricator-object-selector', function(config) {
205
256
} ) ;
206
257
207
258
sendQuery ( ) ;
208
- redrawAttached ( ) ;
209
259
260
+ redrawList ( true ) ;
261
+ redrawAttached ( ) ;
210
262
} ) ;
0 commit comments