mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-04 14:36:50 +08:00
294 lines
9.0 KiB
JavaScript
294 lines
9.0 KiB
JavaScript
|
|
|
|
(function(){
|
|
var TaskRunner = this.taskrunner = new Class({
|
|
Implements: [Events,Options],
|
|
options:{
|
|
stateClass:{
|
|
error:'error2',
|
|
loading:'loading',
|
|
complete:'complete',
|
|
success:''
|
|
},
|
|
showStep:'.appNum',
|
|
showAppName:'.appName',
|
|
container:false,
|
|
dataClass:'.tasks_ipt'
|
|
},
|
|
initialize:function(tasks,options){
|
|
this.setOptions(options);
|
|
this.tasks=$splat(tasks);
|
|
if(!this.tasks)return;
|
|
this.num=this.tasks.length||0;
|
|
this.container=$(this.options.container);
|
|
},
|
|
init:function(container){
|
|
if(!this.iframe)
|
|
this.iframe = this.options.iframe?this.options.iframe: new Element('iframe',{src:'about:blank',name:'_TASK_IFRM_',style:'display:none;height:100%;width:100%'});
|
|
container=container||this.container;
|
|
this.iframe.inject(container||document.body);
|
|
this.form = this.form||new Element('form',{style:'display:none',method:'post',target:this.iframe.name}).inject(document.body);
|
|
|
|
var options=this.options;
|
|
if(!container)return this;
|
|
this.showStep=container.getElement(options.showStep);
|
|
this.appName=container.getElement(options.showAppName);
|
|
this.items=container.getElements('.box');
|
|
|
|
return this;
|
|
},
|
|
getText:function(){
|
|
var temp = document.createElement('div');
|
|
return this[(temp.innerText == null) ? 'textContent' : 'innerText'];
|
|
},
|
|
createFormData:function(ipt){
|
|
if(!this.form)return this;
|
|
this.form.empty();
|
|
var options=this.options,fdoc=document.createDocumentFragment(),
|
|
data=ipt?ipt:$ES(options.dataClass);
|
|
if(data&&data.length)
|
|
data.each(function(ipt,k){
|
|
var n=ipt.name,v=ipt.value;
|
|
fdoc.appendChild(new Element('input',{type:'hidden','name':n,value:v}));
|
|
});
|
|
this.form.appendChild(fdoc);
|
|
return this;
|
|
},
|
|
loader:function(){
|
|
if(this.items&&this.items.length)this.items[this.prestep].addClass(this.options.stateClass.loading);
|
|
if(this.showStep)this.showStep.setText(this.step);
|
|
if(this.appName)this.appName.setText(this.items[this.prestep].get('appname'));
|
|
|
|
return this.fireEvent('loader');
|
|
},
|
|
cancel:function(){
|
|
return this.fireEvent('cancel',this.step);
|
|
},
|
|
run:function(actions){
|
|
this.extra_action=actions;
|
|
this.init(this.container).fireEvent('load',[this.tasks]).createFormData();
|
|
if(actions)return this.progress(actions);
|
|
return this.start();
|
|
},
|
|
start:function(step,actions){
|
|
this.step=step||1;
|
|
this.prestep=this.step-1;
|
|
this.actions=actions||this.tasks[this.prestep];
|
|
return this.fireEvent('start').loader().progress(this.actions);
|
|
},
|
|
error:function(text){
|
|
if(text)alert(text);
|
|
|
|
var stateClass=this.options.stateClass;
|
|
if(this.items&&this.items.length&&this.items[this.prestep])
|
|
this.items[this.prestep].removeClass(stateClass.loading).addClass(stateClass.error);
|
|
|
|
return this.fireEvent('error',text).cancel();
|
|
},
|
|
next:function(step){
|
|
var steps=(step||0)+1;
|
|
return this.start(steps);
|
|
},
|
|
progress:function(actions){
|
|
if(!actions)return this;
|
|
var action=actions||this.actions,iframe=this.iframe,_this=this,rsp,req;
|
|
req = new Request({
|
|
url : action,
|
|
method : 'post',
|
|
data : this.createFormData().form.toQueryString(),
|
|
onComplete : function(rs){
|
|
_this.check(rs);
|
|
}
|
|
}).send();
|
|
return this.fireEvent('progress');
|
|
},
|
|
check:function(messageText){
|
|
this.result=/(\s*)ok\.(\s*)/.test(messageText.slice(-4));
|
|
|
|
this.fireEvent('check',messageText);
|
|
var error=messageText.slice(-500);
|
|
messageText.slice(-500).replace(/Error:(\s\S+)/,function(){
|
|
var arg=arguments;error=arg[1];
|
|
});
|
|
return this.result?this.complete():this.error(error);
|
|
},
|
|
complete:function(){
|
|
this.fireEvent('complete');
|
|
if(this.extra_action){delete this.extra_action;return this.start(1);}
|
|
|
|
var stateClass=this.options.stateClass;
|
|
if(this.items&&this.items.length)
|
|
this.items[this.prestep].removeClass(stateClass.loading).addClass(stateClass.complete);
|
|
|
|
if(!this.step&&!this.num)return this.success();
|
|
var step=this.step||0;
|
|
return this[step==this.num?'success':'next'](step);
|
|
},
|
|
success:function(){
|
|
if(this.form)this.form.destroy();
|
|
return this.fireEvent('success');
|
|
}
|
|
});
|
|
|
|
|
|
|
|
var cmdrunner = this.cmdrunner = new Class({
|
|
Extends:TaskRunner,
|
|
options:{
|
|
title:'',
|
|
singlon:true
|
|
},
|
|
delayT:function(){
|
|
|
|
if(!this.iframe.contentWindow)return this;
|
|
|
|
var doc=this.iframe.contentWindow.document.body;
|
|
|
|
if(!doc)return this;
|
|
|
|
var text=this.getText.call(doc);
|
|
|
|
text.replace(/[>|\n]([^\n]+)/gi,function($1,$2){
|
|
if($2.trim().length>1)
|
|
this.csolinfo.set('text',$2);
|
|
}.bind(this));
|
|
|
|
return this;
|
|
},
|
|
startTimer:function(){
|
|
this.timer= this.delayT.periodical(200,this);
|
|
return this;
|
|
},
|
|
stopTimer:function(){
|
|
if(this.timer) $clear(this.timer);
|
|
return this;
|
|
},
|
|
check:function(iframe){
|
|
this.stopTimer().delayT();
|
|
return this.parent(iframe);
|
|
},
|
|
createTpl:function(){
|
|
var queue=this.tasks,type=queue.filter(function(el){return el.type!=='dialog';}),html=this.options.singlon?'':'<h5>'+LANG_Cmdrunner['title']+'</h5>';
|
|
html+='<ul class="division apptip">';
|
|
if(type.length)
|
|
type.each(function(t,i){
|
|
var n=t.name||this.options.title;
|
|
html+='<li class="box" appname="'+n+'">'+n+'</li>';
|
|
},this);
|
|
var num=queue.filter(function(q){return q.type!='dialog';}).length;
|
|
html+='</ul>';
|
|
this.theme=this.options.singlon?html:html+'<div class="division loader"><em class="appNum">0</em>/<em>'+num+'</em><span class="appName"></span></div>';
|
|
var csol='<div class="console"><p class="csolinfo">loading...</p><span class="lnk csol" onClick="_open(\'index.php?app=desktop&ctl=appmgr&act=app_console\')">'+LANG_Cmdrunner['console']+'</span></div>';
|
|
this.container.innerHTML=this.theme+csol;
|
|
this.csolinfo=$E('.csolinfo',this.container);
|
|
return this;
|
|
},
|
|
close:function(d){
|
|
var dialog=d||this.dialog;
|
|
if(dialog)dialog.close.delay(800,dialog);return this;
|
|
},
|
|
adddialog:function(url){
|
|
return new Dialog(url,{title:this.options.title,height:200,width:600,modal:true,resizeable:false,onClose:function(){this.stopTimer();}.bind(this)});
|
|
},
|
|
progress:function(task){
|
|
var url;
|
|
switch(task.type){
|
|
case 'command':
|
|
url='index.php?app=desktop&ctl=appmgr&act=command&command_id='+task.command_id +'&data='+ encodeURIComponent(task.data);
|
|
this.startTimer().parent(url);
|
|
break;
|
|
case 'dialog':
|
|
url = 'index.php?app=desktop&ctl=appmgr&act='+task.action +'&data='+encodeURIComponent(task.data);
|
|
this.tasks.splice(this.prestep,1);
|
|
this.num=this.tasks.length;
|
|
this.stopTimer();
|
|
new Request.HTML({url:url,append:this.appinfo,
|
|
onComplete:function(){
|
|
var appbtn=this.appinfo.getElement('.appbtn');
|
|
if(appbtn){
|
|
this.container.hide();
|
|
appbtn.addEvent('click',function(){
|
|
this.container.show();
|
|
this.appinfo.hide();
|
|
this.start(this.step);
|
|
}.bind(this));
|
|
}else{
|
|
this.start(this.step);
|
|
}
|
|
}.bind(this)}).get();
|
|
break;
|
|
default:this.startTimer().parent(task); break;
|
|
}
|
|
},
|
|
init:function(){
|
|
this.container=this.container||new Element('div',{'class':'appbox','html':this.theme||''});
|
|
this.dialog =this.adddialog.call(this,this.container);
|
|
this.appinfo=new Element('div',{'class':'appinfo'}).inject(this.container,'before');
|
|
this.createTpl().parent(this.container);
|
|
return this;
|
|
},
|
|
success:function(){
|
|
this.parent();
|
|
if(this.options.singlon)this.close();
|
|
MessageBox.success(LANG_Cmdrunner['success']);
|
|
}
|
|
});
|
|
|
|
this.appmgr =function(appdata){
|
|
return new ApplicationManager(appdata,{'onSuccess':function(){
|
|
if(!finderGroup)return;
|
|
for(var f in finderGroup){
|
|
if(finderGroup[f])finderGroup[f].refresh();
|
|
}
|
|
}});
|
|
}
|
|
|
|
var ApplicationManager = new Class({
|
|
Extends:TaskRunner,
|
|
type:{
|
|
install:LANG_Cmdrunner['install'],
|
|
uninstall:LANG_Cmdrunner['uninstall'],
|
|
update:LANG_Cmdrunner['update'],
|
|
pause:LANG_Cmdrunner['stop'],
|
|
active:LANG_Cmdrunner['start'],
|
|
download:LANG_Cmdrunner['download']
|
|
},
|
|
run:function(app_id){
|
|
this.app_id=app_id;
|
|
this.parent();
|
|
},
|
|
init:function(){return this;},
|
|
progress:function(actions){
|
|
new Request.JSON({url: 'index.php?app=desktop&ctl=appmgr&act=prepare&action='+actions,
|
|
onSuccess: this.prepare.bind(this)}).post({'action':actions,'app_id':this.app_id});
|
|
},
|
|
prepare:function(prepare_result){
|
|
if(!prepare_result)return this.error();
|
|
switch(prepare_result.status){
|
|
case 'confirm':
|
|
var confirm_result = window.confirm(prepare_result.message);
|
|
if(!confirm_result){if(this.dialog)this.dialog.close();return this;}
|
|
break;
|
|
case 'alert':
|
|
alert(prepare_result.message);return;
|
|
break;
|
|
case 'error': break;
|
|
default:break;
|
|
}
|
|
var type=this.type;
|
|
this.queue= prepare_result.queue;
|
|
if(this.dialog)this.dialog.close();
|
|
this.runner=new cmdrunner(this.queue,{
|
|
title:type[this.tasks[this.prestep]]+':'+this.app_id,
|
|
singlon:false,onSuccess:this.complete.bind(this)
|
|
});
|
|
this.runner.run();
|
|
return this.dialog=this.runner.dialog;
|
|
},
|
|
success:function(){
|
|
this.parent().runner.close(this.dialog);
|
|
}
|
|
});
|
|
|
|
})();
|