/* Sapns selector */
(function($) {
// SapnsSelector (constructor)
function SapnsSelector(settings) {
var _settings = $.extend(true, {
name: 'sapns_selector_' + Math.floor(Math.random()*999999),
value: '',
title: '',
rc: '',
rc_title: settings.rc.toUpperCase(),
read_only: false,
select: false,
title_url: "/dashboard/title/",
edit_url: "/dashboard/edit/",
onChange: null,
onClick: null,
dialog: {
modal: true,
draggable : true,
resizable: false,
closeOnEscape: false,
width: 'auto',
height: 'auto',
minHeight: 100,
dialogClass: "col-md-8 col-xs-12",
open: function(){
$(this)
.parents('.ui-dialog')
.css('width','');
$(this)
.dialog('option','position', {
my: "top center",
at: "center center",
of: window
});
},
},
grid: {
cls: settings.rc,
q: '',
rp: 10,
pag_n: 1,
with_pager: true,
pager_options: [{
val: 10,
desc: '10',
sel: true
},
{
val: 100,
desc: '100',
sel: false
},
{
val: 500,
desc: '500',
sel: false
}],
allow_multiselect: false,
height: 380,
exportable: false,
select_first: true,
search_params: {
url: settings.search_url,
data: settings.search_data
},
with_search: true,
multiselect: false,
with_filters: false,
show_options: false,
}
}, settings);
$.extend(true, this, _settings);
}
// setValue
SapnsSelector.prototype.setValue = function(value, no_callback) {
var self = this;
//if (!self.read_only) {
var change = self.value != value;
var old_value = self.value;
self.value = value;
/* ENDER.IE:
* Si hay cambio
* Si tiene onChange y no callback
* */
if (change && self.onChange && !no_callback && value!=null) {
self.onChange(value, old_value);
}
//}
$(document).find('#st_' + self.name).focus();
}
// getValue
SapnsSelector.prototype.getValue = function() {
return this.value;
}
// seTttritle
SapnsSelector.prototype.setTitle = function(dict, callback) {
var self = this,
id = '#st_' + self.name,
value = self.value;
if (value && self.rc) {
$(id).addClass('loading');
$.ajax({
url: self.title_url,
data: {
cls: self.rc,
id: self.value
},
success: function(data) {
$(id).removeClass('loading');
if (data.status) {
if(!self.select){
$(id).val(data.title).parent().attr('value', value);
self.title = data.title;
}else{
dict.push({ id: self.value, text: data.title });
callback(dict);
}
}
},
error: function() {
$(id).removeClass('loading');
}
});
}
else {
$(id).val('').parent().attr('value', '');
self.title = '';
}
}
// getTitle
SapnsSelector.prototype.getTitle = function() {
return this.title;
}
// getClass
SapnsSelector.prototype.getClass = function() {
return this.rc;
}
// remove
SapnsSelector.prototype.remove = function() {
this.setValue('');
this.setTitle();
}
// setEnabled
SapnsSelector.prototype.setReadonly = function(value) {
var self = this;
if (value === undefined) {
value = true;
}
$('#st_' + self.name).prop('disabled', value);
$('#sb_' + self.name).prop('disabled', value);
$('#rb_' + self.name).prop('disabled', value);
self.read_only = value;
}
SapnsSelector.prototype.dialog_name = function() {
var self = this;
return '#sp-selector-dialog-' + self.name;
}
$.fn.sapnsSelector = function(arg1, arg2, arg3) {
if (typeof(arg1) === "object") {
var self = this,
sapnsSelector = new SapnsSelector(arg1);
if(sapnsSelector.select){
updateSelector(self, sapnsSelector);
}else{
select_text = '';
self.append(select_text);
s_selector = '#st_' + sapnsSelector.name;
$(document).off('focusin', s_selector).on('focusin', s_selector, function() {
$(this).keypress( function(e){
if (e.keyCode == 32) {
if (!sapnsSelector.read_only) {
if (sapnsSelector.onClick) {
sapnsSelector.onClick(sapnsSelector.value);
}
else {
// dialog title
var dialog_title = sapnsSelector.rc_title;
if (typeof(sapnsSelector.rc_title) === 'function') {
dialog_title = sapnsSelector.rc_title();
}
var dialog_name_ = sapnsSelector.dialog_name().replace('#', '');
$(sapnsSelector.dialog_name()).remove();
$('
').appendTo('body');
$(sapnsSelector.dialog_name() + ' .sapnsGrid').sapnsGrid(sapnsSelector.grid);
var dialog_buttons = {
"Ok": function() {
// get the id of the selected row
var new_value = $(sapnsSelector.dialog_name() + ' .sapnsGrid').sapnsGrid('getSelectedIds')[0],
current_value = sapnsSelector.getValue();
sapnsSelector.setValue(new_value);
if (current_value != new_value) {
sapnsSelector.setTitle();
}
$(sapnsSelector.dialog_name()).dialog('destroy').remove();
}
};
// add extra buttons
if (sapnsSelector.dialog.extra_buttons) {
for (var i=0, l=sapnsSelector.dialog.extra_buttons.length; i', {
action: url_edit,
method: 'post',
target: '_blank'
});
var came_from = $('', {
name: 'came_from',
type: 'hidden',
value: ''
});
form_edit.append(came_from).appendTo('body').submit().remove();
}
else if (typeof(url_edit) === 'function') {
url_edit();
}
}
}
});
// select_button
var title = "Set value",
select_button = '
';
self.append(select_button);
$(document).on('click', '#sb_' + sapnsSelector.name, function() {
//self.find('#sb_' + sapnsSelector.name).click(function() {
if (!sapnsSelector.read_only) {
if (sapnsSelector.onClick) {
sapnsSelector.onClick(sapnsSelector.value);
}
else {
// dialog title
var dialog_title = sapnsSelector.rc_title;
if (typeof(sapnsSelector.rc_title) === 'function') {
dialog_title = sapnsSelector.rc_title();
}
var dialog_name_ = sapnsSelector.dialog_name().replace('#', '');
$(sapnsSelector.dialog_name()).remove();
$('').appendTo('body');
$(sapnsSelector.dialog_name() + ' .sapnsGrid').sapnsGrid(sapnsSelector.grid);
var dialog_buttons = {
"Ok": function() {
// get the id of the selected row
var new_value = $(sapnsSelector.dialog_name() + ' .sapnsGrid').sapnsGrid('getSelectedIds')[0],
current_value = sapnsSelector.getValue();
sapnsSelector.setValue(new_value);
if (current_value != new_value) {
sapnsSelector.setTitle();
}
$(sapnsSelector.dialog_name()).dialog('destroy').remove();
}
};
// add extra buttons
if (sapnsSelector.dialog.extra_buttons) {
for (var i=0, l=sapnsSelector.dialog.extra_buttons.length; i';
this.append(remove_button);
this.find('#rb_' + sapnsSelector.name).click(function() {
if (!sapnsSelector.read_only) {
sapnsSelector.remove();
}
});
//this.sapnsSelector = sapnsSelector;
this.data('sapnsSelector', sapnsSelector);
}
}
else if (typeof(arg1) === "string") {
var sapnsSelector = this.data('sapnsSelector');
if (arg1 === "setValue" && sapnsSelector) {
var current_value = sapnsSelector.getValue();
sapnsSelector.setValue(arg2, arg3);
if (current_value != arg2) {
sapnsSelector.setTitle();
}
}
// getValue()
else if (arg1 === "getValue") {
return $(this).val();
//return sapnsSelector.value;
}
// getTitle()
else if (arg1 === "getTitle") {
return sapnsSelector.title;
}
// getClass()
else if (arg1 === "getClass") {
return sapnsSelector.rc;
}
else if (arg1 === "setReadonly") {
sapnsSelector.setReadonly(arg2);
}
else if (arg1 === "isReadonly") {
return sapnsSelector.read_only;
}
// TODO: other sapnsSelector methods
}
return this;
};
function updateSelector(self, sapnsSelector){
$(self).selectize({
valueField: 'id',
labelField: 'text',
searchField: 'text',
create: false,
preload: true, //focus para cargar onclick
selectOnTab: true,
maxItems: 1,
diacritics: false,
render: {
option: function(item, escape) {
return '' + escape(item.text) + '
';
}
},
load: function(query, callback) {
var grid_url = sapnsSelector.search_url;
if(grid_url == undefined)
grid_url = "/dashboard/grid/";
$.ajax({
url: grid_url,
type: 'GET',
dataType: 'json',
data: {
q: query,
page_limit: 10,
cls: sapnsSelector.rc
},
error: function() {
callback();
},
success: function(res) {
var dict = [];
for(var i=0;i < res.data.length;i++){
dict.push({ id: res.data[i][0], text: res.data[i][1] });
}
if(sapnsSelector.value && (sapnsSelector.value == query || query == '')){
sapnsSelector.setTitle(dict, function(dict){
callback(dict);
$(self).selectize()[0].selectize.setValue(sapnsSelector.value);
});
}else{
callback(dict);
if(!query)
$(self).selectize()[0].selectize.setValue(sapnsSelector.value);
}
if(sapnsSelector.read_only == true || (res.data.length == 0 && query == '')){
$(self).selectize()[0].selectize.disable();
}
}
});
}
});
}
}) (jQuery);