mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-05 06:45:32 +08:00
1323 lines
35 KiB
JavaScript
1323 lines
35 KiB
JavaScript
/**
|
|
* Shopex OMS
|
|
*
|
|
* Copyright (c) 2025 Shopex (http://www.shopex.cn)
|
|
* Licensed under Apache-2.0 with additional terms (See LICENSE file)
|
|
*/
|
|
|
|
/*
|
|
Finder Class
|
|
@autohr litie@shopex.cn
|
|
@copyright www.shopex.cn
|
|
*/
|
|
(function() {
|
|
|
|
/*全局 finderGroup HASH*/
|
|
finderGroup = {};
|
|
|
|
|
|
this.finderDestory = function() {
|
|
for (var key in finderGroup) {
|
|
delete finderGroup[key];
|
|
}
|
|
};
|
|
|
|
var _createRemoteEvents = function(revent,ctl, colinfo) {
|
|
|
|
ctl = ctl || 'controller';
|
|
var _return = {};
|
|
var obj = {};
|
|
|
|
obj[ctl] = obj[ctl] || {};
|
|
|
|
obj[ctl][colinfo[0]] = colinfo[1];
|
|
_return[revent] = obj;
|
|
return _return;
|
|
|
|
};
|
|
|
|
|
|
var FinderColDrag = new Class({
|
|
Extends: Drag,
|
|
start: function(event) {
|
|
|
|
//if(this.element.getParent('.finder-header').scrollLeft>0)return;
|
|
this.parent(event);
|
|
}
|
|
});
|
|
|
|
/*
|
|
单元格编辑定位函数。
|
|
*/
|
|
var _position = function(panel, event, rela, offsets) {
|
|
offsets = offsets || {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
|
|
var size = (rela || window).getSize(),
|
|
scroll = (rela || window).getScroll();
|
|
|
|
var tip = {
|
|
x: panel.offsetWidth,
|
|
y: panel.offsetHeight
|
|
};
|
|
var props = {
|
|
x: 'left',
|
|
y: 'top'
|
|
};
|
|
for (var z in props) {
|
|
var pos = event.page[z] + offsets[z];
|
|
if ((pos + tip[z] - scroll[z]) > size[z]) {
|
|
|
|
pos = event.page[z] - offsets[z] - tip[z];
|
|
|
|
}
|
|
panel.setStyle(props[z], pos);
|
|
}
|
|
|
|
};
|
|
|
|
/*Finder 类定义*/
|
|
Finder = new Class({
|
|
Implements: [Events],
|
|
options: {
|
|
selectName: 'items[]'
|
|
},
|
|
detailStatus: {},
|
|
initialize: function(finderId, options) {
|
|
|
|
$extend(this.options, options);
|
|
/*init finder area*/
|
|
this.id = finderId;
|
|
|
|
this.initStaticView();
|
|
|
|
this.initView();
|
|
|
|
this.listContainer = this.list.getContainer();
|
|
|
|
this.attachStaticEvents();
|
|
|
|
this.attachEvents();
|
|
|
|
if (this.options.packet) {
|
|
|
|
this.loadPacket();
|
|
|
|
}
|
|
|
|
},
|
|
/*初始化 Finder 静态Elements*/
|
|
initStaticView: function() {
|
|
|
|
$each(['action', 'form', 'filter', 'search', 'tip', 'header', 'footer', 'pager', 'packet'], function(p) {
|
|
|
|
this[p] = $('finder-' + p + '-' + this.id);
|
|
|
|
},
|
|
this);
|
|
|
|
},
|
|
/*初始化 Finder 动态Elements*/
|
|
initView: function() {
|
|
|
|
/* $each(['header','list','footer'],function(p){
|
|
|
|
this[p]=$('finder-'+p+'-'+this.id);
|
|
if('list'==p){
|
|
this[p].store('visibility',true);
|
|
}
|
|
},this);
|
|
*/
|
|
this.list = $('finder-list-' + this.id).store('visibility', true);
|
|
this.tip = $('finder-tip-' + this.id);
|
|
|
|
},
|
|
isVisibile: function() {
|
|
if (!this.list['retrieve']) return false;
|
|
return $chk(this.list.retrieve('visibility'));
|
|
},
|
|
attachStaticEvents: function() {
|
|
var finder = this;
|
|
|
|
if (finder.search) {
|
|
var search_input = finder.search.getElement('input[search]').addEvent('keypress', function(e) {
|
|
if (e.code === 13) {
|
|
e.stop();
|
|
if (!this.value.trim().length) {
|
|
finder.filter.value = '';
|
|
}
|
|
var rowselected = finder.form.retrieve('rowselected', []);
|
|
finder.refresh(rowselected.length&&!rowselected.contains('_ALL_')&&!confirm(LANG_Finder['refresh_confirm']));
|
|
}
|
|
});
|
|
finder.search.getElement('.finder-search-btn').addEvent('click', function() {
|
|
search_input.fireEvent('keypress', {
|
|
stop: $empty,
|
|
code: 13
|
|
});
|
|
});
|
|
|
|
/*if(search_input.value.trim()!=''){
|
|
|
|
search_input.fireEvent('keypress',{stop:$empty,code:13});
|
|
|
|
search_input.focus();
|
|
} */
|
|
}
|
|
|
|
if (finder.action) {
|
|
|
|
finder.action.getElements('*[submit]').addEvent('click', function(e) {
|
|
if(e&&e.stop){e.stop();}
|
|
var target = this.get('target');
|
|
var actionUrl = this.get('submit');
|
|
var itemSelected = finder.form.retrieve('rowselected');
|
|
|
|
/*rowindex*/
|
|
var itemindex= finder.form.retrieve('_rowindex',$H());
|
|
|
|
if(!itemSelected) itemSelected=[];
|
|
|
|
if(!itemSelected.length&&itemindex)
|
|
itemindex.getValues().sort(function(a,b){
|
|
return a.toInt()-b.toInt();
|
|
}).each(function(item){
|
|
itemSelected.push(itemindex.keyOf(item));
|
|
});
|
|
|
|
var tmpForm = new Element('form'),
|
|
fdoc = document.createDocumentFragment();
|
|
var isSelectedAll = false;
|
|
itemSelected.each(function(v) {
|
|
var _name = finder.options.selectName;
|
|
if (v == '_ALL_')
|
|
isSelectedAll = _name = 'isSelectedAll';
|
|
fdoc.appendChild(new Element('input', {
|
|
type: 'hidden',
|
|
'name': _name,
|
|
value: v
|
|
}));
|
|
});
|
|
|
|
tmpForm.appendChild(fdoc);
|
|
if (!tmpForm.getFirst()) return MessageBox.error(LANG_Finder['error']);
|
|
|
|
/*for(n in itemSelected){
|
|
if(n){
|
|
$A(itemSelected[n]).each(function(v){
|
|
fdoc.appendChild(new Element('input',{type:'hidden','name':n,value:v}));
|
|
})
|
|
tmpForm.appendChild(fdoc);
|
|
}
|
|
}*/
|
|
|
|
var targetType = target,
|
|
targetOptions = {};
|
|
|
|
if (target && target.contains('::')) {
|
|
targetType = target.split('::')[0];
|
|
targetOptions = JSON.decode(target.split('::')[1]);
|
|
if ($type(targetOptions) != 'object') {
|
|
targetOptions = {};
|
|
}
|
|
}
|
|
|
|
|
|
var con = this.getProperty('confirm');
|
|
if (!!con&&!window.confirm(con)){return;}
|
|
|
|
if (isSelectedAll) {
|
|
var fgqs = finder.form.action.match(/\?([\s\S]+$)/);
|
|
fgqs = fgqs[1]?fgqs[1]:'';
|
|
var querystring = [fgqs,finder.form.toQueryString(), finder.filter.value].join('&');
|
|
tmpForm.adopt(querystring.toFormElements());
|
|
}
|
|
|
|
switch (targetType) {
|
|
|
|
case 'refresh':
|
|
W.page(actionUrl, $extend({
|
|
data: tmpForm,
|
|
method: 'post',
|
|
onComplete: finder.refresh.bind(finder)
|
|
},
|
|
targetOptions));
|
|
break;
|
|
case 'command':
|
|
new cmdrunner(actionurl, {
|
|
onSuccess: finder.refresh.bind(finder)
|
|
});
|
|
break;
|
|
case 'dialog':
|
|
new Dialog(actionUrl, $extend({
|
|
title: this.get('dialogtitle') || this.get('text'),
|
|
ajaxoptions: {
|
|
data: tmpForm,
|
|
method: 'post'
|
|
},
|
|
onClose: function() {
|
|
finder.unselectAll();
|
|
finder.refresh.call(finder);
|
|
}
|
|
},
|
|
targetOptions));
|
|
break;
|
|
case '_blank':
|
|
var _blankForm = tmpForm.set({
|
|
action: actionUrl,
|
|
name: targetType,
|
|
target: '_blank',
|
|
method: 'post'
|
|
}).inject(document.body);
|
|
_blankForm.submit();
|
|
_blankForm.remove.delay(1000, _blankForm);
|
|
break;
|
|
default:
|
|
W.page(actionUrl, $extend({
|
|
data: tmpForm,
|
|
method: 'post'
|
|
},
|
|
targetOptions));
|
|
break;
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (finder.header) {
|
|
|
|
finder.header.addEvent('click', function(e) {
|
|
var target = $(e.target);
|
|
if (!target.hasClass('orderable')) {
|
|
target = target.getParent('.orderable');
|
|
}
|
|
if (!target) return;
|
|
var forFill = [('desc' == target.get('order')) ? 'asc': 'desc', target.get('key')].link({
|
|
'_finder[orderType]': String.type,
|
|
'_finder[orderBy]': String.type
|
|
});
|
|
finder.fillForm(forFill).refresh();
|
|
e.stopPropagation();
|
|
return;
|
|
});
|
|
|
|
var headerResizeHandle = function(main_w,main_h){
|
|
try{
|
|
finder.header.setStyles({'width':finder.listContainer.clientWidth-finder.listContainer.getPatch().x});
|
|
}catch(e){}
|
|
};
|
|
headerResizeHandle();
|
|
LAYOUT.content_main.addEvent('resizelayout',headerResizeHandle);
|
|
|
|
finder.header.addEvent('dispose',function(){
|
|
LAYOUT.content_main.removeEvent('resizelayout',headerResizeHandle);
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
selectAll: function() {
|
|
var sellist = this.header.getElement('.sellist');
|
|
sellist.set('checked', true).fireEvent('change');
|
|
this.tip.fireEvent('_update', 'selectedall').fireEvent('_show');
|
|
this.form.retrieve('rowselected').empty().push('_ALL_');
|
|
},
|
|
unselectAll: function() {
|
|
var sellist = this.header.getElement('.sellist');
|
|
sellist.set('checked', false).fireEvent('change');
|
|
this.form.retrieve('rowselected').empty();
|
|
|
|
this.form.retrieve('_rowindex',$H()).empty();
|
|
|
|
this.tip.fireEvent('_hide');
|
|
},
|
|
selectFav:function(un){
|
|
this.list.getElements('table tbody td:nth-child(first)').each(function(selP){
|
|
var input_chekbox = selP.getElement('input[type=checkbox]');
|
|
if(selP.getElement('.fav-star-on')){
|
|
input_chekbox.set('checked',(!un)).fireEvent('change');
|
|
}else{
|
|
input_chekbox.set('checked',!!un).fireEvent('change');
|
|
}
|
|
});
|
|
},
|
|
selectunFav:function(){
|
|
this.selectFav(true);
|
|
},
|
|
attachEvents: function() {
|
|
|
|
var finder = this;
|
|
var finderListContainer = this.listContainer;
|
|
/*finderListEventInfo*/
|
|
var fleinfo = finder.list.retrieve('eventInfo', {});
|
|
|
|
/*rowselected Array*/
|
|
var frowselected = finder.form.retrieve('rowselected', []);
|
|
|
|
/*finder drag col*/
|
|
if (finder.header&&finder.list.getElement('tr')) {
|
|
var finder_header_inner = finder.header.getElement('.finder-header');
|
|
var finder_col_resizer = finder_header_inner.getElements('.finder-col-resizer');
|
|
var finder_header_cols = finder_header_inner.getElements('col');
|
|
var finder_header_tds = finder_header_inner.getElement('tr').getChildren();
|
|
var finder_list_cols = finder.list.getElements('col');
|
|
|
|
new FinderColDrag(finder_header_inner, {
|
|
modifiers: {
|
|
'x': false,
|
|
'y':false
|
|
},
|
|
limit: {
|
|
'x': [35, 1000]
|
|
},
|
|
handle: Array.from(finder_col_resizer),
|
|
onStart: function(el,evt) {
|
|
|
|
el.addClass('col-resizing');
|
|
var _td;
|
|
if(evt.target.getParent('.cell')){
|
|
_td = evt.target.getParent('.cell').getParent('td')
|
|
}else if(evt.target.getParent('td')){
|
|
_td = evt.target.getParent('td');
|
|
}else{
|
|
_td = evt.target;
|
|
}
|
|
var _index = finder_header_tds.indexOf(_td);
|
|
if(_index<0)return this.cancel();
|
|
|
|
var resizer = finder_header_tds[_index].getElement('.finder-col-resizer');
|
|
|
|
el.store('_dragTargetIndex',_index);
|
|
|
|
finder_header_cols[_index].addClass('resizing').setStyle('background','#e9e9e9');
|
|
|
|
var moveEL = el.retrieve('_dragTargetMoveEl');
|
|
if(!moveEL){
|
|
moveEL = new Element('div',{
|
|
'class':'resize-move-el',
|
|
styles:{
|
|
height:finder.header.offsetHeight+finderListContainer.offsetHeight,
|
|
width:resizer.offsetWidth,
|
|
position:'absolute',
|
|
top:resizer.getPosition().y,
|
|
left:resizer.getPosition().x,
|
|
background:'#e9e9e9',
|
|
zIndex:65535,
|
|
cursor:'col-resize',
|
|
opacity:.8,
|
|
borderRight:'1px #cccccc solid'
|
|
}
|
|
}).inject(document.body);
|
|
|
|
el.store('_dragTargetMoveEl',moveEL);
|
|
};
|
|
|
|
|
|
|
|
},
|
|
onDrag: function(el) {
|
|
el.retrieve('_dragTargetMoveEl').setStyle('left',this.mouse.now.x);
|
|
|
|
},
|
|
onComplete: function(el) {
|
|
|
|
el.removeClass('col-resizing');
|
|
var _index = el.retrieve('_dragTargetIndex');
|
|
var tcol = finder_header_cols[_index].removeClass('resizing').setStyle('background','');
|
|
|
|
if(!el.retrieve('_dragTargetMoveEl'))return;
|
|
el.retrieve('_dragTargetMoveEl').dispose();
|
|
el.eliminate('_dragTargetMoveEl');
|
|
|
|
var mouselimit = (this.mouse.now.x - this.mouse.start.x);
|
|
|
|
var startWidth = tcol.getStyle('width').toInt();
|
|
|
|
var nowWidth = (startWidth+mouselimit).limit(this.options.limit.x[0],this.options.limit.x[1]);
|
|
|
|
var fixEls = $$(tcol,finder_list_cols[_index]);
|
|
|
|
var targetListTd = finder.list.getElement('tr').getElement('td:nth-child(' + (_index+1) + ')');
|
|
|
|
if (window.webkit) {
|
|
fixEls = $$(fixEls,
|
|
finder_header_tds[_index],
|
|
targetListTd
|
|
);
|
|
}
|
|
|
|
fixEls.setStyle('width', nowWidth);
|
|
|
|
var sl = finderListContainer.scrollLeft,s = finderListContainer.offsetWidth,sw = finderListContainer.scrollWidth;
|
|
if (sl>0&&sl+s>=sw) {
|
|
var lw = nowWidth - startWidth;
|
|
if(lw<0){
|
|
finderListContainer.scrollLeft = (finderListContainer.scrollLeft - Math.abs(lw)).limit(0, finderListContainer.scrollWidth);
|
|
}
|
|
}
|
|
|
|
if (!targetListTd) return;
|
|
var key = targetListTd.get('key');
|
|
EventsRemote.post({
|
|
events:_createRemoteEvents('finder_colset',finder.options.object_name + '_' + finder.options.finder_aliasname,[key,nowWidth])
|
|
});
|
|
|
|
}
|
|
});
|
|
|
|
|
|
}
|
|
|
|
if (finder.tip) {
|
|
|
|
finder.tip.addEvents({
|
|
'_update': function(className, selectedCount) {
|
|
if (this.retrieve('arg:class', 'NULL') != className) {
|
|
$$(this.childNodes).hide();
|
|
}
|
|
var el = this.getElement('.' + className);
|
|
|
|
if (!!el) {
|
|
el.innerHTML = el.innerHTML.replace(/<em>([\s\S]*?)<\/em>/ig, function() {
|
|
|
|
return '<em>' + selectedCount + '</em>';
|
|
});
|
|
el.setStyle('display', 'block');
|
|
}
|
|
this.store('arg:class', className);
|
|
|
|
|
|
if(!this.retrieve('tipclone')){
|
|
var tipclone = new Element('div',{'class':'hide','html':' ',styles:{'height':this.offsetHeight}}).injectTop(finderListContainer);
|
|
this.store('tipclone',tipclone);
|
|
}
|
|
},
|
|
'_show': function() {
|
|
if (this.style.visibility != 'hidden') return;
|
|
this.setStyle('visibility','visible');
|
|
this.retrieve('tipclone').removeClass('hide');
|
|
},
|
|
'_hide': function() {
|
|
if (this.style.visibility == 'hidden') return;
|
|
this.setStyle('visibility','hidden');
|
|
this.retrieve('tipclone').addClass('hide');
|
|
}
|
|
});
|
|
|
|
var selectedLength = frowselected.length;
|
|
|
|
if (selectedLength > 1) {
|
|
if (selectedLength == finder.tip.get('count').toInt() || frowselected.contains('_ALL_')) {
|
|
finder.tip.fireEvent('_update', ['selectedall', selectedLength]).fireEvent('_show');
|
|
} else {
|
|
finder.tip.fireEvent('_update', ['selected', selectedLength]).fireEvent('_show');
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*finder.list.addEvent('selectstart',function(e){
|
|
e.stop();
|
|
});*/
|
|
|
|
finder.list.addEvents({
|
|
'selectrow': function(ckbox) {
|
|
ckbox.getParent('.row').addClass('selected');
|
|
},
|
|
'unselectrow': function(ckbox) {
|
|
ckbox.getParent('.row').removeClass('selected');
|
|
}
|
|
});
|
|
|
|
var selectHandles = finder.list.getElements('.sel');
|
|
|
|
finder.rowCount = selectHandles.length;
|
|
|
|
if (finder.header && finder.header.getElement('.sellist')) {
|
|
var sellist = finder.header.getElement('.sellist').addEvent('change', function() {
|
|
selectHandles.set('checked', this.checked).fireEvent('change');
|
|
});
|
|
}
|
|
/*数据行 预处理*/
|
|
selectHandles.each(function(sel) {
|
|
|
|
if (Browser.ie) {
|
|
sel.addEvent('click', function() {
|
|
this.fireEvent('change');
|
|
});
|
|
sel.addEvent('focus', function() {
|
|
this.blur();
|
|
});
|
|
}
|
|
|
|
sel.addEvent('change', function() {
|
|
|
|
if (!sellist) {
|
|
frowselected.empty().push(this.value);
|
|
} else {
|
|
frowselected[this.checked ? 'include': 'erase'](this.value);
|
|
|
|
/*rowindex Hash*/
|
|
var frowindex= finder.form.retrieve('_rowindex', $H());
|
|
this.checked ? frowindex.set(this.value,this.get('rowindex')):frowindex.erase(this.value);
|
|
}
|
|
|
|
if (!this.checked && frowselected.contains('_ALL_')) {
|
|
frowselected.erase('_ALL_');
|
|
return finder.unselectAll();
|
|
}
|
|
|
|
var selectedLength = frowselected.length;
|
|
|
|
var displayTipDelay = 0;
|
|
|
|
if (selectedLength > 1) {
|
|
if (selectedLength == finder.tip.get('count').toInt() || frowselected.contains('_ALL_')) {
|
|
|
|
finder.tip.fireEvent('_update', ['selectedall', selectedLength]).fireEvent('_show');
|
|
|
|
} else {
|
|
finder.tip.fireEvent('_update', ['selected', selectedLength]);
|
|
displayTipDelay = (function() {
|
|
$clear(displayTipDelay);
|
|
if (frowselected.length < 2) return;
|
|
if (finder.list.retrieve('eventState') == 'mousedown') {
|
|
return displayTipDelay = arguments.callee.delay(200);
|
|
}
|
|
finder.tip.fireEvent('_show');
|
|
|
|
}).delay(200);
|
|
}
|
|
} else {
|
|
$clear(displayTipDelay);
|
|
finder.tip.fireEvent('_update', ['selected' ]);
|
|
finder.tip.fireEvent('_hide');
|
|
}
|
|
|
|
finder.list.fireEvent(this.checked ? 'selectrow': 'unselectrow', this);
|
|
|
|
});
|
|
|
|
if (frowselected && frowselected.push && (frowselected.contains(sel.value) || frowselected.contains('_ALL_'))) {
|
|
sel.set('checked', true).fireEvent('change');
|
|
}
|
|
|
|
if (row = sel.getParent('.row')) {
|
|
|
|
var item_id=row.get('item-id');
|
|
|
|
if (item_id && item_id == finder.detailStatus.rowId) {
|
|
finder.showDetail(row.getElement('span[detail]').get('detail'), {},
|
|
row);
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
finder.list.addEvent('click', function(e) {
|
|
|
|
var target = $(e.target);
|
|
if (!target) return;
|
|
|
|
if (target.match('img')) {
|
|
target = $(target.parentNode);
|
|
}
|
|
|
|
/*新窗口查看,选中行
|
|
if (target.match('a') && target.get('target') == '_blank') {
|
|
if (!target.getParent('.row')) return;
|
|
var selfSelected = target.getParent('.row').getElement('input[class=sel]');
|
|
selfSelected.set('checked', true);
|
|
finder.list.fireEvent('selectrow', selfSelected);
|
|
selfSelected.fireEvent('change');
|
|
|
|
return;
|
|
}*/
|
|
|
|
|
|
/*fav start*/
|
|
if(target.hasClass('fav-star')){
|
|
target.toggleClass('fav-star-on');
|
|
return EventsRemote.post({
|
|
events:_createRemoteEvents('finder_favstar',finder.options.object_name + '_' + finder.options.finder_aliasname,
|
|
['id-'+target.getParent('tr[item-id]').get('item-id'),(target.hasClass('fav-star-on')?1:0)])
|
|
});
|
|
}
|
|
|
|
|
|
|
|
|
|
/*view detail*/
|
|
var _detail = target.get('detail');
|
|
if (!!_detail) {
|
|
e.stopPropagation();
|
|
return finder.showDetail(_detail,{},target.getParent('.row'));
|
|
}
|
|
|
|
/*enter edit*/
|
|
if (target.hasClass('cell') || target.hasClass('cell-inside')) {
|
|
target = target.getParent('td');
|
|
}
|
|
|
|
if (target.match('td')) {
|
|
if (! (/row/).test(target.parentNode.className)) return;
|
|
if (finder.detailStatus.row) {
|
|
var detailbtn = target.getParent('.row').getElement('*[detail]');
|
|
if (detailbtn && ! target.getParent('.row').hasClass('view-detail')) {
|
|
return finder.showDetail(detailbtn.get('detail'), {},
|
|
target.getParent('.row'));
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
attachEsayCheck(finder.list, 'td:nth-child(first) .span-auto');
|
|
|
|
var scrollTimer = 0;
|
|
var scrollAnimationFrame = null;
|
|
var lastScrollLeft = 0;
|
|
|
|
var listContainerScrollHandle = function() {
|
|
// 使用 requestAnimationFrame 优化滚动性能
|
|
if (scrollAnimationFrame) {
|
|
cancelAnimationFrame(scrollAnimationFrame);
|
|
}
|
|
|
|
scrollAnimationFrame = requestAnimationFrame(function() {
|
|
var currentScrollLeft = this.listContainer.scrollLeft;
|
|
|
|
// 只有当滚动位置真正改变时才更新
|
|
if (currentScrollLeft !== lastScrollLeft) {
|
|
lastScrollLeft = currentScrollLeft;
|
|
|
|
// 同步表头滚动位置
|
|
if (this.header && this.header.scrollLeft !== currentScrollLeft) {
|
|
this.header.scrollLeft = currentScrollLeft;
|
|
}
|
|
|
|
// 更新详情容器位置
|
|
var detailContainer = this.listContainer.getElement('.finder-detail-content');
|
|
if (detailContainer) {
|
|
detailContainer.setStyle('margin-left', currentScrollLeft);
|
|
}
|
|
|
|
// 更新提示框位置
|
|
if (this.tip && this.tip.style.visibility !== 'hidden') {
|
|
this.tip.setStyles({
|
|
left: currentScrollLeft,
|
|
top: this.listContainer.scrollTop
|
|
});
|
|
}
|
|
}
|
|
|
|
scrollAnimationFrame = null;
|
|
}.bind(this));
|
|
}.bind(this);
|
|
listContainerScrollHandle();
|
|
this.listContainer.addEvent('scroll', listContainerScrollHandle);
|
|
this.list.addEvent('dispose',(function(){
|
|
this.listContainer.removeEvent('scroll',listContainerScrollHandle);
|
|
// 清理动画帧
|
|
if (scrollAnimationFrame) {
|
|
cancelAnimationFrame(scrollAnimationFrame);
|
|
scrollAnimationFrame = null;
|
|
}
|
|
}).bind(this));
|
|
|
|
this.cellOpts.call(this);
|
|
},
|
|
fillForm: function(hash) {
|
|
if (!hash || 'object' != $type(hash)) return;
|
|
hash = $H(hash);
|
|
var finder = this;
|
|
hash.each(function(v, k) {
|
|
var focusHInput = (finder.form.getElement('input[name^=' + k.slice(0, - 1) + ']') || new Element('input', {
|
|
type: 'hidden',
|
|
name: k
|
|
}).inject(finder.form));
|
|
focusHInput.set('value', v);
|
|
});
|
|
|
|
return finder;
|
|
|
|
},
|
|
eraseSelected:function(){
|
|
var finder = this;
|
|
var items_selected = finder.form.retrieve('rowselected', []);
|
|
if(items_selected[0]=='_ALL_')return;
|
|
var cur_page_selected_el = finder.list.getElements('.sel');
|
|
$splat(arguments).flatten().each(function(i){
|
|
var f = cur_page_selected_el.filter(function(_i){
|
|
|
|
return _i.value ==i;
|
|
});
|
|
if(f.length){
|
|
f.set('checked',false).fireEvent('change');
|
|
}else{
|
|
items_selected.erase(i);
|
|
finder.tip.fireEvent('_update', ['selected', items_selected.length]);
|
|
}
|
|
});
|
|
},
|
|
eraseFormElement: function() {
|
|
var readyNames = Array.flatten(arguments);
|
|
var finder = this;
|
|
$each(readyNames, function(name) {
|
|
finder.form.getElement('input[name=' + name + ']').remove();
|
|
});
|
|
|
|
return finder;
|
|
},
|
|
scrollTab: function(tabsWrap,wrap,container){
|
|
wrap || (wrap = LAYOUT.content_main);
|
|
container || (container = tabsWrap);
|
|
|
|
var tabItems = tabsWrap.getElements('li'),
|
|
tscrollhandles = tabsWrap.getElements('.scroll-handle'),
|
|
tabsItem = tabsWrap.getElement('.tabs-items'), _w = 2;
|
|
|
|
tabItems.each(function(i){_w+=i.offsetWidth;});
|
|
|
|
tabsWrap.getElement('ul').setStyle('width',_w);
|
|
|
|
var fxscroll = new Fx.Scroll(tabsItem, {link: 'cancel'});
|
|
|
|
var tabResizeHandle = function(){
|
|
try{
|
|
var w = wrap.offsetWidth;
|
|
tabsWrap[w<_w?'addClass':'removeClass']('tabs-scroll')
|
|
.setStyle('width',w-2);
|
|
tabsItem.setStyle('width',
|
|
w - tabsItem.getStyle('marginLeft').toInt()*2);
|
|
fxscroll.options.duration = 500;
|
|
fxscroll.scrollIntoView(tabsWrap.getElement('.current'));
|
|
}catch(e){}
|
|
};
|
|
tabResizeHandle();
|
|
LAYOUT.content_main.addEvent('resizelayout',tabResizeHandle);
|
|
container.addEvent('dispose',function(){
|
|
LAYOUT.content_main.removeEvent('resizelayout',tabResizeHandle);
|
|
})
|
|
tscrollhandles.addEvents({
|
|
'mouseenter':function(){
|
|
fxscroll.options.duration = 850;
|
|
fxscroll[this.hasClass('r')?'toRight':'toLeft']();
|
|
},'mouseleave':function(){
|
|
fxscroll.stop();
|
|
}
|
|
});
|
|
},
|
|
showDetail: function(url, options, row) {
|
|
var _this = this;
|
|
var dp = row.getNext(),
|
|
rowId=row.get('item-id');
|
|
|
|
if(this.detailCurTab && this.detailCurTab[0]==rowId)
|
|
url=this.detailCurTab[1];
|
|
|
|
if (dp&&dp.hasClass('finder-detail')) {
|
|
return this.hideDetail(row, dp);
|
|
}
|
|
|
|
this.hideDetail(this.detailStatus.row, this.detailStatus.dp);
|
|
|
|
var detailPanel = new Element('tr', {
|
|
'class': 'finder-detail'
|
|
});
|
|
var dpInner = new Element('td', {
|
|
colspan: row.getElements('td').length,
|
|
'class': 'finder-detail-colspan'
|
|
});
|
|
var dpContainer = new Element('div', {
|
|
'class': 'finder-detail-content clearfix',
|
|
id: 'finder-detail-' + this.id
|
|
}).set({
|
|
'container': true
|
|
});
|
|
|
|
detailPanel.adopt(dpInner.adopt(dpContainer));
|
|
var finderContainer = this.list.getContainer(),_req = this.detailStatus.Request;
|
|
|
|
if (_req) {
|
|
_req.cancel();
|
|
}
|
|
|
|
|
|
this.detailStatus.row = row.addClass('view-detail');
|
|
this.detailStatus.rowId = rowId;
|
|
|
|
this.detailStatus.Request = new Request.HTML({
|
|
evalScripts: false,
|
|
url: url + (url.indexOf('&') > 0 ? '&': '') + 'finder_name=' + this.id,
|
|
onRequest: function() {
|
|
new MessageBox(LANG_Finder['detail']['request'], {
|
|
type: 'notice'
|
|
});
|
|
},
|
|
onComplete: function(ns, es, re, js) {
|
|
|
|
detailPanel.injectAfter(row);
|
|
new MessageBox(LANG_Finder['detail']['complete'], {
|
|
autohide: 1
|
|
});
|
|
|
|
W.render(dpContainer.set('html', re));
|
|
|
|
var dpContainerResizeHandle =function(){
|
|
|
|
try{
|
|
dpContainer.setStyle('width', finderContainer.clientWidth - dpInner.getPatch().x);
|
|
}catch(e){}
|
|
};
|
|
dpContainerResizeHandle();
|
|
LAYOUT.content_main.addEvent('resizelayout',dpContainerResizeHandle);
|
|
_this.list.addEvent('dispose',function(){
|
|
LAYOUT.content_main.removeEvent('resizelayout',dpContainerResizeHandle);
|
|
});
|
|
$globalEval(js);
|
|
}.bind(this),
|
|
onFailure: function() {
|
|
|
|
new MessageBox(LANG_Finder['detail']['failure'] + [this.xhr.status], {
|
|
type: 'error',
|
|
autohide: true
|
|
});
|
|
|
|
}
|
|
}).send().chain(function() {
|
|
|
|
delete(this.detailStatus.Request);
|
|
this.detailStatus.dp = detailPanel;
|
|
finderContainer.retrieve('fxscroll', new Fx.Scroll(finderContainer, {
|
|
link: 'cancel'
|
|
})).toElement(row);
|
|
|
|
}.bind(this));
|
|
|
|
},
|
|
/*隐藏 详情展开区域 */
|
|
hideDetail: function(row, dp) {
|
|
|
|
if (row) row.removeClass('view-detail');
|
|
|
|
if (dp) dp.remove();
|
|
|
|
delete(this.detailCurTab);
|
|
delete(this.detail);
|
|
delete(this.detailStatus.row);
|
|
delete(this.detailStatus.dp);
|
|
delete(this.detailStatus.rowId);
|
|
},
|
|
getFormQueryString: function() {
|
|
return this.form.toQueryString();
|
|
},
|
|
page: function(num) {
|
|
this.form.store('page', num || 1);
|
|
|
|
this.request({
|
|
method: this.form.method || 'post'
|
|
});
|
|
|
|
},
|
|
loadPacket: function() {
|
|
var packetPanel = this.packet;
|
|
var _this = this;
|
|
if (!this.options.packet) return;
|
|
new Request.HTML({
|
|
url:this.form.action + '&action=packet',
|
|
update: packetPanel,
|
|
onRequest: function() {
|
|
packetPanel.addClass('loading');
|
|
},
|
|
onComplete: function() {
|
|
packetPanel.removeClass('loading');
|
|
}
|
|
|
|
}).get();
|
|
|
|
},
|
|
storeTab:function(){
|
|
var dpContainer=$('finder-detail-'+this.id);
|
|
if(!dpContainer)return;
|
|
var finder_tab = dpContainer.getElement('.finder-tabs-wrap .current');
|
|
if(finder_tab)
|
|
this.detailCurTab=[finder_tab.get('item-id'),finder_tab.get('url')];
|
|
},
|
|
refresh: function(unselectAll) {
|
|
this.storeTab();
|
|
this.request({
|
|
method: this.form.method || 'post',
|
|
onComplete: function() {
|
|
this.loadPacket();
|
|
if(unselectAll){
|
|
this.unselectAll();
|
|
}
|
|
}.bind(this)
|
|
});
|
|
|
|
},
|
|
filter2packet:function(){
|
|
|
|
var filter_query = this.filter.value;
|
|
if(!!!filter_query)return;
|
|
|
|
new Dialog(this.form.action + '&action=filter2packet',{
|
|
width:400,
|
|
height:200,
|
|
ajaxoptions:{method:'post',
|
|
data:$H({filterquery:filter_query,finder_id:this.id})
|
|
}});
|
|
|
|
|
|
},
|
|
setCount: function() {
|
|
var count = this.tip.get('count').toInt(),head_count = $E('.finder-title .count')
|
|
if (head_count) head_count.setText(count);
|
|
return this;
|
|
},
|
|
request: function() {
|
|
|
|
var params = Array.flatten(arguments);
|
|
var p = params.link({
|
|
'options': Object.type,
|
|
'action': String.type
|
|
});
|
|
//if(!p.action&&!$(this.form.id))return;
|
|
p.action = p.action || this.form.action + '&page=' + (this.form.retrieve('page') || 1);
|
|
p.options = p.options || {};
|
|
var _onComplete = p.options.onComplete;
|
|
if ($type(_onComplete) != 'function') {
|
|
_onComplete = $empty;
|
|
}
|
|
|
|
$extend(p.options, {
|
|
clearUpdateMap: false,
|
|
updateMap: {
|
|
'.innerheader': this.header,
|
|
'.pager': this.pager
|
|
},
|
|
onComplete: function() {
|
|
this.initView();
|
|
this.setCount().attachEvents();
|
|
_onComplete.apply(this, Array.flatten(arguments));
|
|
|
|
var filter_tip = $('filter-tip-'+this.id);
|
|
|
|
if(filter_tip){
|
|
if(!!this.filter.value.trim().length){
|
|
filter_tip.setStyle('visibility','visible').highlight('#FFFFCC');
|
|
}else{
|
|
filter_tip.setStyle('visibility','hidden');
|
|
}
|
|
}
|
|
|
|
}.bind(this)
|
|
|
|
});
|
|
|
|
if (this.search && this.search.getElement('input[search]').value.trim().length) {
|
|
this.filter.value = this.search.toQueryString();
|
|
}
|
|
|
|
var _data = this.getFormQueryString().concat('&' + this.filter.value);
|
|
|
|
|
|
var optData = p.options.data;
|
|
|
|
switch ($type(optData)) {
|
|
|
|
case 'string':
|
|
p.options.data = [_data, optData].join('&');
|
|
break;
|
|
case 'object':
|
|
case 'hash':
|
|
p.options.data = [_data, Hash.toQueryString(optData)].join('&');
|
|
break;
|
|
case 'element':
|
|
p.options.data = [_data, $(optData).toQueryString()].join('&');
|
|
break;
|
|
default:
|
|
p.options.data = _data;
|
|
|
|
}
|
|
|
|
for (v in this.detailStatus) {
|
|
if ($type(this.detailStatus[v]) == 'element') delete(this.detailStatus[v]);
|
|
|
|
}
|
|
|
|
W.page(p.action, p.options);
|
|
},
|
|
cellOpts:function(){
|
|
var finder=this,handles = finder.list.getElements('.opt-handle');
|
|
|
|
if(!handles)return;
|
|
|
|
handles.each(function(el,i){
|
|
var hdSizeX=el.getSize().x,hdPatchX=el.getPatch().x;
|
|
|
|
new DropMenu(el,{eventType:'mouse',stopState:true,
|
|
offset:{x:hdSizeX-hdPatchX-3,y:0},relative:$('main'),
|
|
delay:0,size:true,
|
|
onPosition:function(z){
|
|
if(!this.offset)this.offset=this.options.offset.x;
|
|
|
|
if(z!='x')return;
|
|
|
|
var parentX=el.getParent('td').getSize().x,
|
|
offsetX=hdSizeX>parentX?parentX-hdPatchX-12:this.offset;
|
|
|
|
this.options.offset.x=this.options.relative.getScroll().x+offsetX;
|
|
this.options.offset.y=this.options.relative.getScroll().y;
|
|
},
|
|
|
|
onHide:function(){this.element.style.position='static';},
|
|
|
|
onInitShow:function(){if(finder.detailStatus.rowId)this.status=true},
|
|
|
|
onShow:function(menu){
|
|
this.element.style.position='relative';
|
|
|
|
if(this.bind)return;
|
|
|
|
menu.getElements('a').addEvent('click',function(e){
|
|
var url=this.get('submit')||this.get('url'),target=this.get('target');
|
|
|
|
if(!target||!url)return;
|
|
|
|
e.preventDefault();
|
|
var targetType = target.split('::')[0]||target,
|
|
targetOptions = JSON.decode(target.split('::')[1])||{};
|
|
|
|
switch(targetType){
|
|
case 'dialog':
|
|
var _dialog = new Dialog(url,$extend(targetOptions,{onLoad:function(){
|
|
this.dialog.getElement('form').store('target',{onComplete:function(){
|
|
_dialog.close();
|
|
finder.refresh();
|
|
}});
|
|
}}));
|
|
break;
|
|
case 'tab':
|
|
finder.showDetail(url,targetOptions,this.getParent('tr'));
|
|
break;
|
|
case 'request':
|
|
new Request({
|
|
'url':url,
|
|
'method':'post',
|
|
'data':targetOptions.data,
|
|
'onComplete':function(re){
|
|
finder.showDetail(targetOptions.url,{},this.getParent('tr'));
|
|
}.bind(this)
|
|
}).send();
|
|
break;
|
|
case 'confirm':
|
|
var cfm=this.get('confirm');
|
|
if(cfm &&!confirm(cfm))return;
|
|
W.page(url,{onComplete:function(re){
|
|
finder.refresh();
|
|
}});
|
|
break;
|
|
}
|
|
});
|
|
this.bind=true;
|
|
}});
|
|
});
|
|
}
|
|
});
|
|
|
|
Filter = new Class({
|
|
Implements: [Events, Options],
|
|
options: {
|
|
onPush: $empty,
|
|
onRemove: $empty,
|
|
onChange: $empty
|
|
},
|
|
initialize: function(filterId, finderId, options) {
|
|
|
|
var _this = this;
|
|
_this.finderId = finderId;
|
|
_this.filter = $(filterId);
|
|
_this.finderObj = window.finderGroup[finderId];
|
|
|
|
this.setOptions(options);
|
|
},
|
|
update: function() {
|
|
var f = this.filter;
|
|
var qstr = f.toQueryString(
|
|
function(el) {
|
|
var elp = $(el).getParent('dl'),m;
|
|
if(!elp||!elp.isDisplay()||!!!$(el).value)return;
|
|
|
|
if(m = el.name.match(/_([\s\S]+)_search/)){
|
|
if(!!!f.getElement('*[name='+m[1]+']').value)return;
|
|
}
|
|
|
|
if(el.name.match(/_DTYPE_TIME/)){
|
|
if(!!!f.getElement('*[name='+el.value+']').value)return;
|
|
}
|
|
|
|
if(m=el.name.match(/_DTIME_\[([^\]]+)\]\[([^\]]+)\]/)){
|
|
if(!!!f.getElement('*[name='+m[2]+']').value)return;
|
|
}
|
|
return true;
|
|
},true);
|
|
|
|
if(this.finderObj.search)
|
|
this.finderObj.search.getElement('input[search]').value='';
|
|
|
|
|
|
|
|
this.finderObj.filter.value = qstr;
|
|
var rowselected = this.finderObj.form.retrieve('rowselected', []);
|
|
this.finderObj.refresh(rowselected.length&&!rowselected.contains('_ALL_')&&!confirm(LANG_Finder['refresh_confirm']));
|
|
|
|
|
|
this.fireEvent('change');
|
|
|
|
},
|
|
retrieve: function() {
|
|
|
|
var _re = this.finderObj.filter.value || '';
|
|
if (this.finderObj.search) {
|
|
|
|
this.finderObj.search.getElement('input[search]').value = '';
|
|
}
|
|
var _this = this;
|
|
|
|
_re.replace(/([^&]+)\=([^&]+)/g, function() {
|
|
|
|
var arg = arguments;
|
|
|
|
var _name = arg[1];
|
|
|
|
var el = _this.filter.getElement('[name=' + _name + ']');
|
|
|
|
if (_name && _name.slice( - 1) && _name.slice( - 1) == ']') {
|
|
|
|
el = _this.filter.getElement('[name^=' + _name.substr(0, _name.length - 1) + ']');
|
|
}
|
|
|
|
if (el) {
|
|
|
|
el.value = decodeURIComponent(arg[2]);
|
|
}
|
|
});
|
|
|
|
}
|
|
});
|
|
|
|
}) ();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*finder tips*/
|
|
|
|
(function(){
|
|
var finderColImgTip = new Tips({
|
|
onShow:function(tip,el){
|
|
el.addClass('active');
|
|
var img_src;
|
|
tip.setStyle('display','block').store('tip:imgsource',img_src = $pick(el.get('href'),el.get('src')));
|
|
|
|
var tip_t = tip.getElement('.tip-text').set('html',' ').addClass('loading');
|
|
|
|
Asset.image(img_src,{onload:function(){
|
|
if(this.src!=tip.retrieve('tip:imgsource'))return;
|
|
tip_t.empty().adopt(this.zoomImg(tip_t.offsetWidth,tip_t.offsetHeight)).removeClass('loading');
|
|
this.setStyle('margin-top',(tip_t.offsetHeight-this.height)/2);
|
|
}});
|
|
},
|
|
text: function(element){
|
|
return ' ';
|
|
},
|
|
className:'finder-col-img-tip'
|
|
});
|
|
|
|
var finderColLoadTip = new Tips({
|
|
onShow:function(tip,el){
|
|
|
|
el.addClass('active');
|
|
tip.setStyle('display','block');
|
|
var loadedhtml =el.retrieve('loaded:html');
|
|
var tip_t = tip.getElement('.tip-text');
|
|
if(loadedhtml)return tip_t.set('html',loadedhtml);
|
|
tip_t.set('html',' ').addClass('loading');
|
|
|
|
new Request({url:el.get('data-load'),onSuccess:function(re){
|
|
tip_t.removeClass('loading').empty().set('html',re);
|
|
el.store('loaded:html',re);
|
|
}}).get();
|
|
},
|
|
text: function(element){
|
|
return ' ';
|
|
},
|
|
className:'finder-col-desc-tip'
|
|
});
|
|
|
|
var finderColTextTip = new Tips({
|
|
onShow:function(tip,el){
|
|
el.addClass('active');
|
|
tip.setStyle('display','block');
|
|
},
|
|
text: function(element){
|
|
return element.get('title') || element.get('rel');
|
|
},
|
|
className:'finder-col-text-tip'
|
|
});
|
|
|
|
|
|
|
|
var finderColDescTip = new Tips({
|
|
onShow:function(tip,el){
|
|
el.addClass('active');
|
|
tip.setStyle('display','block');
|
|
},
|
|
text: function(element){
|
|
return element.getElement('textarea').value;
|
|
},
|
|
className:'finder-col-desc-tip'
|
|
});
|
|
|
|
|
|
|
|
this.bindFinderColTip = function(e){
|
|
var e = new Event(e), el = e.target;
|
|
if(!el)return;
|
|
el.onmouseover = null;
|
|
if(el.hasClass('img-tip')){
|
|
finderColImgTip.attach(el);
|
|
}else if(el.hasClass('desc-tip')){
|
|
finderColDescTip.attach(el);
|
|
}else if(el.hasClass('load-tip')){
|
|
finderColLoadTip.attach(el);
|
|
}else{
|
|
finderColTextTip.attach(el);
|
|
}
|
|
//(el.hasClass('img-tip')?finderColImgTip:finderColTextTip)['attach'](el);
|
|
|
|
el.addEvent('mouseleave',function(){
|
|
this.removeClass('active');
|
|
});
|
|
el.fireEvent('mouseenter',e);
|
|
}
|
|
|
|
})();
|
|
|