Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    Multi-cell paste

    One feature that has been very important for us and colleagues I've spoken with is the ability to do a multi-line paste, and Smartclient's current capability in this is not great (i.e., a separate pop-up window). The reason is because users need to fill in a ListGrid and data is often coming from things like an xlsx or text file they can copy from. It's tedious and error prone to expect them to copy/paste one cell at a time.

    I'd be happy for Isomorphic to vet and integrate functionality like this:



    Code:
        pasteTextFromClipboard: function(e) {
            var selection = this.selection.getSelectedCells();
            if (selection.length != 1) {
                return true;
            }
    
            var pastedText = undefined;
            if (window.clipboardData && window.clipboardData.getData) { // IE
                pastedText = window.clipboardData.getData('Text');
            } else if (e.clipboardData && e.clipboardData.getData) {
                pastedText = e.clipboardData.getData('text/plain');
            } else {
                return true;
            }
    
            var rowSep = null;
            var colSep = null;
            if(pastedText.indexOf(String.fromCharCode(13)) != -1){
                rowSep = String.fromCharCode(13);
                colSep = String.fromCharCode(9);
            } else {
                rowSep = /\r?\n/;
                colSep = ",";
            }
            var lines = pastedText.split(rowSep);
    
            var r = selection[0][0];
            var c = selection[0][1];
            for(var i=0; i<lines.length; i++){
                if(r >= this.getTotalRows()){
                    break;
                }
    
                var cols = lines[i].split(colSep);
                for(var j=0; j<cols.length; j++) {
                    var col = c+j;
                    var fieldName = this.getFieldName(col);
                    if(!fieldName){
                        break;
                    }
                    this.setEditValue(r, col, cols[j]);
                    this.validateCell(r,fieldName);
                }
                var record = this.getRecord(r);
                this.markRecordChanged(record);
                r++;
            }
            this.endEditing();
            return false;
        },
                draw: function(){
                    this.Super("draw", arguments);
                    var listGrid = this;
                    var lgDiv = this.getContentElement();
                    if(lgDiv == null){
                        console.log("lgDiv is null!");
                        return;
                    }
                    lgDiv.onpaste = function(e) {
                        return listGrid.pasteTextFromClipboard(e);
                    };
                }


    #2
    Since some browsers under some circumstances reject or restrict attempts to access the clipboard, we opt for the pop-up dialog approach shown in the sample. It does not require one cell at a time entry.

    Feel free to take the approach above if you prefer to deal with browser issues.

    Comment

    Working...
    X