views:

1938

answers:

5

I currently have a GridPanel with the Ext.ux.RowEditor plugin. Four fields exist in the row editor: port, ip address, subnet and DHCP. If the DHCP field (checkbox) of the selected row is checked, I need to make the other three fields un-editable.

I've been trying to perform this code when the beforeedit event is triggered, but to no avail... I've only found ways to make the entire column un-editable. My code so far:

this.rowEditor.on({
    scope: this,
    beforeedit: this.checkIfEditable
});

checkIfEditable:function(rowEditor, rowIndex) {
    if(this.getStore().getAt(rowIndex).get('dhcp')) {
        // this function makes the entire column un-editable:
        this.getColumnModel().setEditable(2, false); 

        // I want to make only the other three fields of the current row 
        // uneditable.
    }
 }

Please let me know if any clarification is needed.

Any help potentially extending RowEditor to accomplish the target functionality would be greatly appreciated as well!

A: 

just set the column in your columnModel/columns to editable:false for fields that should not be editable.

columns: [ 
  { header: "Ticker", width: 60, editable:false },
  { header: "Company Name", width: 150, id: 'company'},
  { header: "Market Cap."},
  { header: "$ Sales", renderer: money},
  { header: "Employees", resizable: false}
]
Tracker1
I want to be able to change the "editable" property dynamically. When the user sets a check box to true I want to make every other field EXCEPT the one clicked un-editable (for the current row). Any ideas?
synchronicity
+2  A: 

As the docs state:

If the listener returns false the editor will not be activated.

So...

this.rowEditor.on({
      scope: this,
     beforeedit: this.checkIfEditable
});

checkIfEditable:function(rowEditor, rowIndex) {
         if(this.getStore().getAt(rowIndex).get('dhcp')) {

             return false; 

         }
 }

Simply returning false will be enough to cancel the editing ability.


Gotcha.

Interesting idea - a bit of a hassle to implement, but possible.

You need to approach this from two directions:

1 ) edit starts

2 ) checkbox is checked/unchecked

For the first part, I think you could use almost the same code I have above, remove the 'return false' and use the reference to the rowEditor to loop through the items collection, disabling (call the disable method on them) the fields that are not your checkbox field.

The second part of this is to add a handler to the checkbox which would do the same thing.

Shea Frederick
This is very close to what I want to do. The only problem is I need one of the fields in the row to remain editable - the checkbox field.I have four fields in the grid, one of which is a checkbox. All of the fields are usually editable, but if the checkbox field is checked, I need to make the other three un-editable (but still allow the checkbox field to be editable). If the checkbox field is once again checked, three aforementioned fields should be made editable again.Please let me know if any clarification is needed, thanks for your help.
synchronicity
Updated orig answer based on your feedback.
Shea Frederick
Yeah that's what I was hoping to do but I'm not sure how to retrieve the items collection. this.items.items don't seem to get me the collection (As they do in the RowEditor.js source code). Sorry for the naivety, I'm new to Javascript and ExtJS...Which function should I use to get the items?
synchronicity
Maybe extending RowEditor would be the best approach? Any help would greatly be appreciated... Let me know if any clarification is needed.
synchronicity
+7  A: 

You can add into RowEditor.js within the function startEditing the call to the function isCellEditable

//.... RowEditor.js
startEditing: function(rowIndex, doFocus){
//.... search for the starting of the below loop into the source code
            var cm = g.getColumnModel(), fields = this.items.items, f, val;
            for(var i = 0, len = cm.getColumnCount(); i < len; i++){
                val = this.preEditValue(record, cm.getDataIndex(i));
                f = fields[i];
                f.setValue(val);

                // *** here add a call to isCellEditable *** //
                f.setDisabled(!cm.isCellEditable(i, rowIndex));
                // ***************************************** //

                this.values[f.id] = Ext.isEmpty(val) ? '' : val;
            }
//....

Then override the isCellEditable of your column model and disabled the field based on you condition:

YYY.getColumnModel().isCellEditable = function(colIndex, rowIndex){
 if (grid.getStore().getAt(rowIndex).get('dhcp')) {
    // you can do more check base on colIndex
    // only to disabled the one you want
    return false; 
  }
  return Ext.grid.ColumnModel.prototype.isCellEditable.call(this, colIndex, rowIndex);
}
Patrick
A: 

I ran into the same problem. Rather than using the GridPanel with the Ext.ux.RowEditor plugin, I used the Ext.grid.EditorGridPanel. In this case, you can specify the editor for each of the other three fields (port, ip address, and subnet) in the column model with a beforeshow event handler as follows:

  editor: new Ext.form.TextArea({
    height:80,
    allowBlank: false,
    listeners:{
      beforeshow: function(column) {
        if (column.gridEditor.record.get('dhcp')) {
          column.gridEditor.cancelEdit();
        }
      }
    }
  })
jearlu
A: 

This solution worked perfectly for me! I needede to be able to control which cells in the RowEditor were enabled/disabled at any given time. I did NOT get any help from the forum but this did the trick perfectly!

Thanks, Scott

Scott