2012-09-04 6 views
6

Sto utilizzando jqGrid con la modifica in linea abilitata. Il problema è che il contenuto di alcuni dei campi sono piuttosto lunghi, e per impostazione predefinita il campo non è abbastanza grande per essere utilizzabile:Visualizza controlli modulo sopra la tabella quando si modifica in linea con jqGrid

jqGrid textarea - how it is now

Quello che voglio fare è impostare una larghezza fissa per textarea, e farlo espandere per essere visibile sopra la tabella quando diventa attiva. Qualcosa di simile a questo:

jqGrid textarea - how I want it to look

posso impostare il CSS per la textarea in editoptions:dataInit, ma se ho appena aumentare la larghezza, il lato destro del textarea ottiene tagliato fuori alla fine della cella della tabella. Immagino di poter risolvere il problema con un CSS intelligente?

BTW, so che un editor popup potrebbe probabilmente avere più senso per questo, ma il cliente insiste che rimane un editor in linea.

+0

hmm .. forse alcuni posizionamenti assoluti e z-index potrebbero risolvere questo .. – ffffff01

+0

Provato a giocare con quello, ma senza fortuna. Non mi definirò un esperto di CSS: P – Cocowalla

+0

@Cocowalla: hai una demo dal vivo che dimostra il problema? Quale browser Web hai utilizzato per i test? Quale comportamento vuoi avere nella textarea? Basterebbe se si impostasse l'altezza fissa della textarea (come tenere 5 righe o 50px)? – Oleg

risposta

3

Se ho compreso correttamente le tue esigenze, vuoi avere textarea che sono più grandi della cella corrispondente della griglia. Nel caso potrei suggerire di cambiare la posizione di textarea in "assoluto". Nel caso si può ridimensionare a textarea ed avere risultati come

enter image description here

Come si può vedere il grande textarea si sovrappongono gli altri controlli di input. Per rendere più agevole la modifica di tutti i campi di immissione e rendere più confortevole l'immissione in textarea, suggerisco di utilizzare anche jQuery.resizable(). Così uno sarà in grado di ridimensionare il textarea:

enter image description here

Troverete corrispondente demo here. La parte più importante del codice è qui sotto:

onSelectRow: function (rowid, status, e) { 
    var $this = $(this); 
    if (rowid !== lastSel) { 
     if (lastSel) { 
      $(this).jqGrid('saveRow', lastSel); 
     } 
     lastSel = rowid; 
    } 
    $this.jqGrid('editRow', rowid, { 
     keys: true, 
     oneditfunc: function(id) { 
      var $textareas = $("#" + id + " textarea"); 
      $textareas.each(function() { 
       var $textarea = $(this); 
       $textarea.css({position: "absolute", zIndex: "auto", width: "200px"}); 
       $textarea.position({ 
        of: $textarea.parent(), 
        my: "left top", 
        at: "left top", 
        offset: "1 1" 
       }); 
       $textarea.resizable(); 
       // now we fix position of the resizable wrapper which is 
       // the parent of the textarea after calling of .resizable() 
       $textarea.parent().css({ 
        "padding-bottom": "0px", 
        "padding-right": "0px" 
       }); 
       // change focus to the control from the clicked cell 
       $("input,select,textarea", e.target).focus(); 
      }); 
     } 
    }); 
    return true; 
} 

Nel codice di cui sopra ho usato in aggiunta il trucco con messa a fuoco sulla cella cliccato come ho descritto originariamente nel the answer.

Per rendere le differenze dei miei suggerimenti per il comportamento jqGrid livello più chiaro suggerisco di confrontare la demo di cui sopra con the following one quale schermo

enter image description here

UPDATE: Dopo aver scritto della risposta che ho postato the feature request trirando. Uno dei maggiori problemi nell'implementazione del suggerimento precedente era che non è possibile spostare il codice che imposta la posizione di textarea su "assoluto" completa in dataInit. Il suggerimento nella richiesta di funzionalità lo renderà possibile.

+0

Perfetto! Sono sicuro che ho provato a impostare la posizione su assoluto prima, ma deve aver fatto qualcosa di sbagliato. A proposito, l'ho impostato in editoptions: dataInit invece di 'editRow' – Cocowalla

+0

@Cocowalla: Il problema di' dataInit' è che verrà chiamato ** prima ** il controllo verrà inserito nella pagina. Quindi prima jqGrid crea il controllo con [document.createElement ("textarea")] (https://github.com/tonytomov/jqGrid/blob/v4.4.1/js/grid.common.js#L299) quindi chiama [ dataInit] (https://github.com/tonytomov/jqGrid/blob/v4.4.1/js/grid.common.js#L269). Successivamente imposta alcuni attributi aggiuntivi (come [qui] (https://github.com/tonytomov/jqGrid/blob/v4.4.1/js/grid.common.js#L308)) aggiungi la classe '" editable "' (vedi [qui] (https://github.com/tonytomov/jqGrid/blob/v4.4.1/js/grid.inlinedit.js#L79) ... – Oleg

+0

@Cocowalla: Ha disposto il controllo interno della cellula dopo tutto (vedi [qui] (https://github.com/tonytomov/jqGrid/blob/v4.4.1/js/grid.inlinedit.js#L81)). Quindi puoi fare molte cose all'interno di 'dataInit' Si usa il setTimeout come soluzione temporanea in molti casi.Ricco il problema come problema di progettazione comune di jqGrid.Nella demo ho usato il callback 'oneditfunc' che verrà chiamato * dopo che il controllo è stato inizializzato completamente *. 'dataInit' otterrai' null' come genitore dell'elemento 'e non puoi eseguire il codice richiesto – Oleg