⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smart_grid_lib.js

📁 Here is the DHTML tree example with full source code
💻 JS
📖 第 1 页 / 共 5 页
字号:
		}

		// scroll to the very bottom of the grid
		this.content_div.scrollTop = this.content_div.scrollHeight;
		if (this.frozen_grid) {
			this.frozen_grid.content_div.scrollTop = this.content_div.scrollTop;
		}

		// switch first cell in edit mode
		var cell_obj = new_row.cells[0];
		if (!cell_obj) return;
		var sc = SmartCells.get_cell(cell_obj);

		if (SmartCells.active_cell) SmartCells.active_cell.save();
		// set current active cell
		SmartCells.active_cell = sc;
		sc.edit();

		if (!document.all) {
//			event.preventDefault();
//			event.stopPropagation();
		}

		event.cancelBubble = true;

		return false;
	}

	// delete selected rows (from db and grid)
	this.actions_delete_selected_rows = function() {

		if (!this.actions_url) return;

		// do not permit to add if no permission to update
		var can_delete = this.delete_allowed;

		if (!can_delete) return;

		var row_id;
		var row_id_list = '';
		for (row_id in this.selected_rows) {
			if (row_id_list != '') row_id_list += '|';
			var row_tr = document.getElementById(row_id);
			if (row_tr) row_id_list += String(row_id).replace(this.get_row_id_prefix(), '');

			// switch current cell in default mode if it is in edit one and
			// belongs to the row to be deleted
			if (SmartCells.active_cell &&
				SmartCells.active_cell.params['row_id'] == row_id) {
				SmartCells.active_cell.cancel_edit();
			}

		}

		// no rows selected
		if (row_id_list == '') return;

		var grid = this;

		// create a new object JSHttpRequest.
		var req = new JsHttpRequest();

		// code executed automatically on loading completed
		req.onreadystatechange = function() {

			if (req.readyState == 4) {
				if (req.responseJS) {
					var status = req.responseJS.status;

					if (status != 'ok') {
						// restore old value
						alert(status);
					} else {

						grid.delete_selected_rows();

						// redraw current page
						if (smart_grid.page_mode && grid.page_size > 0) {
							grid.change_page(grid.current_page);
						}

					}

				}

		// Debug info
//			document.getElementById('debug').innerHTML = req.responseText;
			}
		}

		var query_params = {};

		// submit cell params
		for (i=0; i<this.columns.length; i++) {
			var column = this.columns[i]['cell'];

			if (column.type == 'image') {
				query_params['folder'+i] = column.folder;
			}

		}

		// Enable caching
		req.caching = false;
		// Prepare object
		req.open('POST', this.actions_url+'?action=delete&row_id_list='+row_id_list, true);
		// Send query data
		req.send(query_params);
	}

	// called on save cell event and saves cell's row
	// called as method of a Smart Cell!
	this.on_save_cell = function() {

		var sc_obj = this;
		var grid = this.obj.grid;
		if (grid.common_grid) grid = grid.common_grid;

		if (!grid.actions_url) return;

		// do not permit to add if no permission to update
		var can_update = grid.update_allowed;

		if (!can_update) {
			this.cancel_edit();
			return;
		}


		var row_id = this.params['row_id'];
		if (grid.remove_frozen_prefix) row_id = grid.remove_frozen_prefix(row_id);

		if (!grid.is_row_new(row_id)) {
			var action = '';
		} else {
			var action = '?action=add';
		}


		var old_value = this.value;
		var new_value = sc_obj.get_current_value();    

		// create a new object JSHttpRequest.
		var req = new JsHttpRequest();

		// code executed automatically on loading completed
		req.onreadystatechange = function() {
			var value = old_value;
			if (req.readyState == 4) {
				if (req.responseJS) {
					var status = req.responseJS.status;

					if (status != 'ok') {
						// restore old value
						alert(status);
					} else {

						var value = new_value;

						// function called if modification was successfull
						// non db field cells update data with some delay
						// (eg after uploading => they must call this function
						// themselves when finish uploading
						if (sc_obj.params['db_field'] == '') {
							sc_obj.post_modify_func = new Function();
						} else {
							sc_obj.post_modify_func();
						}

						var new_db_row_id = req.responseJS.new_row_id;
						// just added a new row successfully => set valid row id
						if (new_db_row_id) {
							var new_row_id = grid.change_row_id(row_id, new_db_row_id);

							// update id of the appropriate frozen row
							if (smart_grid.frozen_grid) {
								var frozen_row_id = grid.get_frozen_id_attribute(row_id);
								var frozen_new_row_id = grid.frozen_grid.change_row_id(frozen_row_id, new_db_row_id);
							}

							if (grid.page_mode && grid.page_size > 0) {
								// redraw current page instantly for db field cells
								// only, non db field cells will redraw it themselves
								// after uploading is finished
								if (sc_obj.params['db_field'] == '') {
									// Ajax.js trows an exception in Firefox if run
									// change_page without a delay
									sc_obj.post_modify_func = function(){setTimeout(function(){grid.change_page(grid.current_page);}, 10);};
//									sc_obj.post_modify_func = function(){setTimeout('document.getElementById("'+sc_obj.obj.id+'").grid.change_page(document.getElementById("'+sc_obj.obj.id+'").grid.current_page);', 10);};
//							sc_obj.post_modify_func = function(){smart_grid.change_page(smart_grid.current_page);};
									} else {
										grid.change_page(grid.current_page);
										return;
									}
//							smart_grid.change_page(smart_grid.current_page);
							} else {

								// some values could be set by default by DB =>
								// update all row cells if page is not redrawn
								var row_obj = document.getElementById(new_row_id);
								var row_cells = row_obj.cells;
								if (grid.frozen_grid) {
									var frozen_row_obj = document.getElementById(frozen_new_row_id);
									var frozen_row_cells = frozen_row_obj.cells;
								}
								var i;
								for (i=0; i<grid.columns.length; i++) {
									if (grid.frozen_grid &&
											i < grid.frozen_col_num) {
    
										var cur_row_cells = frozen_row_cells;
										var decr = 0;
									} else {
										var cur_row_cells = row_cells;
										var decr = grid.frozen_col_num;
									}

									var sc = SmartCells.get_cell(cur_row_cells[i-decr]);

									if (sc.obj.id == sc_obj.id ||
										sc.params['db_field'] == '') {
    
										continue;
									}

//alert(eval('req.responseJS.cell_value'+i));
									var cell_index = i;
									sc.set_value(eval('req.responseJS.cell_value'+cell_index));
									sc.show_value();
								}
    
							}

						} else {
							// some values could be changed by DB, eg dates
							if (sc_obj.params['db_field'] != '') {
								value = eval('req.responseJS.cell_value'+(sc_obj.obj.cell_index+sc_obj.obj.grid.frozen_col_num));
							}
						}

//alert(eval('req.responseJS.cell_value'+sc_obj.obj.cell_index));
						// for cells that do not correspond to db table fields
						// (eg images) run _save method anyway
						if (sc_obj.params['db_field'] == '') {
							if (new_db_row_id) {
								value = new_db_row_id;
								sc_obj.set_value(value);
							}
							sc_obj._save();
						}
    
					}
    
				}

				// update cell content
				if (sc_obj.params['db_field'] != '') {
					sc_obj.set_value(value);
					sc_obj.show_value();
				}

			// Debug info
//			document.getElementById('debug').innerHTML = req.responseText;
			}
		}

		var query_params = this.query_params;
//		query_params.value = new_value;

		// add cell params
		var i;
		for (i in this.params) {
			query_params[i] = this.params[i];
		}


		var row_obj = document.getElementById(row_id);
		var row_cells = row_obj.cells;

		if (grid.frozen_grid) {
			var frozen_row_id = grid.get_frozen_id_attribute(row_id);
			var frozen_row_obj = document.getElementById(frozen_row_id);
			var frozen_row_cells = frozen_row_obj.cells;
		}

		for (i=0; i<grid.columns.length; i++) {
			if (grid.frozen_grid &&
				i < grid.frozen_col_num) {
    
				var cur_row_cells = frozen_row_cells;
				var decr = 0;
			} else {
				var cur_row_cells = row_cells;
				var decr = grid.frozen_col_num;
			}
			var cell_obj = cur_row_cells[i-decr];
			var sc = SmartCells.get_cell(cell_obj);
//alert(sc.get_current_value());
			query_params[sc.params['db_field']] = sc.get_current_value();
//alert(sc.params['db_field']);
		}

		var row_tr = document.getElementById(row_id);
		query_params['row_id'] = String(row_id).replace(row_tr.grid.get_row_id_prefix(), '');

		// Enable caching
		req.caching = false;
		// Prepare object
		req.open('POST', grid.actions_url+action, true);
//alert(grid.actions_url+action);
		// Send query data
		req.send(query_params);

	}


	// returns prefix used for new row id
	this.get_new_row_id_prefix = function() {
		return 'sg_new_row';
	}


	// return true if row is new (not saved yet)
	this.is_row_new = function(row_id) {
		var re = new RegExp(this.get_new_row_id_prefix(), '');
		return re.test(row_id);
	}


	// make a cell Smart
	this.do_smart_cell = function(cell_obj, row_id, col_num, cell_data) {

		// make frozen row id differ from the appropriate row of the common grid
		if (this.common_grid) {
			var cell_row_id = this.get_frozen_id_attribute(row_id);
		} else {
			var cell_row_id = row_id;
		}

		cell_obj.setAttribute('id', 'sg_cell'+cell_row_id+'_'+col_num);
		cell_obj.style.width = this.columns[col_num]['col_width']+'px';
		cell_obj.cell_index = col_num - this.frozen_col_num;
		cell_obj.grid = this;


		var sc = this.columns[col_num]['cell'].clone();


		sc.obj = cell_obj;
		if (cell_data) {
			sc.set_value(cell_data);
		} else {
			sc.set_value(sc.default_value);
		}

		// always store id of common grid row
		sc.params['row_id'] = row_id;

		if (this.common_grid) {
			sc.user_save = this.common_grid.on_save_cell;
		} else {
			sc.user_save = this.on_save_cell;
		}

		// do not save anything on Tab key pressed to allow to modify all
		// cells before saving the whole row
		sc.save_on_tab = false;

		// for image cells set initial max size
		if (sc.type == 'image') {
			sc.default_max_size[0] = this.columns[col_num]['col_width'];
			if (this.row_height) sc.default_max_size[1] = this.row_height;
		}

		sc.show_value();
		SmartCells.add_smart_cell(sc);

	}


	// set tab order for the row smart cells
	this.set_smart_row_tab_order = function(data_tr) {
		var j;
		var col_len = data_tr.cells.length;

		for (j=0; j<col_len; j++) {
			var cell_obj = data_tr.cells[j];
			var sc = SmartCells.get_cell(cell_obj);

			sc.set_tab_next_cell(data_tr.cells[(j+1)%col_len].getAttribute('id'));
		}

		// change tab order for last cells in common and frozen grids
		// so that the both of the grids are connected
		if (this.frozen_grid) {
			var frozen_data_tr = this.get_frozen_row_analog(data_tr);
//clear();
//show_val('frozen_data_tr' + frozen_data_tr);
			var frozen_col_len = frozen_data_tr.cells.length;

			var first_cell = data_tr.cells[0];
			var frozen_first_cell = frozen_data_tr.cells[0];
			var last_cell = data_tr.cells[col_len-1];
			var frozen_last_cell = frozen_data_tr.cells[frozen_col_len-1];

			var sc = SmartCells.get_cell(last_cell);
			sc.set_tab_next_cell(frozen_first_cell.getAttribute('id'));
			var sc = SmartCells.get_cell(frozen_last_cell);
			sc.set_tab_next_cell(first_cell.getAttribute('id'));
		}
	}

	// check if row is smart one (not a not-saved new row or a spacer)
	this.is_smart_row = function(row_id) {
		var re = new RegExp(this.get_row_id_prefix(), '');
		return re.test(row_id);
	}

}

// clone object obj
function clone(obj) {
	if (typeof(obj) != 'object') {
		return obj;
	}

	if(obj == null) return obj;

	if (obj instanceof Array) {
		var new_obj = new Array();
	} else {
		var new_obj = new Object();
	}

	for (var i in obj) {
//alert(i + ' => ' + typeof(obj[i]));
		new_obj[i] = clone(obj[i]);
	}

	return new_obj;
}

// Smart Grid lang data

var sg_lang_data = new Array();

	sg_lang_data['en'] = {
'page' : 'Page',
'rows_per_page' : 'Rows per page',
'all_rows' : 'All rows',
'dynamic_loading' : 'Cannot sort if dynamic loading on!',
'add_new_row' : 'add new row',
'delete_selected_rows' : 'delete selected rows'
	};

	sg_lang_data['ru'] = {
'page' : '羊疣龛鲟',
'rows_per_page' : '羊痤

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -