Announcement

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

  • 5.1p / 6.1d MiniDateRangeItem problems (no date, wrong calculation)

    Hi Isomorphic,

    I have a MiniDateRangeItem for creationDate daterange selection. Now, in order to improve the GUI, I added "yearToDate" and "lastYear", ... shortcuts.
    Basically all those shortcuts have problems, even though they should work IMHO.
    Tested using v10.1p_2017-04-13 and SNAPSHOT_v11.1d_2017-04-16.

    BuiltInDS.java:
    Code:
    package com.smartgwt.sample.client;
    
    import java.util.Date;
    
    import com.google.gwt.core.client.EntryPoint;
    import com.google.gwt.i18n.client.DateTimeFormat;
    import com.google.gwt.user.datepicker.client.CalendarUtil;
    import com.smartgwt.client.Version;
    import com.smartgwt.client.core.KeyIdentifier;
    import com.smartgwt.client.data.DataSource;
    import com.smartgwt.client.data.DateRange;
    import com.smartgwt.client.data.RelativeDate;
    import com.smartgwt.client.types.Cursor;
    import com.smartgwt.client.util.Page;
    import com.smartgwt.client.util.PageKeyHandler;
    import com.smartgwt.client.util.SC;
    import com.smartgwt.client.widgets.IButton;
    import com.smartgwt.client.widgets.Label;
    import com.smartgwt.client.widgets.Window;
    import com.smartgwt.client.widgets.events.ClickEvent;
    import com.smartgwt.client.widgets.events.ClickHandler;
    import com.smartgwt.client.widgets.form.DynamicForm;
    import com.smartgwt.client.widgets.form.fields.CanvasItem;
    import com.smartgwt.client.widgets.form.fields.MiniDateRangeItem;
    import com.smartgwt.client.widgets.form.fields.SpacerItem;
    import com.smartgwt.client.widgets.layout.HStack;
    import com.smartgwt.client.widgets.layout.VLayout;
    
    public class BuiltInDS implements EntryPoint {
        private VLayout mainLayout;
        private IButton recreateBtn;
    
        public void onModuleLoad() {
            KeyIdentifier debugKey = new KeyIdentifier();
            debugKey.setCtrlKey(true);
            debugKey.setKeyName("D");
    
            Page.registerKey(debugKey, new PageKeyHandler() {
                public void execute(String keyName) {
                    SC.showConsole();
                }
            });
    
            mainLayout = new VLayout(20);
            mainLayout.setWidth100();
            mainLayout.setHeight100();
    
            recreateBtn = new IButton("Recreate");
            recreateBtn.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    recreate();
                }
            });
            mainLayout.addMember(recreateBtn);
            recreate();
            mainLayout.draw();
        }
    
        private void recreate() {
            Window w = new Window();
            w.setWidth("95%");
            w.setHeight("95%");
            w.setMembersMargin(0);
            w.setModalMaskOpacity(70);
            w.setTitle(" (" + Version.getVersion() + "/" + Version.getSCVersionNumber() + ")");
            w.setTitle("5.1p / 6.1d MiniDateRangeItem problems (no date, wrong calculation)" + w.getTitle());
            w.setShowMinimizeButton(false);
            w.setIsModal(true);
            w.setShowModalMask(true);
            w.centerInPage();
    
            final DynamicForm df = new DynamicForm();
            df.setColWidths("100", "180");
            df.setDataSource(DataSource.get("supplyItem"));
            MiniDateRangeItem createdAtMDRI = new MiniDateRangeItem("nextShipment");
            createdAtMDRI.setWidth("*");
            MDRIConfiguer mdriConfiguer = new MDRIConfiguer("MDRIConfiguer", createdAtMDRI);
            df.setFields(createdAtMDRI, new SpacerItem(), mdriConfiguer);
    
            IButton showValue = new IButton("Show value", new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    SC.say(df.getValuesAsAdvancedCriteria() != null ? df.getValuesAsAdvancedCriteria().toJSON() : "no criteria");
                }
            });
    
            w.addItem(df);
            w.addItem(showValue);
            w.show();
            w.focus();
        }
    
        private class MDRIConfiguer extends CanvasItem {
            private MiniDateRangeItem createdAtDRI;
    
            public MDRIConfiguer(String name, final MiniDateRangeItem createdAtDRI) {
                super(name);
                this.createdAtDRI = createdAtDRI;
    
                setStartRow(false);
                setShowTitle(false);
                setWidth("*");
                setHeight(createdAtDRI.getHeight());
    
                HStack al = new HStack(5);
                {
                    al.addMember(new MyLabel("YTD", new RelativeDate("-0Y"), new RelativeDate("$today")));
                    al.addMember(new MyLabel("QTD", new RelativeDate("-0Q"), new RelativeDate("$today")));
                    al.addMember(new MyLabel("MTD", new RelativeDate("-0M"), new RelativeDate("$today")));
    
                    Date d = new Date();
                    CalendarUtil.addMonthsToDate(d, -12);
                    String lastYear = DateTimeFormat.getFormat("yyyy").format(d);
    
                    d = new Date();
                    CalendarUtil.addMonthsToDate(d, -3);
                    int month0aligned = (new Integer(DateTimeFormat.getFormat("M").format(d)) / 3) + 1;
                    String lastQuarter = "Q" + (month0aligned == 0 ? 4 : month0aligned);
    
                    d = new Date();
                    CalendarUtil.addMonthsToDate(d, -1);
                    String lastMonth = DateTimeFormat.getFormat("MMMM").format(d);
    
                    al.addMember(new MyLabel(lastYear, new RelativeDate("-1Y"), new RelativeDate("-1d[-0Y]"))); // -0Y[-1D] does not work, either
                    al.addMember(new MyLabel(lastQuarter, new RelativeDate("-1Q"), new RelativeDate("-1d[-0Q]")));// -0Q[-1D] does not work, either
                    al.addMember(new MyLabel(lastMonth, new RelativeDate("-1M"), new RelativeDate("-1d[-0M]")));// -0M[-1D] does not work, either
                }
                setCanvas(al);
            }
    
            private class MyLabel extends Label {
                public MyLabel(String content, final RelativeDate startRD, final RelativeDate endRD) {
                    super();
                    setWidth(1);
                    setCursor(Cursor.HAND);
                    setContents("<span style=\"text-decoration: underline;\">" + content + "</span>");
    
                    addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                            DateRange dr = new DateRange();
                            dr.setRelativeStartDate(startRD);
                            dr.setRelativeEndDate(endRD);
                            createdAtDRI.setValue(dr);
                        }
                    });
                }
            }
        }
    }
    Problems:
    • YTD: DateRange looks OK in the DynamicForm, but if calling getValuesAsAdvancedCriteria() via the button, it returns null. Reason: From-value has a validation error, if you click the calendar icon.
    • QTD: DateRange looks OK in the DynamicForm, but if calling getValuesAsAdvancedCriteria() via the button, it returns null. Reason: From-value has a validation error, if you click the calendar icon.
    • MTD: From-value is wrong. Like above it should be Apr, 1st.
    • 2016: To-value should be 2016-12-31. From-value has a validation error, if you click the calendar icon.
    • Q1: To-value should be 2017-03-31. From-value has a validation error, if you click the calendar icon.
    • March: From-value should be 2017-03-01. To-value should be 2017-03-31.
    The wrong values are according to the docs as I understand them:
    ...eg, +1d[+1W] indicates "plus one day from the end of NEXT week".

    So -1d[-0Y] should be "minus one day from the beginning of THIS year".

    Best regards
    Blama

  • #2
    A few things here:

    1) the RelativeDateItem UI doesn't support editing RelativeDateStrings that contain a qualifier (the internal relative-string in square brackets). When you set such a value, the framework is supposed to convert it to an absolute date to use as the value and discard the relative string - there was a bug in this code, and it's been fixed for tomorrow's builds.

    As of tomorrow, things will work as you expect - but relative-strings you pass in this way will be discarded and their absolute equivalent applied to the items, as was supposed to happen already.

    2) You could create your own criteria-based ranges, as in this sample

    3) You could run your RelativeDateStrings through DateUtil.getAbsoluteDate() before passing them to your DateRange

    Comment


    • #3
      Hi Isomorphic,

      thanks for the answer, I'll have a look at RecentDateRangeItem, I did not notice it before.
      But in general the conversion to absolute dates is fine for me, so I'll retest tomorrow.

      Best regards
      Blama

      Comment

      Working...
      X