Browse Source

Minimum/maximum date support.

master
Henning Hall 7 years ago
parent
commit
44d5be1b18
11 changed files with 87 additions and 17 deletions
  1. +10
    -2
      README.md
  2. +11
    -1
      android/src/main/java/com/henninghall/date_picker/DatePickerManager.java
  3. +22
    -6
      android/src/main/java/com/henninghall/date_picker/PickerView.java
  4. +4
    -0
      android/src/main/java/com/henninghall/date_picker/Utils.java
  5. +3
    -1
      android/src/main/java/com/henninghall/date_picker/WheelChangeListener.java
  6. +10
    -1
      android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java
  7. +0
    -1
      android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java
  8. +14
    -5
      android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java
  9. +8
    -0
      example/App.js
  10. +1
    -0
      example/android/build.gradle
  11. +4
    -0
      index.js

+ 10
- 2
README.md View File

@ -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] Replace todays date with the string "Today" (considering locale)
- [x] Animate to date when state change occur. - [x] Animate to date when state change occur.
- [x] Switch between AM/PM when scrolling between forenoon and afternoon. - [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. - [ ] Align text to right.
- [ ] Mode: date - [ ] Mode: date
- [ ] Mode: time - [ ] Mode: time
- [ ] Support maximumDate/minimumDate. (Gray out and animate back to max/min value if exceeded).
<!--
## TODO EXTRA
- [ ] Transparent background support. (Probably need to include transparent gradient).
- [ ] Screen recordings
- [ ] Gray out max/min values.
-->

+ 11
- 1
android/src/main/java/com/henninghall/date_picker/DatePickerManager.java View File

@ -34,7 +34,7 @@ public class DatePickerManager extends SimpleViewManager {
@ReactProp(name = "date") @ReactProp(name = "date")
public void setDate(PickerView view, @Nullable double date) { public void setDate(PickerView view, @Nullable double date) {
view.setDate(new Date((long)date));
view.setDate(Utils.unixToDate(date));
} }
@ReactProp(name = "locale") @ReactProp(name = "locale")
@ -43,6 +43,16 @@ public class DatePickerManager extends SimpleViewManager {
view.requestLayout(); 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() { public Map getExportedCustomBubblingEventTypeConstants() {
return MapBuilder.builder() return MapBuilder.builder()
.put("dateChange", MapBuilder.of("phasedRegistrationNames", .put("dateChange", MapBuilder.of("phasedRegistrationNames",

+ 22
- 6
android/src/main/java/com/henninghall/date_picker/PickerView.java View File

@ -1,8 +1,6 @@
package com.henninghall.date_picker; package com.henninghall.date_picker;
import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import com.facebook.react.bridge.Arguments; 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.DayWheel;
import com.henninghall.date_picker.wheels.HourWheel; import com.henninghall.date_picker.wheels.HourWheel;
import com.henninghall.date_picker.wheels.MinutesWheel; 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.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
@ -31,7 +33,8 @@ public class PickerView extends RelativeLayout {
private DayWheel dayWheel; private DayWheel dayWheel;
private MinutesWheel minutesWheel; private MinutesWheel minutesWheel;
private AmPmWheel ampmWheel; private AmPmWheel ampmWheel;
private int i = 0;
private Date minDate;
private Date maxDate;
public PickerView() { public PickerView() {
super(DatePickerManager.context); super(DatePickerManager.context);
@ -56,19 +59,24 @@ public class PickerView extends RelativeLayout {
dateFormat = new SimpleDateFormat(getDateFormatTemplate(), Locale.US); dateFormat = new SimpleDateFormat(getDateFormatTemplate(), Locale.US);
changeAmPmWhenPassingMidnightOrNoon(); changeAmPmWhenPassingMidnightOrNoon();
} }
WheelChangeListener onWheelChangeListener = new WheelChangeListener(){ WheelChangeListener onWheelChangeListener = new WheelChangeListener(){
@Override @Override
public void onChange() {
public void onChange(Wheel wheel) {
WritableMap event = Arguments.createMap(); WritableMap event = Arguments.createMap();
try { try {
Date date = dateFormat.parse(getDateString()); 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) { } catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();
} }
DatePickerManager.context.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "dateChange", event);
} }
}; };
@ -87,6 +95,14 @@ public class PickerView extends RelativeLayout {
+ ampmWheel.getValue(); + 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) { public void setDate(Date date) {
dayWheel.setValue(date); dayWheel.setValue(date);
hourWheel.setValue(date); hourWheel.setValue(date);

+ 4
- 0
android/src/main/java/com/henninghall/date_picker/Utils.java View File

@ -3,6 +3,7 @@ package com.henninghall.date_picker;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale; import java.util.Locale;
public class Utils { public class Utils {
@ -16,5 +17,8 @@ public class Utils {
return UnitPatterns.of(locale).getTodayWord(); return UnitPatterns.of(locale).getTodayWord();
} }
public static Date unixToDate(double date) {
return new Date((long)date);
}
} }

+ 3
- 1
android/src/main/java/com/henninghall/date_picker/WheelChangeListener.java View File

@ -1,8 +1,10 @@
package com.henninghall.date_picker; package com.henninghall.date_picker;
import com.henninghall.date_picker.wheels.Wheel;
public interface WheelChangeListener { public interface WheelChangeListener {
void onChange();
void onChange(Wheel picker);
} }

+ 10
- 1
android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java View File

@ -17,9 +17,9 @@ public class DayWheel extends Wheel {
@Override @Override
void init() { void init() {
int min = 0; int min = 0;
int max = 10000; // bug int max = 10000; // bug
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -max/2); cal.add(Calendar.DAY_OF_MONTH, -max/2);
@ -40,6 +40,15 @@ public class DayWheel extends Wheel {
picker.setMinValue(min); picker.setMinValue(min);
picker.setMaxValue(max); 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 @Override

+ 0
- 1
android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java View File

@ -26,7 +26,6 @@ public class HourWheel extends Wheel {
picker.setDisplayedValues(values.toArray(new String[0]),true); picker.setDisplayedValues(values.toArray(new String[0]),true);
picker.setMinValue(0); picker.setMinValue(0);
picker.setMaxValue(numberOfHours - 1); picker.setMaxValue(numberOfHours - 1);
} }
@Override @Override

+ 14
- 5
android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java View File

@ -1,5 +1,6 @@
package com.henninghall.date_picker.wheels; package com.henninghall.date_picker.wheels;
import android.util.Log;
import android.view.View; import android.view.View;
import com.henninghall.date_picker.WheelChangeListener; import com.henninghall.date_picker.WheelChangeListener;
@ -16,6 +17,10 @@ import cn.carbswang.android.numberpickerview.library.NumberPickerView;
public abstract class Wheel { public abstract class Wheel {
private final Wheel self;
private int minIndex;
private int prevValue;
abstract void init(); abstract void init();
abstract boolean visible(); abstract boolean visible();
abstract String getFormatTemplate(); abstract String getFormatTemplate();
@ -27,23 +32,26 @@ public abstract class Wheel {
SimpleDateFormat format; SimpleDateFormat format;
SimpleDateFormat displayFormat; SimpleDateFormat displayFormat;
Wheel(NumberPickerView picker, final WheelChangeListener listener, Locale locale){ Wheel(NumberPickerView picker, final WheelChangeListener listener, Locale locale){
this.self = this;
this.locale = locale; this.locale = locale;
this.picker = picker; this.picker = picker;
refresh(false); refresh(false);
picker.setOnValueChangedListener(new NumberPickerView.OnValueChangeListener() { picker.setOnValueChangedListener(new NumberPickerView.OnValueChangeListener() {
@Override @Override
public void onValueChange(NumberPickerView picker, int oldVal, int newVal) { 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() { public String getValue() {
if(!visible()) return ""; if(!visible()) return "";
return getValueAtIndex(getIndex()); return getValueAtIndex(getIndex());
@ -73,6 +81,7 @@ public abstract class Wheel {
refresh(true); refresh(true);
} }
private void refresh(boolean keepOldValue) { private void refresh(boolean keepOldValue) {
this.displayFormat = new SimpleDateFormat(getFormatTemplate(), locale); this.displayFormat = new SimpleDateFormat(getFormatTemplate(), locale);
this.format = new SimpleDateFormat(getFormatTemplate(), LocaleUtils.toLocale("en_US")); this.format = new SimpleDateFormat(getFormatTemplate(), LocaleUtils.toLocale("en_US"));

+ 8
- 0
example/App.js View File

@ -5,6 +5,11 @@ import DeviceInfo from 'react-native-device-info';
import DatePicker from 'react-native-date-picker-x'; import DatePicker from 'react-native-date-picker-x';
import locales from './locales'; 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 { export default class App extends Component {
searchUpdated(term) { searchUpdated(term) {
@ -29,6 +34,8 @@ export default class App extends Component {
date={this.state.chosenDate} date={this.state.chosenDate}
onDateChange={this.setDate} onDateChange={this.setDate}
locale={this.state.locale} locale={this.state.locale}
minimumDate={new Date()}
maximumDate={(new Date()).addHours(24*5)}
/> />
<Text>Current locale: {this.state.locale}</Text> <Text>Current locale: {this.state.locale}</Text>
@ -66,6 +73,7 @@ const styles = StyleSheet.create({
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
backgroundColor: 'white', backgroundColor: 'white',
marginTop: 15,
}, },
item: { item: {
borderWidth: 1, borderWidth: 1,

+ 1
- 0
example/android/build.gradle View File

@ -14,6 +14,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
maven {url "https://maven.google.com"}
mavenLocal() mavenLocal()
jcenter() jcenter()
maven { maven {

+ 4
- 0
index.js View File

@ -19,10 +19,14 @@ const NativeDatePicker = requireNativeComponent(`DatePickerManager`, DatePickerA
class DatePickerAndroid extends React.Component { class DatePickerAndroid extends React.Component {
_onChange = e => this.props.onDateChange(new Date(parseInt(e.nativeEvent.date))); _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 = () => ( render = () => (
<NativeDatePicker <NativeDatePicker
{...this.props } {...this.props }
date={this.props.date.getTime()} date={this.props.date.getTime()}
minimumDate={this._minimumDate()}
maximumDate={this._maximumDate()}
onChange={this._onChange} onChange={this._onChange}
style={[styles.picker, this.props.style]} style={[styles.picker, this.props.style]}
/> />

Loading…
Cancel
Save