| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-form-field-File'>/**</span> * @docauthor Jason Johnston <jason@sencha.com> * * A file upload field which has custom styling and allows control over the button text and other * features of {@link Ext.form.field.Text text fields} like {@link Ext.form.field.Text#emptyText empty text}. * It uses a hidden file input element behind the scenes to allow user selection of a file and to * perform the actual upload during {@link Ext.form.Basic#submit form submit}. * * Because there is no secure cross-browser way to programmatically set the value of a file input, * the standard Field `setValue` method is not implemented. The `{@link #getValue}` method will return * a value that is browser-dependent; some have just the file name, some have a full path, some use * a fake path. * * **IMPORTANT:** File uploads are not performed using normal 'Ajax' techniques; see the description for * {@link Ext.form.Basic#hasUpload} for details. * * # Example Usage * *     @example *     Ext.create('Ext.form.Panel', { *         title: 'Upload a Photo', *         width: 400, *         bodyPadding: 10, *         frame: true, *         renderTo: Ext.getBody(), *         items: [{ *             xtype: 'filefield', *             name: 'photo', *             fieldLabel: 'Photo', *             labelWidth: 50, *             msgTarget: 'side', *             allowBlank: false, *             anchor: '100%', *             buttonText: 'Select Photo...' *         }], * *         buttons: [{ *             text: 'Upload', *             handler: function() { *                 var form = this.up('form').getForm(); *                 if(form.isValid()){ *                     form.submit({ *                         url: 'photo-upload.php', *                         waitMsg: 'Uploading your photo...', *                         success: function(fp, o) { *                             Ext.Msg.alert('Success', 'Your photo "' + o.result.file + '" has been uploaded.'); *                         } *                     }); *                 } *             } *         }] *     }); */Ext.define("Ext.form.field.File", {    extend: 'Ext.form.field.Trigger',    alias: ['widget.filefield', 'widget.fileuploadfield'],    alternateClassName: ['Ext.form.FileUploadField', 'Ext.ux.form.FileUploadField', 'Ext.form.File'],    uses: ['Ext.button.Button', 'Ext.layout.component.field.Field'],    //<locale><span id='Ext-form-field-File-cfg-buttonText'>    /**</span>     * @cfg {String} buttonText     * The button text to display on the upload button. Note that if you supply a value for     * {@link #buttonConfig}, the buttonConfig.text value will be used instead if available.     */    buttonText: 'Browse...',    //</locale><span id='Ext-form-field-File-cfg-buttonOnly'>    /**</span>     * @cfg {Boolean} buttonOnly     * True to display the file upload field as a button with no visible text field. If true, all     * inherited Text members will still be available.     */    buttonOnly: false,<span id='Ext-form-field-File-cfg-buttonMargin'>    /**</span>     * @cfg {Number} buttonMargin     * The number of pixels of space reserved between the button and the text field. Note that this only     * applies if {@link #buttonOnly} = false.     */    buttonMargin: 3,<span id='Ext-form-field-File-cfg-buttonConfig'>    /**</span>     * @cfg {Object} buttonConfig     * A standard {@link Ext.button.Button} config object.     */<span id='Ext-form-field-File-event-change'>    /**</span>     * @event change     * Fires when the underlying file input field's value has changed from the user selecting a new file from the system     * file selection dialog.     * @param {Ext.ux.form.FileUploadField} this     * @param {String} value The file value returned by the underlying file input field     */<span id='Ext-form-field-File-property-fileInputEl'>    /**</span>     * @property {Ext.Element} fileInputEl     * A reference to the invisible file input element created for this upload field. Only populated after this     * component is rendered.     */<span id='Ext-form-field-File-property-button'>    /**</span>     * @property {Ext.button.Button} button     * A reference to the trigger Button component created for this upload field. Only populated after this component is     * rendered.     */<span id='Ext-form-field-File-cfg-fieldBodyCls'>    /**</span>     * @cfg {String} [fieldBodyCls='x-form-file-wrap']     * An extra CSS class to be applied to the body content element in addition to {@link #fieldBodyCls}.     */    fieldBodyCls: Ext.baseCSSPrefix + 'form-file-wrap',<span id='Ext-form-field-File-cfg-readOnly'>    /**</span>     * @cfg {Boolean} readOnly     * Unlike with other form fields, the readOnly config defaults to true in File field.     */    readOnly: true,<span id='Ext-form-field-File-property-triggerNoEditCls'>    /**</span>     * Do not show hand pointer over text field since file choose dialog is only shown when clicking in the button     * @private     */    triggerNoEditCls: '',    // private    componentLayout: 'triggerfield',    // private. Extract the file element, button outer element, and button active element.    childEls: ['fileInputEl', 'buttonEl', 'buttonEl-btnEl', 'browseButtonWrap'],    // private    onRender: function() {        var me = this,            inputEl;        me.callParent(arguments);        inputEl = me.inputEl;        inputEl.dom.name = ''; //name goes on the fileInput, not the text input        me.fileInputEl.dom.name = me.getName();        me.fileInputEl.on({            scope: me,            change: me.onFileChange        });        if (me.buttonOnly) {            me.inputCell.setDisplayed(false);        }        // Ensure the trigger cell is sized correctly upon render        me.browseButtonWrap.dom.style.width = (me.browseButtonWrap.dom.lastChild.offsetWidth + me.buttonEl.getMargin('lr')) + 'px';        if (Ext.isIE) {            me.buttonEl.repaint();        }    },<span id='Ext-form-field-File-method-getTriggerMarkup'>    /**</span>     * Gets the markup to be inserted into the subTplMarkup.     */    getTriggerMarkup: function() {        var me = this,            result,            btn = Ext.widget('button', Ext.apply({                id: me.id + '-buttonEl',                ui: me.ui,                disabled: me.disabled,                text: me.buttonText,                cls: Ext.baseCSSPrefix + 'form-file-btn',                preventDefault: false,                style: me.buttonOnly ? '' : 'margin-left:' + me.buttonMargin + 'px'            }, me.buttonConfig)),            btnCfg = btn.getRenderTree(),            inputElCfg = {                id: me.id + '-fileInputEl',                cls: Ext.baseCSSPrefix + 'form-file-input',                tag: 'input',                type: 'file',                size: 1            };        if (me.disabled) {            inputElCfg.disabled = true;        }        btnCfg.cn = inputElCfg;        result = '<td id="' + me.id + '-browseButtonWrap">' + Ext.DomHelper.markup(btnCfg) + '</td>';        btn.destroy();        return result;    },<span id='Ext-form-field-File-method-createFileInput'>    /**</span>     * @private     * Creates the file input element. It is inserted into the trigger button component, made     * invisible, and floated on top of the button's other content so that it will receive the     * button's clicks.     */    createFileInput : function() {        var me = this;        me.fileInputEl = me.buttonEl.createChild({            name: me.getName(),            id: me.id + '-fileInputEl',            cls: Ext.baseCSSPrefix + 'form-file-input',            tag: 'input',            type: 'file',            size: 1        });        me.fileInputEl.on({            scope: me,            change: me.onFileChange        });    },<span id='Ext-form-field-File-method-onFileChange'>    /**</span>     * @private Event handler fired when the user selects a file.     */    onFileChange: function() {        this.lastValue = null; // force change event to get fired even if the user selects a file with the same name        Ext.form.field.File.superclass.setValue.call(this, this.fileInputEl.dom.value);    },<span id='Ext-form-field-File-method-setValue'>    /**</span>     * Overridden to do nothing     * @method     */    setValue: Ext.emptyFn,    reset : function(){        var me = this;        if (me.rendered) {            me.fileInputEl.remove();            me.createFileInput();            me.inputEl.dom.value = '';        }        me.callParent();    },    onDisable: function(){        this.callParent();        this.disableItems();    },        disableItems: function(){        var file = this.fileInputEl;        if (file) {            file.dom.disabled = true;        }        this['buttonEl-btnEl'].dom.disabled = true;    },    onEnable: function(){        var me = this;        me.callParent();        me.fileInputEl.dom.disabled = false;        this['buttonEl-btnEl'].dom.disabled = false;    },    isFileUpload: function() {        return true;    },    extractFileInput: function() {        var fileInput = this.fileInputEl.dom;        this.reset();        return fileInput;    },    onDestroy: function(){        Ext.destroyMembers(this, 'fileInputEl', 'buttonEl');        this.callParent();    }});</pre></body></html>
 |