]>
Commit | Line | Data |
---|---|---|
f0cfe83e AD |
1 | define("dijit/form/CurrencyTextBox", [ |
2 | "dojo/currency", // currency._mixInDefaults currency.format currency.parse currency.regexp | |
3 | "dojo/_base/declare", // declare | |
4 | "dojo/_base/lang", // lang.hitch | |
5 | "./NumberTextBox" | |
6 | ], function(currency, declare, lang, NumberTextBox){ | |
7 | ||
8 | // module: | |
9 | // dijit/form/CurrencyTextBox | |
10 | ||
11 | /*===== | |
12 | var __Constraints = declare([NumberTextBox.__Constraints, currency.__FormatOptions, currency.__ParseOptions], { | |
13 | // summary: | |
14 | // Specifies both the rules on valid/invalid values (minimum, maximum, | |
15 | // number of required decimal places), and also formatting options for | |
16 | // displaying the value when the field is not focused (currency symbol, | |
17 | // etc.) | |
18 | // description: | |
19 | // Follows the pattern of `dijit/form/NumberTextBox.__Constraints`. | |
20 | // In general developers won't need to set this parameter | |
21 | // example: | |
22 | // To ensure that the user types in the cents (for example, 1.00 instead of just 1): | |
23 | // | {fractional:true} | |
24 | }); | |
25 | =====*/ | |
26 | ||
27 | return declare("dijit.form.CurrencyTextBox", NumberTextBox, { | |
28 | // summary: | |
29 | // A validating currency textbox | |
30 | // description: | |
31 | // CurrencyTextBox is similar to `dijit/form/NumberTextBox` but has a few | |
32 | // extra features related to currency: | |
33 | // | |
34 | // 1. After specifying the currency type (american dollars, euros, etc.) it automatically | |
35 | // sets parse/format options such as how many decimal places to show. | |
36 | // 2. The currency mark (dollar sign, euro mark, etc.) is displayed when the field is blurred | |
37 | // but erased during editing, so that the user can just enter a plain number. | |
38 | ||
39 | // currency: [const] String | |
40 | // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD" | |
41 | currency: "", | |
42 | ||
43 | /*===== | |
44 | // constraints: __Constraints | |
45 | // Despite the name, this parameter specifies both constraints on the input | |
46 | // (including minimum/maximum allowed values) as well as | |
47 | // formatting options. | |
48 | constraints: {}, | |
49 | ======*/ | |
50 | ||
51 | baseClass: "dijitTextBox dijitCurrencyTextBox", | |
52 | ||
53 | // Override pattern ValidationTextBox.pattern.... we use a reg-ex generating function rather | |
54 | // than a straight regexp to deal with locale (plus formatting options too?) | |
55 | pattern: function(constraints){ | |
56 | // if focused, accept either currency data or NumberTextBox format | |
57 | return '(' + (this.focused ? this.inherited(arguments, [ lang.mixin({}, constraints, this.editOptions) ]) + '|' : '') | |
58 | + currency.regexp(constraints) + ')'; | |
59 | }, | |
60 | ||
61 | // Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45" | |
62 | _formatter: currency.format, | |
63 | ||
64 | _parser: currency.parse, | |
65 | ||
66 | parse: function(/*String*/ value, /*Object*/ constraints){ | |
67 | // summary: | |
68 | // Parses string value as a Currency, according to the constraints object | |
69 | // tags: | |
70 | // protected extension | |
71 | var v = this.inherited(arguments); | |
72 | if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse | |
73 | v = lang.hitch(lang.mixin({}, this, { _parser: NumberTextBox.prototype._parser }), "inherited")(arguments); | |
74 | } | |
75 | return v; | |
76 | }, | |
77 | ||
78 | _setConstraintsAttr: function(/*Object*/ constraints){ | |
79 | if(!constraints.currency && this.currency){ | |
80 | constraints.currency = this.currency; | |
81 | } | |
82 | this.inherited(arguments, [ currency._mixInDefaults(lang.mixin(constraints, { exponent: false })) ]); // get places | |
83 | } | |
84 | }); | |
85 | }); |