{"action":"created","comment":{"url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/comments/33934895","id":33934895,"diff_hunk":"@@ -0,0 +1,754 @@\n+/**\n+ * Copyright 2012 A24Group\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package org.ssgwt.client.ui.form.spinner;\n+\n+import org.ssgwt.client.ui.datagrid.SSDataGrid.Resources;\n+import org.ssgwt.client.ui.form.spinner.Spinner.SpinnerResources;\n+\n+import com.google.gwt.core.client.GWT;\n+import com.google.gwt.event.logical.shared.ValueChangeEvent;\n+import com.google.gwt.event.logical.shared.ValueChangeHandler;\n+import com.google.gwt.event.shared.HandlerRegistration;\n+import com.google.gwt.resources.client.ClientBundle;\n+import com.google.gwt.resources.client.CssResource;\n+import com.google.gwt.user.client.ui.FlowPanel;\n+import com.google.gwt.user.client.ui.HasValue;\n+import com.google.gwt.user.client.ui.Label;\n+import com.google.gwt.user.client.ui.TextBox;\n+\n+/**\n+ * A spinner used for selecting a duration in minutes with a hour and minutes spinner\n+ *\n+ * @author Ruan Naude <ruan.naude@a24group.com>\n+ * @since 15 June 2015\n+ */\n+public class DurationSpinner extends FlowPanel implements HasValue<Integer>{\n+\n+    /**\n+     * The style used for the spinner text box\n+     */\n+    protected final String TEXTBOX_STYLE = \"textBox\";\n+\n+    /**\n+     * The style used for the arrows\n+     */\n+    protected final String ARROW_STYLE = \"arrows\";\n+    \n+    /**\n+     * The default resource used\n+     */\n+    private static ValueSpinnerResources defaultResources;\n+\n+    /**\n+     * Default style name used\n+     */\n+    private static final String STYLENAME_DEFAULT = \"gwt-ValueSpinner\";\n+\n+    /**\n+     * The spinner that contains the arrows for hours\n+     */\n+    private Spinner hourSpinner;\n+\n+    /**\n+     * The text box that will display the value of the hours\n+     */\n+    private final TextBox hourValueBox = new TextBox();\n+\n+    /**\n+     * The flow panel that contains the spinner and text box for hours\n+     */\n+    private final FlowPanel hourSpinnerContainer = new FlowPanel();\n+\n+    /**\n+     * The label that is displayed next to the text box for hours\n+     */\n+    private final Label hourValueBoxLabel;\n+    \n+    /**\n+     * The spinner that contains the arrows for the minutes\n+     */\n+    private Spinner minuteSpinner;\n+\n+    /**\n+     * The text box that will display the value for the minutes\n+     */\n+    private final TextBox minuteValueBox = new TextBox();\n+\n+    /**\n+     * The flow panel that contains the spinner and text box for the minutes\n+     */\n+    private final FlowPanel minuteSpinnerContainer = new FlowPanel();\n+\n+    /**\n+     * The label that is displayed next to the text box for the minutes\n+     */\n+    private final Label minuteValueBoxLabel;\n+    \n+    /**\n+     * The minimum hours that is allowed\n+     */\n+    private int spinnerHourMinimum;\n+\n+    /**\n+     * The maximum hours that is allowed\n+     */\n+    private int spinnerHourMaximum;\n+\n+    /**\n+     * The minimum minutes that is allowed\n+     */\n+    private int spinnerMinuteMinimum;\n+\n+    /**\n+     * The maximum minutes that is allowed\n+     */\n+    private int spinnerMinuteMaximum;\n+\n+    /**\n+     * A ClientBundle that provides images for this widget.\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public interface ValueSpinnerResources extends ClientBundle {\n+\n+        /**\n+         * Instance of the Resources\n+         */\n+        public static final Resources INSTANCE = GWT.create(Resources.class);\n+\n+        /**\n+         * The styles used in this widget.\n+         */\n+        @Source(\"ValueSpinner.css\")\n+        Style valueSpinnerStyle();\n+    }\n+\n+    /**\n+     * Interface used for the styles\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public interface Style extends CssResource {\n+    }\n+\n+    /**\n+     * Spinner listener that's used to update all the values if the hour spinner change\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    private final SpinnerListener hourSpinnerListener = new SpinnerListener() {\n+\n+        /**\n+         * On the value change of the hour spinner\n+         *\n+         * @author Ruan Naude <ruan.naude@a24group.com>\n+         * @since 15 June 2015\n+         *\n+         * @param value - The new value to set on the spinner\n+         */\n+        @Override\n+        public void onSpinning(long value) {\n+            if (getHourSpinner() != null) {\n+                getHourSpinner().setValue(value, false);\n+            }\n+            hourValueBox.setText(String.valueOf(value));\n+            \n+            try {\n+                int minutes = Integer.valueOf(minuteValueBox.getValue());\n+                setMinutesValue(minutes);\n+            } catch (NumberFormatException e) {\n+                //ignore this, means the field does not yet have value\n+            }\n+        }\n+    };\n+    \n+    /**\n+     * Spinner listener that's used to update all the values if the minute spinner change\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    private final SpinnerListener minuteSpinnerListener = new SpinnerListener() {\n+\n+        /**\n+         * On the value change of the minutes spinner\n+         *\n+         * @author Ruan Naude <ruan.naude@a24group.com>\n+         * @since 15 June 2015\n+         *\n+         * @param value - The new value to set on the spinner\n+         */\n+        @Override\n+        public void onSpinning(long value) {\n+            setMinutesValue((int) value);\n+        }\n+    };\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value\n+    ) {\n+        this(value, null, null);\n+    }\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * @param resources - The styles and images used by this widget\n+     * @param images - The images used by the spinners\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value,\n+        ValueSpinnerResources resources,\n+        SpinnerResources images\n+    ) {\n+        this(\n+            value,\n+            0,\n+            1440,\n+            1,\n+            99,\n+            1,\n+            99,\n+            false,\n+            null,\n+            null,\n+            resources,\n+            images\n+        );\n+    }\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * @param minValue - The minimum value the duration is allowed to be\n+     * @param maxValue - The maximum value the duration is allowed to be\n+     * @param hourLabelText - The value of the text next to the hour spinner\n+     * @param minuteLabelText - The value of the text next to the minute spinner\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value,\n+        int minValue,\n+        int maxValue,\n+        String hourLabelText,\n+        String minuteLabelText\n+    ) {\n+        this(\n+            value,\n+            minValue,\n+            maxValue,\n+            1,\n+            99,\n+            1,\n+            99,\n+            hourLabelText,\n+            minuteLabelText\n+        );\n+    }\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * @param minValue - The minimum value the duration is allowed to be\n+     * @param maxValue - The maximum value the duration is allowed to be\n+     * @param hourMinStep - The minimum value the hour is allowed to be stepped through\n+     * @param hourMaxStep - The maximum value the hour is allowed to be stepped through\n+     * @param minuteMinStep - The minimum value the minute is allowed to be stepped through\n+     * @param minuteMaxStep - The maximum value the minute is allowed to be stepped through\n+     * @param hourLabelText - The value of the text next to the hour spinner\n+     * @param minuteLabelText - The value of the text next to the minute spinner\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value,\n+        int minValue,\n+        int maxValue,\n+        int hourMinStep,\n+        int hourMaxStep,\n+        int minuteMinStep,\n+        int minuteMaxStep,\n+        String hourLabelText,\n+        String minuteLabelText\n+    ) {\n+        this(\n+            value,\n+            minValue,\n+            maxValue,\n+            hourMinStep,\n+            hourMaxStep,\n+            minuteMinStep,\n+            minuteMaxStep,\n+            true,\n+            hourLabelText,\n+            minuteLabelText\n+        );\n+    }\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * @param minValue - The minimum value the duration is allowed to be\n+     * @param maxValue - The maximum value the duration is allowed to be\n+     * @param hourMinStep - The minimum value the hour is allowed to be stepped through\n+     * @param hourMaxStep - The maximum value the hour is allowed to be stepped through\n+     * @param minuteMinStep - The minimum value the minute is allowed to be stepped through\n+     * @param minuteMaxStep - The maximum value the minute is allowed to be stepped through\n+     * @param constrained - If set to false minimum and maximum value for will not have any effect on spinners\n+     * @param hourLabelText - The value of the text next to the hour spinner\n+     * @param minuteLabelText - The value of the text next to the minute spinner\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value,\n+        int minValue,\n+        int maxValue,\n+        int hourMinStep,\n+        int hourMaxStep,\n+        int minuteMinStep,\n+        int minuteMaxStep,\n+        boolean constrained,\n+        String hourLabelText,\n+        String minuteLabelText\n+    ) {\n+        this(\n+            value,\n+            minValue,\n+            maxValue,\n+            hourMinStep,\n+            hourMaxStep,\n+            minuteMinStep,\n+            minuteMaxStep,\n+            constrained,\n+            hourLabelText,\n+            minuteLabelText,\n+            null\n+        );\n+    }\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * @param minValue - The minimum value the duration is allowed to be\n+     * @param maxValue - The maximum value the duration is allowed to be\n+     * @param hourMinStep - The minimum value the hour is allowed to be stepped through\n+     * @param hourMaxStep - The maximum value the hour is allowed to be stepped through\n+     * @param minuteMinStep - The minimum value the minute is allowed to be stepped through\n+     * @param minuteMaxStep - The maximum value the minute is allowed to be stepped through\n+     * @param constrained - If set to false minimum and maximum value for will not have any effect on spinners\n+     * @param hourLabelText - The value of the text next to the hour spinner\n+     * @param minuteLabelText - The value of the text next to the minute spinner\n+     * @param resources - The styles and images used by this widget\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value,\n+        int minValue,\n+        int maxValue,\n+        int hourMinStep,\n+        int hourMaxStep,\n+        int minuteMinStep,\n+        int minuteMaxStep,\n+        boolean constrained,\n+        String hourLabelText,\n+        String minuteLabelText,\n+        ValueSpinnerResources resources\n+    ) {\n+        this(\n+            value,\n+            minValue,\n+            maxValue,\n+            hourMinStep,\n+            hourMaxStep,\n+            minuteMinStep,\n+            minuteMaxStep,\n+            constrained,\n+            hourLabelText,\n+            minuteLabelText,\n+            resources,\n+            null\n+        );\n+    }\n+\n+    /**\n+     * Class constructor\n+     * \n+     * @param value - The initial value for the duration spinner\n+     * @param minValue - The minimum value the duration is allowed to be\n+     * @param maxValue - The maximum value the duration is allowed to be\n+     * @param hourMinStep - The minimum value the hour is allowed to be stepped through\n+     * @param hourMaxStep - The maximum value the hour is allowed to be stepped through\n+     * @param minuteMinStep - The minimum value the minute is allowed to be stepped through\n+     * @param minuteMaxStep - The maximum value the minute is allowed to be stepped through\n+     * @param constrained - If set to false minimum and maximum value for will not have any effect on spinners\n+     * @param hourLabelText - The value of the text next to the hour spinner\n+     * @param minuteLabelText - The value of the text next to the minute spinner\n+     * @param resources - The styles and images used by this widget\n+     * @param images - The images used by the spinners\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    public DurationSpinner(\n+        int value,\n+        int minValue,\n+        int maxValue,\n+        int hourMinStep,\n+        int hourMaxStep,\n+        int minuteMinStep,\n+        int minuteMaxStep,\n+        boolean constrained,\n+        String hourLabelText,\n+        String minuteLabelText,\n+        ValueSpinnerResources resources,\n+        SpinnerResources images\n+    ) {\n+        super();\n+        \n+        spinnerHourMinimum = minValue / 60;\n+        spinnerHourMaximum = maxValue / 60;\n+        spinnerMinuteMinimum = minValue - (spinnerHourMinimum * 60);\n+        spinnerMinuteMaximum = maxValue - (spinnerHourMaximum * 60);\n+        \n+        setStylePrimaryName(STYLENAME_DEFAULT);\n+        if (resources != null) {\n+            defaultResources = resources;\n+        }\n+        \n+        //divide the total minutes by 60 and cast to int hours will be whole e.g 8.6h will be 8h\n+        int hourValue = (int) (value / 60);\n+        //subtract the amount of minutes taken up by whole hours above to get remaining minutes.\n+        int minuteValue = (int) (value - (hourValue * 60));\n+        \n+        if (images == null) {\n+            hourSpinner = new Spinner(\n+                hourSpinnerListener,\n+                hourValue,\n+                spinnerHourMinimum,\n+                spinnerHourMaximum,\n+                hourMinStep,\n+                hourMaxStep,\n+                constrained\n+            );\n+            minuteSpinner = new Spinner(\n+                minuteSpinnerListener,\n+                minuteValue,\n+                0,\n+                59,\n+                minuteMinStep,\n+                minuteMaxStep,\n+                constrained\n+            );\n+        } else {\n+            hourSpinner = new Spinner(\n+                hourSpinnerListener,\n+                hourValue,\n+                spinnerHourMinimum,\n+                spinnerHourMaximum,\n+                hourMinStep,\n+                hourMaxStep,\n+                constrained,\n+                images\n+            );\n+            minuteSpinner = new Spinner(\n+                minuteSpinnerListener,\n+                minuteValue,\n+                0,\n+                59,\n+                minuteMinStep,\n+                minuteMaxStep,\n+                constrained,\n+                images\n+            );\n+        }\n+        //Setup the hour spinner\n+        hourValueBox.setStyleName(TEXTBOX_STYLE);\n+        hourSpinnerContainer.add(hourValueBox);\n+\n+        FlowPanel arrowsPanel = new FlowPanel();\n+        arrowsPanel.setStylePrimaryName(ARROW_STYLE);\n+        arrowsPanel.add(hourSpinner.getIncrementArrow());\n+        arrowsPanel.add(hourSpinner.getDecrementArrow());\n+        hourSpinnerContainer.add(arrowsPanel);\n+\n+        hourValueBoxLabel = new Label(hourLabelText);\n+        add(hourSpinnerContainer);\n+        add(hourValueBoxLabel);\n+        \n+        //Setup the minute spinner\n+        minuteValueBox.setStyleName(TEXTBOX_STYLE);\n+        minuteSpinnerContainer.add(minuteValueBox);\n+\n+        FlowPanel minuteArrowsPanel = new FlowPanel();\n+        minuteArrowsPanel.setStylePrimaryName(ARROW_STYLE);\n+        minuteArrowsPanel.add(minuteSpinner.getIncrementArrow());\n+        minuteArrowsPanel.add(minuteSpinner.getDecrementArrow());\n+        minuteSpinnerContainer.add(minuteArrowsPanel);\n+\n+        minuteValueBoxLabel = new Label(minuteLabelText);\n+        add(minuteSpinnerContainer);\n+        add(minuteValueBoxLabel);\n+    }\n+    \n+    /**\n+     * This function will set the correct value on the minutes spinner based on the\n+     * value of the hours and taking the max and min values into account.\n+     * \n+     * @param newValue - The new value for the minutes spinner.\n+     * \n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     */\n+    private void setMinutesValue(int newValue) {\n+        try {\n+            int hours = Integer.valueOf(hourValueBox.getValue());\n+            if (hours == spinnerHourMinimum) {\n+                if (newValue <= spinnerMinuteMinimum) {\n+                    newValue = spinnerMinuteMinimum;\n+                }\n+            } else if (hours == spinnerHourMaximum) {\n+                if (newValue >= spinnerMinuteMaximum) {\n+                    newValue = spinnerMinuteMaximum;\n+                }\n+            }\n+        } catch (NumberFormatException e) {\n+            //ignore this, means the field does not yet have value\n+        }\n+        \n+        if (getMinuteSpinner() != null) {\n+            getMinuteSpinner().setValue(newValue, false);\n+        }\n+        if (newValue < 10) {\n+            minuteValueBox.setText(\"0\" + newValue);\n+        } else {\n+            minuteValueBox.setText(String.valueOf(newValue));\n+        }\n+    }\n+\n+    /**\n+     * Getter for the hour spinner component.\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @return the hour Spinner used by this widget\n+     */\n+    public Spinner getHourSpinner() {\n+        return hourSpinner;\n+    }\n+\n+    /**\n+     * Getter for the minute spinner component.\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @return the minute Spinner used by this widget\n+     */\n+    public Spinner getMinuteSpinner() {\n+        return minuteSpinner;\n+    }\n+    \n+    /**\n+     * Getter for the hour text box label\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @return the hour label used by this widget\n+     */\n+    public Label getHourTextBoxLabel() {\n+        return hourValueBoxLabel;\n+    }\n+    \n+    /**\n+     * Getter for the minute text box label\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @return the minute label used by this widget\n+     */\n+    public Label getMinuteTextBoxLabel() {\n+        return minuteValueBoxLabel;\n+    }\n+\n+    /**\n+     * Adds a style name to the spinners\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @param style - The style to add\n+     */\n+    @Override\n+    public void addStyleName(String style) {\n+        hourSpinnerContainer.addStyleName(style);\n+        minuteSpinnerContainer.addStyleName(style);\n+    }\n+\n+    /**\n+     * Removes a style name from the spinners\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @param style - The style to remove\n+     */\n+    @Override\n+    public void removeStyleName(String style) {\n+        hourSpinnerContainer.removeStyleName(style);\n+        minuteSpinnerContainer.removeStyleName(style);\n+    }\n+\n+    /**\n+     * Getter for the boolean whether the fields is enabled\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @return whether this widget is enabled.\n+     */\n+    public boolean isEnabled() {\n+        return hourSpinner.isEnabled();\n+    }\n+\n+    /**\n+     * Sets whether this widget is enabled.\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @param enabled - true to enable the widget, false to disable it\n+     */\n+    public void setEnabled(boolean enabled) {\n+        hourSpinner.setEnabled(enabled);\n+        hourValueBox.setEnabled(enabled);\n+        minuteSpinner.setEnabled(enabled);\n+        minuteValueBox.setEnabled(enabled);\n+    }\n+\n+    /**\n+     * Sets the text boxes to ready only or not.\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @param enabled - true to set the text boxes to read only, false to enable it\n+     */\n+    public void setTextBoxReadOnly(boolean enabled) {\n+        hourValueBox.setReadOnly(enabled);\n+        minuteValueBox.setReadOnly(enabled);\n+    }\n+\n+    /**\n+     * Add the valueChangeHandler to the value spinner\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @param handler - The handler to add\n+     *\n+     * @return HandlerRegistration\n+     */\n+    @Override\n+    public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Integer> handler) {\n+        return addHandler(handler, ValueChangeEvent.getType());\n+    }\n+\n+    /**\n+     * Get the total minutes value from the spinners\n+     *\n+     * @author Ruan Naude <ruan.naude@a24group.com>\n+     * @since 15 June 2015\n+     *\n+     * @return The total minutes value from the spinners\n+     */\n+    @Override\n+    public Integer getValue() {\n+        try {\n+            int hours = Integer.valueOf(this.hourValueBox.getValue());\n+            int minutes = Integer.valueOf(this.minuteValueBox.getValue());\n+            return minutes + (hours * 60);\n+        } catch (Exception e) {\n+            return null;\n+        }\n+    }\n+\n+    /**\n+     * Set the value of the spinners\n+     *","path":"src/org/ssgwt/client/ui/form/spinner/DurationSpinner.java","position":717,"original_position":717,"commit_id":"b6957289f408deecb53e35b5bef6155bcdeb51b7","original_commit_id":"b6957289f408deecb53e35b5bef6155bcdeb51b7","user":{"login":"Rynoh","id":1476292,"avatar_url":"https://avatars.githubusercontent.com/u/1476292?v=3","gravatar_id":"","url":"https://api.github.com/users/Rynoh","html_url":"https://github.com/Rynoh","followers_url":"https://api.github.com/users/Rynoh/followers","following_url":"https://api.github.com/users/Rynoh/following{/other_user}","gists_url":"https://api.github.com/users/Rynoh/gists{/gist_id}","starred_url":"https://api.github.com/users/Rynoh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rynoh/subscriptions","organizations_url":"https://api.github.com/users/Rynoh/orgs","repos_url":"https://api.github.com/users/Rynoh/repos","events_url":"https://api.github.com/users/Rynoh/events{/privacy}","received_events_url":"https://api.github.com/users/Rynoh/received_events","type":"User","site_admin":false},"body":"can you maybe add a comment to say that this will always fire an event","created_at":"2015-07-06T13:47:30Z","updated_at":"2015-07-06T13:47:30Z","html_url":"https://github.com/A24Group/ssGWT-lib/pull/250#discussion_r33934895","pull_request_url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250","_links":{"self":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/comments/33934895"},"html":{"href":"https://github.com/A24Group/ssGWT-lib/pull/250#discussion_r33934895"},"pull_request":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250"}}},"pull_request":{"url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250","id":38659673,"html_url":"https://github.com/A24Group/ssGWT-lib/pull/250","diff_url":"https://github.com/A24Group/ssGWT-lib/pull/250.diff","patch_url":"https://github.com/A24Group/ssGWT-lib/pull/250.patch","issue_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/250","number":250,"state":"open","locked":false,"title":"Added the duration input field for a form","user":{"login":"nauderuan","id":1098648,"avatar_url":"https://avatars.githubusercontent.com/u/1098648?v=3","gravatar_id":"","url":"https://api.github.com/users/nauderuan","html_url":"https://github.com/nauderuan","followers_url":"https://api.github.com/users/nauderuan/followers","following_url":"https://api.github.com/users/nauderuan/following{/other_user}","gists_url":"https://api.github.com/users/nauderuan/gists{/gist_id}","starred_url":"https://api.github.com/users/nauderuan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nauderuan/subscriptions","organizations_url":"https://api.github.com/users/nauderuan/orgs","repos_url":"https://api.github.com/users/nauderuan/repos","events_url":"https://api.github.com/users/nauderuan/events{/privacy}","received_events_url":"https://api.github.com/users/nauderuan/received_events","type":"User","site_admin":false},"body":"Added the duration input field for a form\r\n\r\nNot implemented anywhere yet no testing\r\n\r\nissue https://github.com/A24Group/Triage/issues/7726","created_at":"2015-06-26T15:19:21Z","updated_at":"2015-07-06T13:47:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d203337e4a31a62e819a78bd78c9ee661273435b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250/commits","review_comments_url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250/comments","review_comment_url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/comments{/number}","comments_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/250/comments","statuses_url":"https://api.github.com/repos/A24Group/ssGWT-lib/statuses/b6957289f408deecb53e35b5bef6155bcdeb51b7","head":{"label":"A24Group:feature-timesheetHousrToMin-issue-7726","ref":"feature-timesheetHousrToMin-issue-7726","sha":"b6957289f408deecb53e35b5bef6155bcdeb51b7","user":{"login":"A24Group","id":1457167,"avatar_url":"https://avatars.githubusercontent.com/u/1457167?v=3","gravatar_id":"","url":"https://api.github.com/users/A24Group","html_url":"https://github.com/A24Group","followers_url":"https://api.github.com/users/A24Group/followers","following_url":"https://api.github.com/users/A24Group/following{/other_user}","gists_url":"https://api.github.com/users/A24Group/gists{/gist_id}","starred_url":"https://api.github.com/users/A24Group/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/A24Group/subscriptions","organizations_url":"https://api.github.com/users/A24Group/orgs","repos_url":"https://api.github.com/users/A24Group/repos","events_url":"https://api.github.com/users/A24Group/events{/privacy}","received_events_url":"https://api.github.com/users/A24Group/received_events","type":"Organization","site_admin":false},"repo":{"id":4558601,"name":"ssGWT-lib","full_name":"A24Group/ssGWT-lib","owner":{"login":"A24Group","id":1457167,"avatar_url":"https://avatars.githubusercontent.com/u/1457167?v=3","gravatar_id":"","url":"https://api.github.com/users/A24Group","html_url":"https://github.com/A24Group","followers_url":"https://api.github.com/users/A24Group/followers","following_url":"https://api.github.com/users/A24Group/following{/other_user}","gists_url":"https://api.github.com/users/A24Group/gists{/gist_id}","starred_url":"https://api.github.com/users/A24Group/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/A24Group/subscriptions","organizations_url":"https://api.github.com/users/A24Group/orgs","repos_url":"https://api.github.com/users/A24Group/repos","events_url":"https://api.github.com/users/A24Group/events{/privacy}","received_events_url":"https://api.github.com/users/A24Group/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/A24Group/ssGWT-lib","description":"A General Purpose GWT library","fork":false,"url":"https://api.github.com/repos/A24Group/ssGWT-lib","forks_url":"https://api.github.com/repos/A24Group/ssGWT-lib/forks","keys_url":"https://api.github.com/repos/A24Group/ssGWT-lib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/A24Group/ssGWT-lib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/A24Group/ssGWT-lib/teams","hooks_url":"https://api.github.com/repos/A24Group/ssGWT-lib/hooks","issue_events_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/events{/number}","events_url":"https://api.github.com/repos/A24Group/ssGWT-lib/events","assignees_url":"https://api.github.com/repos/A24Group/ssGWT-lib/assignees{/user}","branches_url":"https://api.github.com/repos/A24Group/ssGWT-lib/branches{/branch}","tags_url":"https://api.github.com/repos/A24Group/ssGWT-lib/tags","blobs_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/refs{/sha}","trees_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/A24Group/ssGWT-lib/statuses/{sha}","languages_url":"https://api.github.com/repos/A24Group/ssGWT-lib/languages","stargazers_url":"https://api.github.com/repos/A24Group/ssGWT-lib/stargazers","contributors_url":"https://api.github.com/repos/A24Group/ssGWT-lib/contributors","subscribers_url":"https://api.github.com/repos/A24Group/ssGWT-lib/subscribers","subscription_url":"https://api.github.com/repos/A24Group/ssGWT-lib/subscription","commits_url":"https://api.github.com/repos/A24Group/ssGWT-lib/commits{/sha}","git_commits_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/commits{/sha}","comments_url":"https://api.github.com/repos/A24Group/ssGWT-lib/comments{/number}","issue_comment_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/comments{/number}","contents_url":"https://api.github.com/repos/A24Group/ssGWT-lib/contents/{+path}","compare_url":"https://api.github.com/repos/A24Group/ssGWT-lib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/A24Group/ssGWT-lib/merges","archive_url":"https://api.github.com/repos/A24Group/ssGWT-lib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/A24Group/ssGWT-lib/downloads","issues_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues{/number}","pulls_url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls{/number}","milestones_url":"https://api.github.com/repos/A24Group/ssGWT-lib/milestones{/number}","notifications_url":"https://api.github.com/repos/A24Group/ssGWT-lib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/A24Group/ssGWT-lib/labels{/name}","releases_url":"https://api.github.com/repos/A24Group/ssGWT-lib/releases{/id}","created_at":"2012-06-05T10:44:09Z","updated_at":"2014-12-22T12:02:49Z","pushed_at":"2015-06-26T17:47:36Z","git_url":"git://github.com/A24Group/ssGWT-lib.git","ssh_url":"git@github.com:A24Group/ssGWT-lib.git","clone_url":"https://github.com/A24Group/ssGWT-lib.git","svn_url":"https://github.com/A24Group/ssGWT-lib","homepage":null,"size":7913,"stargazers_count":14,"watchers_count":14,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":2,"forks":13,"open_issues":2,"watchers":14,"default_branch":"master"}},"base":{"label":"A24Group:master","ref":"master","sha":"8bd8ca2df0ca5ee99a177b09b41ddd590423ccb5","user":{"login":"A24Group","id":1457167,"avatar_url":"https://avatars.githubusercontent.com/u/1457167?v=3","gravatar_id":"","url":"https://api.github.com/users/A24Group","html_url":"https://github.com/A24Group","followers_url":"https://api.github.com/users/A24Group/followers","following_url":"https://api.github.com/users/A24Group/following{/other_user}","gists_url":"https://api.github.com/users/A24Group/gists{/gist_id}","starred_url":"https://api.github.com/users/A24Group/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/A24Group/subscriptions","organizations_url":"https://api.github.com/users/A24Group/orgs","repos_url":"https://api.github.com/users/A24Group/repos","events_url":"https://api.github.com/users/A24Group/events{/privacy}","received_events_url":"https://api.github.com/users/A24Group/received_events","type":"Organization","site_admin":false},"repo":{"id":4558601,"name":"ssGWT-lib","full_name":"A24Group/ssGWT-lib","owner":{"login":"A24Group","id":1457167,"avatar_url":"https://avatars.githubusercontent.com/u/1457167?v=3","gravatar_id":"","url":"https://api.github.com/users/A24Group","html_url":"https://github.com/A24Group","followers_url":"https://api.github.com/users/A24Group/followers","following_url":"https://api.github.com/users/A24Group/following{/other_user}","gists_url":"https://api.github.com/users/A24Group/gists{/gist_id}","starred_url":"https://api.github.com/users/A24Group/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/A24Group/subscriptions","organizations_url":"https://api.github.com/users/A24Group/orgs","repos_url":"https://api.github.com/users/A24Group/repos","events_url":"https://api.github.com/users/A24Group/events{/privacy}","received_events_url":"https://api.github.com/users/A24Group/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/A24Group/ssGWT-lib","description":"A General Purpose GWT library","fork":false,"url":"https://api.github.com/repos/A24Group/ssGWT-lib","forks_url":"https://api.github.com/repos/A24Group/ssGWT-lib/forks","keys_url":"https://api.github.com/repos/A24Group/ssGWT-lib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/A24Group/ssGWT-lib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/A24Group/ssGWT-lib/teams","hooks_url":"https://api.github.com/repos/A24Group/ssGWT-lib/hooks","issue_events_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/events{/number}","events_url":"https://api.github.com/repos/A24Group/ssGWT-lib/events","assignees_url":"https://api.github.com/repos/A24Group/ssGWT-lib/assignees{/user}","branches_url":"https://api.github.com/repos/A24Group/ssGWT-lib/branches{/branch}","tags_url":"https://api.github.com/repos/A24Group/ssGWT-lib/tags","blobs_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/refs{/sha}","trees_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/A24Group/ssGWT-lib/statuses/{sha}","languages_url":"https://api.github.com/repos/A24Group/ssGWT-lib/languages","stargazers_url":"https://api.github.com/repos/A24Group/ssGWT-lib/stargazers","contributors_url":"https://api.github.com/repos/A24Group/ssGWT-lib/contributors","subscribers_url":"https://api.github.com/repos/A24Group/ssGWT-lib/subscribers","subscription_url":"https://api.github.com/repos/A24Group/ssGWT-lib/subscription","commits_url":"https://api.github.com/repos/A24Group/ssGWT-lib/commits{/sha}","git_commits_url":"https://api.github.com/repos/A24Group/ssGWT-lib/git/commits{/sha}","comments_url":"https://api.github.com/repos/A24Group/ssGWT-lib/comments{/number}","issue_comment_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/comments{/number}","contents_url":"https://api.github.com/repos/A24Group/ssGWT-lib/contents/{+path}","compare_url":"https://api.github.com/repos/A24Group/ssGWT-lib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/A24Group/ssGWT-lib/merges","archive_url":"https://api.github.com/repos/A24Group/ssGWT-lib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/A24Group/ssGWT-lib/downloads","issues_url":"https://api.github.com/repos/A24Group/ssGWT-lib/issues{/number}","pulls_url":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls{/number}","milestones_url":"https://api.github.com/repos/A24Group/ssGWT-lib/milestones{/number}","notifications_url":"https://api.github.com/repos/A24Group/ssGWT-lib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/A24Group/ssGWT-lib/labels{/name}","releases_url":"https://api.github.com/repos/A24Group/ssGWT-lib/releases{/id}","created_at":"2012-06-05T10:44:09Z","updated_at":"2014-12-22T12:02:49Z","pushed_at":"2015-06-26T17:47:36Z","git_url":"git://github.com/A24Group/ssGWT-lib.git","ssh_url":"git@github.com:A24Group/ssGWT-lib.git","clone_url":"https://github.com/A24Group/ssGWT-lib.git","svn_url":"https://github.com/A24Group/ssGWT-lib","homepage":null,"size":7913,"stargazers_count":14,"watchers_count":14,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":2,"forks":13,"open_issues":2,"watchers":14,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250"},"html":{"href":"https://github.com/A24Group/ssGWT-lib/pull/250"},"issue":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/250"},"comments":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/issues/250/comments"},"review_comments":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250/comments"},"review_comment":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/pulls/250/commits"},"statuses":{"href":"https://api.github.com/repos/A24Group/ssGWT-lib/statuses/b6957289f408deecb53e35b5bef6155bcdeb51b7"}}}}