2019-05-09 18:54:39 +12:00
|
|
|
(function (window) {
|
|
|
|
"use strict";
|
|
|
|
|
2019-05-09 20:01:51 +12:00
|
|
|
window.ls.container.get('view').add(
|
2019-05-09 18:54:39 +12:00
|
|
|
{
|
2019-05-12 19:24:53 +12:00
|
|
|
selector: 'data-service',
|
2019-05-12 23:20:51 +12:00
|
|
|
repeat: false,
|
2019-05-12 19:24:53 +12:00
|
|
|
controller: function(element, view, container, form, alerts, expression, window) {
|
|
|
|
let action = element.dataset['service'];
|
|
|
|
let service = element.dataset['name'] || action;
|
2019-05-09 18:54:39 +12:00
|
|
|
let event = element.dataset['event']; // load, click, change, submit
|
|
|
|
let confirm = element.dataset['confirm'] || ''; // Free text
|
|
|
|
let loading = element.dataset['loading'] || ''; // Free text
|
|
|
|
let loaderId = null;
|
|
|
|
let scope = element.dataset['scope'] || 'sdk'; // Free text
|
|
|
|
let debug = !!(element.dataset['debug']); // Free text
|
|
|
|
|
|
|
|
if (debug) console.log('%c[service init]: ' + action + ' (' + service + ')', 'color:red');
|
|
|
|
|
|
|
|
let resolve = function(target) {
|
|
|
|
let FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
|
|
|
|
let text = target.toString();
|
|
|
|
let args = text.match(FN_ARGS)[1].split(',');
|
|
|
|
let data = ('FORM' === element.tagName) ? form.toJson(element) : {};
|
|
|
|
|
|
|
|
if (debug) console.log('%c[form data]: ', 'color:green', data);
|
|
|
|
|
|
|
|
return target.apply(target, args.map(function(value) {
|
|
|
|
let result = null;
|
|
|
|
|
|
|
|
if(!value) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 1. Get from element data-param-* (expression supported)
|
|
|
|
* 2. Get from element data-param-state-*
|
|
|
|
* 3. Get from element form object-*
|
|
|
|
*/
|
|
|
|
|
|
|
|
if(element.dataset['param' + value.charAt(0).toUpperCase() + value.slice(1)]) {
|
|
|
|
result = expression.parse(element.dataset['param' + value.charAt(0).toUpperCase() + value.slice(1)]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(data[value]) {
|
|
|
|
result = data[value];
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!result) {
|
|
|
|
result = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (debug) console.log('%c[param resolved]: (' + service + ') ' + value + '=' + result, 'color:#808080');
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}));
|
|
|
|
};
|
|
|
|
|
|
|
|
let exec = function(event) {
|
2019-05-13 01:03:30 +12:00
|
|
|
element.$lsSkip = true;
|
|
|
|
|
2019-05-09 18:54:39 +12:00
|
|
|
if (debug) console.log('%c[executed]: ' + scope + '.' + action, 'color:yellow', event, element, document.body.contains(element));
|
|
|
|
|
|
|
|
if(!document.body.contains(element)) {
|
|
|
|
element = undefined;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(confirm) {
|
|
|
|
if (window.confirm(confirm) !== true) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(loading) {
|
|
|
|
loaderId = alerts.send({text: loading, class: ''}, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
let method = container.path(scope + '.' + action);
|
|
|
|
|
|
|
|
if(!method) {
|
|
|
|
throw new Error('Method "' + scope + '.' + action + '" not found');
|
|
|
|
}
|
|
|
|
|
|
|
|
let result = resolve(method);
|
|
|
|
|
|
|
|
if(!result) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
result
|
|
|
|
.then(function (data) {
|
|
|
|
if(loaderId !== null) { // Remove loader if needed
|
|
|
|
alerts.remove(loaderId);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!element) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-05-12 23:20:51 +12:00
|
|
|
try {
|
|
|
|
container.set(service.replace('.', '-'), JSON.parse(data), true, true);
|
2019-05-13 01:03:30 +12:00
|
|
|
if (debug) console.log('%cservice ready: "' + service.replace('.', '-') + '"', 'color:green');
|
|
|
|
if (debug) console.log('%cservice:', 'color:blue', container.get(service.replace('.', '-')));
|
2019-05-12 23:20:51 +12:00
|
|
|
} catch (e) {
|
|
|
|
container.set(service.replace('.', '-'), {}, true);
|
2019-05-09 18:54:39 +12:00
|
|
|
}
|
2019-05-13 01:03:30 +12:00
|
|
|
|
|
|
|
element.$lsSkip = false;
|
|
|
|
|
|
|
|
view.render(element);
|
2019-05-09 18:54:39 +12:00
|
|
|
}, function (exception) {
|
|
|
|
if(loaderId !== null) { // Remove loader if needed
|
|
|
|
alerts.remove(loaderId);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!element) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
let events = event.trim().split(',');
|
|
|
|
|
|
|
|
for (let y = 0; y < events.length; y++) {
|
|
|
|
if ('' === events[y]) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (events[y].trim()) {
|
|
|
|
case 'load':
|
|
|
|
exec();
|
|
|
|
break;
|
|
|
|
case 'none':
|
|
|
|
break;
|
|
|
|
case 'click':
|
|
|
|
case 'change':
|
|
|
|
case 'keypress':
|
|
|
|
case 'keydown':
|
|
|
|
case 'keyup':
|
|
|
|
case 'input':
|
|
|
|
case 'submit':
|
|
|
|
element.addEventListener(events[y], exec);
|
|
|
|
break;
|
|
|
|
default:
|
2019-05-14 21:02:51 +12:00
|
|
|
document.addEventListener(events[y], exec);
|
2019-05-09 18:54:39 +12:00
|
|
|
}
|
|
|
|
|
|
|
|
if (debug) console.log('%cregistered: "' + events[y].trim() + '" (' + service + ')', 'color:blue');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
})(window);
|