CheckboxGroup_wev8.js
13.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
/*!
* Ext JS Library 3.0.0
* Copyright(c) 2006-2009 Ext JS, LLC
* licensing@extjs.com
* http://www.extjs.com/license
*/
/**
* @class Ext.form.CheckboxGroup
* @extends Ext.form.Field
* <p>A grouping container for {@link Ext.form.Checkbox} controls.</p>
* <p>Sample usage:</p>
* <pre><code>
var myCheckboxGroup = new Ext.form.CheckboxGroup({
id:'myGroup',
xtype: 'checkboxgroup',
fieldLabel: 'Single Column',
itemCls: 'x-check-group-alt',
// Put all controls in a single column with width 100%
columns: 1,
items: [
{boxLabel: 'Item 1', name: 'cb-col-1'},
{boxLabel: 'Item 2', name: 'cb-col-2', checked: true},
{boxLabel: 'Item 3', name: 'cb-col-3'}
]
});
* </code></pre>
* @constructor
* Creates a new CheckboxGroup
* @param {Object} config Configuration options
* @xtype checkboxgroup
*/
Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, {
/**
* @cfg {Array} items An Array of {@link Ext.form.Checkbox Checkbox}es or Checkbox config objects
* to arrange in the group.
*/
/**
* @cfg {String/Number/Array} columns Specifies the number of columns to use when displaying grouped
* checkbox/radio controls using automatic layout. This config can take several types of values:
* <ul><li><b>'auto'</b> : <p class="sub-desc">The controls will be rendered one per column on one row and the width
* of each column will be evenly distributed based on the width of the overall field container. This is the default.</p></li>
* <li><b>Number</b> : <p class="sub-desc">If you specific a number (e.g., 3) that number of columns will be
* created and the contained controls will be automatically distributed based on the value of {@link #vertical}.</p></li>
* <li><b>Array</b> : Object<p class="sub-desc">You can also specify an array of column widths, mixing integer
* (fixed width) and float (percentage width) values as needed (e.g., [100, .25, .75]). Any integer values will
* be rendered first, then any float values will be calculated as a percentage of the remaining space. Float
* values do not have to add up to 1 (100%) although if you want the controls to take up the entire field
* container you should do so.</p></li></ul>
*/
columns : 'auto',
/**
* @cfg {Boolean} vertical True to distribute contained controls across columns, completely filling each column
* top to bottom before starting on the next column. The number of controls in each column will be automatically
* calculated to keep columns as even as possible. The default value is false, so that controls will be added
* to columns one at a time, completely filling each row left to right before starting on the next row.
*/
vertical : false,
/**
* @cfg {Boolean} allowBlank False to validate that at least one item in the group is checked (defaults to true).
* If no items are selected at validation time, {@link @blankText} will be used as the error text.
*/
allowBlank : true,
/**
* @cfg {String} blankText Error text to display if the {@link #allowBlank} validation fails (defaults to "You must
* select at least one item in this group")
*/
blankText : "You must select at least one item in this group",
// private
defaultType : 'checkbox',
// private
groupCls : 'x-form-check-group',
// private
initComponent: function(){
this.addEvents(
/**
* @event change
* Fires when the state of a child checkbox changes.
* @param {Ext.form.CheckboxGroup} this
* @param {Array} checked An array containing the checked boxes.
*/
'change'
);
Ext.form.CheckboxGroup.superclass.initComponent.call(this);
},
// private
onRender : function(ct, position){
if(!this.el){
var panelCfg = {
cls: this.groupCls,
layout: 'column',
border: false,
renderTo: ct
};
var colCfg = {
defaultType: this.defaultType,
layout: 'form',
border: false,
defaults: {
hideLabel: true,
anchor: '100%'
}
};
if(this.items[0].items){
// The container has standard ColumnLayout configs, so pass them in directly
Ext.apply(panelCfg, {
layoutConfig: {columns: this.items.length},
defaults: this.defaults,
items: this.items
});
for(var i=0, len=this.items.length; i<len; i++){
Ext.applyIf(this.items[i], colCfg);
}
}else{
// The container has field item configs, so we have to generate the column
// panels first then move the items into the columns as needed.
var numCols, cols = [];
if(typeof this.columns == 'string'){ // 'auto' so create a col per item
this.columns = this.items.length;
}
if(!Ext.isArray(this.columns)){
var cs = [];
for(var i=0; i<this.columns; i++){
cs.push((100/this.columns)*.01); // distribute by even %
}
this.columns = cs;
}
numCols = this.columns.length;
// Generate the column configs with the correct width setting
for(var i=0; i<numCols; i++){
var cc = Ext.apply({items:[]}, colCfg);
cc[this.columns[i] <= 1 ? 'columnWidth' : 'width'] = this.columns[i];
if(this.defaults){
cc.defaults = Ext.apply(cc.defaults || {}, this.defaults)
}
cols.push(cc);
};
// Distribute the original items into the columns
if(this.vertical){
var rows = Math.ceil(this.items.length / numCols), ri = 0;
for(var i=0, len=this.items.length; i<len; i++){
if(i>0 && i%rows==0){
ri++;
}
if(this.items[i].fieldLabel){
this.items[i].hideLabel = false;
}
cols[ri].items.push(this.items[i]);
};
}else{
for(var i=0, len=this.items.length; i<len; i++){
var ci = i % numCols;
if(this.items[i].fieldLabel){
this.items[i].hideLabel = false;
}
cols[ci].items.push(this.items[i]);
};
}
Ext.apply(panelCfg, {
layoutConfig: {columns: numCols},
items: cols
});
}
this.panel = new Ext.Panel(panelCfg);
this.panel.ownerCt = this;
this.el = this.panel.getEl();
if(this.forId && this.itemCls){
var l = this.el.up(this.itemCls).child('label', true);
if(l){
l.setAttribute('htmlFor', this.forId);
}
}
var fields = this.panel.findBy(function(c){
return c.isFormField;
}, this);
this.items = new Ext.util.MixedCollection();
this.items.addAll(fields);
}
Ext.form.CheckboxGroup.superclass.onRender.call(this, ct, position);
},
afterRender : function(){
Ext.form.CheckboxGroup.superclass.afterRender.call(this);
if(this.values){
this.setValue.apply(this, this.values);
delete this.values;
}
this.eachItem(function(item){
item.on('check', this.fireChecked, this);
item.inGroup = true;
});
},
// private
doLayout: function(){
//ugly method required to layout hidden items
if(this.rendered){
this.panel.forceLayout = this.ownerCt.forceLayout;
this.panel.doLayout();
}
},
// private
fireChecked: function(){
var arr = [];
this.eachItem(function(item){
if(item.checked){
arr.push(item);
}
});
this.fireEvent('change', this, arr);
},
// private
validateValue : function(value){
if(!this.allowBlank){
var blank = true;
this.eachItem(function(f){
if(f.checked){
return (blank = false);
}
});
if(blank){
this.markInvalid(this.blankText);
return false;
}
}
return true;
},
// private
onDisable : function(){
this.eachItem(function(item){
item.disable();
});
},
// private
onEnable : function(){
this.eachItem(function(item){
item.enable();
});
},
// private
doLayout: function(){
if(this.rendered){
this.panel.forceLayout = this.ownerCt.forceLayout;
this.panel.doLayout();
}
},
// private
onResize : function(w, h){
this.panel.setSize(w, h);
this.panel.doLayout();
},
// inherit docs from Field
reset : function(){
Ext.form.CheckboxGroup.superclass.reset.call(this);
this.eachItem(function(c){
if(c.reset){
c.reset();
}
});
},
/**
* {@link Ext.form.Checkbox#setValue Set the value(s)} of an item or items
* in the group. Examples illustrating how this method may be called:
* <pre><code>
// call with name and value
myCheckboxGroup.setValue('cb-col-1', true);
// call with an array of boolean values
myCheckboxGroup.setValue([true, false, false]);
// call with an object literal specifying item:value pairs
myCheckboxGroup.setValue({
'cb-col-2': false,
'cb-col-3': true
});
// use comma separated string to set items with name to true (checked)
myCheckboxGroup.setValue('cb-col-1,cb-col-3');
* </code></pre>
* See {@link Ext.form.Checkbox#setValue} for additional information.
* @param {Mixed} id The checkbox to check, or as described by example shown.
* @param {Boolean} value (optional) The value to set the item.
* @return {Ext.form.CheckboxGroup} this
*/
setValue : function(id, value){
if(this.rendered){
if(arguments.length == 1){
if(Ext.isArray(id)){
//an array of boolean values
Ext.each(id, function(val, idx){
var item = this.items.itemAt(idx);
if(item){
item.setValue(val);
}
}, this);
}else if(Ext.isObject(id)){
//set of name/value pairs
for(var i in id){
var f = this.getBox(i);
if(f){
f.setValue(id[i]);
}
}
}else{
this.setValueForItem(id);
}
}else{
var f = this.getBox(id);
if(f){
f.setValue(value);
}
}
}else{
this.values = arguments;
}
return this;
},
// private
onDestroy: function(){
Ext.destroy(this.panel);
Ext.form.CheckboxGroup.superclass.onDestroy.call(this);
},
setValueForItem : function(val){
val = String(val).split(',');
this.eachItem(function(item){
if(val.indexOf(item.inputValue)> -1){
item.setValue(true);
}
});
},
// private
getBox : function(id){
var box = null;
this.eachItem(function(f){
if(id == f || f.dataIndex == id || f.id == id || f.getName() == id){
box = f;
return false;
}
});
return box;
},
/**
* Gets an array of the selected {@link Ext.form.Checkbox} in the group.
* @return {Array} An array of the selected checkboxes.
*/
getValue : function(){
var out = [];
this.eachItem(function(item){
if(item.checked){
out.push(item);
}
});
return out;
},
// private
eachItem: function(fn){
if(this.items && this.items.each){
this.items.each(fn, this);
}
},
/**
* @cfg {String} name
* @hide
*/
/**
* @method initValue
* @hide
*/
initValue : Ext.emptyFn,
/**
* @method getValue
* @hide
*/
getValue : Ext.emptyFn,
/**
* @method getRawValue
* @hide
*/
getRawValue : Ext.emptyFn,
/**
* @method setRawValue
* @hide
*/
setRawValue : Ext.emptyFn
});
Ext.reg('checkboxgroup', Ext.form.CheckboxGroup);