diff --git a/BCL.csproj b/BCL.csproj index 9620dbb86..b9210b2c8 100644 --- a/BCL.csproj +++ b/BCL.csproj @@ -241,6 +241,14 @@ + + dialogs.d.ts + + + + dialogs.d.ts + + @@ -259,6 +267,9 @@ + + + commonjs True @@ -351,7 +362,15 @@ - + + + + + + + + + diff --git a/Tests/application-tests-common.ts b/Tests/application-tests-common.ts index 1220938ee..9855c0253 100644 --- a/Tests/application-tests-common.ts +++ b/Tests/application-tests-common.ts @@ -1,4 +1,4 @@ -// +// // # Application // The Application module provides abstraction over the platform-specific Application implementations. // It is the main BCL module and is required for other BCL modules to work properly. @@ -9,7 +9,7 @@ import app = require("application"); // The pre-required `app` module is used throughout the following code snippets. // -// +// // ### Initialization // ``` JavaScript //// The native app instance depends on the target platform @@ -18,7 +18,7 @@ app.init(nativeAppInstance); // ``` // -// +// // ### Checking the target platform // Use the following code in case you need to check somewhere in your code the platform you are running against: // ``` JavaScript diff --git a/Tests/application-tests.android.ts b/Tests/application-tests.android.ts index 15113d7f9..9e01f431c 100644 --- a/Tests/application-tests.android.ts +++ b/Tests/application-tests.android.ts @@ -6,7 +6,7 @@ import commonTests = require("Tests/application-tests-common"); declare var exports; require("utils/module-merge").merge(commonTests, exports); -// +// // ### Using the Android-specific implementation // Accessing the Android-specific object instance (will be undefined if running on iOS) // ``` JavaScript diff --git a/Tests/file-system-tests.ts b/Tests/file-system-tests.ts index f51f33afe..5b9f06f2a 100644 --- a/Tests/file-system-tests.ts +++ b/Tests/file-system-tests.ts @@ -1,5 +1,5 @@  -// +// // # File System // Using the file system requires the FileSystem module. // ``` JavaScript @@ -10,12 +10,12 @@ import fs = require("file-system"); import TKUnit = require("Tests/TKUnit"); -// +// // ## Path // export var testPathNormalize = function () { - // + // // ### Normalize a Path // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -31,7 +31,7 @@ export var testPathNormalize = function () { }; export var testPathJoin = function () { - // + // // ### Path Join // Concatinate a path to a file by providing multiple path arguments. // ``` JavaScript @@ -47,7 +47,7 @@ export var testPathJoin = function () { }; export var testPathSeparator = function () { - // + // // ### Get the Path Separator // ``` JavaScript //// An OS dependant path separator, "\" or "/". @@ -61,7 +61,7 @@ export var testPathSeparator = function () { }; export var testFileFromPath = function () { - // + // // ### Get or Create a File With Path // The following example writes some text to a file created for path. // It will create a new file or overwrite an existing file. @@ -98,7 +98,7 @@ export var testFileFromPath = function () { } export var testFolderFromPath = function () { - // + // // ### Get or Create a Folder With Path // ``` JavaScript var path = fs.path.join(fs.knownFolders.documents().path, "music"); @@ -112,12 +112,12 @@ export var testFolderFromPath = function () { // } -// +// // ## Create // export var testFileWrite = function () { - // + // // ### Writing a string to a File // The following example writes some text to a file. // It will create a new file or overwrite an existing file. @@ -153,7 +153,7 @@ export var testFileWrite = function () { }; export var testGetFile = function () { - // + // // ### Get or Create a File // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -168,7 +168,7 @@ export var testGetFile = function () { } export var testGetFolder = function () { - // + // // ### Get or Create a Folder // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -182,12 +182,12 @@ export var testGetFolder = function () { // }; -// +// // ## Read // export var testFileRead = function () { - // + // // ### Reading from a File // The following example writes some text to a file and then reads it back. // ``` JavaScript @@ -230,7 +230,7 @@ export var testFileRead = function () { }; export var testGetKnownFolders = function () { - // + // // ### Getting the Known Folders // Each app has several well known folders. This is how to access them: // ``` JavaScript @@ -251,7 +251,7 @@ export var testGetKnownFolders = function () { }; export var testGetEntities = function () { - // + // // ### Getting Folder Contents // Getting all files and folders within a folder: // ``` JavaScript @@ -300,7 +300,7 @@ export var testGetEntities = function () { }; export var testEnumEntities = function () { - // + // // ### Enumerating Folder Contents // Getting all folder entities in array may be slow with large number of files. // Enumerating the folder entities would itterate the files one by one without blocking the UI. @@ -338,7 +338,7 @@ export var testEnumEntities = function () { }; export var testGetParent = function () { - // + // // ### Getting Parent Folder // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -357,7 +357,7 @@ export var testGetParent = function () { }; export var testFileNameExtension = function () { - // + // // ### Getting File Name and Extension // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -376,7 +376,7 @@ export var testFileNameExtension = function () { }; export var testFileExists = function () { - // + // // ### Checking if a File Exists // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -393,7 +393,7 @@ export var testFileExists = function () { }; export var testFolderExists = function () { - // + // // ### Checking if a Folder Exists // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -419,12 +419,12 @@ export var testContainsFile = function () { file.remove(); }; -// +// // ## Update // export var testFileRename = function () { - // + // // ### Renaming a File // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -450,7 +450,7 @@ export var testFileRename = function () { }; export var testFolderRename = function () { - // + // // ### Renaming a Folder // ``` JavaScript var folder = fs.knownFolders.documents(); @@ -475,12 +475,12 @@ export var testFolderRename = function () { // }; -// +// // ## Delete // export var testFileRemove = function () { - // + // // ### Removing a File // To 'delete', 'remove' or 'unlink' a file use the file's remove method: // ``` JavaScript @@ -504,7 +504,7 @@ export var testFileRemove = function () { }; export var testFolderRemove = function () { - // + // // ### Removing a Folder // ``` JavaScript var documents = fs.knownFolders.documents(); @@ -528,7 +528,7 @@ export var testFolderRemove = function () { } export var testFolderClear = function () { - // + // // ### Clearing the Contents of a Folder // The clear method removes all files within a folder. // ``` JavaScript diff --git a/Tests/http-tests.ts b/Tests/http-tests.ts index 82ffdf457..48da82a2e 100644 --- a/Tests/http-tests.ts +++ b/Tests/http-tests.ts @@ -2,7 +2,7 @@ import http = require("http"); require("globals"); -// +// // # Http module // ``` JavaScript // var http = require("http"); @@ -18,7 +18,7 @@ export var test_getString = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Get string from URL // ``` JavaScript http.getString("http://httpbin.org/get").then(function (r) { @@ -61,7 +61,7 @@ export var test_getJSON = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Get JSON from URL // ``` JavaScript http.getJSON("http://httpbin.org/get").then(function (r) { @@ -104,7 +104,7 @@ export var test_getImage = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Get Image from URL // ``` JavaScript http.getImage("http://www.google.com/images/errors/logo_sm_2.png").then(function (r) { @@ -161,7 +161,7 @@ export var test_request_responseStatusCodeShouldBeDefined = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Get response status code // ``` JavaScript http.request({ url: "http://httpbin.org/get", method: "GET" }).then(function (response) { @@ -187,7 +187,7 @@ export var test_request_responseHeadersShouldBeDefined = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Get response headers // ``` JavaScript http.request({ url: "http://httpbin.org/get", method: "GET" }).then(function (response) { @@ -215,7 +215,7 @@ export var test_request_responseContentShouldBeDefined = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Get response content // ``` JavaScript http.request({ url: "http://httpbin.org/get", method: "GET" }).then(function (response) { diff --git a/Tests/image-source-tests.ts b/Tests/image-source-tests.ts index afc5d080c..b85941b61 100644 --- a/Tests/image-source-tests.ts +++ b/Tests/image-source-tests.ts @@ -1,4 +1,4 @@ -// +// // # Image source // Using the image source requires the image-source module. // ``` JavaScript @@ -18,7 +18,7 @@ import app = require("application"); import TKUnit = require("Tests/TKUnit"); export var testFromResource = function () { - // + // // ### Load image using resource name // This is similar to loading Bitmap from `R.drawable.logo` on Android or calling `[UIImage imageNamed@"logo"]` on iOS // ``` JavaScript @@ -32,7 +32,7 @@ export var testFromUrl = function () { var completed; var result: imageSource.ImageSource; - // + // // ### Load image from URL // ``` JavaScript imageSource.fromUrl("http://www.google.com/images/errors/logo_sm_2.png") @@ -62,7 +62,7 @@ export var testFromUrl = function () { } export var testSaveToFile = function () { - // + // // ### Save image source to PNG or JPG file // ``` JavaScript var img = imageSource.fromResource("logo"); @@ -76,7 +76,7 @@ export var testSaveToFile = function () { } export var testFromFile = function () { - // + // // ### Load image from a local file // ``` JavaScript var folder = fs.knownFolders.documents(); diff --git a/Tests/local-settings-tests.ts b/Tests/local-settings-tests.ts index ed05dff78..50c93f268 100644 --- a/Tests/local-settings-tests.ts +++ b/Tests/local-settings-tests.ts @@ -1,4 +1,4 @@ -// +// // # Local Settings // ``` JavaScript var LocalSettings = require("local-settings"); @@ -13,7 +13,7 @@ var noStringKey: string = "noStringKey"; var noBoolKey: string = "noBoolKey"; var noNumberKey: string = "noNumberKey"; -// +// // ## Working with string, number and boolean values // @@ -22,7 +22,7 @@ export var testBoolean = function () { var boolValue = LocalSettings.getBoolean(boolKey); TKUnit.assert(false == boolValue, "Cannot set boolean to false, currently it is: " + LocalSettings.getBoolean(boolKey)); - // + // // ### Set and get boolean value and provide default value in case it is not set // ``` JavaScript LocalSettings.setBoolean("boolKey", true); @@ -35,7 +35,7 @@ export var testBoolean = function () { }; export var testString = function () { - // + // // ### Set and get string value // ``` JavaScript LocalSettings.setString("stringKey", "String value"); @@ -46,7 +46,7 @@ export var testString = function () { }; export var testNumber = function () { - // + // // ### Set and get numeric value. // We use `toFixed()` here in order to avoid floating point errors - ex: `54.321` becoming `54.320999999537`. // Beware the result of `toFixed()` is a string not a number therefore you cannot use `===` or `!==` when comparing with a number. @@ -59,7 +59,7 @@ export var testNumber = function () { }; export var testDefaults = function () { - // + // // ### Reading values that are not set before while providing default value // ``` JavaScript var defaultValue = LocalSettings.getString("noStringKey", "No string value"); @@ -70,7 +70,7 @@ export var testDefaults = function () { TKUnit.assert(true === LocalSettings.getBoolean(noBoolKey, true), "Bad default boolean value"); TKUnit.assert(123.45 === LocalSettings.getNumber(noNumberKey, 123.45), "Bad default number value"); - // + // // ### Reading values that are not set before not providing default value // ``` JavaScript var defaultValue = LocalSettings.getString("noStringKey"); @@ -83,12 +83,12 @@ export var testDefaults = function () { TKUnit.assert("undefined" === typeof LocalSettings.getNumber(noNumberKey), "Default number value is not undefined"); }; -// +// // ## Other functions // export var testHasKey = function () { - // + // // ### Checking for existence of value for key // ``` JavaScript var hasKey = LocalSettings.hasKey("noBoolKey"); @@ -105,7 +105,7 @@ export var testHasKey = function () { }; export var testRemove = function () { - // + // // ### Removing value for key // ``` JavaScript LocalSettings.remove("boolKey"); diff --git a/Tests/location-tests.ts b/Tests/location-tests.ts index be0eaf4e1..922e70b61 100644 --- a/Tests/location-tests.ts +++ b/Tests/location-tests.ts @@ -1,4 +1,4 @@ -// +// // # Location // Using the location requires the Location module. // ``` JavaScript @@ -12,12 +12,12 @@ import locationModule = require("location"); var LocationManager = locationModule.LocationManager; var Location = locationModule.Location; -// +// // ## Other functions // export var testIsEnabled = function () { - // + // // ### Test are location services available for this device // ``` JavaScript var isEnabled = LocationManager.isEnabled(); @@ -27,7 +27,7 @@ export var testIsEnabled = function () { }; export var testDistance = function () { - // + // // ### Get distance between two locations // ``` JavaScript //var Location = require("location").Location; @@ -43,14 +43,14 @@ export var testDistance = function () { TKUnit.assert((distance > 10780000) && (distance < 10860000), "invalid distance " + distance); }; -// +// // ## Getting location // export var testLocation = function () { var locationReceived; - // + // // ### Receive continuous location updates // ``` JavaScript var locationManager = new LocationManager(); @@ -83,7 +83,7 @@ export var testLocation = function () { export var testLastKnownLocation = function () { TKUnit.waitUntilReady(function () { return false; }, 1); // give it some time after the last test - // + // // ### Get last known location // ``` JavaScript var locationManager = new LocationManager(); @@ -135,7 +135,7 @@ export var testLocationOnceTimeout10000 = function () { export var testSnippet = function () { var locationReceived; - // + // // ### Get location once // if there is `options.timeout` you will receive error on timeout. If `options.timeout` is 0 then the result is the same as the result from `LocationManager.lastKnownLocation` // and there will be no wait. You can use `options.maximumAge` to specify you don't want to receive locations older than specified time in ms. diff --git a/Tests/timer-tests.ts b/Tests/timer-tests.ts index 03b665e51..9bcf4c58b 100644 --- a/Tests/timer-tests.ts +++ b/Tests/timer-tests.ts @@ -1,7 +1,7 @@ import TKUnit = require("Tests/TKUnit"); var timer = require("timer/timer"); -// +// // # Timer module // ``` JavaScript // require("globals"); @@ -30,7 +30,7 @@ export var test_setTimeout = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Evaluates an expression after 0 milliseconds. // ``` JavaScript timer.setTimeout(function () { @@ -49,7 +49,7 @@ export var test_setTimeout_callbackCalledAfterSpecifedTime = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Evaluates an expression after a specified number of milliseconds. // ``` JavaScript timer.setTimeout(function () { @@ -85,7 +85,7 @@ export var test_setTimeout_callbackShouldBeCleared = function () { var completed: boolean; var isReady = function () { return completed; } - // + // // ### Cancels the evaluation with the clearTimeout method. // ``` JavaScript var id = timer.setTimeout(function () { @@ -109,7 +109,7 @@ export var test_setInterval_callbackCalledDuringPeriod = function () { var expected = 4; var isReady = function () { return counter >= expected; } - // + // // ### Evaluates an expression each time a specified number of milliseconds has elapsed. // ``` JavaScript timer.setInterval(function () { @@ -129,7 +129,7 @@ export var test_setInterval_callbackShouldBeCleared = function () { var expected = 1; var isReady = function () { return counter == expected; } - // + // // ### Cancel the interval previously started using the setInterval method. // ``` JavaScript var id = timer.setInterval(function () { diff --git a/text/text.d.ts b/text/text.d.ts index a5359343c..7f6c92774 100644 --- a/text/text.d.ts +++ b/text/text.d.ts @@ -2,7 +2,7 @@ * Defines the supported character encodings. */ declare module "text" { - export module encoding { + module encoding { export var ISO_8859_1: any; export var US_ASCII: any; export var UTF_16: any; diff --git a/ui/dialogs/Readme.md b/ui/dialogs/Readme.md new file mode 100644 index 000000000..19766516d --- /dev/null +++ b/ui/dialogs/Readme.md @@ -0,0 +1,15 @@ +Dialogs module. Examples: +```js + dialogs.alert("Test").then(function(){ dialogs.alert("Test2"); }); + dialogs.alert({message:"Test", title: "MyAlert", buttonName: "Close" }) + .then(function(){ dialogs.alert("Test2"); }); + + dialogs.confirm("Test?").then(function(r){ dialogs.alert("Result:" + r); }); + dialogs.confirm({message:"Confirm?", title: "MyConfirm", okButtonName: "Do it!", cancelButtonName: "Ignore it!" }) + .then(function(r){ dialogs.alert("Result:" + r); }); + + dialogs.prompt("Enter something!").then(function(r){ dialogs.alert("Result:" + r); }); + dialogs.prompt({message:"Enter something?", title: "MyPrompt", okButtonName: "Do it!", + cancelButtonName: "Ignore it!", defaultText : "Enter your password here!" }) + .then(function(r){ dialogs.alert("Result:" + r); }); +``` \ No newline at end of file diff --git a/ui/dialogs/dialogs.android.ts b/ui/dialogs/dialogs.android.ts new file mode 100644 index 000000000..b004531e4 --- /dev/null +++ b/ui/dialogs/dialogs.android.ts @@ -0,0 +1,101 @@ +/** + * Android specific dialogs functions implementation. + */ +import promises = require("promises"); +import dialogs = require("ui/dialogs"); +import appmodule = require("application"); + +var STRING = "string", + ALERT = "Alert", + OK = "OK", + CANCEL = "Cancel"; + +function createAlertDialog(options: dialogs.DialogOptions): android.app.AlertDialog.Builder { + var alert = new android.app.AlertDialog.Builder(appmodule.android.currentActivity); + alert.setTitle(options.title); + alert.setMessage(options.message); + return alert; +} + +function addOkCancelButtonsToAlertDialog(alert: android.app.AlertDialog.Builder, options: dialogs.ConfirmOptions, + okCallback: Function, cancelCallback?: Function): void { + alert.setPositiveButton(options.okButtonName, new android.content.DialogInterface.OnClickListener({ + onClick: function (dialog: android.content.DialogInterface, id: number) { + dialog.cancel(); + okCallback(); + } + })); + + alert.setNegativeButton(options.cancelButtonName, new android.content.DialogInterface.OnClickListener({ + onClick: function (dialog: android.content.DialogInterface, id: number) { + dialog.cancel(); + if (cancelCallback) { + cancelCallback(); + } + } + })); +} + +export function alert(arg: any): promises.Promise { + var d = promises.defer(); + try { + var options = typeof arg === STRING ? { message: arg, title: ALERT, buttonName: OK } : arg + + var alert = createAlertDialog(options); + + alert.setPositiveButton(options.buttonName, new android.content.DialogInterface.OnClickListener({ + onClick: function (dialog: android.content.DialogInterface, id: number) { + dialog.cancel(); + d.resolve(); + } + })); + + alert.show(); + + } catch (ex) { + d.reject(ex); + } + + return d.promise(); +} + +export function confirm(arg: any): promises.Promise { + var d = promises.defer(); + try { + var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg + + var alert = createAlertDialog(options); + + addOkCancelButtonsToAlertDialog(alert, options, function () { d.resolve(true); }, function () { d.resolve(false); }); + + alert.show(); + + } catch (ex) { + d.reject(ex); + } + + return d.promise(); +} + +export function prompt(arg: any): promises.Promise { + var d = promises.defer(); + try { + var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg + + var alert = createAlertDialog(options); + + var input = new android.widget.EditText(appmodule.android.context); + input.setText(options.defaultText ? options.defaultText : ""); + + alert.setView(input); + + addOkCancelButtonsToAlertDialog(alert, options, function () { d.resolve(input.getText().toString()); }); + + alert.show(); + + } catch (ex) { + d.reject(ex); + } + + return d.promise(); +} \ No newline at end of file diff --git a/ui/dialogs/dialogs.d.ts b/ui/dialogs/dialogs.d.ts new file mode 100644 index 000000000..f65fc56cc --- /dev/null +++ b/ui/dialogs/dialogs.d.ts @@ -0,0 +1,88 @@ +declare module "ui/dialogs" { + import promises = require("promises"); + /** + * The alert() method displays an alert box with a specified message. + * @param message Specifies the text to display in the alert box. + */ + function alert(message: string): promises.Promise; + + /** + * The alert() method displays an alert box with a specified options. + * @param options Specifies the options for the alert box. + */ + function alert(options: AlertOptions): promises.Promise; + + /** + * The confirm() method displays a dialog box with a specified message. + * @param message Specifies the text to display in the confirm box. + */ + function confirm(message: string): promises.Promise; + + /** + * The confirm() method displays a dialog box with a specified message. + * @param options Specifies the options for the confirm box. + */ + function confirm(options: ConfirmOptions): promises.Promise; + + /** + * The prompt() method displays a dialog box that prompts the visitor for input. + * @param message The text to display in the dialog box. + */ + function prompt(message: string): promises.Promise; + + /** + * The prompt() method displays a dialog box that prompts the visitor for input. + * @param options The options for the dialog box. + */ + function prompt(options: PromptOptions): promises.Promise; + + /** + * Provides options for the dialog. + */ + interface DialogOptions { + /** + * Gets or sets the alert message. + */ + message: string; + + /** + * Gets or sets the alert title. + */ + title?: string; + } + + /** + * Provides options for the alert. + */ + interface AlertOptions extends DialogOptions { + /** + * Gets or sets the button name. + */ + buttonName?: string; + } + + /** + * Provides options for the confirm. + */ + interface ConfirmOptions extends DialogOptions { + /** + * Gets or sets the OK button name. + */ + okButtonName?: string; + + /** + * Gets or sets the Cancel button name. + */ + cancelButtonName?: string; + } + + /** + * Provides options for the prompt. + */ + interface PromptOptions extends ConfirmOptions { + /** + * Gets or sets the default text. + */ + defaultText?: string; + } +} \ No newline at end of file diff --git a/ui/dialogs/dialogs.ios.ts b/ui/dialogs/dialogs.ios.ts new file mode 100644 index 000000000..cd68a3240 --- /dev/null +++ b/ui/dialogs/dialogs.ios.ts @@ -0,0 +1,117 @@ +/** + * iOS specific dialogs functions implementation. + */ +import promises = require("promises"); +import dialogs = require("ui/dialogs"); + +var UIALERTVIEWDELEGATE = "UIAlertViewDelegate", + STRING = "string", + ALERT = "Alert", + OK = "OK", + CANCEL = "Cancel"; + +function createUIAlertView(options: dialogs.DialogOptions): UIKit.UIAlertView { + var alert = new UIKit.UIAlertView(); + alert.title = options.title; + alert.message = options.message; + return alert; +} + +function createDelegate(callback) { + var delegateType = Foundation.NSObject.extends({}, {}).implements({ + protocol: UIALERTVIEWDELEGATE, + implementation: { + alertViewClickedButtonAtIndex: function (view, index) { + callback(view, index); + } + } + }); + return new delegateType; +} + +export function alert(arg: any): promises.Promise { + var d = promises.defer(); + try { + var options = typeof arg === STRING ? { message: arg, title: ALERT, buttonName: OK } : arg + + var alert = createUIAlertView(options); + + alert.addButtonWithTitle(options.buttonName); + + // Assign first to local variable, otherwise it will be garbage collected since delegate is weak reference. + var delegate = createDelegate(function (view, index) { + d.resolve(); + // Remove the local variable for the delegate. + delegate = undefined; + }); + + alert.delegate = delegate; + + alert.show(); + } catch (ex) { + d.reject(ex); + } + + return d.promise(); +} + +export function confirm(arg: any): promises.Promise { + var d = promises.defer(); + try { + var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg + + var alert = createUIAlertView(options); + + alert.addButtonWithTitle(options.okButtonName); + alert.addButtonWithTitle(options.cancelButtonName); + + // Assign first to local variable, otherwise it will be garbage collected since delegate is weak reference. + var delegate = createDelegate(function (view, index) { + d.resolve(index === 0); + // Remove the local variable for the delegate. + delegate = undefined; + }); + + alert.delegate = delegate; + + alert.show(); + + } catch (ex) { + d.reject(ex); + } + + return d.promise(); +} + +export function prompt(arg: any): promises.Promise { + var d = promises.defer(); + try { + var options = typeof arg === STRING ? { message: arg, title: ALERT, okButtonName: OK, cancelButtonName: CANCEL } : arg + + var alert = createUIAlertView(options); + alert.alertViewStyle = UIKit.UIAlertViewStyle.UIAlertViewStylePlainTextInput; + alert.addButtonWithTitle(options.okButtonName); + alert.addButtonWithTitle(options.cancelButtonName); + + var textField = alert.textFieldAtIndex(0); + textField.text = options.defaultText ? options.defaultText : ""; + + // Assign first to local variable, otherwise it will be garbage collected since delegate is weak reference. + var delegate = createDelegate(function (view, index) { + if (index === 0) { + d.resolve(textField.text); + } + // Remove the local variable for the delegate. + delegate = undefined; + }); + + alert.delegate = delegate; + + alert.show(); + + } catch (ex) { + d.reject(ex); + } + + return d.promise(); +} \ No newline at end of file diff --git a/ui/dialogs/index.ts b/ui/dialogs/index.ts new file mode 100644 index 000000000..fac3ad1cb --- /dev/null +++ b/ui/dialogs/index.ts @@ -0,0 +1,2 @@ +declare var module, require; +module.exports = require("ui/dialogs/dialogs"); \ No newline at end of file