mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-06 23:05:36 +08:00
643 lines
19 KiB
JavaScript
643 lines
19 KiB
JavaScript
/**
|
|
* Shopex OMS
|
|
*
|
|
* Copyright (c) 2025 Shopex (http://www.shopex.cn)
|
|
* Licensed under Apache-2.0 with additional terms (See LICENSE file)
|
|
*/
|
|
|
|
(function() {
|
|
|
|
|
|
this.$globalEval = Browser.exec;
|
|
|
|
|
|
var processLinks = function() {
|
|
|
|
|
|
|
|
$(document.body).addEvent('click',
|
|
function(e) {
|
|
|
|
|
|
|
|
var clickElement = $(e.target);
|
|
/*if(clickElement){
|
|
|
|
if(v=clickElement.get('disabled')){
|
|
|
|
if(v=='disabled'||v=='true'){return e.stop();}
|
|
|
|
}
|
|
|
|
}*/
|
|
for (var i = 0; i < 3; i++) {
|
|
if (!clickElement || $chk(clickElement.get('href'))) continue;
|
|
clickElement = clickElement.getParent();
|
|
}
|
|
|
|
|
|
if (!clickElement || !clickElement.get('href')) {
|
|
return null;
|
|
}
|
|
|
|
var ceTarget = clickElement.get('target') || '';
|
|
var ceHref = clickElement.href || '';
|
|
var ceLabel = clickElement.get('text') || '';
|
|
var _matchFail = !((!$chk(ceTarget) || ceTarget.match(/({|:)/)) && !ceHref.match(/^javascript.+/i) && !clickElement.onclick);
|
|
|
|
var regexp = new RegExp('' + SHOPADMINDIR + '');
|
|
|
|
if (ceTarget.match(/blank/) && ceHref.match(regexp)) {
|
|
e.stop();
|
|
return _open(ceHref);
|
|
}
|
|
if (_matchFail) {
|
|
return null;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
e.stop();
|
|
|
|
|
|
if (ceTarget.match(/::/)) {
|
|
|
|
var clickOpt = ceTarget.split('::');
|
|
|
|
switch (clickOpt[0]) {
|
|
case 'dialog':
|
|
return new Dialog(ceHref, JSON.decode(clickOpt[1] || {}));
|
|
case 'open':
|
|
return _open(ceHref, JSON.decode(clickOpt[1] || {}));
|
|
case 'command':
|
|
|
|
return Ex_Loader('cmdrunner',
|
|
function() {
|
|
new cmdrunner(ceHref, JSON.decode(clickOpt[1] || {})).run();
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (e.shift) return open(ceHref.replace('?', '#'));
|
|
|
|
W.page(ceHref, $extend({
|
|
|
|
method: 'get'
|
|
/*,
|
|
data:$H({x_navlabel:ceLabel})*/
|
|
|
|
|
|
},
|
|
JSON.decode(ceTarget)), clickElement);
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var Wpage = this.Wpage = new Class({
|
|
Extends: Request,
|
|
exoptions: {
|
|
evalScripts: true,
|
|
link: 'cancel',
|
|
message: false,
|
|
render: true,
|
|
sponsor: false,
|
|
clearUpdateMap: true,
|
|
updateMap: {},
|
|
url: '',
|
|
data: '',
|
|
headers: {
|
|
'X-Requested-With': 'XMLHttpRequest',
|
|
'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
|
|
},
|
|
async: true,
|
|
format: false,
|
|
method: 'post',
|
|
emulation: true,
|
|
urlEncoded: true,
|
|
encoding: 'utf-8',
|
|
evalResponse: false,
|
|
noCache: false,
|
|
update: false
|
|
},
|
|
|
|
initialize: function(options, defaultAction) {
|
|
options = $merge(this.exoptions, options);
|
|
this.parent(options);
|
|
|
|
processLinks();
|
|
|
|
if (options.singlepage) return;
|
|
|
|
if (typeof history.pushState != 'undefined') {
|
|
/*html5 history plus*/
|
|
var defaultGo = location.hash.slice(1) ? location.hash.slice(1) : defaultAction;
|
|
this.page('index.php?' + defaultGo);
|
|
window.onpopstate = function(event) {
|
|
this.popstate = true;
|
|
if (event.state) this.page('index.php?' + event.state.go);
|
|
}.bind(this);
|
|
|
|
} else {
|
|
Ex_Loader('historyMan',
|
|
function() {
|
|
var historyMan = new HistoryManager({
|
|
iframeSrc: SHOPBASE + '/app/desktop/view/blank.html'
|
|
});
|
|
this.hstMan = historyMan.register('page', [defaultAction],
|
|
function(values, dft) {
|
|
var url = 'index.php?' + (values.input ? values.input: dft[0]);
|
|
return this.page(url);
|
|
}.bind(this),
|
|
function(values) {
|
|
return values[0];
|
|
},
|
|
'.*');
|
|
historyMan.start();
|
|
}.bind(this));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
},
|
|
success: function(html, xml) {
|
|
|
|
//var requestTime = this.getHeader('Request_time');
|
|
if ((/text\/jcmd/).test(this.getHeader('Content-type'))) {
|
|
return this.doCommand.apply(this, $splat(arguments));
|
|
}
|
|
|
|
|
|
|
|
html = html.stripScripts(function(s) {
|
|
this.response.javascript = s;
|
|
}.bind(this));
|
|
|
|
|
|
var match = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
if (match) {
|
|
html = match[1];
|
|
}
|
|
|
|
|
|
var update = this.options.update;
|
|
|
|
var updateMap = this.options.updateMap;
|
|
|
|
|
|
if (this.options.clearUpdateMap) {
|
|
|
|
$H(updateMap).each(function(v, k) {
|
|
if (! (/side-/.test(k)) && v) {
|
|
v.empty().fixEmpty();
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
html = html.replace(/<\!-{5}(.*?)-{5}([\s\S]*?)-{5}(.*?)-{5}>/g,
|
|
function() {
|
|
|
|
var $k = arguments[1];
|
|
$k = updateMap[$k] || $($k);
|
|
var $v = arguments[2] || null;
|
|
|
|
if ($v && $k) {
|
|
$k.empty().set('html', $v).fixEmpty();
|
|
}
|
|
return '';
|
|
});
|
|
|
|
update.empty().set('html', html);
|
|
|
|
if (update == LAYOUT.content_main) {
|
|
var _v = this.options.url.match('index\\.php\\?(.*)');
|
|
|
|
if (_v && _v[1]) {
|
|
|
|
if (typeof history.pushState != 'undefined') {
|
|
/*html5 history plus*/
|
|
history[this.popstate ? 'replaceState': 'pushState']({
|
|
go: _v[1]
|
|
},
|
|
'', '#' + _v[1]);
|
|
this.popstate = false;
|
|
} else if (this.hstMan) {
|
|
this.hstMan.setValue(0, _v[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
this.render(update);
|
|
|
|
if (this.options.evalScripts) {
|
|
Browser.exec(this.response.javascript);
|
|
}
|
|
|
|
|
|
this.onSuccess(html, xml, this.response.javascript);
|
|
this.onComplete();
|
|
},
|
|
|
|
onFailure: function() {
|
|
|
|
switch (this.status) {
|
|
|
|
case 404:
|
|
new MessageBox(LANG_Wpage['failure']['status_404'], {
|
|
type: 'error',
|
|
autohide: true
|
|
});
|
|
break;
|
|
case 401:
|
|
new MessageBox(LANG_Wpage['failure']['status_401'], {
|
|
type: 'error'
|
|
});
|
|
break;
|
|
case 403:
|
|
new MessageBox(LANG_Wpage['failure']['status_401'], {
|
|
type: 'notice',
|
|
autohide: true
|
|
});
|
|
break;
|
|
default:
|
|
new MessageBox(LANG_Wpage['failure']['status'] + this.status + ']', {
|
|
type: 'error',
|
|
autohide: true
|
|
});
|
|
}
|
|
|
|
this.parent();
|
|
|
|
|
|
},
|
|
doCommand: function(cmdstr, arg2) {
|
|
|
|
var _this = this,
|
|
cmd;
|
|
|
|
if ($type(cmdstr) == 'string') {
|
|
try {
|
|
cmd = JSON.decode(cmdstr);
|
|
} catch(e) {}
|
|
} else {
|
|
cmd = cmdstr;
|
|
}
|
|
|
|
if (cmd && $type(cmd) != 'string') {
|
|
|
|
cmd = $H(cmd);
|
|
|
|
var _v1 = cmd.getKeys(),
|
|
_v2 = cmd.getValues();
|
|
|
|
return (new MessageBox(_v2[0], {
|
|
type: _v1[0] == 'success' ? 'default': _v1[0],
|
|
onHide: function() {
|
|
if (_v1[0] == 'error') {
|
|
return _this.onSuccess(cmdstr, arg2);
|
|
}
|
|
},
|
|
onShow: function() {
|
|
if (_v1[0] == 'error') {
|
|
return;
|
|
}
|
|
if (!$chk(_v2[1])) {
|
|
return _this.onSuccess(cmdstr, arg2);
|
|
}
|
|
|
|
|
|
var options = {},
|
|
_m;
|
|
|
|
if (_v1[1] == 'forward') {
|
|
|
|
$extend(options, {
|
|
method: _this.options.method,
|
|
data: _this.options.data
|
|
});
|
|
|
|
}
|
|
_this.onSuccess(cmdstr, arg2);
|
|
|
|
|
|
if (_m = _v2[1].match(/javascript:([\s\S]+)/)) {
|
|
|
|
$globalEval(_m[1]);
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
_this.page(_v2[1], options);
|
|
|
|
},
|
|
autohide: (cmd.autohide || 1500)
|
|
}));
|
|
|
|
} else {
|
|
|
|
new MessageBox(cmdstr, {
|
|
type: 'notice',
|
|
onHide: function() {
|
|
|
|
_this.onSuccess(cmdstr, arg2);
|
|
|
|
},
|
|
autohide: 4000
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
eventClear: function() {
|
|
|
|
for (e in this.$events) {
|
|
var fns = this.$events[e].clean();
|
|
for (var i = fns.length; i--;) {
|
|
this.removeEvent(e, fns[i]);
|
|
}
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
page: function() {
|
|
|
|
var params = Array.flatten(arguments).link({
|
|
'url': String.type,
|
|
/*请求地址*/
|
|
'options': Object.type,
|
|
/*请求配置*/
|
|
'sponsor': Element.type
|
|
/*发起请求事件的元素*/
|
|
});
|
|
|
|
this.eventClear();
|
|
|
|
var update = (params.options && params.options.update) ? $(params.options.update) : '';
|
|
|
|
if ( !! update) {
|
|
for (e in update.retrieve('events', {})) {
|
|
update.removeEvents(e);
|
|
}
|
|
}
|
|
|
|
delete(this.options.updateMap);
|
|
|
|
|
|
params.options = params.options || {};
|
|
|
|
|
|
this.setOptions(this.exoptions);
|
|
|
|
if (params.options) {
|
|
this.setOptions(params.options);
|
|
}
|
|
if (params.sponsor) {
|
|
this.options.sponsor = params.sponsor;
|
|
}
|
|
if (params.url) {
|
|
this.options.url = params.url;
|
|
}
|
|
|
|
if (!this.options.update && this.options.sponsor && $type(this.options.sponsor) == 'element') {
|
|
this.options.update = this.options.sponsor.getContainer();
|
|
}
|
|
|
|
var update = this.options.update = $(this.options.update || LAYOUT.content_main);
|
|
|
|
|
|
var exUpdateMap = {
|
|
'.side-r-content': LAYOUT.side_r_content,
|
|
'.mainHead': update.getPrevious(),
|
|
'.mainFoot': update.getNext(),
|
|
'.side-content': LAYOUT.side.getElement('.side-content')
|
|
};
|
|
|
|
|
|
this.options.updateMap = $merge(exUpdateMap, this.options.updateMap);
|
|
|
|
|
|
this.setHeader('WORKGROUND', top['currentWorkground'] || 'NULL');
|
|
|
|
this.send(this.options);
|
|
this.msgBox = new MessageBox(this.options.message || LANG_Wpage['loading'], {
|
|
type: 'notice'
|
|
});
|
|
},
|
|
render: function(scope) {
|
|
|
|
if (!this.options.render) return this;
|
|
|
|
|
|
scope = (scope || this.options.update);
|
|
|
|
var _this = this;
|
|
|
|
$(scope).getElements('form').each(function(f) {
|
|
|
|
f.addEvent('submit',
|
|
function(e) {
|
|
var _form = this;
|
|
if (_form.retrieve('submiting')) {
|
|
return e.stop();
|
|
}
|
|
|
|
if (!validate(_form)) {
|
|
e.stop();
|
|
return (new MessageBox(LANG_Wpage['form']['error'], {
|
|
type: 'error',
|
|
autohide: true
|
|
}));
|
|
}
|
|
|
|
$ES('textarea[ishtml=true]', _form).getValue();
|
|
/* html */
|
|
|
|
|
|
var _formtarget = _form.get('target');
|
|
if (_formtarget == '_blank') {
|
|
return true;
|
|
}
|
|
|
|
if (_form.get('enctype') == 'multipart/form-data' || _form.get('encoding') == 'multipart/form-data') {
|
|
_form.target = 'upload';
|
|
var targetobj = $(_form).retrieve('target', {});
|
|
if (('onRequest' in targetobj) && 'function' == $type(targetobj.onRequest)) {
|
|
try {
|
|
targetobj.onRequest();
|
|
} catch(e) {}
|
|
}
|
|
$('uploadframe').addEvent('load',
|
|
function() {
|
|
if (_form && _form.uid) _form.eliminate('submiting');
|
|
var doc = this.contentWindow.document;
|
|
var response = doc.body[(doc.body.innerText ? 'innerText': 'textContent')];
|
|
var cmd = null;
|
|
try {
|
|
if ((cmd = JSON.decode(response)) && cmd.splash) {
|
|
_this.eventClear().doCommand.call(_this, cmd);
|
|
}
|
|
} catch(e) {}
|
|
if (('onComplete' in targetobj) && 'function' == $type(targetobj.onComplete)) {
|
|
try {
|
|
targetobj.onComplete(response);
|
|
} catch(e) {}
|
|
}
|
|
if (!cmd) {
|
|
new MessageBox(LANG_Wpage['form']['complete'], {
|
|
autohide: 2000
|
|
});
|
|
}
|
|
$('uploadframe').removeEvent('load', arguments.callee).set('src', $('uploadframe').retrieve('default:src'));
|
|
|
|
}).store('default:src', $('uploadframe').src);
|
|
|
|
_form.store('submiting', true).submit();
|
|
new MessageBox(LANG_Wpage['form']['loading'], {
|
|
type: 'notice'
|
|
});
|
|
return true;
|
|
}
|
|
|
|
e.stop();
|
|
var _options = $merge(_form.retrieve('target', {}), JSON.decode(_formtarget)),
|
|
_onComplete = _options.onComplete || $empty;
|
|
_options.onComplete = function() {
|
|
_onComplete.apply(_this, $splat(arguments));
|
|
if (_form && _form.uid) _form.eliminate('submiting');
|
|
};
|
|
_this.page(_form.store('submiting', true).action, $merge({
|
|
method: _form.method,
|
|
data: _form,
|
|
message: LANG_Wpage['form']['loading']
|
|
},
|
|
_options), _form);
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
// console.log('W.render');
|
|
|
|
},
|
|
onComplete: function(re) {
|
|
|
|
new MessageBox(LANG_Wpage['complete'], {
|
|
autohide: 1000
|
|
});
|
|
|
|
var scope = this.options.update;
|
|
|
|
/*DatePicker*/
|
|
var dpInputs = $(scope).getElements('input[date]');
|
|
if (dpInputs&&dpInputs.length)
|
|
Ex_Loader("picker",
|
|
function() {
|
|
dpInputs.each(function(dpi) {
|
|
dpi.makeCalable();
|
|
});
|
|
});
|
|
|
|
|
|
/*BREADCRUMBS*/
|
|
|
|
// BREADCRUMBS =window.BREADCRUMBS;
|
|
if (BREADCRUMBS){
|
|
var _BREADCRUMBS = BREADCRUMBS.split(':');
|
|
[LAYOUT.head, LAYOUT.side].clean().each(function(layout) {
|
|
layout.getElements('.current').removeClass('current');
|
|
_BREADCRUMBS.each(function(item) {
|
|
var i = layout.getElement('a[mid=' + item + ']');
|
|
if ( !! i) {
|
|
i.addClass('current');
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
/*autocompleter*/
|
|
|
|
var autocpt = $(scope).getElements('input[autocompleter], textarea[autocompleter]');
|
|
// var autocpt = $$(autocpt, $(scope).getElements('textarea[autocompleter]'));
|
|
if (autocpt&&autocpt.length)
|
|
Ex_Loader('autocompleter',
|
|
function() {
|
|
autocpt.each(function(item) {
|
|
//item.setAttribute('autocomplete','off');
|
|
|
|
var params = item.get('autocompleter');
|
|
var callUrl = '?app=desktop&ctl=autocomplete¶ms=' + params;
|
|
|
|
var _getVar = params.match(/:([^,]*)/)[1];
|
|
|
|
|
|
item.addEvent('keydown',
|
|
function(e) {
|
|
if (e.code == 13) e.stop();
|
|
});
|
|
|
|
|
|
var _base_options = {
|
|
getVar: _getVar,
|
|
fxOptions: false,
|
|
delay: 300,
|
|
callJSON: function() {
|
|
return window.autocompleter_json;
|
|
},
|
|
injectChoice: function(json) {
|
|
|
|
var token = json[this.options.getVar];
|
|
var choice = new Element('li', {
|
|
'html': this.markQueryValue(token)
|
|
});
|
|
choice.inputValue = token;
|
|
this.addChoiceEvents(choice).inject(this.choices);
|
|
}
|
|
|
|
};
|
|
var _options = $merge(_base_options, JSON.decode(item.get('ac_options')));
|
|
new Autocompleter.script(item, callUrl, _options);
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// console.log('W.complete');
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
})();
|