RSS Git Download  Clone
Raw Blame History
var model_manager = function() {};
model_manager.prototype.constructor = model_manager;

model_manager.prototype.jform = null;
model_manager.prototype.jgrid = null;
model_manager.prototype.jpager = null;
model_manager.prototype.form_name = null;
model_manager.prototype.model = null;
model_manager.prototype.selected_id = null;
model_manager.prototype.grid_options = null;
model_manager.prototype.relationship_data = {};
model_manager.prototype.relationships = [];
model_manager.prototype.table_id = null;
model_manager.prototype.pager_id = null;

/***********************************************
 * Model management
 ***********************************************/
model_manager.prototype.index_data = function(data, id_field) {
	if (typeof id_field == 'undefined') {
		id_field = 'id';
	}
	indexed_data = {};
	for(var index = 0; index < data.length; index++) {
		var d = data[index];
		var data_key = d[id_field]
		indexed_data[data_key] = d;
	}
	var table = {};
	table.rows = indexed_data;
	table.count = data.length;
	return table;
}

model_manager.prototype.on_related_model_data_loaded = function(callback) {
	var self = this;
	
	var is_ready = function() {
		var ready = true;
		for(var index = 0; index < self.relationships.length; index++) {
			var r = self.relationships[index];
			if (typeof self.relationship_data[r.model] == 'undefined') {
				ready = false;
				break;
			}
		}
		if (ready) {
			callback.call(self);
		} else {
			setTimeout(is_ready, 10);
		}
	}
	is_ready();
}
 
model_manager.prototype.fetch_model_data = function(r) {
	var self = this;
	var url = config.app_url + 'ajax_model_interface/fetch/' + r.model + '/' + r.sort_field + '/' + r.sort_direction;
	$.ajax({
		url: url,
		success: function(data) {
			self.relationship_data[r.model] = self.index_data(data);
		}
	});
}

model_manager.prototype.fetch_related_model_data = function(complete_callback) {

	var self = this;
	
	self.relationship_data = {};
	
	for(var index = 0; index < self.relationships.length; index++) {
		var r = self.relationships[index];
		self.fetch_model_data(r);		
	}	
	self.on_related_model_data_loaded(complete_callback);
}

model_manager.prototype.delete_record = function(id, callback) {
	var self = this;
	$.ajax({
		url: config.app_url + 'ajax_model_interface/delete/' + this.model + '/' + id,
		success: function(response) {
			callback.call(self, response);
		}
	});
}

model_manager.prototype.load_record = function(id, callback) {
	var self = this;
	$.ajax({
		url: config.app_url + 'ajax_model_interface/load/' + this.model + '/' + id,
		success: function(response) {
			callback.call(self, response);
		}
	});
}

model_manager.prototype.save_record = function() {
	var self = this;
	var form_data = this.jform.find('form').formToJson();
	var data = {};
	data.data = form_data;
	$.ajax({
		url: config.app_url + 'ajax_model_interface/save/' + this.model,
		data: data,
		success: function(response) {
			self.reset_form_errors();
			if (response.validation == true) {
				self.grid_reload();
				self.set_form_editing(true);
				self.get_form_field('id').val(response.data.id);
				self.get_form_field('updated_on').val(response.data.updated_on);
				lm.alert(lang.model_manager.data_saved_message);
			} else {
				for (var key in response.validation) {
					var id = self.field_name_to_id(key);
					var input = self.jform.find('#' + id);
					if (!input.is(':visible')) {
						input = input.parent().find(input.data('error-container-selector'));
					}
					input.addClass('error');
				}
				lm.alert(lang.model_manager.data_validation_error_message);
			}
		}
	});
}


/***********************************************
 * Grid management
 ***********************************************/
model_manager.prototype.grid_has_selected = function() {
	var count = this.jgrid.find('.ui-state-highlight').length;
	if (count == 0 ) {
		lm.alert(lang.model_manager.grid_no_data_selected);
	}
	return count == 1;
}

model_manager.prototype.get_base_grid_url = function() {
	var self = this;
	var url = config.app_url + 'ajax_model_interface/jqgrid/' + self.model;
	return url;
}

model_manager.prototype.grid =  function(table_id, pager_id) {
	
	var self = this;

	self.table_id = table_id;
	self.pager_id = pager_id;
	
	var table_selector = '#' + table_id;
	var pager_selector = '#' + pager_id;

	var options = $.extend({
		add: true,
		edit: true,
		remove: true,
		column_chooser: true,
		resizable: true
	}, options);
	
	var grid_options = $.extend({
		rownumbers: true, 
		rownumWidth: 40, 
		gridview: true, 
		sortable: true,
		datatype: "json",
		rowNum: 10,
		rowList: [10, 20, 30],
		viewrecords: true,
		width: 800,
		height: '100%',
		altRows: true,					
		onSelectRow: function(id){
			self.selected_id = id;
		},
		ondblClickRow: function(id, row, col, e) {
			self.edit(self.selected_id);
		},
		loadComplete: function(){
		}	
	}, this.grid_options);

	grid_options.url = self.get_base_grid_url();
	grid_options.pager = pager_selector;
	
	this.jgrid = $(table_selector);
	this.jgrid.jqGrid(grid_options);
	
	this.jgrid.jqGrid('navGrid', pager_selector, {edit:false,add:false,del:false, search: false});
	
	if (options.add) {
		this.jgrid.jqGrid('navButtonAdd', pager_selector, {
			caption: "",
			title: lang.model_manager.grid_new_data,
			buttonicon: "ui-icon-plus",
			onClickButton: function() {
				self.add.call(self);
			}
		});
	}
	
	if (options.edit) {
		this.jgrid.jqGrid('navButtonAdd', pager_selector, {
			caption: "",
			title: lang.model_manager.grid_edit_data,
			buttonicon: "ui-icon-pencil",
			onClickButton: function() {
				if (self.grid_has_selected() ) {
					self.edit.call(self, self.selected_id);
				}
			}
		});
	}
	
	if (options.remove) {
		this.jgrid.jqGrid('navButtonAdd', pager_selector, {
			caption: '',
			title: lang.model_manager.grid_delete_data,
			buttonicon: "ui-icon-trash",
			onClickButton: function() {
				if (self.grid_has_selected() ) {
					self.remove.call(self, self.selected_id);
				}
			}
		});
	}
	
	if (options.column_chooser) {
		this.jgrid.jqGrid('navButtonAdd',pager_selector,{ 
			buttonicon: "ui-icon-key",
			caption: "", 
			title: lang.model_manager.grid_column_chooser, 
			onClickButton : function (){ 
				self.jgrid.jqGrid('columnChooser'); 
			} 
		}); 
	}

	if (options.resizable) {
		this.jgrid.jqGrid('gridResize',{minWidth:300,maxWidth:900,minHeight:80, maxHeight:600});
	}
	
};

model_manager.prototype.grid_reload = function() {
	if (this.jgrid != null) {
		this.jgrid.trigger("reloadGrid");
	}
}

/*
 * Form management
 */
model_manager.prototype.form = function(options) {
	var self = this;
	
	options = $.extend({
		autoOpen: false,
		modal: true,
		minWidth: 420
	}, options);
	
	self.jform = $('#' + this.form_name);
	self.jform.dialog(options);

	self.jform.bind('dialogclose', function(e, ui) {
		$('#tiptip_holder').hide();
	});

	var selector = '#' + self.form_name + ' [title]';
	lm.tooltip(selector, {defaultPosition: 'top', keepCursor: true, activation:'hover' });
};

model_manager.prototype.form_close = function() {
	if (this.jform != null) {
		this.jform.dialog("close");
	}
}

// callback must have callback...
model_manager.prototype.initialize_form = function(initialize_form_complete) {
	var self = this;
	
	var init = function() {
		self.reset_form();
		self.fetch_related_model_data(function() {

			initialize_form_complete.call(self);
			self.jform.find(':focus').blur();
			self.jform.dialog('open');
		});
	}
	if ($('#' + this.form_name).length == 0) {
		lm.get_form(this.form_name, function() {
			self.form(self.form_name);
			init.call(self);
		});
	} else {
		init.call(self);
	}
		
};
	
model_manager.prototype.set_form_editing = function(editing) {
	var self = this;

	var buttons_add = [
		{
			text: lang.model_manager.form_button_add_save,
			click: function() {
				self.save_record();
			}
		},
		{
			text: lang.model_manager.form_button_add_close,
			click: function() {
				$(this).dialog('close');
			}
		}
	];
	
	var buttons_edit = [
		{
			text: lang.model_manager.form_button_edit_save,
			click: function() {
				self.save_record();
			}
		},
		{
			text: lang.model_manager.form_button_edit_delete,
			click: function() {
				self.remove(self.get_form_field('id').val());
			}
		},
		{
			text: lang.model_manager.form_button_edit_close,
			click: function() {
				$(this).dialog('close');
			}
		}
	];
	

	if (editing) {
		self.jform.find('.form-read-only').show();
		self.jform.dialog('option', 'buttons', buttons_edit);
		
	} else {
		self.jform.find('.form-read-only').hide();
		self.jform.dialog('option', 'buttons', buttons_add);
	}
}

model_manager.prototype.add = function() {
	var self = this;
	this.initialize_form.call(this, function(initialize_form_complete) {
		self.set_form_editing(false);
		
		if (typeof callback != 'undefined') {
			initialize_form_complete.call(self);
		}
	});
};
	
model_manager.prototype.edit = function(id) {
	var self = this;
	this.initialize_form.call(this, function(initialize_form_complete) {

		self.set_form_editing(true);		

		self.load_record(id, function(response) {
			for(var field in response.data) {
				self.set_form_field(field, response.data[field]);
			}

			if (typeof callback != 'undefined') {
				initialize_form_complete.call(self);
			}
		})
	});
};

model_manager.prototype.remove = function (id) {
	var self = this;
	lm.confirm(lang.model_manager.confirm_delete, function() {
		self.delete_record(id, function() {
			self.grid_reload();
			self.form_close();
			lm.alert(lang.model_manager.data_deleted_message);
		});
	});
};

model_manager.prototype.field_name_to_id = function(name) {
	name = name.replace('_', '-');
	var id = this.model + '-' + name;
	return id;
}

model_manager.prototype.reset_form_errors = function() {
	this.jform.find('.error').removeClass('error');
}

model_manager.prototype.reset_form = function() {
	this.reset_form_errors();
	this.jform.find('form')[0].reset();
}

model_manager.prototype.get_form_field = function(name) {
	var id = this.field_name_to_id(name);
	return this.jform.find('#' + id);
}

model_manager.prototype.set_form_field = function(field, value) {
	var self = this;
	var field = self.get_form_field(field);
	field.val(value);
}


model_manager.prototype.populate_select_with_fetch_data = function($o, table, value_field, text_field) {
	for(var key in table.rows) {
		var data = table.rows[key];
		var value = data[value_field];
		var text = data[text_field];
		var option = $('<option></option>');
		option.val(value);
		option.append(text);
		$o.append(option);
	}
}