Announcement

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

    'Excel' paste does not work with field.valueXPath

    1. SmartClient Version: SNAPSHOT_v9.1d_2014-01-14/LGPL Development Only (built 2014-01-14)

    2. Firefox 26.0

    3.

    4.

    5.

    6. sample code if applicable

    This is just slightly modified showcase "ExcelToGridSample":
    in CountryXmlDS.class countryCodeField.setValueXPath("countryCode/code")
    in country.data.xml <countryCode><code>XX</code></countryCode>

    EntryPoint:
    Code:
    package pl.com.tech4.client;
    
    import java.util.ArrayList;
    import com.google.gwt.core.client.EntryPoint;
    import com.google.gwt.user.client.DOM;
    import com.smartgwt.client.data.Record;
    import com.smartgwt.client.data.RecordList;
    import com.smartgwt.client.data.DataSource;
    import com.smartgwt.client.data.TextImportSettings;
    import com.smartgwt.client.data.DSCallback;
    import com.smartgwt.client.data.DSRequest;
    import com.smartgwt.client.data.DSResponse;
    import com.smartgwt.client.types.Autofit;
    import com.smartgwt.client.types.Alignment;
    import com.smartgwt.client.types.Visibility;
    import com.smartgwt.client.types.EscapingMode;
    import com.smartgwt.client.util.SC;
    import com.smartgwt.client.widgets.Button;
    import com.smartgwt.client.widgets.Canvas;
    import com.smartgwt.client.widgets.Dialog;
    import com.smartgwt.client.widgets.layout.VLayout;
    import com.smartgwt.client.widgets.form.DynamicForm;
    import com.smartgwt.client.widgets.grid.ListGrid;
    import com.smartgwt.client.widgets.grid.ListGridField;
    import com.smartgwt.client.widgets.grid.ListGridRecord;
    import com.smartgwt.client.widgets.grid.CellSelection;
    import com.smartgwt.client.widgets.events.ClickEvent;
    import com.smartgwt.client.widgets.events.ClickHandler;
    import com.smartgwt.client.widgets.form.fields.FormItem;
    import com.smartgwt.client.widgets.form.fields.ButtonItem;
    import com.smartgwt.client.widgets.form.fields.TextAreaItem;
    import com.smartgwt.client.widgets.form.fields.StaticTextItem;
    
    public class MainEntryPoint implements EntryPoint, ClickHandler {
    
        private ListGrid countryList;
    
        private class MyDialog extends Dialog implements
    
            com.smartgwt.client.widgets.form.fields.events.ClickHandler {
    
            private DynamicForm form;
    
            private TextAreaItem textArea;
    
            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                String text = (String) this.textArea.getValue();
                MainEntryPoint.this.pasteText(text);
                this.removeItem(this.form);
                this.markForDestroy();
                this.hide();
            };
    
            public MyDialog() {
               
                final int WIDTH = 525;
                final int HEIGHT = 300;
    
                final String GUIDANCE = "Press Ctrl-V (Command-V on Mac) or right click (Option-click on Mac) to paste values, then hit \"Apply\"";
    
                StaticTextItem label = new StaticTextItem();
                label.setName("label");
                label.setShowTitle(false);
                label.setValue(GUIDANCE);
    
                TextAreaItem area = new TextAreaItem();
                area.setName("textArea");
                area.setShowTitle(false);
                area.setCanEdit(true);
                area.setHeight("*");
                area.setWidth("*");
                this.textArea = area;
    
                ButtonItem button = new ButtonItem();
                button.setName("apply");
                button.setAlign(Alignment.CENTER);
                button.setTitle("Apply");
                button.addClickHandler(this);
           
                DynamicForm form = new DynamicForm();
                form.setNumCols(1);
                form.setWidth(WIDTH);
                form.setHeight(HEIGHT);
                form.setAutoFocus(true);
                form.setFields(new FormItem[]{ label, this.textArea, button });
                this.form = form;
    
                this.setAutoSize(true);
                this.setShowToolbar(false);
                this.setCanDragReposition(true);
                this.setTitle("Paste Cells");
                this.setShowModalMask(true);
                this.setIsModal(true);
                this.addItem(form);
            }
        };
    
        public void onClick(ClickEvent event) {
            this.new MyDialog().draw();     
        };
    
        private void pasteText(String text) {
            ArrayList<String> fieldNames = new ArrayList<String>();
    
            int[][] cells = this.countryList.getCellSelection().getSelectedCells();
            if (cells.length == 0) {
                countryList.getCellSelection().selectCell(0, 0);
                cells = countryList.getCellSelection().getSelectedCells();
            }
            int firstCol = cells[0][1];
            ListGridField[] fields = this.countryList.getFields();
            for (int col = firstCol; col < fields.length; col++) {
                fieldNames.add(this.countryList.getFieldName(col));
            }
            TextImportSettings settings = new TextImportSettings();
            settings.setFieldList(fieldNames.toArray(new String[0]));
            settings.setFieldSeparator("\t");
            settings.setEscapingMode(EscapingMode.DOUBLE);
    
            DataSource dataSource = this.countryList.getDataSource();
            Record[] records = dataSource.recordsFromText(text, settings);
            this.countryList.applyRecordData(new RecordList(records));
        };
    
       
        public void onModuleLoad() {
            DOM.getElementById("loadingPicture").removeFromParent();
            SC.showConsole();
           
            DataSource dataSource = CountryXmlDS.getInstance();
    
            final ListGrid grid = new ListGrid();
            grid.setCanEdit(true);
            grid.setAutoFetchData(true);
            grid.setCanDragSelect(true);
            grid.setCanSelectCells(true);
            grid.setDataSource(dataSource);
            grid.setAutoFitData(Autofit.VERTICAL);
            grid.fetchData(null, new DSCallback() {
                @Override
                public void execute(DSResponse dsResponse, Object data,
                        DSRequest dsRequest) {
                    grid.getCellSelection().selectCell(0, 0);
                }
            });
            this.countryList = grid;
    
            Button button = new Button();
            button.setTitle("Paste Cells");
            button.addClickHandler(this);
    
            VLayout layout = new VLayout(15);
            layout.setWidth100();
            layout.addMember(grid);
            layout.addMember(button);
            layout.draw();
        }
    
    };
    CountryXmlDS:
    Code:
    package pl.com.tech4.client;
    
    import com.smartgwt.client.data.DataSource;
    import com.smartgwt.client.data.fields.*;
    
    public class CountryXmlDS extends DataSource {
    
        private static CountryXmlDS instance = null;
    
        public static CountryXmlDS getInstance() {
            if (instance == null) {
                instance = new CountryXmlDS("countryDS");
            }
            return instance;
        }
    
        public CountryXmlDS(String id) {
    
            setID(id);
            setRecordXPath("/List/country");
            DataSourceIntegerField pkField = new DataSourceIntegerField("pk");
            pkField.setHidden(true);
            pkField.setPrimaryKey(true);
    
            DataSourceTextField countryCodeField = new DataSourceTextField("countryCode", "Code");
            countryCodeField.setRequired(true);
            countryCodeField.setValueXPath("countryCode/code");
    
            DataSourceTextField countryNameField = new DataSourceTextField("countryName", "Country");
            countryNameField.setRequired(true);
    
            DataSourceTextField capitalField = new DataSourceTextField("capital", "Capital");
            DataSourceTextField governmentField = new DataSourceTextField("government", "Government", 500);
    
            DataSourceBooleanField memberG8Field = new DataSourceBooleanField("member_g8", "G8");
    
            DataSourceTextField continentField = new DataSourceTextField("continent", "Continent");
            continentField.setValueMap("Europe", "Asia", "North America", "Australia/Oceania", "South America", "Africa");
    
            DataSourceDateField independenceField = new DataSourceDateField("independence", "Nationhood");
            DataSourceFloatField areaField = new DataSourceFloatField("area", "Area (kmē)");
            DataSourceIntegerField populationField = new DataSourceIntegerField("population", "Population");
            DataSourceFloatField gdpField = new DataSourceFloatField("gdp", "GDP ($M)");
            DataSourceLinkField articleField = new DataSourceLinkField("article", "Info");
    
            setFields(pkField, countryCodeField, countryNameField, capitalField, governmentField,
                    memberG8Field, continentField, independenceField, areaField, populationField,
                    gdpField, articleField);
    
            setDataURL("country.data.xml");
            setClientOnly(true);
        }
    }
    country.data:
    Code:
    <List>
    
    <country>
        <continent>North America</continent>
        <countryName>United States</countryName>
        <countryCode>
            <code>US</code>
        </countryCode>
        <area>9631420</area>
        <population>298444215</population>
        <gdp>12360000</gdp>
        <independence>1776-07-04</independence>
        <government>federal republic</government>
        <government_desc>2</government_desc>
        <capital>Washington, DC</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/United_states</article>
    </country>
    <country>
        <continent>Asia</continent>
        <countryName>China</countryName>
        <countryCode>
            <code>CH</code>
        </countryCode>
        <area>9596960</area>
        <population>1313973713</population>
        <gdp>8859000</gdp>
        <government>Communist state</government>
        <government_desc>0</government_desc>
        <capital>Beijing</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/China</article>
    </country>
    <country>
        <continent>Asia</continent>
        <countryName>Japan</countryName>
        <countryCode>
            <code>JA</code>
        </countryCode>
        <area>377835</area>
        <population>127463611</population>
        <gdp>4018000</gdp>
        <government>constitutional monarchy with parliamentary government</government>
        <government_desc>1</government_desc>
        <capital>Tokyo</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/Japan</article>
    </country>
    <country>
        <continent>Asia</continent>
        <countryName>India</countryName>
        <countryCode>
            <code>IN</code>
        </countryCode>
        <area>3287590</area>
        <population>1095351995</population>
        <gdp>3611000</gdp>
        <independence>1947-08-15</independence>
        <government>federal republic</government>
        <government_desc>2</government_desc>
        <capital>New Delhi</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/India</article>
    </country>
    <country>
        <continent>Europe</continent>
        <countryName>Germany</countryName>
        <countryCode>
            <code>GM</code>
        </countryCode>
        <area>357021</area>
        <population>82422299</population>
        <gdp>2504000</gdp>
        <independence>1871-01-18</independence>
        <government>federal republic</government>
        <government_desc>2</government_desc>
        <capital>Berlin</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/Germany</article>
    </country>
    <country>
        <continent>Europe</continent>
        <countryName>United Kingdom</countryName>
        <countryCode>
            <code>UK</code>
        </countryCode>
        <area>244820</area>
        <population>60609153</population>
        <gdp>1830000</gdp>
        <independence>1801-01-01</independence>
        <government>constitutional monarchy</government>
        <government_desc>1</government_desc>
        <capital>London</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/United_kingdom</article>
    </country>
    <country>
        <continent>Europe</continent>
        <countryName>France</countryName>
        <countryCode>
            <code>FR</code>
        </countryCode>
        <area>547030</area>
        <population>60876136</population>
        <gdp>1816000</gdp>
        <government>republic</government>
        <government_desc>5</government_desc>
        <capital>Paris</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/France</article>
    </country>
    <country>
        <continent>Europe</continent>
        <countryName>Italy</countryName>
        <countryCode>
            <code>IT</code>
        </countryCode>
        <area>301230</area>
        <population>58133509</population>
        <gdp>1698000</gdp>
        <independence>1861-03-17</independence>
        <government>republic</government>
        <government_desc>5</government_desc>
        <capital>Rome</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/Italy</article>
    </country>
    <country>
        <continent>Asia</continent>
        <countryName>Russia</countryName>
        <countryCode>
            <code>RS</code>
        </countryCode>
        <area>17075200</area>
        <population>142893540</population>
        <gdp>1589000</gdp>
        <independence>1991-08-24</independence>
        <government>federation</government>
        <government_desc>3</government_desc>
        <capital>Moscow</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/Russia</article>
    </country>
    <country>
        <continent>South America</continent>
        <countryName>Brazil</countryName>
        <countryCode>
            <code>BR</code>
        </countryCode>
        <area>8511965</area>
        <population>188078227</population>
        <gdp>1556000</gdp>
        <independence>1822-09-07</independence>
        <government>federative republic</government>
        <government_desc>3</government_desc>
        <capital>Brasilia</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/Brazil</article>
    </country>
    <country>
        <continent>North America</continent>
        <countryName>Canada</countryName>
        <countryCode>
            <code>CA</code>
        </countryCode>
        <area>9984670</area>
        <population>33098932</population>
        <gdp>1114000</gdp>
        <independence>1867-07-01</independence>
        <government>constitutional monarchy with parliamentary democracy and federation</government>
        <government_desc>1</government_desc>
        <capital>Ottawa</capital>
        <member_g8>true</member_g8>
        <article>http://en.wikipedia.org/wiki/Canada</article>
    </country>
    <country>
        <continent>North America</continent>
        <countryName>Mexico</countryName>
        <countryCode>
            <code>MX</code>
        </countryCode>
        <area>1972550</area>
        <population>107449525</population>
        <gdp>1067000</gdp>
        <independence>1810-09-16</independence>
        <government>federal republic</government>
        <government_desc>2</government_desc>
        <capital>Mexico (Distrito Federal)</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/Mexico</article>
    </country>
    <country>
        <continent>Europe</continent>
        <countryName>Spain</countryName>
        <countryCode>
            <code>SP</code>
        </countryCode>
        <area>504782</area>
        <population>40397842</population>
        <gdp>1029000</gdp>
        <independence>1492-01-01</independence>
        <government>parliamentary monarchy</government>
        <government_desc>4</government_desc>
        <capital>Madrid</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/Spain</article>
    </country>
    <country>
        <continent>Asia</continent>
        <countryName>South Korea</countryName>
        <countryCode>
            <code>KS</code>
        </countryCode>
        <area>98480</area>
        <population>48846823</population>
        <gdp>965300</gdp>
        <independence>1945-08-15</independence>
        <government>republic</government>
        <government_desc>5</government_desc>
        <capital>Seoul</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/South_korea</article>
    </country>
    <country>
        <continent>Asia</continent>
        <countryName>Indonesia</countryName>
        <countryCode>
            <code>ID</code>
        </countryCode>
        <area>1919440</area>
        <population>245452739</population>
        <gdp>865600</gdp>
        <independence>1945-08-17</independence>
        <government>republic</government>
        <government_desc>5</government_desc>
        <capital>Jakarta</capital>
        <member_g8>false</member_g8>
        <article>http://en.wikipedia.org/wiki/Indonesia</article>
    </country>
    
    </List>
    Select any cell in Country column and paste changed value - it works and changed value is indicated in blue.
    Now select any cell in Code column and paste changed value - this is NOT working.

    The problem lays in datasource.recordsFromText() method, backed with JavaScript function with the same name. That one is using dataSource.validateJSONRecord(). Unfortunately it tries to process as follows:
    validateJSONRecord : function (record) {
    ...
    if (field.valueXPath) {
    fieldValue = isc.xml.selectObjects(record, field.valueXPath, true);
    } else {
    fieldValue = record[fieldName];
    }

    and finds always "undef" value in case of valueXPath field.

    MichalG

    #2
    We've made a fix to the SC 9.1d/9.0p and SGWT 4.1d/4.0p code streams that should be in tomorrows builds.

    Comment


      #3
      Tested against:
      - SmartClient Version: SNAPSHOT_v9.1d_2014-01-19/LGPL Development Only (built 2014-01-19)
      - SmartClient Version: v9.0p_2014-01-19/LGPL Development Only (built 2014-01-19)
      and confirmed as fixed.
      Thank you,
      MichalG

      Comment

      Working...
      X