mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
chore: cleanup
This commit is contained in:
@@ -1,117 +1,93 @@
|
||||
import {
|
||||
TimePickerBase,
|
||||
getValidTime,
|
||||
timeProperty,
|
||||
hourProperty,
|
||||
minuteProperty,
|
||||
} from "./time-picker-common";
|
||||
import { TimePickerBase, getValidTime, timeProperty, hourProperty, minuteProperty } from './time-picker-common';
|
||||
|
||||
export * from "./time-picker-common";
|
||||
export * from './time-picker-common';
|
||||
|
||||
interface TimeChangedListener {
|
||||
new (owner: TimePicker): android.widget.TimePicker.OnTimeChangedListener;
|
||||
new (owner: TimePicker): android.widget.TimePicker.OnTimeChangedListener;
|
||||
}
|
||||
|
||||
let TimeChangedListener: TimeChangedListener;
|
||||
|
||||
function initializeTimeChangedListener(): void {
|
||||
if (TimeChangedListener) {
|
||||
return;
|
||||
}
|
||||
if (TimeChangedListener) {
|
||||
return;
|
||||
}
|
||||
|
||||
apiLevel = android.os.Build.VERSION.SDK_INT;
|
||||
apiLevel = android.os.Build.VERSION.SDK_INT;
|
||||
|
||||
@Interfaces([android.widget.TimePicker.OnTimeChangedListener])
|
||||
class TimeChangedListenerImpl extends java.lang.Object
|
||||
implements android.widget.TimePicker.OnTimeChangedListener {
|
||||
constructor(public owner: TimePicker) {
|
||||
super();
|
||||
@Interfaces([android.widget.TimePicker.OnTimeChangedListener])
|
||||
class TimeChangedListenerImpl extends java.lang.Object implements android.widget.TimePicker.OnTimeChangedListener {
|
||||
constructor(public owner: TimePicker) {
|
||||
super();
|
||||
|
||||
return global.__native(this);
|
||||
}
|
||||
return global.__native(this);
|
||||
}
|
||||
|
||||
onTimeChanged(
|
||||
picker: android.widget.TimePicker,
|
||||
hour: number,
|
||||
minute: number
|
||||
): void {
|
||||
const timePicker = this.owner;
|
||||
if (timePicker.updatingNativeValue) {
|
||||
return;
|
||||
}
|
||||
onTimeChanged(picker: android.widget.TimePicker, hour: number, minute: number): void {
|
||||
const timePicker = this.owner;
|
||||
if (timePicker.updatingNativeValue) {
|
||||
return;
|
||||
}
|
||||
|
||||
const validTime = getValidTime(timePicker, hour, minute);
|
||||
timeProperty.nativeValueChange(
|
||||
timePicker,
|
||||
new Date(0, 0, 0, validTime.hour, validTime.minute)
|
||||
);
|
||||
}
|
||||
}
|
||||
const validTime = getValidTime(timePicker, hour, minute);
|
||||
timeProperty.nativeValueChange(timePicker, new Date(0, 0, 0, validTime.hour, validTime.minute));
|
||||
}
|
||||
}
|
||||
|
||||
TimeChangedListener = TimeChangedListenerImpl;
|
||||
TimeChangedListener = TimeChangedListenerImpl;
|
||||
}
|
||||
|
||||
let apiLevel: number;
|
||||
|
||||
export class TimePicker extends TimePickerBase {
|
||||
nativeViewProtected: android.widget.TimePicker;
|
||||
updatingNativeValue: boolean;
|
||||
nativeViewProtected: android.widget.TimePicker;
|
||||
updatingNativeValue: boolean;
|
||||
|
||||
public createNativeView() {
|
||||
return new android.widget.TimePicker(this._context);
|
||||
}
|
||||
public createNativeView() {
|
||||
return new android.widget.TimePicker(this._context);
|
||||
}
|
||||
|
||||
public initNativeView(): void {
|
||||
super.initNativeView();
|
||||
const nativeView = this.nativeViewProtected;
|
||||
initializeTimeChangedListener();
|
||||
const listener = new TimeChangedListener(this);
|
||||
nativeView.setOnTimeChangedListener(listener);
|
||||
(<any>nativeView).listener = listener;
|
||||
const calendar = ((<any>(
|
||||
nativeView
|
||||
)).calendar = java.util.Calendar.getInstance());
|
||||
public initNativeView(): void {
|
||||
super.initNativeView();
|
||||
const nativeView = this.nativeViewProtected;
|
||||
initializeTimeChangedListener();
|
||||
const listener = new TimeChangedListener(this);
|
||||
nativeView.setOnTimeChangedListener(listener);
|
||||
(<any>nativeView).listener = listener;
|
||||
const calendar = ((<any>nativeView).calendar = java.util.Calendar.getInstance());
|
||||
|
||||
const hour = hourProperty.isSet(this)
|
||||
? this.hour
|
||||
: calendar.get(java.util.Calendar.HOUR_OF_DAY);
|
||||
const minute = minuteProperty.isSet(this)
|
||||
? this.minute
|
||||
: calendar.get(java.util.Calendar.MINUTE);
|
||||
const hour = hourProperty.isSet(this) ? this.hour : calendar.get(java.util.Calendar.HOUR_OF_DAY);
|
||||
const minute = minuteProperty.isSet(this) ? this.minute : calendar.get(java.util.Calendar.MINUTE);
|
||||
|
||||
const validTime = getValidTime(this, hour, minute);
|
||||
if (!timeProperty.isSet(this)) {
|
||||
this.time = new Date(0, 0, 0, validTime.hour, validTime.minute);
|
||||
}
|
||||
}
|
||||
const validTime = getValidTime(this, hour, minute);
|
||||
if (!timeProperty.isSet(this)) {
|
||||
this.time = new Date(0, 0, 0, validTime.hour, validTime.minute);
|
||||
}
|
||||
}
|
||||
|
||||
[minuteProperty.setNative](value: number) {
|
||||
this.updatingNativeValue = true;
|
||||
try {
|
||||
if (apiLevel >= 23) {
|
||||
(<any>this.nativeViewProtected).setMinute(value);
|
||||
} else {
|
||||
this.nativeViewProtected.setCurrentMinute(
|
||||
new java.lang.Integer(value)
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
this.updatingNativeValue = false;
|
||||
}
|
||||
}
|
||||
[minuteProperty.setNative](value: number) {
|
||||
this.updatingNativeValue = true;
|
||||
try {
|
||||
if (apiLevel >= 23) {
|
||||
(<any>this.nativeViewProtected).setMinute(value);
|
||||
} else {
|
||||
this.nativeViewProtected.setCurrentMinute(new java.lang.Integer(value));
|
||||
}
|
||||
} finally {
|
||||
this.updatingNativeValue = false;
|
||||
}
|
||||
}
|
||||
|
||||
[hourProperty.setNative](value: number) {
|
||||
this.updatingNativeValue = true;
|
||||
try {
|
||||
if (apiLevel >= 23) {
|
||||
(<any>this.nativeViewProtected).setHour(value);
|
||||
} else {
|
||||
this.nativeViewProtected.setCurrentHour(
|
||||
new java.lang.Integer(value)
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
this.updatingNativeValue = false;
|
||||
}
|
||||
}
|
||||
[hourProperty.setNative](value: number) {
|
||||
this.updatingNativeValue = true;
|
||||
try {
|
||||
if (apiLevel >= 23) {
|
||||
(<any>this.nativeViewProtected).setHour(value);
|
||||
} else {
|
||||
this.nativeViewProtected.setCurrentHour(new java.lang.Integer(value));
|
||||
}
|
||||
} finally {
|
||||
this.updatingNativeValue = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
84
nativescript-core/ui/time-picker/index.d.ts
vendored
84
nativescript-core/ui/time-picker/index.d.ts
vendored
@@ -1,59 +1,59 @@
|
||||
import { View } from "../core/view";
|
||||
import { Property } from "../core/properties";
|
||||
import { View } from '../core/view';
|
||||
import { Property } from '../core/properties';
|
||||
|
||||
/**
|
||||
* Represents an time picker.
|
||||
*/
|
||||
export class TimePicker extends View {
|
||||
/**
|
||||
* Gets the native [android.widget.TimePicker](http://developer.android.com/reference/android/widget/TimePicker.html) that represents the user interface for this component. Valid only when running on Android OS.
|
||||
*/
|
||||
android: any /* android.widget.TimePicker */;
|
||||
/**
|
||||
* Gets the native [android.widget.TimePicker](http://developer.android.com/reference/android/widget/TimePicker.html) that represents the user interface for this component. Valid only when running on Android OS.
|
||||
*/
|
||||
android: any /* android.widget.TimePicker */;
|
||||
|
||||
/**
|
||||
* Gets the native iOS [UIDatePicker](http://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIDatePicker_Class/index.html) that represents the user interface for this component. Valid only when running on iOS.
|
||||
*/
|
||||
ios: any /* UIDatePicker */;
|
||||
/**
|
||||
* Gets the native iOS [UIDatePicker](http://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIDatePicker_Class/index.html) that represents the user interface for this component. Valid only when running on iOS.
|
||||
*/
|
||||
ios: any /* UIDatePicker */;
|
||||
|
||||
/**
|
||||
* Gets or sets the time hour.
|
||||
*/
|
||||
hour: number;
|
||||
/**
|
||||
* Gets or sets the time hour.
|
||||
*/
|
||||
hour: number;
|
||||
|
||||
/**
|
||||
* Gets or sets the time minute.
|
||||
*/
|
||||
minute: number;
|
||||
/**
|
||||
* Gets or sets the time minute.
|
||||
*/
|
||||
minute: number;
|
||||
|
||||
/**
|
||||
* Gets or sets the time.
|
||||
*/
|
||||
time: Date;
|
||||
/**
|
||||
* Gets or sets the time.
|
||||
*/
|
||||
time: Date;
|
||||
|
||||
/**
|
||||
* Gets or sets the max time hour.
|
||||
*/
|
||||
maxHour: number;
|
||||
/**
|
||||
* Gets or sets the max time hour.
|
||||
*/
|
||||
maxHour: number;
|
||||
|
||||
/**
|
||||
* Gets or sets the max time minute.
|
||||
*/
|
||||
maxMinute: number;
|
||||
/**
|
||||
* Gets or sets the max time minute.
|
||||
*/
|
||||
maxMinute: number;
|
||||
|
||||
/**
|
||||
* Gets or sets the min time hour.
|
||||
*/
|
||||
minHour: number;
|
||||
/**
|
||||
* Gets or sets the min time hour.
|
||||
*/
|
||||
minHour: number;
|
||||
|
||||
/**
|
||||
* Gets or sets the min time minute.
|
||||
*/
|
||||
minMinute: number;
|
||||
/**
|
||||
* Gets or sets the min time minute.
|
||||
*/
|
||||
minMinute: number;
|
||||
|
||||
/**
|
||||
* Gets or sets the minute interval.
|
||||
*/
|
||||
minuteInterval: number;
|
||||
/**
|
||||
* Gets or sets the minute interval.
|
||||
*/
|
||||
minuteInterval: number;
|
||||
}
|
||||
|
||||
export const hourProperty: Property<TimePicker, number>;
|
||||
|
||||
@@ -1,188 +1,154 @@
|
||||
import {
|
||||
TimePickerBase,
|
||||
timeProperty,
|
||||
minuteIntervalProperty,
|
||||
minuteProperty,
|
||||
minMinuteProperty,
|
||||
maxMinuteProperty,
|
||||
hourProperty,
|
||||
minHourProperty,
|
||||
maxHourProperty,
|
||||
} from "./time-picker-common";
|
||||
import { Color } from "../../color";
|
||||
import { colorProperty } from "../styling/style-properties";
|
||||
import { TimePickerBase, timeProperty, minuteIntervalProperty, minuteProperty, minMinuteProperty, maxMinuteProperty, hourProperty, minHourProperty, maxHourProperty } from './time-picker-common';
|
||||
import { Color } from '../../color';
|
||||
import { colorProperty } from '../styling/style-properties';
|
||||
|
||||
export * from "./time-picker-common";
|
||||
export * from './time-picker-common';
|
||||
|
||||
function getDate(hour: number, minute: number): Date {
|
||||
let components = NSDateComponents.alloc().init();
|
||||
components.hour = hour;
|
||||
components.minute = minute;
|
||||
let components = NSDateComponents.alloc().init();
|
||||
components.hour = hour;
|
||||
components.minute = minute;
|
||||
|
||||
return NSCalendar.currentCalendar.dateFromComponents(<any>components);
|
||||
return NSCalendar.currentCalendar.dateFromComponents(<any>components);
|
||||
}
|
||||
|
||||
function getComponents(date: Date | NSDate): NSDateComponents {
|
||||
return NSCalendar.currentCalendar.componentsFromDate(
|
||||
NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute,
|
||||
<any>date
|
||||
);
|
||||
return NSCalendar.currentCalendar.componentsFromDate(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute, <any>date);
|
||||
}
|
||||
|
||||
export class TimePicker extends TimePickerBase {
|
||||
nativeViewProtected: UIDatePicker;
|
||||
private _changeHandler: NSObject;
|
||||
nativeViewProtected: UIDatePicker;
|
||||
private _changeHandler: NSObject;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
let components = getComponents(NSDate.date());
|
||||
this.hour = components.hour;
|
||||
this.minute = components.minute;
|
||||
}
|
||||
constructor() {
|
||||
super();
|
||||
let components = getComponents(NSDate.date());
|
||||
this.hour = components.hour;
|
||||
this.minute = components.minute;
|
||||
}
|
||||
|
||||
createNativeView() {
|
||||
const picker = UIDatePicker.new();
|
||||
picker.datePickerMode = UIDatePickerMode.Time;
|
||||
createNativeView() {
|
||||
const picker = UIDatePicker.new();
|
||||
picker.datePickerMode = UIDatePickerMode.Time;
|
||||
|
||||
return picker;
|
||||
}
|
||||
return picker;
|
||||
}
|
||||
|
||||
initNativeView() {
|
||||
super.initNativeView();
|
||||
this._changeHandler = UITimePickerChangeHandlerImpl.initWithOwner(
|
||||
new WeakRef(this)
|
||||
);
|
||||
this.nativeViewProtected.addTargetActionForControlEvents(
|
||||
this._changeHandler,
|
||||
"valueChanged",
|
||||
UIControlEvents.ValueChanged
|
||||
);
|
||||
}
|
||||
initNativeView() {
|
||||
super.initNativeView();
|
||||
this._changeHandler = UITimePickerChangeHandlerImpl.initWithOwner(new WeakRef(this));
|
||||
this.nativeViewProtected.addTargetActionForControlEvents(this._changeHandler, 'valueChanged', UIControlEvents.ValueChanged);
|
||||
}
|
||||
|
||||
disposeNativeView() {
|
||||
this._changeHandler = null;
|
||||
super.initNativeView();
|
||||
}
|
||||
disposeNativeView() {
|
||||
this._changeHandler = null;
|
||||
super.initNativeView();
|
||||
}
|
||||
|
||||
get ios(): UIDatePicker {
|
||||
return this.nativeViewProtected;
|
||||
}
|
||||
get ios(): UIDatePicker {
|
||||
return this.nativeViewProtected;
|
||||
}
|
||||
|
||||
[timeProperty.getDefault](): Date {
|
||||
return this.nativeViewProtected.date;
|
||||
}
|
||||
[timeProperty.setNative](value: Date) {
|
||||
this.nativeViewProtected.date = getDate(this.hour, this.minute);
|
||||
}
|
||||
[timeProperty.getDefault](): Date {
|
||||
return this.nativeViewProtected.date;
|
||||
}
|
||||
[timeProperty.setNative](value: Date) {
|
||||
this.nativeViewProtected.date = getDate(this.hour, this.minute);
|
||||
}
|
||||
|
||||
[minuteProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.date.getMinutes();
|
||||
}
|
||||
[minuteProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.date = getDate(this.hour, value);
|
||||
}
|
||||
[minuteProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.date.getMinutes();
|
||||
}
|
||||
[minuteProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.date = getDate(this.hour, value);
|
||||
}
|
||||
|
||||
[hourProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.date.getHours();
|
||||
}
|
||||
[hourProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.date = getDate(value, this.minute);
|
||||
}
|
||||
[hourProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.date.getHours();
|
||||
}
|
||||
[hourProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.date = getDate(value, this.minute);
|
||||
}
|
||||
|
||||
[minHourProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.minimumDate
|
||||
? this.nativeViewProtected.minimumDate.getHours()
|
||||
: 0;
|
||||
}
|
||||
[minHourProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.minimumDate = getDate(value, this.minute);
|
||||
}
|
||||
[minHourProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.minimumDate ? this.nativeViewProtected.minimumDate.getHours() : 0;
|
||||
}
|
||||
[minHourProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.minimumDate = getDate(value, this.minute);
|
||||
}
|
||||
|
||||
[maxHourProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.maximumDate
|
||||
? this.nativeViewProtected.maximumDate.getHours()
|
||||
: 24;
|
||||
}
|
||||
[maxHourProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.maximumDate = getDate(value, this.minute);
|
||||
}
|
||||
[maxHourProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.maximumDate ? this.nativeViewProtected.maximumDate.getHours() : 24;
|
||||
}
|
||||
[maxHourProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.maximumDate = getDate(value, this.minute);
|
||||
}
|
||||
|
||||
[minMinuteProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.minimumDate
|
||||
? this.nativeViewProtected.minimumDate.getMinutes()
|
||||
: 0;
|
||||
}
|
||||
[minMinuteProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.minimumDate = getDate(this.hour, value);
|
||||
}
|
||||
[minMinuteProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.minimumDate ? this.nativeViewProtected.minimumDate.getMinutes() : 0;
|
||||
}
|
||||
[minMinuteProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.minimumDate = getDate(this.hour, value);
|
||||
}
|
||||
|
||||
[maxMinuteProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.maximumDate
|
||||
? this.nativeViewProtected.maximumDate.getMinutes()
|
||||
: 60;
|
||||
}
|
||||
[maxMinuteProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.maximumDate = getDate(this.hour, value);
|
||||
}
|
||||
[maxMinuteProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.maximumDate ? this.nativeViewProtected.maximumDate.getMinutes() : 60;
|
||||
}
|
||||
[maxMinuteProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.maximumDate = getDate(this.hour, value);
|
||||
}
|
||||
|
||||
[minuteIntervalProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.minuteInterval;
|
||||
}
|
||||
[minuteIntervalProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.minuteInterval = value;
|
||||
}
|
||||
[minuteIntervalProperty.getDefault](): number {
|
||||
return this.nativeViewProtected.minuteInterval;
|
||||
}
|
||||
[minuteIntervalProperty.setNative](value: number) {
|
||||
this.nativeViewProtected.minuteInterval = value;
|
||||
}
|
||||
|
||||
[colorProperty.getDefault](): UIColor {
|
||||
return this.nativeViewProtected.valueForKey("textColor");
|
||||
}
|
||||
[colorProperty.setNative](value: Color | UIColor) {
|
||||
const color = value instanceof Color ? value.ios : value;
|
||||
this.nativeViewProtected.setValueForKey(color, "textColor");
|
||||
}
|
||||
[colorProperty.getDefault](): UIColor {
|
||||
return this.nativeViewProtected.valueForKey('textColor');
|
||||
}
|
||||
[colorProperty.setNative](value: Color | UIColor) {
|
||||
const color = value instanceof Color ? value.ios : value;
|
||||
this.nativeViewProtected.setValueForKey(color, 'textColor');
|
||||
}
|
||||
}
|
||||
|
||||
class UITimePickerChangeHandlerImpl extends NSObject {
|
||||
private _owner: WeakRef<TimePicker>;
|
||||
private _owner: WeakRef<TimePicker>;
|
||||
|
||||
public static initWithOwner(
|
||||
owner: WeakRef<TimePicker>
|
||||
): UITimePickerChangeHandlerImpl {
|
||||
let handler = <UITimePickerChangeHandlerImpl>(
|
||||
UITimePickerChangeHandlerImpl.new()
|
||||
);
|
||||
handler._owner = owner;
|
||||
public static initWithOwner(owner: WeakRef<TimePicker>): UITimePickerChangeHandlerImpl {
|
||||
let handler = <UITimePickerChangeHandlerImpl>UITimePickerChangeHandlerImpl.new();
|
||||
handler._owner = owner;
|
||||
|
||||
return handler;
|
||||
}
|
||||
return handler;
|
||||
}
|
||||
|
||||
public valueChanged(sender: UIDatePicker) {
|
||||
let owner = this._owner.get();
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
public valueChanged(sender: UIDatePicker) {
|
||||
let owner = this._owner.get();
|
||||
if (!owner) {
|
||||
return;
|
||||
}
|
||||
|
||||
let components = getComponents(sender.date);
|
||||
let components = getComponents(sender.date);
|
||||
|
||||
let timeChanged = false;
|
||||
if (components.hour !== owner.hour) {
|
||||
hourProperty.nativeValueChange(owner, components.hour);
|
||||
timeChanged = true;
|
||||
}
|
||||
let timeChanged = false;
|
||||
if (components.hour !== owner.hour) {
|
||||
hourProperty.nativeValueChange(owner, components.hour);
|
||||
timeChanged = true;
|
||||
}
|
||||
|
||||
if (components.minute !== owner.minute) {
|
||||
minuteProperty.nativeValueChange(owner, components.minute);
|
||||
timeChanged = true;
|
||||
}
|
||||
if (components.minute !== owner.minute) {
|
||||
minuteProperty.nativeValueChange(owner, components.minute);
|
||||
timeChanged = true;
|
||||
}
|
||||
|
||||
if (timeChanged) {
|
||||
timeProperty.nativeValueChange(
|
||||
owner,
|
||||
new Date(0, 0, 0, components.hour, components.minute)
|
||||
);
|
||||
}
|
||||
}
|
||||
if (timeChanged) {
|
||||
timeProperty.nativeValueChange(owner, new Date(0, 0, 0, components.hour, components.minute));
|
||||
}
|
||||
}
|
||||
|
||||
public static ObjCExposedMethods = {
|
||||
valueChanged: { returns: interop.types.void, params: [UIDatePicker] },
|
||||
};
|
||||
public static ObjCExposedMethods = {
|
||||
valueChanged: { returns: interop.types.void, params: [UIDatePicker] },
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,244 +1,206 @@
|
||||
import { TimePicker as TimePickerDefinition } from ".";
|
||||
import { View, CSSType } from "../core/view";
|
||||
import { Property } from "../core/properties";
|
||||
import { TimePicker as TimePickerDefinition } from '.';
|
||||
import { View, CSSType } from '../core/view';
|
||||
import { Property } from '../core/properties';
|
||||
|
||||
interface Time {
|
||||
hour: number;
|
||||
minute: number;
|
||||
hour: number;
|
||||
minute: number;
|
||||
}
|
||||
|
||||
const dateComparer = (x: Date, y: Date): boolean => x <= y && x >= y;
|
||||
|
||||
export function getValidTime(
|
||||
picker: TimePickerDefinition,
|
||||
hour: number,
|
||||
minute: number
|
||||
): Time {
|
||||
if (picker.minuteInterval > 1) {
|
||||
let minuteFloor = minute - (minute % picker.minuteInterval);
|
||||
minute =
|
||||
minuteFloor +
|
||||
(minute === minuteFloor + 1 ? picker.minuteInterval : 0);
|
||||
export function getValidTime(picker: TimePickerDefinition, hour: number, minute: number): Time {
|
||||
if (picker.minuteInterval > 1) {
|
||||
let minuteFloor = minute - (minute % picker.minuteInterval);
|
||||
minute = minuteFloor + (minute === minuteFloor + 1 ? picker.minuteInterval : 0);
|
||||
|
||||
if (minute === 60) {
|
||||
hour++;
|
||||
minute = 0;
|
||||
}
|
||||
}
|
||||
if (minute === 60) {
|
||||
hour++;
|
||||
minute = 0;
|
||||
}
|
||||
}
|
||||
|
||||
let time = { hour: hour, minute: minute };
|
||||
if (!isLessThanMaxTime(picker, hour, minute)) {
|
||||
time = { hour: picker.maxHour, minute: picker.maxMinute };
|
||||
}
|
||||
let time = { hour: hour, minute: minute };
|
||||
if (!isLessThanMaxTime(picker, hour, minute)) {
|
||||
time = { hour: picker.maxHour, minute: picker.maxMinute };
|
||||
}
|
||||
|
||||
if (!isGreaterThanMinTime(picker, hour, minute)) {
|
||||
time = { hour: picker.minHour, minute: picker.minMinute };
|
||||
}
|
||||
if (!isGreaterThanMinTime(picker, hour, minute)) {
|
||||
time = { hour: picker.minHour, minute: picker.minMinute };
|
||||
}
|
||||
|
||||
return time;
|
||||
return time;
|
||||
}
|
||||
|
||||
function isValidTime(picker: TimePickerDefinition): boolean {
|
||||
return isGreaterThanMinTime(picker) && isLessThanMaxTime(picker);
|
||||
return isGreaterThanMinTime(picker) && isLessThanMaxTime(picker);
|
||||
}
|
||||
|
||||
function isHourValid(value: number): boolean {
|
||||
return typeof value === "number" && value >= 0 && value <= 23;
|
||||
return typeof value === 'number' && value >= 0 && value <= 23;
|
||||
}
|
||||
|
||||
function isMinuteValid(value: number): boolean {
|
||||
return typeof value === "number" && value >= 0 && value <= 59;
|
||||
return typeof value === 'number' && value >= 0 && value <= 59;
|
||||
}
|
||||
|
||||
function isMinuteIntervalValid(value: number): boolean {
|
||||
return (
|
||||
typeof value === "number" &&
|
||||
value >= 1 &&
|
||||
value <= 30 &&
|
||||
60 % value === 0
|
||||
);
|
||||
return typeof value === 'number' && value >= 1 && value <= 30 && 60 % value === 0;
|
||||
}
|
||||
|
||||
function getMinutes(hour: number): number {
|
||||
return hour * 60;
|
||||
return hour * 60;
|
||||
}
|
||||
|
||||
export function isDefined(value: any): boolean {
|
||||
return value !== undefined;
|
||||
return value !== undefined;
|
||||
}
|
||||
|
||||
function isGreaterThanMinTime(
|
||||
picker: TimePickerDefinition,
|
||||
hour?: number,
|
||||
minute?: number
|
||||
): boolean {
|
||||
if (picker.minHour === undefined || picker.minMinute === undefined) {
|
||||
return true;
|
||||
}
|
||||
function isGreaterThanMinTime(picker: TimePickerDefinition, hour?: number, minute?: number): boolean {
|
||||
if (picker.minHour === undefined || picker.minMinute === undefined) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (
|
||||
getMinutes(hour !== undefined ? hour : picker.hour) +
|
||||
(minute !== undefined ? minute : picker.minute) >=
|
||||
getMinutes(picker.minHour) + picker.minMinute
|
||||
);
|
||||
return getMinutes(hour !== undefined ? hour : picker.hour) + (minute !== undefined ? minute : picker.minute) >= getMinutes(picker.minHour) + picker.minMinute;
|
||||
}
|
||||
|
||||
function isLessThanMaxTime(
|
||||
picker: TimePickerDefinition,
|
||||
hour?: number,
|
||||
minute?: number
|
||||
): boolean {
|
||||
if (!isDefined(picker.maxHour) || !isDefined(picker.maxMinute)) {
|
||||
return true;
|
||||
}
|
||||
function isLessThanMaxTime(picker: TimePickerDefinition, hour?: number, minute?: number): boolean {
|
||||
if (!isDefined(picker.maxHour) || !isDefined(picker.maxMinute)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (
|
||||
getMinutes(isDefined(hour) ? hour : picker.hour) +
|
||||
(isDefined(minute) ? minute : picker.minute) <=
|
||||
getMinutes(picker.maxHour) + picker.maxMinute
|
||||
);
|
||||
return getMinutes(isDefined(hour) ? hour : picker.hour) + (isDefined(minute) ? minute : picker.minute) <= getMinutes(picker.maxHour) + picker.maxMinute;
|
||||
}
|
||||
|
||||
function toString(value: number | Date): string {
|
||||
if (value instanceof Date) {
|
||||
return value + "";
|
||||
}
|
||||
if (value instanceof Date) {
|
||||
return value + '';
|
||||
}
|
||||
|
||||
return value < 10 ? `0${value}` : `${value}`;
|
||||
return value < 10 ? `0${value}` : `${value}`;
|
||||
}
|
||||
|
||||
function getMinMaxTimeErrorMessage(picker: TimePickerDefinition): string {
|
||||
return `Min time: (${toString(picker.minHour)}:${toString(
|
||||
picker.minMinute
|
||||
)}), max time: (${toString(picker.maxHour)}:${toString(picker.maxMinute)})`;
|
||||
return `Min time: (${toString(picker.minHour)}:${toString(picker.minMinute)}), max time: (${toString(picker.maxHour)}:${toString(picker.maxMinute)})`;
|
||||
}
|
||||
|
||||
function getErrorMessage(
|
||||
picker: TimePickerDefinition,
|
||||
propertyName: string,
|
||||
newValue: number | Date
|
||||
): string {
|
||||
return `${propertyName} property value (${toString(newValue)}:${toString(
|
||||
picker.minute
|
||||
)}) is not valid. ${getMinMaxTimeErrorMessage(picker)}.`;
|
||||
function getErrorMessage(picker: TimePickerDefinition, propertyName: string, newValue: number | Date): string {
|
||||
return `${propertyName} property value (${toString(newValue)}:${toString(picker.minute)}) is not valid. ${getMinMaxTimeErrorMessage(picker)}.`;
|
||||
}
|
||||
|
||||
@CSSType("TimePicker")
|
||||
export abstract class TimePickerBase extends View
|
||||
implements TimePickerDefinition {
|
||||
public hour: number;
|
||||
public minute: number;
|
||||
public time: Date;
|
||||
public minuteInterval: number;
|
||||
public minHour: number;
|
||||
public maxHour: number;
|
||||
public minMinute: number;
|
||||
public maxMinute: number;
|
||||
@CSSType('TimePicker')
|
||||
export abstract class TimePickerBase extends View implements TimePickerDefinition {
|
||||
public hour: number;
|
||||
public minute: number;
|
||||
public time: Date;
|
||||
public minuteInterval: number;
|
||||
public minHour: number;
|
||||
public maxHour: number;
|
||||
public minMinute: number;
|
||||
public maxMinute: number;
|
||||
}
|
||||
|
||||
TimePickerBase.prototype.recycleNativeView = "auto";
|
||||
TimePickerBase.prototype.recycleNativeView = 'auto';
|
||||
|
||||
export const minHourProperty = new Property<TimePickerBase, number>({
|
||||
name: "minHour",
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "minHour", newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
name: 'minHour',
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'minHour', newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
minHourProperty.register(TimePickerBase);
|
||||
|
||||
export const maxHourProperty = new Property<TimePickerBase, number>({
|
||||
name: "maxHour",
|
||||
defaultValue: 23,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "maxHour", newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
name: 'maxHour',
|
||||
defaultValue: 23,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'maxHour', newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
maxHourProperty.register(TimePickerBase);
|
||||
|
||||
export const minMinuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "minMinute",
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "minMinute", newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
name: 'minMinute',
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'minMinute', newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
minMinuteProperty.register(TimePickerBase);
|
||||
|
||||
export const maxMinuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "maxMinute",
|
||||
defaultValue: 59,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "maxMinute", newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
name: 'maxMinute',
|
||||
defaultValue: 59,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'maxMinute', newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
maxMinuteProperty.register(TimePickerBase);
|
||||
|
||||
export const minuteIntervalProperty = new Property<TimePickerBase, number>({
|
||||
name: "minuteInterval",
|
||||
defaultValue: 1,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteIntervalValid(newValue)) {
|
||||
throw new Error(
|
||||
getErrorMessage(picker, "minuteInterval", newValue)
|
||||
);
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
name: 'minuteInterval',
|
||||
defaultValue: 1,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteIntervalValid(newValue)) {
|
||||
throw new Error(getErrorMessage(picker, 'minuteInterval', newValue));
|
||||
}
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
minuteIntervalProperty.register(TimePickerBase);
|
||||
|
||||
export const minuteProperty = new Property<TimePickerBase, number>({
|
||||
name: "minute",
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "minute", newValue));
|
||||
}
|
||||
name: 'minute',
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'minute', newValue));
|
||||
}
|
||||
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
minuteProperty.register(TimePickerBase);
|
||||
|
||||
export const hourProperty = new Property<TimePickerBase, number>({
|
||||
name: "hour",
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "Hour", newValue));
|
||||
}
|
||||
name: 'hour',
|
||||
defaultValue: 0,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isHourValid(newValue) || !isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'Hour', newValue));
|
||||
}
|
||||
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
|
||||
},
|
||||
valueConverter: (v) => parseInt(v),
|
||||
});
|
||||
hourProperty.register(TimePickerBase);
|
||||
|
||||
export const timeProperty = new Property<TimePickerBase, Date>({
|
||||
name: "time",
|
||||
defaultValue: new Date(),
|
||||
equalityComparer: dateComparer,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, "time", newValue));
|
||||
}
|
||||
name: 'time',
|
||||
defaultValue: new Date(),
|
||||
equalityComparer: dateComparer,
|
||||
valueChanged: (picker, oldValue, newValue) => {
|
||||
if (!isValidTime(picker)) {
|
||||
throw new Error(getErrorMessage(picker, 'time', newValue));
|
||||
}
|
||||
|
||||
picker.hour = newValue.getHours();
|
||||
picker.minute = newValue.getMinutes();
|
||||
},
|
||||
picker.hour = newValue.getHours();
|
||||
picker.minute = newValue.getMinutes();
|
||||
},
|
||||
});
|
||||
timeProperty.register(TimePickerBase);
|
||||
|
||||
Reference in New Issue
Block a user