兼容EXT3的UploadDialog

本文介绍了一个UploadDialog组件与EXT3框架不兼容的问题,并提供了详细的代码修改方案来解决该问题,确保文件上传功能正常运行。

对于UploadDialog报错x-buttons...getEl()为空或不是对象,是由于UploadDialog与EXT3不兼容的缘故,修改之后就又可以使用了。

请命名为Ext.ux.UploadDialog.packed.js:

Ext.namespace("Ext.ux.Utils");
Ext.ux.Utils.EventQueue = function(handler, scope) {
	if (!handler) {
		throw "Handler is required."
	}
	this.handler = handler;
	this.scope = scope || window;
	this.queue = [];
	this.is_processing = false;
	this.postEvent = function(event, data) {
		data = data || null;
		this.queue.push( {
			event :event,
			data :data
		});
		if (!this.is_processing) {
			this.process()
		}
	};
	this.flushEventQueue = function() {
		this.queue = []
	}, this.process = function() {
		while (this.queue.length > 0) {
			this.is_processing = true;
			var event_data = this.queue.shift();
			this.handler.call(this.scope, event_data.event, event_data.data)
		}
		this.is_processing = false
	}
};
Ext.ux.Utils.FSA = function(initial_state, trans_table, trans_table_scope) {
	this.current_state = initial_state;
	this.trans_table = trans_table || {};
	this.trans_table_scope = trans_table_scope || window;
	Ext.ux.Utils.FSA.superclass.constructor.call(this, this.processEvent, this)
};
Ext
		.extend(
				Ext.ux.Utils.FSA,
				Ext.ux.Utils.EventQueue,
				{
					current_state :null,
					trans_table :null,
					trans_table_scope :null,
					state : function() {
						return this.current_state
					},
					processEvent : function(event, data) {
						var transitions = this
								.currentStateEventTransitions(event);
						if (!transitions) {
							throw "State '" + this.current_state
									+ "' has no transition for event '" + event
									+ "'."
						}
						for ( var i = 0, len = transitions.length; i < len; i++) {
							var transition = transitions[i];
							var predicate = transition.predicate
									|| transition.p || true;
							var action = transition.action || transition.a
									|| Ext.emptyFn;
							var new_state = transition.state || transition.s
									|| this.current_state;
							var scope = transition.scope
									|| this.trans_table_scope;
							if (this.computePredicate(predicate, scope, data,
									event)) {
								this.callAction(action, scope, data, event);
								this.current_state = new_state;
								return
							}
						}
						throw "State '" + this.current_state
								+ "' has no transition for event '" + event
								+ "' in current context"
					},
					currentStateEventTransitions : function(event) {
						return this.trans_table[this.current_state] ? this.trans_table[this.current_state][event] || false
								: false
					},
					computePredicate : function(predicate, scope, data, event) {
						var result = false;
						switch (Ext.type(predicate)) {
						case "function":
							result = predicate.call(scope, data, event, this);
							break;
						case "array":
							result = true;
							for ( var i = 0, len = predicate.length; result
									&& (i < len); i++) {
								if (Ext.type(predicate[i]) == "function") {
									result = predicate[i].call(scope, data,
											event, this)
								} else {
									throw [ "Predicate: ", predicate[i],
											' is not callable in "',
											this.current_state,
											'" state for event "', event ]
											.join("")
								}
							}
							break;
						case "boolean":
							result = predicate;
							break;
						default:
							throw [ "Predicate: ", predicate,
									' is not callable in "',
									this.current_state, '" state for event "',
									event ].join("")
						}
						return result
					},
					callAction : function(action, scope, data, event) {
						switch (Ext.type(action)) {
						case "array":
							for ( var i = 0, len = action.length; i < len; i++) {
								if (Ext.type(action[i]) == "function") {
									action[i].call(scope, data, event, this)
								} else {
									throw [ "Action: ", action[i],
											' is not callable in "',
											this.current_state,
											'" state for event "', event ]
											.join("")
								}
							}
							break;
						case "function":
							action.call(scope, data, event, this);
							break;
						default:
							throw [ "Action: ", action,
									' is not callable in "',
									this.current_state, '" state for event "',
									event ].join("")
						}
					}
				});
Ext.namespace("Ext.ux.UploadDialog");
Ext.ux.UploadDialog.BrowseButton = Ext
		.extend(
				Ext.Button,
				{
					input_name :"file",
					input_file :null,
					original_handler :null,
					original_scope :null,
					initComponent : function() {
						Ext.ux.UploadDialog.BrowseButton.superclass.initComponent
								.call(this);
						this.original_handler = this.handler || null;
						this.original_scope = this.scope || window;
						this.handler = null;
						this.scope = null
					},
					onRender : function(ct, position) {
						Ext.ux.UploadDialog.BrowseButton.superclass.onRender
								.call(this, ct, position);
						this.createInputFile()
					},
					createInputFile : function() {
						var button_container = this.el.child(".x-btn-mc");
						button_container.position("relative");
						this.input_file = Ext.DomHelper
								.append(
										button_container,
										{
											tag :"input",
											type :"file",
											size :1,
											name :this.input_name
													|| Ext.id(this.el),
											style :"position: absolute; display: block; border: none; cursor: pointer"
										}, true);
						var button_box = button_container.getBox();
						this.input_file.setStyle("font-size",
								(button_box.width * 0.5) + "px");
						var input_box = this.input_file.getBox();
						var adj = {
							x :3,
							y :3
						};
						if (Ext.isIE) {
							adj = {
								x :0,
								y :3
							}
						}
						this.input_file.setLeft(button_box.width
								- input_box.width + adj.x + "px");
						this.input_file.setTop(button_box.height
								- input_box.height + adj.y + "px");
						this.input_file.setOpacity(0);
						if (this.handleMouseEvents) {
							this.input_file.on("mouseover", this.onMouseOver,
									this);
							this.input_file.on("mousedown", this.onMouseDown,
									this)
						}
						if (this.tooltip) {
							if (typeof this.tooltip == "object") {
								Ext.QuickTips.register(Ext.apply( {
									target :this.input_file
								}, this.tooltip))
							} else {
								this.input_file.dom[this.tooltipType] = this.tooltip
							}
						}
						this.input_file.on("change", this.onInputFileChange,
								this);
						this.input_file.on("click", function(e) {
							e.stopPropagation()
						})
					},
					detachInputFile : function(no_create) {
						var result = this.input_file;
						no_create = no_create || false;
						if (typeof this.tooltip == "object") {
							Ext.QuickTips.unregister(this.input_file)
						} else {
							this.input_file.dom[this.tooltipType] = null
						}
						this.input_file.removeAllListeners();
						this.input_file = null;
						if (!no_create) {
							this.createInputFile()
						}
						return result
					},
					getInputFile : function() {
						return this.input_file
					},
					disable : function() {
						Ext.ux.UploadDialog.BrowseButton.superclass.disable
								.call(this);
						this.input_file.dom.disabled = true
					},
					enable : function() {
						Ext.ux.UploadDialog.BrowseButton.superclass.enable
								.call(this);
						this.input_file.dom.disabled = false
					},
					destroy : function() {
						var input_file = this.detachInputFile(true);
						input_file.remove();
						input_file = null;
						Ext.ux.UploadDialog.BrowseButton.superclass.destroy
								.call(this)
					},
					onInputFileChange : function() {
						if (this.original_handler) {
							this.original_handler.call(this.original_scope,
									this)
						}
					}
				});
Ext.ux.UploadDialog.TBBrowseButton = Ext.extend(
		Ext.ux.UploadDialog.BrowseButton, {
			hideParent :true,
			onDestroy : function() {
				Ext.ux.UploadDialog.TBBrowseButton.superclass.onDestroy
						.call(this);
				if (this.container) {
					this.container.remove()
				}
			}
		});
Ext.ux.UploadDialog.FileRecord = Ext.data.Record.create( [ {
	name :"filename"
}, {
	name :"state",
	type :"int"
}, {
	name :"note"
}, {
	name :"input_element"
} ]);
Ext.ux.UploadDialog.FileRecord.STATE_QUEUE = 0;
Ext.ux.UploadDialog.FileRecord.STATE_FINISHED = 1;
Ext.ux.UploadDialog.FileRecord.STATE_FAILED = 2;
Ext.ux.UploadDialog.FileRecord.STATE_PROCESSING = 3;
Ext.ux.UploadDialog.Dialog = function(config) {
	var default_config = {
		border :false,
		width :450,
		height :300,
		minWidth :450,
		minHeight :300,
		plain :true,
		constrainHeader :true,
		draggable :true,
		closable :true,
		maximizable :false,
		minimizable :false,
		resizable :true,
		autoDestroy :true,
		closeAction :"hide",
		title :this.i18n.title,
		cls :"ext-ux-uploaddialog-dialog",
		url :"",
		base_params : {},
		permitted_extensions : [],
		reset_on_hide :true,
		allow_close_on_upload :false,
		upload_autostart :false,
		post_var_name :"file"
	};
	config = Ext.applyIf(config || {}, default_config);
	config.layout = "absolute";
	Ext.ux.UploadDialog.Dialog.superclass.constructor.call(this, config)
};
Ext
		.extend(
				Ext.ux.UploadDialog.Dialog,
				Ext.Window,
				{
					fsa :null,
					state_tpl :null,
					form :null,
					grid_panel :null,
					progress_bar :null,
					is_uploading :false,
					initial_queued_count :0,
					upload_frame :null,
					initComponent : function() {
						Ext.ux.UploadDialog.Dialog.superclass.initComponent
								.call(this);
						var tt = {
							created : {
								"window-render" : [ {
									action : [ this.createForm,
											this.createProgressBar,
											this.createGrid ],
									state :"rendering"
								} ],
								destroy : [ {
									action :this.flushEventQueue,
									state :"destroyed"
								} ]
							},
							rendering : {
								"grid-render" : [ {
									action : [ this.fillToolbar,
											this.updateToolbar ],
									state :"ready"
								} ],
								destroy : [ {
									action :this.flushEventQueue,
									state :"destroyed"
								} ]
							},
							ready : {
								"file-selected" : [
										{
											predicate : [
													this.fireFileTestEvent,
													this.isPermittedFile ],
											action :this.addFileToUploadQueue,
											state :"adding-file"
										}, {} ],
								"grid-selection-change" : [ {
									action :this.updateToolbar
								} ],
								"remove-files" : [ {
									action : [ this.removeFiles,
											this.fireFileRemoveEvent ]
								} ],
								"reset-queue" : [ {
									action : [ this.resetQueue,
											this.fireResetQueueEvent ]
								} ],
								"start-upload" : [
										{
											predicate :this.hasUnuploadedFiles,
											action : [
													this.setUploadingFlag,
													this.saveInitialQueuedCount,
													this.updateToolbar,
													this.updateProgressBar,
													this.prepareNextUploadTask,
													this.fireUploadStartEvent ],
											state :"uploading"
										}, {} ],
								"stop-upload" : [ {} ],
								hide : [
										{
											predicate : [ this.isNotEmptyQueue,
													this.getResetOnHide ],
											action : [ this.resetQueue,
													this.fireResetQueueEvent ]
										}, {} ],
								destroy : [ {
									action :this.flushEventQueue,
									state :"destroyed"
								} ]
							},
							"adding-file" : {
								"file-added" : [
										{
											predicate :this.isUploading,
											action : [
													this.incInitialQueuedCount,
													this.updateProgressBar,
													this.fireFileAddEvent ],
											state :"uploading"
										},
										{
											predicate :this.getUploadAutostart,
											action : [ this.startUpload,
													this.fireFileAddEvent ],
											state :"ready"
										},
										{
											action : [ this.updateToolbar,
													this.fireFileAddEvent ],
											state :"ready"
										} ]
							},
							uploading : {
								"file-selected" : [
										{
											predicate : [
													this.fireFileTestEvent,
													this.isPermittedFile ],
											action :this.addFileToUploadQueue,
											state :"adding-file"
										}, {} ],
								"grid-selection-change" : [ {} ],
								"start-upload" : [ {} ],
								"stop-upload" : [
										{
											predicate :this.hasUnuploadedFiles,
											action : [ this.resetUploadingFlag,
													this.abortUpload,
													this.updateToolbar,
													this.updateProgressBar,
													this.fireUploadStopEvent ],
											state :"ready"
										},
										{
											action : [
													this.resetUploadingFlag,
													this.abortUpload,
													this.updateToolbar,
													this.updateProgressBar,
													this.fireUploadStopEvent,
													this.fireUploadCompleteEvent ],
											state :"ready"
										} ],
								"file-upload-start" : [ {
									action : [ this.uploadFile,
											this.findUploadFrame,
											this.fireFileUploadStartEvent ]
								} ],
								"file-upload-success" : [
										{
											predicate :this.hasUnuploadedFiles,
											action : [ this.resetUploadFrame,
													this.updateRecordState,
													this.updateProgressBar,
													this.prepareNextUploadTask,
													this.fireUploadSuccessEvent ]
										},
										{
											action : [
													this.resetUploadFrame,
													this.resetUploadingFlag,
													this.updateRecordState,
													this.updateToolbar,
													this.updateProgressBar,
													this.fireUploadSuccessEvent,
													this.fireUploadCompleteEvent ],
											state :"ready"
										} ],
								"file-upload-error" : [
										{
											predicate :this.hasUnuploadedFiles,
											action : [ this.resetUploadFrame,
													this.updateRecordState,
													this.updateProgressBar,
													this.prepareNextUploadTask,
													this.fireUploadErrorEvent ]
										},
										{
											action : [
													this.resetUploadFrame,
													this.resetUploadingFlag,
													this.updateRecordState,
													this.updateToolbar,
													this.updateProgressBar,
													this.fireUploadErrorEvent,
													this.fireUploadCompleteEvent ],
											state :"ready"
										} ],
								"file-upload-failed" : [
										{
											predicate :this.hasUnuploadedFiles,
											action : [ this.resetUploadFrame,
													this.updateRecordState,
													this.updateProgressBar,
													this.prepareNextUploadTask,
													this.fireUploadFailedEvent ]
										},
										{
											action : [
													this.resetUploadFrame,
													this.resetUploadingFlag,
													this.updateRecordState,
													this.updateToolbar,
													this.updateProgressBar,
													this.fireUploadFailedEvent,
													this.fireUploadCompleteEvent ],
											state :"ready"
										} ],
								hide : [
										{
											predicate :this.getResetOnHide,
											action : [ this.stopUpload,
													this.repostHide ]
										}, {} ],
								destroy : [
										{
											predicate :this.hasUnuploadedFiles,
											action : [ this.resetUploadingFlag,
													this.abortUpload,
													this.fireUploadStopEvent,
													this.flushEventQueue ],
											state :"destroyed"
										},
										{
											action : [
													this.resetUploadingFlag,
													this.abortUpload,
													this.fireUploadStopEvent,
													this.fireUploadCompleteEvent,
													this.flushEventQueue ],
											state :"destroyed"
										} ]
							},
							destroyed : {}
						};
						this.fsa = new Ext.ux.Utils.FSA("created", tt, this);
						this.addEvents( {
							filetest :true,
							fileadd :true,
							fileremove :true,
							resetqueue :true,
							uploadsuccess :true,
							uploaderror :true,
							uploadfailed :true,
							uploadstart :true,
							uploadstop :true,
							uploadcomplete :true,
							fileuploadstart :true
						});
						this.on("render", this.onWindowRender, this);
						this.on("beforehide", this.onWindowBeforeHide, this);
						this.on("hide", this.onWindowHide, this);
						this.on("destroy", this.onWindowDestroy, this);
						this.state_tpl = new Ext.Template(
								"<div class='ext-ux-uploaddialog-state ext-ux-uploaddialog-state-{state}'> </div>")
								.compile()
					},
					createForm : function() {
						this.form = Ext.DomHelper
								.append(
										this.body,
										{
											tag :"form",
											method :"post",
											action :this.url,
											style :"position: absolute; left: -100px; top: -100px; width: 100px; height: 100px"
										})
					},
					createProgressBar : function() {
						this.progress_bar = this.add(new Ext.ProgressBar( {
							x :0,
							y :0,
							anchor :"0",
							value :0,
							text :this.i18n.progress_waiting_text
						}))
					},
					createGrid : function() {
						var store = new Ext.data.Store( {
							proxy :new Ext.data.MemoryProxy( []),
							reader :new Ext.data.JsonReader( {},
									Ext.ux.UploadDialog.FileRecord),
							sortInfo : {
								field :"state",
								direction :"DESC"
							},
							pruneModifiedRecords :true
						});
						var cm = new Ext.grid.ColumnModel( [
								{
									header :this.i18n.state_col_title,
									width :this.i18n.state_col_width,
									resizable :false,
									dataIndex :"state",
									sortable :true,
									renderer :this.renderStateCell
											.createDelegate(this)
								},
								{
									header :this.i18n.filename_col_title,
									width :this.i18n.filename_col_width,
									dataIndex :"filename",
									sortable :true,
									renderer :this.renderFilenameCell
											.createDelegate(this)
								},
								{
									header :this.i18n.note_col_title,
									width :this.i18n.note_col_width,
									dataIndex :"note",
									sortable :true,
									renderer :this.renderNoteCell
											.createDelegate(this)
								} ]);
						this.grid_panel = new Ext.grid.GridPanel( {
							ds :store,
							cm :cm,
							x :0,
							y :22,
							anchor :"0 -22",
							border :true,
							viewConfig : {
								autoFill :true,
								forceFit :true
							},
							bbar :new Ext.Toolbar()
						});
						this.grid_panel.on("render", this.onGridRender, this);
						this.add(this.grid_panel);
						this.grid_panel.getSelectionModel().on(
								"selectionchange", this.onGridSelectionChange,
								this)
					},
					fillToolbar : function() {
						var tb = this.grid_panel.getBottomToolbar();
						tb.x_buttons = {};
						tb.x_buttons.add = tb
								.addItem(new Ext.ux.UploadDialog.TBBrowseButton(
										{
											input_name :this.post_var_name,
											text :this.i18n.add_btn_text,
											tooltip :this.i18n.add_btn_tip,
											iconCls :"ext-ux-uploaddialog-addbtn",
											handler :this.onAddButtonFileSelected,
											scope :this
										}));
						tb.x_buttons.remove = tb.addButton( {
							text :this.i18n.remove_btn_text,
							tooltip :this.i18n.remove_btn_tip,
							iconCls :"ext-ux-uploaddialog-removebtn",
							handler :this.onRemoveButtonClick,
							scope :this
						});
						tb.x_buttons.reset = tb.addButton( {
							text :this.i18n.reset_btn_text,
							tooltip :this.i18n.reset_btn_tip,
							iconCls :"ext-ux-uploaddialog-resetbtn",
							handler :this.onResetButtonClick,
							scope :this
						});
						tb.add("-");
						tb.x_buttons.upload = tb.addButton( {
							text :this.i18n.upload_btn_start_text,
							tooltip :this.i18n.upload_btn_start_tip,
							iconCls :"ext-ux-uploaddialog-uploadstartbtn",
							handler :this.onUploadButtonClick,
							scope :this
						});
						tb.add("-");
						tb.x_buttons.indicator = tb
								.addItem(new Ext.Toolbar.Item(
										Ext.DomHelper
												.append(
														tb.getEl(),
														{
															id:'indicatorId',
															tag :"div",
															cls :"ext-ux-uploaddialog-indicator-stoped",
															html :" "
														})));
						tb.add("->");
						tb.x_buttons.close = tb.addButton( {
							text :this.i18n.close_btn_text,
							tooltip :this.i18n.close_btn_tip,
							handler :this.onCloseButtonClick,
							scope :this
						})
					},
					renderStateCell : function(data, cell, record, row_index,
							column_index, store) {
						return this.state_tpl.apply( {
							state :data
						})
					},
					renderFilenameCell : function(data, cell, record,
							row_index, column_index, store) {
						var view = this.grid_panel.getView();
						var f = function() {
							try {
								Ext.fly(view.getCell(row_index, column_index))
										.child(".x-grid3-cell-inner").dom.qtip = data
							} catch (e) {
							}
						};
						f.defer(1000);
						return data
					},
					renderNoteCell : function(data, cell, record, row_index,
							column_index, store) {
						var view = this.grid_panel.getView();
						var f = function() {
							try {
								Ext.fly(view.getCell(row_index, column_index))
										.child(".x-grid3-cell-inner").dom.qtip = data
							} catch (e) {
							}
						};
						f.defer(1000);
						return data
					},
					getFileExtension : function(filename) {
						var result = null;
						var parts = filename.split(".");
						if (parts.length > 1) {
							result = parts.pop()
						}
						return result
					},
					isPermittedFileType : function(filename) {
						var result = true;
						if (this.permitted_extensions.length > 0) {
							result = this.permitted_extensions.indexOf(this
									.getFileExtension(filename)) != -1
						}
						return result
					},
					isPermittedFile : function(browse_btn) {
						var result = false;
						var filename = browse_btn.getInputFile().dom.value;
						if (this.isPermittedFileType(filename)) {
							result = true
						} else {
							Ext.Msg
									.alert(
											this.i18n.error_msgbox_title,
											String
													.format(
															this.i18n.err_file_type_not_permitted,
															filename,
															this.permitted_extensions
																	.join(this.i18n.permitted_extensions_join_str)));
							result = false
						}
						return result
					},
					fireFileTestEvent : function(browse_btn) {
						return this.fireEvent("filetest", this, browse_btn
								.getInputFile().dom.value) !== false
					},
					addFileToUploadQueue : function(browse_btn) {
						var input_file = browse_btn.detachInputFile();
						input_file.appendTo(this.form);
						input_file.setStyle("width", "100px");
						input_file.dom.disabled = true;
						var store = this.grid_panel.getStore();
						store.add(new Ext.ux.UploadDialog.FileRecord( {
							state :Ext.ux.UploadDialog.FileRecord.STATE_QUEUE,
							filename :input_file.dom.value,
							note :this.i18n.note_queued_to_upload,
							input_element :input_file
						}));
						this.fsa.postEvent("file-added", input_file.dom.value)
					},
					fireFileAddEvent : function(filename) {
						this.fireEvent("fileadd", this, filename)
					},
					updateProgressBar : function() {
						if (this.is_uploading) {
							var queued = this.getQueuedCount(true);
							var value = 1 - queued / this.initial_queued_count;
							this.progress_bar.updateProgress(value, String
									.format(this.i18n.progress_uploading_text,
											this.initial_queued_count - queued,
											this.initial_queued_count))
						} else {
							this.progress_bar.updateProgress(0,
									this.i18n.progress_waiting_text)
						}
					},
					updateToolbar : function() {
						var tb = this.grid_panel.getBottomToolbar();
						if (this.is_uploading) {
							tb.x_buttons.remove.disable();
							tb.x_buttons.reset.disable();
							tb.x_buttons.upload.enable();
							if (!this.getAllowCloseOnUpload()) {
								tb.x_buttons.close.disable()
							}
							Ext
									.fly(tb.x_buttons.indicator.getEl())
									.replaceClass(
											"ext-ux-uploaddialog-indicator-stoped",
											"ext-ux-uploaddialog-indicator-processing");
							tb.x_buttons.upload
									.setIconClass("ext-ux-uploaddialog-uploadstopbtn");
							tb.x_buttons.upload
									.setText(this.i18n.upload_btn_stop_text);
							/*
							tb.x_buttons.upload.getEl().child(
									tb.x_buttons.upload.buttonSelector).dom[tb.x_buttons.upload.tooltipType] = this.i18n.upload_btn_stop_tip
						    */
						} else {
							tb.x_buttons.remove.enable();
							tb.x_buttons.reset.enable();
							tb.x_buttons.close.enable();
							Ext
									.fly(tb.x_buttons.indicator.getEl())
									.replaceClass(
											"ext-ux-uploaddialog-indicator-processing",
											"ext-ux-uploaddialog-indicator-stoped");
							tb.x_buttons.upload
									.setIconClass("ext-ux-uploaddialog-uploadstartbtn");
							tb.x_buttons.upload
									.setText(this.i18n.upload_btn_start_text);
							/*
							tb.x_buttons.upload.getEl().child(
									tb.x_buttons.upload.buttonSelector).dom[tb.x_buttons.upload.tooltipType] = this.i18n.upload_btn_start_tip;
							*/
							if (this.getQueuedCount() > 0) {
								tb.x_buttons.upload.enable()
							} else {
								tb.x_buttons.upload.disable()
							}
							if (this.grid_panel.getSelectionModel()
									.hasSelection()) {
								tb.x_buttons.remove.enable()
							} else {
								tb.x_buttons.remove.disable()
							}
							if (this.grid_panel.getStore().getCount() > 0) {
								tb.x_buttons.reset.enable()
							} else {
								tb.x_buttons.reset.disable()
							}
						}
					},
					saveInitialQueuedCount : function() {
						this.initial_queued_count = this.getQueuedCount()
					},
					incInitialQueuedCount : function() {
						this.initial_queued_count++
					},
					setUploadingFlag : function() {
						this.is_uploading = true
					},
					resetUploadingFlag : function() {
						this.is_uploading = false
					},
					prepareNextUploadTask : function() {
						var store = this.grid_panel.getStore();
						var record = null;
						store
								.each( function(r) {
									if (!record
											&& r.get("state") == Ext.ux.UploadDialog.FileRecord.STATE_QUEUE) {
										record = r
									} else {
										r.get("input_element").dom.disabled = true
									}
								});
						record.get("input_element").dom.disabled = false;
						record
								.set(
										"state",
										Ext.ux.UploadDialog.FileRecord.STATE_PROCESSING);
						record.set("note", this.i18n.note_processing);
						record.commit();
						this.fsa.postEvent("file-upload-start", record)
					},
					fireUploadStartEvent : function() {
						this.fireEvent("uploadstart", this)
					},
					removeFiles : function(file_records) {
						var store = this.grid_panel.getStore();
						for ( var i = 0, len = file_records.length; i < len; i++) {
							var r = file_records[i];
							r.get("input_element").remove();
							store.remove(r)
						}
					},
					fireFileRemoveEvent : function(file_records) {
						for ( var i = 0, len = file_records.length; i < len; i++) {
							this.fireEvent("fileremove", this, file_records[i]
									.get("filename"))
						}
					},
					resetQueue : function() {
						var store = this.grid_panel.getStore();
						store.each( function(r) {
							r.get("input_element").remove()
						});
						store.removeAll()
					},
					fireResetQueueEvent : function() {
						this.fireEvent("resetqueue", this)
					},
					uploadFile : function(record) {
						Ext.Ajax.request( {
							url :this.url,
							params :this.base_params || this.baseParams
									|| this.params,
							method :"POST",
							form :this.form,
							isUpload :true,
							success :this.onAjaxSuccess,
							failure :this.onAjaxFailure,
							scope :this,
							record :record
						})
					},
					fireFileUploadStartEvent : function(record) {
						this.fireEvent("fileuploadstart", this, record
								.get("filename"))
					},
					updateRecordState : function(data) {
						if ("success" in data.response && data.response.success) {
							data.record
									.set(
											"state",
											Ext.ux.UploadDialog.FileRecord.STATE_FINISHED);
							data.record.set("note", data.response.message
									|| data.response.error
									|| this.i18n.note_upload_success)
						} else {
							data.record
									.set(
											"state",
											Ext.ux.UploadDialog.FileRecord.STATE_FAILED);
							data.record.set("note", data.response.message
									|| data.response.error
									|| this.i18n.note_upload_error)
						}
						data.record.commit()
					},
					fireUploadSuccessEvent : function(data) {
						this.fireEvent("uploadsuccess", this, data.record
								.get("filename"), data.response)
					},
					fireUploadErrorEvent : function(data) {
						this.fireEvent("uploaderror", this, data.record
								.get("filename"), data.response)
					},
					fireUploadFailedEvent : function(data) {
						this.fireEvent("uploadfailed", this, data.record
								.get("filename"))
					},
					fireUploadCompleteEvent : function() {
						this.fireEvent("uploadcomplete", this)
					},
					findUploadFrame : function() {
						this.upload_frame = Ext.getBody().child(
								"iframe.x-hidden:last")
					},
					resetUploadFrame : function() {
						this.upload_frame = null
					},
					removeUploadFrame : function() {
						if (this.upload_frame) {
							this.upload_frame.removeAllListeners();
							this.upload_frame.dom.src = "about:blank";
							this.upload_frame.remove()
						}
						this.upload_frame = null
					},
					abortUpload : function() {
						this.removeUploadFrame();
						var store = this.grid_panel.getStore();
						var record = null;
						store
								.each( function(r) {
									if (r.get("state") == Ext.ux.UploadDialog.FileRecord.STATE_PROCESSING) {
										record = r;
										return false
									}
								});
						record.set("state",
								Ext.ux.UploadDialog.FileRecord.STATE_FAILED);
						record.set("note", this.i18n.note_aborted);
						record.commit()
					},
					fireUploadStopEvent : function() {
						this.fireEvent("uploadstop", this)
					},
					repostHide : function() {
						this.fsa.postEvent("hide")
					},
					flushEventQueue : function() {
						this.fsa.flushEventQueue()
					},
					onWindowRender : function() {
						this.fsa.postEvent("window-render")
					},
					onWindowBeforeHide : function() {
						return this.isUploading() ? this
								.getAllowCloseOnUpload() : true
					},
					onWindowHide : function() {
						this.fsa.postEvent("hide")
					},
					onWindowDestroy : function() {
						this.fsa.postEvent("destroy")
					},
					onGridRender : function() {
						this.fsa.postEvent("grid-render")
					},
					onGridSelectionChange : function() {
						this.fsa.postEvent("grid-selection-change")
					},
					onAddButtonFileSelected : function(btn) {
						this.fsa.postEvent("file-selected", btn)
					},
					onUploadButtonClick : function() {
						if (this.is_uploading) {
							this.fsa.postEvent("stop-upload")
						} else {
							this.fsa.postEvent("start-upload")
						}
					},
					onRemoveButtonClick : function() {
						var selections = this.grid_panel.getSelectionModel()
								.getSelections();
						this.fsa.postEvent("remove-files", selections)
					},
					onResetButtonClick : function() {
						this.fsa.postEvent("reset-queue")
					},
					onCloseButtonClick : function() {
						this[this.closeAction].call(this)
					},
					onAjaxSuccess : function(response, options) {
						var json_response = {
							success :false,
							error :this.i18n.note_upload_error
						};
						try {
							var rt = response.responseText;
							var filter = rt
									.match(/^<[^>]+>((?:.|\n)*)<\/[^>]+>$/);
							if (filter) {
								rt = filter[1]
							}
							json_response = Ext.util.JSON.decode(rt)
						} catch (e) {
						}
						var data = {
							record :options.record,
							response :json_response
						};
						if ("success" in json_response && json_response.success) {
							this.fsa.postEvent("file-upload-success", data)
						} else {
							this.fsa.postEvent("file-upload-error", data)
						}
					},
					onAjaxFailure : function(response, options) {
						var data = {
							record :options.record,
							response : {
								success :false,
								error :this.i18n.note_upload_failed
							}
						};
						this.fsa.postEvent("file-upload-failed", data)
					},
					startUpload : function() {
						this.fsa.postEvent("start-upload")
					},
					stopUpload : function() {
						this.fsa.postEvent("stop-upload")
					},
					getUrl : function() {
						return this.url
					},
					setUrl : function(url) {
						this.url = url
					},
					getBaseParams : function() {
						return this.base_params
					},
					setBaseParams : function(params) {
						this.base_params = params
					},
					getUploadAutostart : function() {
						return this.upload_autostart
					},
					setUploadAutostart : function(value) {
						this.upload_autostart = value
					},
					getAllowCloseOnUpload : function() {
						return this.allow_close_on_upload
					},
					setAllowCloseOnUpload : function(value) {
						this.allow_close_on_upload
					},
					getResetOnHide : function() {
						return this.reset_on_hide
					},
					setResetOnHide : function(value) {
						this.reset_on_hide = value
					},
					getPermittedExtensions : function() {
						return this.permitted_extensions
					},
					setPermittedExtensions : function(value) {
						this.permitted_extensions = value
					},
					isUploading : function() {
						return this.is_uploading
					},
					isNotEmptyQueue : function() {
						return this.grid_panel.getStore().getCount() > 0
					},
					getQueuedCount : function(count_processing) {
						var count = 0;
						var store = this.grid_panel.getStore();
						store
								.each( function(r) {
									if (r.get("state") == Ext.ux.UploadDialog.FileRecord.STATE_QUEUE) {
										count++
									}
									if (count_processing
											&& r.get("state") == Ext.ux.UploadDialog.FileRecord.STATE_PROCESSING) {
										count++
									}
								});
						return count
					},
					hasUnuploadedFiles : function() {
						return this.getQueuedCount() > 0
					}
				});
var p = Ext.ux.UploadDialog.Dialog.prototype;
p.i18n = {
	title :"File upload dialog",
	state_col_title :"State",
	state_col_width :70,
	filename_col_title :"Filename",
	filename_col_width :230,
	note_col_title :"Note",
	note_col_width :150,
	add_btn_text :"Add",
	add_btn_tip :"Add file into upload queue.",
	remove_btn_text :"Remove",
	remove_btn_tip :"Remove file from upload queue.",
	reset_btn_text :"Reset",
	reset_btn_tip :"Reset queue.",
	upload_btn_start_text :"Upload",
	upload_btn_stop_text :"Abort",
	upload_btn_start_tip :"Upload queued files to the server.",
	upload_btn_stop_tip :"Stop upload.",
	close_btn_text :"Close",
	close_btn_tip :"Close the dialog.",
	progress_waiting_text :"Waiting...",
	progress_uploading_text :"Uploading: {0} of {1} files complete.",
	error_msgbox_title :"Error",
	permitted_extensions_join_str :",",
	err_file_type_not_permitted :"Selected file extension isn't permitted.<br/>Please select files with following extensions: {1}",
	note_queued_to_upload :"Queued for upload.",
	note_processing :"Uploading...",
	note_upload_failed :"Server is unavailable or internal server error occured.",
	note_upload_success :"OK.",
	note_upload_error :"Upload error.",
	note_aborted :"Aborted by user."
};


 

Configuration. Most configuration options are inherited from Ext.Window (see ExtJs docs). The added ones are: url - the url where to post uploaded files. base_params - additional post params (default to {}). permitted_extensions - array of file extensions which are permitted to upload (default to []). reset_on_hide - whether to reset upload queue on dialog hide or not (default true). allow_close_on_upload - whether to allow hide/close dialog during upload process (default false). upload_autostart - whether to start upload automaticaly when file added or not (default false). post_var_name - uploaded data POST variable name (defaults to &#39;file&#39;). Events. filetest - fires before file is added into the queue, parameters: dialog - reference to dialog filename - file name If handler returns false then file will not be queued. fileadd - fires when file is added into the queue, parameters: dialog - reference to dialog filename - file name fileremove - fires when file is removed from the queue, parameters: dialog - reference to dialog filename - file name record - file record resetqueue - fires when upload queue is resetted, parameters: dialog - reference to dialog beforefileuploadstart - fires when file as about to start uploading: dialog - reference to dialog filename - uploaded file name record - file record If handler returns false then file upload will be canceled. fileuploadstart - fires when file has started uploading: dialog - reference to dialog filename - uploaded file name record - file record uploadsuccess - fires when file is successfuly uploaded, parameters: dialog - reference to dialog filename - uploaded file name data - js-object builded from json-data returned from upload handler response. record - file record uploaderror - fires when file upload error occured, parameters: dialog - reference to dialog filename - uploaded file name data - js-object builded from json-data returned from upload handler response. record - file record uploadfailed - fires when file upload failed, parameters: dialog - reference to dialog filename - failed file name record - file record uploadcanceled - fires when file upload canceled, parameters: dialog - reference to dialog filename - failed file name record - file record uploadstart - fires when upload process starts, parameters: dialog - reference to dialog uploadstop - fires when upload process stops, parameters: dialog - reference to dialog uploadcomplete - fires when upload process complete (no files to upload left), parameters: dialog - reference to dialog Public methods Better go see the source. I18n. The class is ready for i18n, override the Ext.ux.UploadDialog.Dialog.prototype.i18n object with your language strings, or just pass i18n object in config. Server side handler. The files in the queue are posted one at a time, the file field name is &#39;file&#39;. The handler should return json encoded object with following properties:
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值