123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708 |
- /**
- * jQuery EasyUI 1.5.2
- *
- * Copyright (c) 2009-2017 www.jeasyui.com. All rights reserved.
- *
- * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
- * To use it on other terms please contact us: info@jeasyui.com
- *
- */
- /**
- * combobox - jQuery EasyUI
- *
- * Dependencies:
- * combo
- *
- */
- (function($){
- function getRowIndex(target, value){
- var state = $.data(target, 'combobox');
- return $.easyui.indexOfArray(state.data, state.options.valueField, value);
- }
-
- /**
- * scroll panel to display the specified item
- */
- function scrollTo(target, value){
- var opts = $.data(target, 'combobox').options;
- var panel = $(target).combo('panel');
- var item = opts.finder.getEl(target, value);
- if (item.length){
- if (item.position().top <= 0){
- var h = panel.scrollTop() + item.position().top;
- panel.scrollTop(h);
- } else if (item.position().top + item.outerHeight() > panel.height()){
- var h = panel.scrollTop() + item.position().top + item.outerHeight() - panel.height();
- panel.scrollTop(h);
- }
- }
- panel.triggerHandler('scroll'); // trigger the group sticking
- }
-
- function nav(target, dir){
- var opts = $.data(target, 'combobox').options;
- var panel = $(target).combobox('panel');
- var item = panel.children('div.combobox-item-hover');
- if (!item.length){
- item = panel.children('div.combobox-item-selected');
- }
- item.removeClass('combobox-item-hover');
- var firstSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):first';
- var lastSelector = 'div.combobox-item:visible:not(.combobox-item-disabled):last';
- if (!item.length){
- item = panel.children(dir=='next' ? firstSelector : lastSelector);
- } else {
- if (dir == 'next'){
- item = item.nextAll(firstSelector);
- if (!item.length){
- item = panel.children(firstSelector);
- }
- } else {
- item = item.prevAll(firstSelector);
- if (!item.length){
- item = panel.children(lastSelector);
- }
- }
- }
- if (item.length){
- item.addClass('combobox-item-hover');
- var row = opts.finder.getRow(target, item);
- if (row){
- $(target).combobox('scrollTo', row[opts.valueField]);
- if (opts.selectOnNavigation){
- select(target, row[opts.valueField]);
- }
- }
- }
- }
-
- /**
- * select the specified value
- */
- function select(target, value, remainText){
- var opts = $.data(target, 'combobox').options;
- var values = $(target).combo('getValues');
- if ($.inArray(value+'', values) == -1){
- if (opts.multiple){
- values.push(value);
- } else {
- values = [value];
- }
- setValues(target, values, remainText);
- }
- }
-
- /**
- * unselect the specified value
- */
- function unselect(target, value){
- var opts = $.data(target, 'combobox').options;
- var values = $(target).combo('getValues');
- var index = $.inArray(value+'', values);
- if (index >= 0){
- values.splice(index, 1);
- setValues(target, values);
- }
- }
-
- /**
- * set values
- */
- function setValues(target, values, remainText){
- var opts = $.data(target, 'combobox').options;
- var panel = $(target).combo('panel');
-
- if (!$.isArray(values)){
- values = values.split(opts.separator);
- }
- if (!opts.multiple){
- values = values.length ? [values[0]] : [''];
- }
- // unselect the old rows
- var oldValues = $(target).combo('getValues');
- if (panel.is(':visible')){
- panel.find('.combobox-item-selected').each(function(){
- var row = opts.finder.getRow(target, $(this));
- if (row){
- if ($.easyui.indexOfArray(oldValues, row[opts.valueField]) == -1){
- $(this).removeClass('combobox-item-selected');
- }
- }
- });
- }
- $.map(oldValues, function(v){
- if ($.easyui.indexOfArray(values, v) == -1){
- var el = opts.finder.getEl(target, v);
- if (el.hasClass('combobox-item-selected')){
- el.removeClass('combobox-item-selected');
- opts.onUnselect.call(target, opts.finder.getRow(target, v));
- }
- }
- });
- var theRow = null;
- var vv = [], ss = [];
- for(var i=0; i<values.length; i++){
- var v = values[i];
- var s = v;
- var row = opts.finder.getRow(target, v);
- if (row){
- s = row[opts.textField];
- theRow = row;
- var el = opts.finder.getEl(target, v);
- if (!el.hasClass('combobox-item-selected')){
- el.addClass('combobox-item-selected');
- opts.onSelect.call(target, row);
- }
- }
- vv.push(v);
- ss.push(s);
- }
- if (!remainText){
- $(target).combo('setText', ss.join(opts.separator));
- }
- if (opts.showItemIcon){
- var tb = $(target).combobox('textbox');
- tb.removeClass('textbox-bgicon ' + opts.textboxIconCls);
- if (theRow && theRow.iconCls){
- tb.addClass('textbox-bgicon ' + theRow.iconCls);
- opts.textboxIconCls = theRow.iconCls;
- }
- }
- $(target).combo('setValues', vv);
- panel.triggerHandler('scroll'); // trigger the group sticking
- }
-
- /**
- * load data, the old list items will be removed.
- */
- function loadData(target, data, remainText){
- var state = $.data(target, 'combobox');
- var opts = state.options;
- state.data = opts.loadFilter.call(target, data);
- opts.view.render.call(opts.view, target, $(target).combo('panel'), state.data);
- var vv = $(target).combobox('getValues');
- $.easyui.forEach(state.data, false, function(row){
- if (row['selected']){
- $.easyui.addArrayItem(vv, row[opts.valueField]+'');
- }
- });
- if (opts.multiple){
- setValues(target, vv, remainText);
- } else {
- setValues(target, vv.length ? [vv[vv.length-1]] : [], remainText);
- }
-
- opts.onLoadSuccess.call(target, data);
- }
-
- /**
- * request remote data if the url property is setted.
- */
- function request(target, url, param, remainText){
- var opts = $.data(target, 'combobox').options;
- if (url){
- opts.url = url;
- }
- param = $.extend({}, opts.queryParams, param||{});
- // param = param || {};
-
- if (opts.onBeforeLoad.call(target, param) == false) return;
- opts.loader.call(target, param, function(data){
- loadData(target, data, remainText);
- }, function(){
- opts.onLoadError.apply(this, arguments);
- });
- }
-
- /**
- * do the query action
- */
- function doQuery(target, q){
- var state = $.data(target, 'combobox');
- var opts = state.options;
- var highlightItem = $();
- var qq = opts.multiple ? q.split(opts.separator) : [q];
- if (opts.mode == 'remote'){
- _setValues(qq);
- request(target, null, {q:q}, true);
- } else {
- var panel = $(target).combo('panel');
- panel.find('.combobox-item-hover').removeClass('combobox-item-hover');
- panel.find('.combobox-item,.combobox-group').hide();
- var data = state.data;
- var vv = [];
- $.map(qq, function(q){
- q = $.trim(q);
- var value = q;
- var group = undefined;
- highlightItem = $();
- for(var i=0; i<data.length; i++){
- var row = data[i];
- if (opts.filter.call(target, q, row)){
- var v = row[opts.valueField];
- var s = row[opts.textField];
- var g = row[opts.groupField];
- var item = opts.finder.getEl(target, v).show();
- if (s.toLowerCase() == q.toLowerCase()){
- value = v;
- if (opts.reversed){
- highlightItem = item;
- } else {
- select(target, v, true);
- }
- }
- if (opts.groupField && group != g){
- opts.finder.getGroupEl(target, g).show();
- group = g;
- }
- }
- }
- vv.push(value);
- });
- _setValues(vv);
- }
- function _setValues(vv){
- if (opts.reversed){
- highlightItem.addClass('combobox-item-hover');
- } else {
- setValues(target, opts.multiple ? (q?vv:[]) : vv, true);
- }
- }
- }
-
- function doEnter(target){
- var t = $(target);
- var opts = t.combobox('options');
- var panel = t.combobox('panel');
- var item = panel.children('div.combobox-item-hover');
- if (item.length){
- item.removeClass('combobox-item-hover');
- var row = opts.finder.getRow(target, item);
- var value = row[opts.valueField];
- if (opts.multiple){
- if (item.hasClass('combobox-item-selected')){
- t.combobox('unselect', value);
- } else {
- t.combobox('select', value);
- }
- } else {
- t.combobox('select', value);
- }
- }
- var vv = [];
- $.map(t.combobox('getValues'), function(v){
- if (getRowIndex(target, v) >= 0){
- vv.push(v);
- }
- });
- t.combobox('setValues', vv);
- if (!opts.multiple){
- t.combobox('hidePanel');
- }
- }
-
- /**
- * create the component
- */
- function create(target){
- var state = $.data(target, 'combobox');
- var opts = state.options;
-
- $(target).addClass('combobox-f');
- $(target).combo($.extend({}, opts, {
- onShowPanel: function(){
- $(this).combo('panel').find('div.combobox-item:hidden,div.combobox-group:hidden').show();
- setValues(this, $(this).combobox('getValues'), true);
- $(this).combobox('scrollTo', $(this).combobox('getValue'));
- opts.onShowPanel.call(this);
- }
- }));
- var p = $(target).combo('panel');
- p.unbind('.combobox');
- for(var event in opts.panelEvents){
- p.bind(event+'.combobox', {target:target}, opts.panelEvents[event]);
- }
- }
- function mouseoverHandler(e){
- $(this).children('div.combobox-item-hover').removeClass('combobox-item-hover');
- var item = $(e.target).closest('div.combobox-item');
- if (!item.hasClass('combobox-item-disabled')){
- item.addClass('combobox-item-hover');
- }
- e.stopPropagation();
- }
- function mouseoutHandler(e){
- $(e.target).closest('div.combobox-item').removeClass('combobox-item-hover');
- e.stopPropagation();
- }
- function clickHandler(e){
- var target = $(this).panel('options').comboTarget;
- if (!target){return;}
- var opts = $(target).combobox('options');
- var item = $(e.target).closest('div.combobox-item');
- if (!item.length || item.hasClass('combobox-item-disabled')){return}
- var row = opts.finder.getRow(target, item);
- if (!row){return;}
- if (opts.blurTimer){
- clearTimeout(opts.blurTimer);
- opts.blurTimer = null;
- }
- opts.onClick.call(target, row);
- var value = row[opts.valueField];
- if (opts.multiple){
- if (item.hasClass('combobox-item-selected')){
- unselect(target, value);
- } else {
- select(target, value);
- }
- } else {
- $(target).combobox('setValue', value).combobox('hidePanel');
- }
- e.stopPropagation();
- }
- function scrollHandler(e){
- var target = $(this).panel('options').comboTarget;
- if (!target){return;}
- var opts = $(target).combobox('options');
- if (opts.groupPosition == 'sticky'){
- var stick = $(this).children('.combobox-stick');
- if (!stick.length){
- stick = $('<div class="combobox-stick"></div>').appendTo(this);
- }
- stick.hide();
- var state = $(target).data('combobox');
- $(this).children('.combobox-group:visible').each(function(){
- var g = $(this);
- var groupData = opts.finder.getGroup(target, g);
- var rowData = state.data[groupData.startIndex + groupData.count - 1];
- var last = opts.finder.getEl(target, rowData[opts.valueField]);
- if (g.position().top < 0 && last.position().top > 0){
- stick.show().html(g.html());
- return false;
- }
- });
- }
- }
-
- $.fn.combobox = function(options, param){
- if (typeof options == 'string'){
- var method = $.fn.combobox.methods[options];
- if (method){
- return method(this, param);
- } else {
- return this.combo(options, param);
- }
- }
-
- options = options || {};
- return this.each(function(){
- var state = $.data(this, 'combobox');
- if (state){
- $.extend(state.options, options);
- } else {
- state = $.data(this, 'combobox', {
- options: $.extend({}, $.fn.combobox.defaults, $.fn.combobox.parseOptions(this), options),
- data: []
- });
- }
- create(this);
- if (state.options.data){
- loadData(this, state.options.data);
- } else {
- var data = $.fn.combobox.parseData(this);
- if (data.length){
- loadData(this, data);
- }
- }
- request(this);
- });
- };
-
-
- $.fn.combobox.methods = {
- options: function(jq){
- var copts = jq.combo('options');
- return $.extend($.data(jq[0], 'combobox').options, {
- width: copts.width,
- height: copts.height,
- originalValue: copts.originalValue,
- disabled: copts.disabled,
- readonly: copts.readonly
- });
- },
- cloneFrom: function(jq, from){
- return jq.each(function(){
- $(this).combo('cloneFrom', from);
- $.data(this, 'combobox', $(from).data('combobox'));
- $(this).addClass('combobox-f').attr('comboboxName', $(this).attr('textboxName'));
- });
- },
- getData: function(jq){
- return $.data(jq[0], 'combobox').data;
- },
- setValues: function(jq, values){
- return jq.each(function(){
- setValues(this, values);
- });
- },
- setValue: function(jq, value){
- return jq.each(function(){
- setValues(this, $.isArray(value)?value:[value]);
- });
- },
- clear: function(jq){
- return jq.each(function(){
- setValues(this, []);
- });
- },
- reset: function(jq){
- return jq.each(function(){
- var opts = $(this).combobox('options');
- if (opts.multiple){
- $(this).combobox('setValues', opts.originalValue);
- } else {
- $(this).combobox('setValue', opts.originalValue);
- }
- });
- },
- loadData: function(jq, data){
- return jq.each(function(){
- loadData(this, data);
- });
- },
- reload: function(jq, url){
- return jq.each(function(){
- if (typeof url == 'string'){
- request(this, url);
- } else {
- if (url){
- var opts = $(this).combobox('options');
- opts.queryParams = url;
- }
- request(this);
- }
- });
- },
- select: function(jq, value){
- return jq.each(function(){
- select(this, value);
- });
- },
- unselect: function(jq, value){
- return jq.each(function(){
- unselect(this, value);
- });
- },
- scrollTo: function(jq, value){
- return jq.each(function(){
- scrollTo(this, value);
- });
- }
- };
-
- $.fn.combobox.parseOptions = function(target){
- var t = $(target);
- return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target,[
- 'valueField','textField','groupField','groupPosition','mode','method','url',
- {showItemIcon:'boolean',limitToList:'boolean'}
- ]));
- };
-
- $.fn.combobox.parseData = function(target){
- var data = [];
- var opts = $(target).combobox('options');
- $(target).children().each(function(){
- if (this.tagName.toLowerCase() == 'optgroup'){
- var group = $(this).attr('label');
- $(this).children().each(function(){
- _parseItem(this, group);
- });
- } else {
- _parseItem(this);
- }
- });
- return data;
-
- function _parseItem(el, group){
- var t = $(el);
- var row = {};
- row[opts.valueField] = t.attr('value')!=undefined ? t.attr('value') : t.text();
- row[opts.textField] = t.text();
- row['selected'] = t.is(':selected');
- row['disabled'] = t.is(':disabled');
- if (group){
- opts.groupField = opts.groupField || 'group';
- row[opts.groupField] = group;
- }
- data.push(row);
- }
- };
- var COMBOBOX_SERNO = 0;
- var defaultView = {
- render: function(target, container, data){
- var state = $.data(target, 'combobox');
- var opts = state.options;
- COMBOBOX_SERNO++;
- state.itemIdPrefix = '_easyui_combobox_i' + COMBOBOX_SERNO;
- state.groupIdPrefix = '_easyui_combobox_g' + COMBOBOX_SERNO;
- state.groups = [];
-
- var dd = [];
- var group = undefined;
- for(var i=0; i<data.length; i++){
- var row = data[i];
- var v = row[opts.valueField]+'';
- var s = row[opts.textField];
- var g = row[opts.groupField];
-
- if (g){
- if (group != g){
- group = g;
- state.groups.push({
- value: g,
- startIndex: i,
- count: 1
- });
- dd.push('<div id="' + (state.groupIdPrefix+'_'+(state.groups.length-1)) + '" class="combobox-group">');
- dd.push(opts.groupFormatter ? opts.groupFormatter.call(target, g) : g);
- dd.push('</div>');
- } else {
- state.groups[state.groups.length-1].count++;
- }
- } else {
- group = undefined;
- }
-
- var cls = 'combobox-item' + (row.disabled ? ' combobox-item-disabled' : '') + (g ? ' combobox-gitem' : '');
- dd.push('<div id="' + (state.itemIdPrefix+'_'+i) + '" class="' + cls + '">');
- if (opts.showItemIcon && row.iconCls){
- dd.push('<span class="combobox-icon ' + row.iconCls + '"></span>');
- }
- dd.push(opts.formatter ? opts.formatter.call(target, row) : s);
- dd.push('</div>');
- }
- $(container).html(dd.join(''));
- }
- };
-
- $.fn.combobox.defaults = $.extend({}, $.fn.combo.defaults, {
- valueField: 'value',
- textField: 'text',
- groupPosition: 'static', // or 'sticky'
- groupField: null,
- groupFormatter: function(group){return group;},
- mode: 'local', // or 'remote'
- method: 'post',
- url: null,
- data: null,
- queryParams: {},
- showItemIcon: false,
- limitToList: false, // limit the inputed values to the listed items
- view: defaultView,
-
- keyHandler: {
- up: function(e){nav(this,'prev');e.preventDefault()},
- down: function(e){nav(this,'next');e.preventDefault()},
- left: function(e){},
- right: function(e){},
- enter: function(e){doEnter(this)},
- query: function(q,e){doQuery(this, q)}
- },
- inputEvents: $.extend({}, $.fn.combo.defaults.inputEvents, {
- blur: function(e){
- var target = e.data.target;
- var opts = $(target).combobox('options');
- if (opts.reversed || opts.limitToList){
- if (opts.blurTimer){
- clearTimeout(opts.blurTimer);
- }
- opts.blurTimer = setTimeout(function(){
- var existing = $(target).parent().length;
- if (existing){
- if (opts.reversed){
- $(target).combobox('setValues', $(target).combobox('getValues'));
- } else if (opts.limitToList){
- doEnter(target);
- }
- opts.blurTimer = null;
- }
- },50);
- }
- }
- }),
- panelEvents: {
- mouseover: mouseoverHandler,
- mouseout: mouseoutHandler,
- click: clickHandler,
- scroll: scrollHandler
- },
- filter: function(q, row){
- var opts = $(this).combobox('options');
- return row[opts.textField].toLowerCase().indexOf(q.toLowerCase()) >= 0;
- },
- formatter: function(row){
- var opts = $(this).combobox('options');
- return row[opts.textField];
- },
- loader: function(param, success, error){
- var opts = $(this).combobox('options');
- if (!opts.url) return false;
- $.ajax({
- type: opts.method,
- url: opts.url,
- data: param,
- dataType: 'json',
- success: function(data){
- success(data);
- },
- error: function(){
- error.apply(this, arguments);
- }
- });
- },
- loadFilter: function(data){
- return data;
- },
- finder:{
- getEl:function(target, value){
- var index = getRowIndex(target, value);
- var id = $.data(target, 'combobox').itemIdPrefix + '_' + index;
- return $('#'+id);
- },
- getGroupEl:function(target, gvalue){
- var state = $.data(target, 'combobox');
- var index = $.easyui.indexOfArray(state.groups, 'value', gvalue);
- var id = state.groupIdPrefix + '_' + index;
- return $('#'+id);
- },
- getGroup:function(target, p){
- var state = $.data(target, 'combobox');
- var index = p.attr('id').substr(state.groupIdPrefix.length+1);
- return state.groups[parseInt(index)];
- },
- getRow:function(target, p){
- var state = $.data(target, 'combobox');
- var index = (p instanceof $) ? p.attr('id').substr(state.itemIdPrefix.length+1) : getRowIndex(target, p);
- return state.data[parseInt(index)];
- }
- },
-
- onBeforeLoad: function(param){},
- onLoadSuccess: function(data){},
- onLoadError: function(){},
- onSelect: function(record){},
- onUnselect: function(record){},
- onClick: function(record){}
- });
- })(jQuery);
|