From 083ded43394c227f3a8a415c7985fdaf329b117b Mon Sep 17 00:00:00 2001 From: Jogboms Date: Thu, 8 Feb 2018 17:51:37 +0100 Subject: [PATCH 1/5] fix: lint issues --- src/index.d.ts | 58 ++-- src/modal-datetimepicker.android.ts | 252 ++++++++------ src/modal-datetimepicker.ios.ts | 518 +++++++++++++++++----------- 3 files changed, 478 insertions(+), 350 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index 043c635..74d4182 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,33 +1,35 @@ export interface PickerOptions { - type?: string; - title?: string; - theme?: string; - maxDate?: Date; - minDate?: Date; - startingDate?: Date; - is24HourView: boolean; - maxTime?: { - hour: number; - minute: number; - }; - minTime?: { - hour: number; - minute: number; - }; + type?: string; + title?: string; + theme?: string; + maxDate?: Date; + minDate?: Date; + startingDate?: Date; + startingHour?: number; + startingMinute?: number; + is24HourView: boolean; + maxTime?: { + hour: number; + minute: number; + }; + minTime?: { + hour: number; + minute: number; + }; } export interface PickerResponse { - day?: number; - month?: number; - year?: number; - hour?: number; - minute?: number; -} + day?: number; + month?: number; + year?: number; + hour?: number; + minute?: number; +} export declare class ModalDatetimepicker { - constructor(); - pickDate(options?: PickerOptions): Promise<{}>; - pickTime(options?: PickerOptions): Promise<{}>; - private show(options); - chooseDate(): void; - chooseTime(): void; - close(response?: any): void; + constructor(); + pickDate(options?: PickerOptions): Promise<{}>; + pickTime(options?: PickerOptions): Promise<{}>; + private show(options); + chooseDate(): void; + chooseTime(): void; + close(response?: any): void; } diff --git a/src/modal-datetimepicker.android.ts b/src/modal-datetimepicker.android.ts index 3664bf1..6b2a630 100644 --- a/src/modal-datetimepicker.android.ts +++ b/src/modal-datetimepicker.android.ts @@ -4,130 +4,160 @@ declare var com: any; const Calendar = java.util.Calendar; export interface PickerOptions { - type?: string; - title?: string; - theme?: string; - maxDate?: Date; - minDate?: Date; - startingDate?: Date; - is24HourView: boolean; - maxTime?: { - hour: number, - minute: number - }, - minTime?: { - hour: number, - minute: number - } + type?: string; + title?: string; + theme?: string; + maxDate?: Date; + minDate?: Date; + startingDate?: Date; + startingHour?: number; + startingMinute?: number; + is24HourView: boolean; + maxTime?: { + hour: number; + minute: number; + }; + minTime?: { + hour: number; + minute: number; + }; } export interface PickerResponse { - day?: number, - month?: number, - year?: number, - hour?: number, - minute?: number + day?: number; + month?: number; + year?: number; + hour?: number; + minute?: number; } export class ModalDatetimepicker { - constructor() {} + constructor() {} - public pickDate(options?: PickerOptions) { - return new Promise((resolve, reject) => { - if (options.startingDate && typeof options.startingDate.getMonth != 'function') { - reject('startingDate must be a Date.'); - } - if (options.minDate && typeof options.minDate.getMonth != 'function') { - reject('minDate must be a Date.'); - } - if (options.maxDate && typeof options.maxDate.getMonth != 'function') { - reject('maxDate must be a Date.'); - } - //let now = Calendar.getInstance(); - let startDate = new Date(); - if (options.startingDate) startDate = options.startingDate; - try { - let themeId = android.app.AlertDialog.THEME_DEVICE_DEFAULT_LIGHT; - if (options.theme && options.theme === "dark") { - themeId = android.app.AlertDialog.THEME_DEVICE_DEFAULT_DARK; + public pickDate(options?: PickerOptions) { + return new Promise((resolve, reject) => { + if ( + options.startingDate && + typeof options.startingDate.getMonth !== "function" + ) { + reject("startingDate must be a Date."); + } + if (options.minDate && typeof options.minDate.getMonth !== "function") { + reject("minDate must be a Date."); + } + if (options.maxDate && typeof options.maxDate.getMonth !== "function") { + reject("maxDate must be a Date."); + } + // let now = Calendar.getInstance(); + let startDate = new Date(); + if (options.startingDate) startDate = options.startingDate; + try { + let themeId = android.app.AlertDialog.THEME_DEVICE_DEFAULT_LIGHT; + if (options.theme && options.theme === "dark") { + themeId = android.app.AlertDialog.THEME_DEVICE_DEFAULT_DARK; + } + let datePicker = new android.app.DatePickerDialog( + app.android.foregroundActivity, + themeId, + new android.app.DatePickerDialog.OnDateSetListener({ + onDateSet: function(view, year, monthOfYear, dayOfMonth) { + const date = { + day: dayOfMonth, + month: ++monthOfYear, + year: year + }; + resolve(date); } - let datePicker = new android.app.DatePickerDialog(app.android.foregroundActivity, - themeId, - new android.app.DatePickerDialog.OnDateSetListener({ - onDateSet: function(view, year, monthOfYear, dayOfMonth) { - const date = { - "day": dayOfMonth, - "month": (++monthOfYear), - "year": year - }; - resolve(date); - } - }), startDate.getFullYear(), - startDate.getMonth(), - startDate.getDate()); + }), + startDate.getFullYear(), + startDate.getMonth(), + startDate.getDate() + ); - if (options.maxDate || options.minDate) { - let datePickerInstance = datePicker.getDatePicker(); - if (options.maxDate) datePickerInstance.setMaxDate(options.maxDate.getTime()); - if (options.minDate) datePickerInstance.setMinDate(options.minDate.getTime()); - } + if (options.maxDate || options.minDate) { + let datePickerInstance = datePicker.getDatePicker(); + if (options.maxDate) + datePickerInstance.setMaxDate(options.maxDate.getTime()); + if (options.minDate) + datePickerInstance.setMinDate(options.minDate.getTime()); + } - datePicker.show(); - } catch (err) { - reject(err); - } - }); + datePicker.show(); + } catch (err) { + reject(err); } + }); + } - public pickTime(options?: PickerOptions) { - options.is24HourView = options.is24HourView || false; - return new Promise((resolve, reject) => { - let now = Calendar.getInstance(); - try { - let timePicker = new android.app.TimePickerDialog(app.android.foregroundActivity, - new android.app.TimePickerDialog.OnTimeSetListener({ - onTimeSet: function(view, hourOfDay, minute) { - const time = { - "hour": hourOfDay, - "minute": minute - }; - resolve(time); - } - }), now.get(Calendar.HOUR_OF_DAY), - now.get(Calendar.MINUTE), options.is24HourView); - - timePicker.show(); - - if (options.minTime) { - if (options.minTime.hour < 24 && options.minTime.hour >= 0 - && options.minTime.minute < 60 && options.minTime.minute >= 0) { - timePicker.updateTime(options.minTime.hour, options.minTime.minute); - android.widget.Toast.makeText(app.android.foregroundActivity, "Minimum Time: " + - options.minTime.hour + ":" + options.minTime.minute, - android.widget.Toast.LENGTH_SHORT).show(); - } else { - reject('Invalid minTime'); - } - } - - if (options.maxTime) { - if (options.maxTime.hour < 24 && options.maxTime.hour >= 0 - && options.maxTime.minute < 60 && options.maxTime.minute >= 0) { - timePicker.updateTime(options.maxTime.hour, options.maxTime.minute); - android.widget.Toast.makeText(app.android.foregroundActivity, "Maximum Time: " + - options.maxTime.hour + ":" + options.maxTime.minute, - android.widget.Toast.LENGTH_SHORT).show(); - } else { - reject('Invalid maxTime'); - } + public pickTime(options?: PickerOptions) { + options.is24HourView = options.is24HourView || false; + return new Promise((resolve, reject) => { + let now = Calendar.getInstance(); + try { + let timePicker = new android.app.TimePickerDialog( + app.android.foregroundActivity, + new android.app.TimePickerDialog.OnTimeSetListener({ + onTimeSet: function(view, hourOfDay, minute) { + const time = { + hour: hourOfDay, + minute: minute + }; + resolve(time); } - - timePicker.updateTime(Calendar.HOUR_OF_DAY, Calendar.MINUTE); - - } catch (err) { - reject(err); + }), + now.get(Calendar.HOUR_OF_DAY), + now.get(Calendar.MINUTE), + options.is24HourView + ); + + timePicker.show(); + + if (options.minTime) { + if ( + options.minTime.hour < 24 && + options.minTime.hour >= 0 && + options.minTime.minute < 60 && + options.minTime.minute >= 0 + ) { + timePicker.updateTime(options.minTime.hour, options.minTime.minute); + android.widget.Toast.makeText( + app.android.foregroundActivity, + "Minimum Time: " + + options.minTime.hour + + ":" + + options.minTime.minute, + android.widget.Toast.LENGTH_SHORT + ).show(); + } else { + reject("Invalid minTime"); } - }); - } + } + + if (options.maxTime) { + if ( + options.maxTime.hour < 24 && + options.maxTime.hour >= 0 && + options.maxTime.minute < 60 && + options.maxTime.minute >= 0 + ) { + timePicker.updateTime(options.maxTime.hour, options.maxTime.minute); + android.widget.Toast.makeText( + app.android.foregroundActivity, + "Maximum Time: " + + options.maxTime.hour + + ":" + + options.maxTime.minute, + android.widget.Toast.LENGTH_SHORT + ).show(); + } else { + reject("Invalid maxTime"); + } + } + timePicker.updateTime(Calendar.HOUR_OF_DAY, Calendar.MINUTE); + } catch (err) { + reject(err); + } + }); + } } diff --git a/src/modal-datetimepicker.ios.ts b/src/modal-datetimepicker.ios.ts index 714e99f..75c7947 100644 --- a/src/modal-datetimepicker.ios.ts +++ b/src/modal-datetimepicker.ios.ts @@ -3,44 +3,51 @@ import * as frame from "tns-core-modules/ui/frame"; import { Label } from "tns-core-modules/ui/label/"; import { Page } from "tns-core-modules/ui/page"; - class ButtonHandler extends NSObject { - public close(nativeButton: UIButton, nativeEvent: _UIEvent) { - picker.close(); - } + public close(nativeButton: UIButton, nativeEvent: _UIEvent) { + picker.close(); + } - public chooseDate(nativeButton: UIButton, nativeEvent: _UIEvent) { - picker.chooseDate(); - } - public chooseTime(nativeButton: UIButton, nativeEvent: _UIEvent) { - picker.chooseTime(); - } + public chooseDate(nativeButton: UIButton, nativeEvent: _UIEvent) { + picker.chooseDate(); + } + public chooseTime(nativeButton: UIButton, nativeEvent: _UIEvent) { + picker.chooseTime(); + } - public static ObjCExposedMethods = { - "close": { returns: interop.types.void, params: [interop.types.id, interop.types.id] }, - "chooseDate": { returns: interop.types.void, params: [interop.types.id, interop.types.id] }, - "chooseTime": { returns: interop.types.void, params: [interop.types.id, interop.types.id] } - }; + public static ObjCExposedMethods = { + close: { + returns: interop.types.void, + params: [interop.types.id, interop.types.id] + }, + chooseDate: { + returns: interop.types.void, + params: [interop.types.id, interop.types.id] + }, + chooseTime: { + returns: interop.types.void, + params: [interop.types.id, interop.types.id] + } + }; } const buttonHandler = ButtonHandler.new(); let myResolve; - export interface PickerOptions { - type?: string, - title?: string, - theme?: string, - maxDate?: Date, - minDate?: Date, - startingDate?: Date + type?: string; + title?: string; + theme?: string; + maxDate?: Date; + minDate?: Date; + startingDate?: Date; } export interface PickerResponse { - day?: number, - month?: number, - year?: number, - hour?: number, - minute?: number + day?: number; + month?: number; + year?: number; + hour?: number; + minute?: number; } let window: UIWindow; @@ -53,198 +60,287 @@ let minMaxLabel: UILabel; let datePickerView: UIDatePicker; export class ModalDatetimepicker { - constructor() {} - - public pickDate(options?: PickerOptions) { - if (!options) options = {}; - options.type = 'date'; - return this.show(options); - } - public pickTime(options?: PickerOptions) { - if (!options) options = {}; - options.type = 'time'; - return this.show(options); - } + constructor() {} - private show(options: PickerOptions) { - return new Promise((resolve, reject) => { - myResolve = resolve; - if (!options.type) options.type = 'date'; - if (!options.theme) options.theme = 'dark'; - if (!options.title) { - if (options.type == 'date') { - options.title = 'Choose A Date'; - } else { - options.title = 'Choose A Time'; - } - } - - if (options.startingDate && typeof options.startingDate.getMonth != 'function') { - reject('startingDate must be a Date.'); - } - if (options.minDate && typeof options.minDate.getMonth != 'function') { - reject('minDate must be a Date.'); - } - if (options.maxDate && typeof options.maxDate.getMonth != 'function') { - reject('maxDate must be a Date.'); - } - window = UIApplication.sharedApplication.keyWindow; - let containerBounds = window.bounds; - - // blur the background of the application. - effectView = UIVisualEffectView.alloc().init(); - effectView.frame = CGRectMake(containerBounds.origin.x, containerBounds.origin.y, containerBounds.size.width, containerBounds.size.height + 20); - effectView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; - window.addSubview(effectView); - window.bringSubviewToFront(effectView); - UIView.animateWithDurationAnimations(0.4, () => { - effectView.effect = UIBlurEffect.effectWithStyle(options.theme == 'light' ? UIBlurEffectStyle.Light : UIBlurEffectStyle.Dark); - }) - - bottomContentContainer = UIView.alloc().init(); - bottomContentContainer.frame = CGRectMake(10, containerBounds.size.height - 320, containerBounds.size.width - 20, 310); - bottomContentContainer.autoresizingMask = UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth; - bottomContentContainer.autoresizesSubviews = true; - bottomContentContainer.transform = CGAffineTransformMakeTranslation(0, 320); - - pickerHolderView = UIView.alloc().init(); - pickerHolderView.backgroundColor = UIColor.whiteColor; - pickerHolderView.frame = CGRectMake(0, 0, containerBounds.size.width - 20, 270); - pickerHolderView.layer.cornerRadius = 10; - pickerHolderView.layer.masksToBounds = true; - pickerHolderView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; - pickerHolderView.layer.masksToBounds = false; - pickerHolderView.layer.shadowColor = UIColor.blackColor.CGColor; - pickerHolderView.layer.shadowOffset = CGSizeMake(2.0, 2.0); - pickerHolderView.layer.shadowOpacity = 0.5; - pickerHolderView.layer.shadowRadius = 8; - pickerHolderView.layer.shadowPath = UIBezierPath.bezierPathWithRect(pickerHolderView.bounds).CGPath; - - - let buttonContainer: UIView = UIView.alloc().initWithFrame(CGRectMake(0, 270, containerBounds.size.width - 20, 40)) - buttonContainer.autoresizingMask = UIViewAutoresizing.FlexibleWidth; - buttonContainer.autoresizesSubviews = true; - - let cancelButton: UIButton = UIButton.buttonWithType(UIButtonType.System); - cancelButton.setTitleForState('Cancel', UIControlState.Normal); - cancelButton.addTargetActionForControlEvents(buttonHandler, "close", UIControlEvents.TouchUpInside); - cancelButton.frame = CGRectMake(0, 0, ((buttonContainer.bounds.size.width)/2), 40); - cancelButton.setTitleColorForState(UIColor.whiteColor, UIControlState.Normal); - cancelButton.titleLabel.font = UIFont.systemFontOfSize(18); - cancelButton.autoresizingMask = UIViewAutoresizing.FlexibleWidth; - buttonContainer.addSubview(cancelButton); - buttonContainer.bringSubviewToFront(cancelButton); - - let doneButton: UIButton = UIButton.buttonWithType(UIButtonType.System); - doneButton.setTitleForState('Done', UIControlState.Normal); - if (options.type == 'date') { - doneButton.addTargetActionForControlEvents(buttonHandler, "chooseDate", UIControlEvents.TouchUpInside); - } else { - doneButton.addTargetActionForControlEvents(buttonHandler, "chooseTime", UIControlEvents.TouchUpInside); - } - - doneButton.frame = CGRectMake(((buttonContainer.bounds.size.width)/2), 0, ((buttonContainer.bounds.size.width)/2), 40); - doneButton.setTitleColorForState(UIColor.colorWithRedGreenBlueAlpha(0, 153, 255, 1), UIControlState.Normal); - doneButton.titleLabel.font = UIFont.boldSystemFontOfSize(18); - doneButton.autoresizingMask = UIViewAutoresizing.FlexibleWidth; - buttonContainer.addSubview(doneButton); - buttonContainer.bringSubviewToFront(doneButton); - - bottomContentContainer.addSubview(buttonContainer); - bottomContentContainer.bringSubviewToFront(buttonContainer); - - - datePickerView = UIDatePicker.alloc().initWithFrame(CGRectMake(0, 0, containerBounds.size.width - 20, 250)); - datePickerView.datePickerMode = (options.type == 'date' ? UIDatePickerMode.Date : UIDatePickerMode.Time); - datePickerView.autoresizingMask = UIViewAutoresizing.FlexibleWidth; - if (options.startingDate) datePickerView.date = options.startingDate; - if (options.minDate) datePickerView.minimumDate = options.minDate; - if (options.maxDate) datePickerView.maximumDate = options.maxDate; - pickerHolderView.addSubview(datePickerView); - pickerHolderView.bringSubviewToFront(datePickerView); - - bottomContentContainer.addSubview(pickerHolderView); - bottomContentContainer.bringSubviewToFront(pickerHolderView); - - titleLabel = this.labelFactory(options.title, UIColor.whiteColor, true, 25); - titleLabel.textAlignment = NSTextAlignment.Center; - titleLabel.frame = CGRectMake(0, 20, containerBounds.size.width, containerBounds.size.height - 360); - - titleLabel.transform = CGAffineTransformMakeScale(.8, .8) - titleLabel.adjustsFontForContentSizeCategory = true; - titleLabel.adjustsFontSizeToFitWidth = true; - titleLabel.layer.masksToBounds = false; - titleLabel.alpha = 0; - titleLabel.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth; - - window.addSubview(titleLabel); - window.bringSubviewToFront(titleLabel); - - window.addSubview(bottomContentContainer); - window.bringSubviewToFront(bottomContentContainer); - let animationOptions: UIViewAnimationOptions; - UIView.animateWithDurationDelayOptionsAnimationsCompletion(0.4, 0, UIViewAnimationOptions.CurveEaseOut, () => { - bottomContentContainer.transform = CGAffineTransformMakeTranslation(0, 0); - titleLabel.transform = CGAffineTransformMakeScale(1, 1) - titleLabel.alpha = 1; - }, () => { - console.dir('animation completed'); - }) - }) - } + public pickDate(options?: PickerOptions) { + if (!options) options = {}; + options.type = "date"; + return this.show(options); + } + public pickTime(options?: PickerOptions) { + if (!options) options = {}; + options.type = "time"; + return this.show(options); + } - private labelFactory(text, color, shadow, size) { - window = UIApplication.sharedApplication.keyWindow; - let containerBounds = window.bounds; - let label = UILabel.alloc().init(); - label.text = text; - label.font = UIFont.boldSystemFontOfSize(size); - label.textColor = color; - if (shadow) { - label.shadowColor = UIColor.colorWithRedGreenBlueAlpha(0,0,0,0.4); - label.shadowOffset = CGSizeMake(2.0, 2.0); - label.layer.shadowRadius = 8.0; - label.layer.shadowOpacity = 0.5; - label.layer.masksToBounds = false; - label.layer.shouldRasterize = true; + private show(options: PickerOptions) { + return new Promise((resolve, reject) => { + myResolve = resolve; + if (!options.type) options.type = "date"; + if (!options.theme) options.theme = "dark"; + if (!options.title) { + if (options.type === "date") { + options.title = "Choose A Date"; + } else { + options.title = "Choose A Time"; } - return label; - } + } - public chooseDate() { - let pickedDate = new Date(datePickerView.date); - let response: PickerResponse = { - day: pickedDate.getDate(), - month: pickedDate.getMonth() + 1, - year: pickedDate.getFullYear() - } - this.close(response) - } + if ( + options.startingDate && + typeof options.startingDate.getMonth !== "function" + ) { + reject("startingDate must be a Date."); + } + if (options.minDate && typeof options.minDate.getMonth !== "function") { + reject("minDate must be a Date."); + } + if (options.maxDate && typeof options.maxDate.getMonth !== "function") { + reject("maxDate must be a Date."); + } + window = UIApplication.sharedApplication.keyWindow; + let containerBounds = window.bounds; + + // blur the background of the application. + effectView = UIVisualEffectView.alloc().init(); + effectView.frame = CGRectMake( + containerBounds.origin.x, + containerBounds.origin.y, + containerBounds.size.width, + containerBounds.size.height + 20 + ); + effectView.autoresizingMask = + UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; + window.addSubview(effectView); + window.bringSubviewToFront(effectView); + UIView.animateWithDurationAnimations(0.4, () => { + effectView.effect = UIBlurEffect.effectWithStyle( + options.theme === "light" + ? UIBlurEffectStyle.Light + : UIBlurEffectStyle.Dark + ); + }); + + bottomContentContainer = UIView.alloc().init(); + bottomContentContainer.frame = CGRectMake( + 10, + containerBounds.size.height - 320, + containerBounds.size.width - 20, + 310 + ); + bottomContentContainer.autoresizingMask = + UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth; + bottomContentContainer.autoresizesSubviews = true; + bottomContentContainer.transform = CGAffineTransformMakeTranslation( + 0, + 320 + ); - public chooseTime() { - let pickedDate = new Date(datePickerView.date); - let response: PickerResponse = { - hour: pickedDate.getHours(), - minute: pickedDate.getMinutes() + pickerHolderView = UIView.alloc().init(); + pickerHolderView.backgroundColor = UIColor.whiteColor; + pickerHolderView.frame = CGRectMake( + 0, + 0, + containerBounds.size.width - 20, + 270 + ); + pickerHolderView.layer.cornerRadius = 10; + pickerHolderView.layer.masksToBounds = true; + pickerHolderView.autoresizingMask = + UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; + pickerHolderView.layer.masksToBounds = false; + pickerHolderView.layer.shadowColor = UIColor.blackColor.CGColor; + pickerHolderView.layer.shadowOffset = CGSizeMake(2.0, 2.0); + pickerHolderView.layer.shadowOpacity = 0.5; + pickerHolderView.layer.shadowRadius = 8; + pickerHolderView.layer.shadowPath = UIBezierPath.bezierPathWithRect( + pickerHolderView.bounds + ).CGPath; + + let buttonContainer: UIView = UIView.alloc().initWithFrame( + CGRectMake(0, 270, containerBounds.size.width - 20, 40) + ); + buttonContainer.autoresizingMask = UIViewAutoresizing.FlexibleWidth; + buttonContainer.autoresizesSubviews = true; + + let cancelButton: UIButton = UIButton.buttonWithType(UIButtonType.System); + cancelButton.setTitleForState("Cancel", UIControlState.Normal); + cancelButton.addTargetActionForControlEvents( + buttonHandler, + "close", + UIControlEvents.TouchUpInside + ); + cancelButton.frame = CGRectMake( + 0, + 0, + buttonContainer.bounds.size.width / 2, + 40 + ); + cancelButton.setTitleColorForState( + UIColor.whiteColor, + UIControlState.Normal + ); + cancelButton.titleLabel.font = UIFont.systemFontOfSize(18); + cancelButton.autoresizingMask = UIViewAutoresizing.FlexibleWidth; + buttonContainer.addSubview(cancelButton); + buttonContainer.bringSubviewToFront(cancelButton); + + let doneButton: UIButton = UIButton.buttonWithType(UIButtonType.System); + doneButton.setTitleForState("Done", UIControlState.Normal); + if (options.type === "date") { + doneButton.addTargetActionForControlEvents( + buttonHandler, + "chooseDate", + UIControlEvents.TouchUpInside + ); + } else { + doneButton.addTargetActionForControlEvents( + buttonHandler, + "chooseTime", + UIControlEvents.TouchUpInside + ); + } + + doneButton.frame = CGRectMake( + buttonContainer.bounds.size.width / 2, + 0, + buttonContainer.bounds.size.width / 2, + 40 + ); + doneButton.setTitleColorForState( + UIColor.colorWithRedGreenBlueAlpha(0, 153, 255, 1), + UIControlState.Normal + ); + doneButton.titleLabel.font = UIFont.boldSystemFontOfSize(18); + doneButton.autoresizingMask = UIViewAutoresizing.FlexibleWidth; + buttonContainer.addSubview(doneButton); + buttonContainer.bringSubviewToFront(doneButton); + + bottomContentContainer.addSubview(buttonContainer); + bottomContentContainer.bringSubviewToFront(buttonContainer); + + datePickerView = UIDatePicker.alloc().initWithFrame( + CGRectMake(0, 0, containerBounds.size.width - 20, 250) + ); + datePickerView.datePickerMode = + options.type === "date" ? UIDatePickerMode.Date : UIDatePickerMode.Time; + datePickerView.autoresizingMask = UIViewAutoresizing.FlexibleWidth; + if (options.startingDate) datePickerView.date = options.startingDate; + if (options.minDate) datePickerView.minimumDate = options.minDate; + if (options.maxDate) datePickerView.maximumDate = options.maxDate; + pickerHolderView.addSubview(datePickerView); + pickerHolderView.bringSubviewToFront(datePickerView); + + bottomContentContainer.addSubview(pickerHolderView); + bottomContentContainer.bringSubviewToFront(pickerHolderView); + + titleLabel = this.labelFactory( + options.title, + UIColor.whiteColor, + true, + 25 + ); + titleLabel.textAlignment = NSTextAlignment.Center; + titleLabel.frame = CGRectMake( + 0, + 20, + containerBounds.size.width, + containerBounds.size.height - 360 + ); + + titleLabel.transform = CGAffineTransformMakeScale(0.8, 0.8); + titleLabel.adjustsFontForContentSizeCategory = true; + titleLabel.adjustsFontSizeToFitWidth = true; + titleLabel.layer.masksToBounds = false; + titleLabel.alpha = 0; + titleLabel.autoresizingMask = + UIViewAutoresizing.FlexibleHeight | + UIViewAutoresizing.FlexibleTopMargin | + UIViewAutoresizing.FlexibleWidth; + + window.addSubview(titleLabel); + window.bringSubviewToFront(titleLabel); + + window.addSubview(bottomContentContainer); + window.bringSubviewToFront(bottomContentContainer); + let animationOptions: UIViewAnimationOptions; + UIView.animateWithDurationDelayOptionsAnimationsCompletion( + 0.4, + 0, + UIViewAnimationOptions.CurveEaseOut, + () => { + bottomContentContainer.transform = CGAffineTransformMakeTranslation( + 0, + 0 + ); + titleLabel.transform = CGAffineTransformMakeScale(1, 1); + titleLabel.alpha = 1; + }, + () => { + console.dir("animation completed"); } - this.close(response) - } + ); + }); + } - public close(response?) { - if (!response) response = false; - UIView.animateWithDurationAnimationsCompletion(0.3, () => { - effectView.effect = null; - bottomContentContainer.transform = CGAffineTransformMakeTranslation(0, 320); - titleLabel.transform = CGAffineTransformMakeScale(.8, .8) - titleLabel.alpha = 0; - }, () => { - effectView.removeFromSuperview(); - bottomContentContainer.removeFromSuperview(); - titleLabel.removeFromSuperview(); - myResolve(response); - }) + private labelFactory(text, color, shadow, size) { + window = UIApplication.sharedApplication.keyWindow; + let containerBounds = window.bounds; + let label = UILabel.alloc().init(); + label.text = text; + label.font = UIFont.boldSystemFontOfSize(size); + label.textColor = color; + if (shadow) { + label.shadowColor = UIColor.colorWithRedGreenBlueAlpha(0, 0, 0, 0.4); + label.shadowOffset = CGSizeMake(2.0, 2.0); + label.layer.shadowRadius = 8.0; + label.layer.shadowOpacity = 0.5; + label.layer.masksToBounds = false; + label.layer.shouldRasterize = true; } + return label; + } + + public chooseDate() { + let pickedDate = new Date(datePickerView.date); + let response: PickerResponse = { + day: pickedDate.getDate(), + month: pickedDate.getMonth() + 1, + year: pickedDate.getFullYear() + }; + this.close(response); + } + + public chooseTime() { + let pickedDate = new Date(datePickerView.date); + let response: PickerResponse = { + hour: pickedDate.getHours(), + minute: pickedDate.getMinutes() + }; + this.close(response); + } + public close(response?) { + if (!response) response = false; + UIView.animateWithDurationAnimationsCompletion( + 0.3, + () => { + effectView.effect = null; + bottomContentContainer.transform = CGAffineTransformMakeTranslation( + 0, + 320 + ); + titleLabel.transform = CGAffineTransformMakeScale(0.8, 0.8); + titleLabel.alpha = 0; + }, + () => { + effectView.removeFromSuperview(); + bottomContentContainer.removeFromSuperview(); + titleLabel.removeFromSuperview(); + myResolve(response); + } + ); + } } -let picker = new ModalDatetimepicker(); \ No newline at end of file +let picker = new ModalDatetimepicker(); From a73420e4ec17df3607e665675f54affd30d00816 Mon Sep 17 00:00:00 2001 From: Jogboms Date: Thu, 8 Feb 2018 17:57:53 +0100 Subject: [PATCH 2/5] refactor(android): `startingHour` + `startingMinute` --- src/modal-datetimepicker.android.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/modal-datetimepicker.android.ts b/src/modal-datetimepicker.android.ts index 6b2a630..2c0dad2 100644 --- a/src/modal-datetimepicker.android.ts +++ b/src/modal-datetimepicker.android.ts @@ -93,6 +93,12 @@ export class ModalDatetimepicker { options.is24HourView = options.is24HourView || false; return new Promise((resolve, reject) => { let now = Calendar.getInstance(); + const hour = options.startingHour + ? +options.startingHour + : now.get(Calendar.HOUR_OF_DAY); + const minute = options.startingMinute + ? +options.startingMinute + : now.get(Calendar.MINUTE); try { let timePicker = new android.app.TimePickerDialog( app.android.foregroundActivity, @@ -105,8 +111,8 @@ export class ModalDatetimepicker { resolve(time); } }), - now.get(Calendar.HOUR_OF_DAY), - now.get(Calendar.MINUTE), + hour, + minute, options.is24HourView ); From 49c711e485c2983f1705011636a68dad30782db4 Mon Sep 17 00:00:00 2001 From: Jogboms Date: Thu, 8 Feb 2018 18:20:05 +0100 Subject: [PATCH 3/5] fix(ios): remove console.dir --- src/modal-datetimepicker.ios.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modal-datetimepicker.ios.ts b/src/modal-datetimepicker.ios.ts index 75c7947..63c2613 100644 --- a/src/modal-datetimepicker.ios.ts +++ b/src/modal-datetimepicker.ios.ts @@ -277,7 +277,7 @@ export class ModalDatetimepicker { titleLabel.alpha = 1; }, () => { - console.dir("animation completed"); + // console.dir("animation completed"); } ); }); From 0f833234684d3eadfdeea4b3f146da994720f8bc Mon Sep 17 00:00:00 2001 From: Jogboms Date: Thu, 8 Feb 2018 18:39:10 +0100 Subject: [PATCH 4/5] fix(android): remove unnecessary updateTime call --- src/modal-datetimepicker.android.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modal-datetimepicker.android.ts b/src/modal-datetimepicker.android.ts index 2c0dad2..be7cd82 100644 --- a/src/modal-datetimepicker.android.ts +++ b/src/modal-datetimepicker.android.ts @@ -159,8 +159,6 @@ export class ModalDatetimepicker { reject("Invalid maxTime"); } } - - timePicker.updateTime(Calendar.HOUR_OF_DAY, Calendar.MINUTE); } catch (err) { reject(err); } From a9d697625bf2de8aa9a0d4ff8cb7bab5f9a53134 Mon Sep 17 00:00:00 2001 From: Jogboms Date: Mon, 19 Mar 2018 17:23:42 +0100 Subject: [PATCH 5/5] chore: update README to accomodate changes --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a66f65..b970c4c 100644 --- a/README.md +++ b/README.md @@ -102,13 +102,15 @@ time: { ``` options conform to the following interface: -``` +```ts export interface PickerOptions { title?: string, // iOS ONLY: The title to display above the picker, defaults to "Choose A Time" or "Choose A Date" theme?: string, // iOS ONLY: light for a light blurry effect, dark for a dark blurry effect - defaults to dark maxDate?: Date, minDate?: Date, - startingDate?: Date + startingHour?: number, // Ignored on pickDate() + startingMinute?: number, // Ignored on pickDate() + startingDate?: Date // Ignored on pickTime() } ```