diff --git a/README.md b/README.md index b70b5ef..b7583e7 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,16 @@ The goal is to make a cross platform variant of [DatePickerIOS](https://facebook - [x] Replace todays date with the string "Today" (considering locale) - [x] Animate to date when state change occur. - [x] Switch between AM/PM when scrolling between forenoon and afternoon. -- [ ] Transparent background support. (Probably need to include transparent gradient). +- [x] Support maximumDate/minimumDate. +- [ ] Minute interval prop. +- [ ] Colored background support. - [ ] Align text to right. - [ ] Mode: date - [ ] Mode: time -- [ ] Support maximumDate/minimumDate. (Gray out and animate back to max/min value if exceeded). \ No newline at end of file + + \ No newline at end of file diff --git a/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java b/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java index d0a6e19..85e3a9e 100644 --- a/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java +++ b/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java @@ -34,7 +34,7 @@ public class DatePickerManager extends SimpleViewManager { @ReactProp(name = "date") public void setDate(PickerView view, @Nullable double date) { - view.setDate(new Date((long)date)); + view.setDate(Utils.unixToDate(date)); } @ReactProp(name = "locale") @@ -43,6 +43,16 @@ public class DatePickerManager extends SimpleViewManager { view.requestLayout(); } + @ReactProp(name = "minimumDate") + public void setMinimumDate(PickerView view, @Nullable double date) { + view.setMinimumDate(Utils.unixToDate(date)); + } + + @ReactProp(name = "maximumDate") + public void setMaximumDate(PickerView view, @Nullable double date) { + view.setMaximumDate(Utils.unixToDate(date)); + } + public Map getExportedCustomBubblingEventTypeConstants() { return MapBuilder.builder() .put("dateChange", MapBuilder.of("phasedRegistrationNames", diff --git a/android/src/main/java/com/henninghall/date_picker/PickerView.java b/android/src/main/java/com/henninghall/date_picker/PickerView.java index ba5b4a5..9cc8bd3 100644 --- a/android/src/main/java/com/henninghall/date_picker/PickerView.java +++ b/android/src/main/java/com/henninghall/date_picker/PickerView.java @@ -1,8 +1,6 @@ package com.henninghall.date_picker; -import android.util.Log; import android.view.View; -import android.view.ViewGroup; import android.widget.RelativeLayout; import com.facebook.react.bridge.Arguments; @@ -12,9 +10,13 @@ import com.henninghall.date_picker.wheels.AmPmWheel; import com.henninghall.date_picker.wheels.DayWheel; import com.henninghall.date_picker.wheels.HourWheel; import com.henninghall.date_picker.wheels.MinutesWheel; +import com.henninghall.date_picker.wheels.Wheel; + +import org.apache.commons.lang3.time.DateUtils; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; import java.util.Locale; @@ -31,7 +33,8 @@ public class PickerView extends RelativeLayout { private DayWheel dayWheel; private MinutesWheel minutesWheel; private AmPmWheel ampmWheel; - private int i = 0; + private Date minDate; + private Date maxDate; public PickerView() { super(DatePickerManager.context); @@ -56,19 +59,24 @@ public class PickerView extends RelativeLayout { dateFormat = new SimpleDateFormat(getDateFormatTemplate(), Locale.US); changeAmPmWhenPassingMidnightOrNoon(); + } WheelChangeListener onWheelChangeListener = new WheelChangeListener(){ @Override - public void onChange() { + public void onChange(Wheel wheel) { WritableMap event = Arguments.createMap(); try { Date date = dateFormat.parse(getDateString()); - event.putDouble("date", date.getTime()); + if (date.before(minDate)) wheel.animateToDate(minDate); + if (date.after(maxDate)) wheel.animateToDate(maxDate); + else { + event.putDouble("date", date.getTime()); + DatePickerManager.context.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "dateChange", event); + } } catch (ParseException e) { e.printStackTrace(); } - DatePickerManager.context.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "dateChange", event); } }; @@ -87,6 +95,14 @@ public class PickerView extends RelativeLayout { + ampmWheel.getValue(); } + public void setMinimumDate(Date date) { + minDate = DateUtils.truncate(date, Calendar.MINUTE); + } + + public void setMaximumDate(Date date) { + maxDate = DateUtils.truncate(date, Calendar.MINUTE); + } + public void setDate(Date date) { dayWheel.setValue(date); hourWheel.setValue(date); diff --git a/android/src/main/java/com/henninghall/date_picker/Utils.java b/android/src/main/java/com/henninghall/date_picker/Utils.java index 12b4508..9868eca 100644 --- a/android/src/main/java/com/henninghall/date_picker/Utils.java +++ b/android/src/main/java/com/henninghall/date_picker/Utils.java @@ -3,6 +3,7 @@ package com.henninghall.date_picker; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Locale; public class Utils { @@ -16,5 +17,8 @@ public class Utils { return UnitPatterns.of(locale).getTodayWord(); } + public static Date unixToDate(double date) { + return new Date((long)date); + } } diff --git a/android/src/main/java/com/henninghall/date_picker/WheelChangeListener.java b/android/src/main/java/com/henninghall/date_picker/WheelChangeListener.java index 7744f03..c0f83dd 100644 --- a/android/src/main/java/com/henninghall/date_picker/WheelChangeListener.java +++ b/android/src/main/java/com/henninghall/date_picker/WheelChangeListener.java @@ -1,8 +1,10 @@ package com.henninghall.date_picker; +import com.henninghall.date_picker.wheels.Wheel; + public interface WheelChangeListener { - void onChange(); + void onChange(Wheel picker); } diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java index 64a4007..04ef85c 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java @@ -17,9 +17,9 @@ public class DayWheel extends Wheel { @Override void init() { + int min = 0; int max = 10000; // bug - Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -max/2); @@ -40,6 +40,15 @@ public class DayWheel extends Wheel { picker.setMinValue(min); picker.setMaxValue(max); + picker.setValue(5000); +// picker.setMinAndMaxShowIndex(4995, 5005); + +// if(minDate != null){ +// int index = values.indexOf(format.format(minDate)); +// if(index > -1) picker.setMinValue(index); +// } + + } @Override diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java index 1e663d4..6522048 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java @@ -26,7 +26,6 @@ public class HourWheel extends Wheel { picker.setDisplayedValues(values.toArray(new String[0]),true); picker.setMinValue(0); picker.setMaxValue(numberOfHours - 1); - } @Override diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java index dd331c1..1b26f03 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java @@ -1,5 +1,6 @@ package com.henninghall.date_picker.wheels; +import android.util.Log; import android.view.View; import com.henninghall.date_picker.WheelChangeListener; @@ -16,6 +17,10 @@ import cn.carbswang.android.numberpickerview.library.NumberPickerView; public abstract class Wheel { + private final Wheel self; + private int minIndex; + private int prevValue; + abstract void init(); abstract boolean visible(); abstract String getFormatTemplate(); @@ -27,23 +32,26 @@ public abstract class Wheel { SimpleDateFormat format; SimpleDateFormat displayFormat; - - Wheel(NumberPickerView picker, final WheelChangeListener listener, Locale locale){ + this.self = this; this.locale = locale; this.picker = picker; - refresh(false); - picker.setOnValueChangedListener(new NumberPickerView.OnValueChangeListener() { @Override public void onValueChange(NumberPickerView picker, int oldVal, int newVal) { - listener.onChange(); + prevValue = oldVal; + listener.onChange(self); } }); + } + public void animateToDate(Date date) { + int index = values.indexOf(format.format(date)); + picker.smoothScrollToValue(index ); } + public String getValue() { if(!visible()) return ""; return getValueAtIndex(getIndex()); @@ -73,6 +81,7 @@ public abstract class Wheel { refresh(true); } + private void refresh(boolean keepOldValue) { this.displayFormat = new SimpleDateFormat(getFormatTemplate(), locale); this.format = new SimpleDateFormat(getFormatTemplate(), LocaleUtils.toLocale("en_US")); diff --git a/example/App.js b/example/App.js index 7aae381..43f38de 100644 --- a/example/App.js +++ b/example/App.js @@ -5,6 +5,11 @@ import DeviceInfo from 'react-native-device-info'; import DatePicker from 'react-native-date-picker-x'; import locales from './locales'; +Date.prototype.addHours = function(h) { + this.setTime(this.getTime() + (h*60*60*1000)); + return this; +} + export default class App extends Component { searchUpdated(term) { @@ -29,6 +34,8 @@ export default class App extends Component { date={this.state.chosenDate} onDateChange={this.setDate} locale={this.state.locale} + minimumDate={new Date()} + maximumDate={(new Date()).addHours(24*5)} /> Current locale: {this.state.locale} @@ -66,6 +73,7 @@ const styles = StyleSheet.create({ alignItems: 'center', justifyContent: 'center', backgroundColor: 'white', + marginTop: 15, }, item: { borderWidth: 1, diff --git a/example/android/build.gradle b/example/android/build.gradle index bfe87eb..2282bc9 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -14,6 +14,7 @@ buildscript { allprojects { repositories { + maven {url "https://maven.google.com"} mavenLocal() jcenter() maven { diff --git a/index.js b/index.js index d9ac692..4ae62b2 100644 --- a/index.js +++ b/index.js @@ -19,10 +19,14 @@ const NativeDatePicker = requireNativeComponent(`DatePickerManager`, DatePickerA class DatePickerAndroid extends React.Component { _onChange = e => this.props.onDateChange(new Date(parseInt(e.nativeEvent.date))); + _maximumDate = () => this.props.maximumDate && this.props.maximumDate.getTime(); + _minimumDate = () => this.props.minimumDate && this.props.minimumDate.getTime(); render = () => (