1 | define([ |
---|
2 | "dojo/_base/declare", |
---|
3 | "dojo/_base/kernel", |
---|
4 | "dojo/_base/fx", |
---|
5 | "dojo/dom-attr", |
---|
6 | "dojo/dom-class", |
---|
7 | "dojo/text!./resources/FileInput.html", |
---|
8 | "dijit/form/_FormWidget", |
---|
9 | "dijit/_Templated" |
---|
10 | ], |
---|
11 | function(declare, kernel, fx, domAttr, domClass, template, FormWidget, Templated){ |
---|
12 | kernel.experimental("dojox.form.FileInput"); |
---|
13 | |
---|
14 | return declare("dojox.form.FileInput", FormWidget, |
---|
15 | { |
---|
16 | // summary: |
---|
17 | // A styled input type="file" |
---|
18 | // |
---|
19 | // description: |
---|
20 | // A input type="file" form widget, with a button for uploading to be styled via css, |
---|
21 | // a cancel button to clear selection, and FormWidget mixin to provide standard dijit.form.Form |
---|
22 | // support (FIXME: maybe not fully implemented) |
---|
23 | |
---|
24 | // label: String |
---|
25 | // the title text of the "Browse" button |
---|
26 | label: "Browse ...", |
---|
27 | |
---|
28 | // cancelText: String |
---|
29 | // the title of the "Cancel" button |
---|
30 | cancelText: "Cancel", |
---|
31 | |
---|
32 | // name: String |
---|
33 | // ugh, this should be pulled from this.domNode |
---|
34 | name: "uploadFile", |
---|
35 | |
---|
36 | templateString: template, |
---|
37 | |
---|
38 | startup: function(){ |
---|
39 | // summary: |
---|
40 | // listen for changes on our real file input |
---|
41 | this._listener = this.connect(this.fileInput,"onchange","_matchValue"); |
---|
42 | this._keyListener = this.connect(this.fileInput,"onkeyup","_matchValue"); |
---|
43 | }, |
---|
44 | |
---|
45 | //get rid of the this.connect in _FormWidget.postCreate to allow IE to show |
---|
46 | //the file picker dialog properly |
---|
47 | postCreate: function(){}, |
---|
48 | |
---|
49 | _matchValue: function(){ |
---|
50 | // summary: |
---|
51 | // set the content of the upper input based on the semi-hidden file input |
---|
52 | this.inputNode.value = this.fileInput.value; |
---|
53 | if(this.inputNode.value){ |
---|
54 | this.cancelNode.style.visibility = "visible"; |
---|
55 | fx.fadeIn({ node: this.cancelNode, duration:275 }).play(); |
---|
56 | } |
---|
57 | }, |
---|
58 | |
---|
59 | setLabel: function(/*String*/ label, /*String?*/ cssClass){ |
---|
60 | // summary: |
---|
61 | // method to allow use to change button label |
---|
62 | this.titleNode.innerHTML = label; |
---|
63 | }, |
---|
64 | |
---|
65 | reset: function(/*Event*/ e){ |
---|
66 | // summary: |
---|
67 | // on click of cancel button, since we can't clear the input because of |
---|
68 | // security reasons, we destroy it, and add a new one in it's place. |
---|
69 | this.disconnect(this._listener); |
---|
70 | this.disconnect(this._keyListener); |
---|
71 | if(this.fileInput){ |
---|
72 | this.domNode.removeChild(this.fileInput); |
---|
73 | } |
---|
74 | fx.fadeOut({ node: this.cancelNode, duration:275 }).play(); |
---|
75 | |
---|
76 | // should we use cloneNode()? can we? |
---|
77 | this.fileInput = document.createElement('input'); |
---|
78 | // domAttr.set(this.fileInput,{ |
---|
79 | // "type":"file", "id":this.id, "name": this.name |
---|
80 | //}); |
---|
81 | this.fileInput.setAttribute("type","file"); |
---|
82 | this.fileInput.setAttribute("id", this.id); |
---|
83 | this.fileInput.setAttribute("name", this.name); |
---|
84 | domClass.add(this.fileInput,"dijitFileInputReal"); |
---|
85 | this.domNode.appendChild(this.fileInput); |
---|
86 | |
---|
87 | this._keyListener = this.connect(this.fileInput, "onkeyup", "_matchValue"); |
---|
88 | this._listener = this.connect(this.fileInput, "onchange", "_matchValue"); |
---|
89 | this.inputNode.value = ""; |
---|
90 | } |
---|
91 | |
---|
92 | }); |
---|
93 | |
---|
94 | }); |
---|