%PDF- %PDF-
| Direktori : /home2/vacivi36/intranet.vacivitta.com.br/static/js/humhub/ |
| Current File : //home2/vacivi36/intranet.vacivitta.com.br/static/js/humhub/humhub.client.js |
/**
* Manages the client/server communication. Handles humhub json api responses and
* pjax requests.
*/
humhub.module('client', function (module, require, $) {
var object = require('util').object;
var event = require('event');
var action = require('action');
var additions = require('ui.additions');
var view = require('ui.view');
var HEADER_VIEW_CONTEXT = 'HUMHUB-VIEW-CONTEXT';
/**
* Response Wrapper Object for easily accessing common data
*/
var Response = function (xhr, url, textStatus, dataType) {
this.url = url;
this.status = xhr.status;
this.response = xhr.responseJSON || xhr.responseText;
//Textstatus = "timeout", "error", "abort", "parsererror", "application"
this.textStatus = textStatus;
this.xhr = xhr;
if (!dataType) {
var responseType = this.header('content-type');
if (responseType && responseType.indexOf('json') > -1) {
dataType = 'json';
} else if (responseType && responseType.indexOf('html') > -1) {
dataType = 'html';
} else if (!this.isAbort() && !this.isError()) {
console.error('Unable to determine dataType from response, this may cause problems.');
}
}
this.dataType = dataType;
// If we expect json and received json we merge the json result with our response object.
if (this.dataType === 'json') {
$.extend(this, this.response);
} else if (this.dataType === 'html') {
this[dataType] = this.response;
}
};
Response.prototype.isAbort = function () {
return this.textStatus === "abort";
};
Response.prototype.isError = function () {
return this.textStatus === "error";
};
Response.prototype.header = function (key) {
return this.xhr.getResponseHeader(key);
};
Response.prototype.setSuccess = function (data) {
this.data = data;
return this;
};
Response.prototype.setError = function (errorThrown) {
try {
this.error = JSON.parse(this.response);
} catch (e) {/* Nothing todo... */
}
this.error = this.error || {};
this.errorThrown = errorThrown;
this.validationError = (this.status === 400);
return this;
};
Response.prototype.isError = function () {
return this.status >= 400;
};
Response.prototype.getLog = function () {
var result = $.extend({}, this);
if (this.response && object.isString(this.response)) {
result.response = this.response.substr(0, 500)
result.response += (this.response.length > 500) ? '...' : '';
}
if (this.html && object.isString(this.html)) {
result.html = this.html.substr(0, 500)
result.html += (this.html.length > 500) ? '...' : '';
}
return result;
};
var reload = function (preventPjax) {
if (!preventPjax && module.pjax.config.active) {
module.pjax.reload();
} else {
location.reload(true);
}
};
var submit = function ($form, cfg, originalEvent) {
if ($form instanceof $.Event && $form.$form && $form.length) {
originalEvent = $form;
$form = $form.$form;
} else if ($form instanceof $.Event && $form.$trigger) {
originalEvent = $form;
$form = $form.$trigger.closest('form');
} else if (cfg instanceof $.Event) {
originalEvent = cfg;
cfg = {};
} else if ($form.url) {
// Create a post form
$form = $('<form>', {
action: $form.url,
method: 'post'
});
$form.appendTo('body');
}
cfg = cfg || {};
$form = object.isString($form) ? $($form) : $form;
if (!$form || !$form.length) {
return Promise.reject('Could not determine form for submit action.');
}
cfg.type = $form.attr('method') || 'post';
cfg.data = $form.serialize();
var url = cfg.url;
if (!url && (originalEvent && originalEvent.url)) {
url = originalEvent.url;
} else if (!url && $form) {
url = $form.attr('action');
}
return ajax(url, cfg, originalEvent);
};
var actionPost = function (evt) {
post(evt).catch(function (e) {
module.log.error(e, true);
});
};
var post = function (url, cfg, originalEvent) {
if (url instanceof $.Event) {
originalEvent = url;
url = originalEvent.url || cfg.url;
} else if (cfg instanceof $.Event) {
originalEvent = cfg;
cfg = {};
} else if (!object.isString(url)) {
cfg = url;
url = cfg.url;
}
cfg = cfg || {};
cfg.type = cfg.method = 'POST';
return ajax(url, cfg, originalEvent);
};
var html = function (url, cfg, originalEvent) {
if (url instanceof $.Event) {
originalEvent = url;
url = originalEvent.url || cfg.url;
} else if (cfg instanceof $.Event) {
originalEvent = cfg;
cfg = {};
} else if (!object.isString(url)) {
cfg = url;
url = cfg.url;
}
cfg = cfg || {};
cfg.type = cfg.method = 'GET';
cfg.dataType = 'html';
return get(url, cfg, originalEvent);
};
var get = function (url, cfg, originalEvent) {
if (url instanceof $.Event) {
originalEvent = url;
url = originalEvent.url || cfg.url;
} else if (cfg instanceof $.Event) {
originalEvent = cfg;
cfg = {};
} else if (!object.isString(url)) {
cfg = url;
url = cfg.url;
}
cfg = cfg || {};
cfg.type = cfg.method = 'GET';
return ajax(url, cfg, originalEvent);
};
var json = function (url, cfg, originalEvent) {
return new Promise(function (resolve, reject) {
get(url, cfg, originalEvent).then(function (response) {
resolve(response.data);
}).catch(reject)
});
};
var ajax = function (url, cfg, originalEvent) {
// support for ajax(url, event) and ajax(path, successhandler);
if (cfg instanceof $.Event) {
originalEvent = cfg;
cfg = {};
} else if (object.isFunction(cfg)) {
cfg = {'success': cfg};
}
var viewContext = cfg.viewContext || view.getViewContext();
if (viewContext) {
if (!cfg['headers']) {
cfg['headers'] = {};
}
cfg['headers'][HEADER_VIEW_CONTEXT] = viewContext
}
var requestXhr = null;
var promise = new Promise(function (resolve, reject) {
cfg = cfg || {};
// allows data-action-data-type="json" on $trigger
if (originalEvent && object.isFunction(originalEvent.data)) {
cfg.dataType = originalEvent.data('data-type', cfg.dataType);
}
var errorHandler = cfg.error;
var error = function (xhr, textStatus, errorThrown) {
var response = new Response(xhr, url, textStatus, cfg.dataType).setError(errorThrown);
if (response.status == 302) {
_redirect(xhr);
resolve(response);
return;
}
if (errorHandler && object.isFunction(errorHandler)) {
errorHandler(response);
}
finish(originalEvent);
reject(response);
};
var successHandler = cfg.success;
var success = function (data, textStatus, xhr) {
var response = new Response(xhr, url, textStatus, cfg.dataType).setSuccess(data);
if (successHandler) {
successHandler(response);
}
finish(originalEvent);
resolve(response);
// Other modules can register global handler by the response type given by the backend.
// For example {type:'modal', 'content': '...')
if (response.type) {
event.trigger('humhub:modules:client:response:' + response.type);
}
promise.done(function () {
// If content with <link> tags are inserted in resolve, the ajaxComplete handler in yii.js
// makes sure redundant stylesheets are removed. Here we make sure it is called after inserting the response.
$(document).trigger('ajaxComplete');
});
};
var beforeSendHandler = cfg.beforeSend;
var beforeSend = function (xhr, settings) {
if (beforeSendHandler) {
beforeSendHandler(xhr, settings);
}
requestXhr = xhr;
};
//Overwriting the handler with our wrapper handler
cfg.success = success;
cfg.error = error;
cfg.beforeSend = beforeSend;
cfg.url = url;
$.ajax(cfg);
});
promise.status = function (setting) {
return new Promise(function (resolve, reject) {
promise.then(function (response) {
try {
if (setting[response.status]) {
setting[response.status](response);
}
resolve(response);
} catch (e) {
reject(e);
}
}).catch(function (response) {
try {
if (setting[response.status]) {
setting[response.status](response);
resolve(response);
} else {
reject(response);
}
} catch (e) {
reject(e);
}
});
});
};
promise.abort = function () {
if (requestXhr) {
requestXhr.abort();
}
};
return promise;
};
var _redirect = function (xhr) {
var url = null;
if (xhr.getResponseHeader('X-Pjax-Url')) {
url = xhr.getResponseHeader('X-Pjax-Url');
} else {
url = xhr.getResponseHeader('X-Redirect');
}
redirect(url);
};
var redirect = function (url) {
if (!url) {
return;
}
url = object.isString(url) ? url : url.url;
if (object.isString(url)) {
if (module.pjax && module.pjax.config.active) {
module.pjax.redirect(url);
} else {
document.location = url;
}
return;
}
};
var finish = function (originalEvent) {
if (originalEvent && object.isFunction(originalEvent.finish) && originalEvent.block !== 'manual') {
originalEvent.finish();
}
};
var back = function () {
history.back();
};
var onBeforeLoad = function (form, msg, msgModal) {
var $form = $(form);
if (!$form.is('form')) {
$form = $form.find('form');
}
if (!$form.length || !$form.is('form')) {
return;
}
$form.data('state', serializeFormState($form));
msg = msg || module.text('warn.onBeforeLoad');
msgModal = msgModal || module.text('warn.onBeforeCloseModal');
$form.resetChanges = function() {
$form.data('state', null);
}
$form.on('submit', $form.resetChanges);
$form.find('[type=submit]').on('click', $form.resetChanges);
// Note some browser do not support custom messages for this event.
$(window).on('beforeunload.humhub_client', function () {
if (formStateChanged($form)) {
return msg;
}
});
var confirmFormChanges = function (evt, message) {
if (unloadForm($form, message)) {
$form.resetChanges();
} else {
evt.preventDefault();
}
}
$(document).on('pjax:beforeSend.humhub_client', function (evt) {
confirmFormChanges(evt, msg);
});
$(document).on('hide.bs.modal', '.modal', function (evt) {
if ($form.closest('.modal').length) {
confirmFormChanges(evt, msgModal);
}
});
};
var serializeFormState = function ($form) {
return $form.find('input, select, textarea').not('[data-prevent-statechange]').serialize();
};
var unloadForm = function ($form, msg) {
return !formStateChanged($form) || confirmUnload(msg)
};
var formStateChanged = function ($form) {
return $form.data('state') && $form.data('state') !== serializeFormState($form);
};
var confirmUnload = function (msg) {
if (!module.confirmedMessages) {
module.confirmedMessages = {};
}
msg = msg || module.text('warn.onBeforeLoad');
if (module.confirmedMessages[msg] && (Date.now() - module.confirmedMessages[msg].time < 100)) {
// Don't ask the same confirmation message twice if it was answered recently
// because several forms exist on the current page with confirm option
return module.confirmedMessages[msg].result;
}
var confirmedResult = window.confirm(msg);
module.confirmedMessages[msg] = {time: Date.now(), result: confirmedResult};
return confirmedResult;
};
var offBeforeLoad = function () {
$(window).off('beforeunload.humhub_client');
$(document).off('pjax:beforeSend.humhub_client');
};
module.initOnPjaxLoad = true;
var init = function (isPjax) {
if (!isPjax) {
if (module.config.reloadableScripts) {
$.extend(yii.reloadableScripts, module.config.reloadableScripts)
}
action.registerHandler('post', function (evt) {
evt.block = 'manual';
module.post(evt).then(function (resp) {
module.log.debug('post success', resp, true);
}).catch(function (err) {
evt.finish();
module.log.error(err, true);
});
});
additions.register('acknowledgeForm', function ($match) {
onBeforeLoad($match, ($match.data('acknowledgeMessage') || null));
});
} else {
offBeforeLoad();
}
};
module.export({
ajax: ajax,
back: back,
actionPost: actionPost,
post: post,
get: get,
html: html,
reload: reload,
submit: submit,
init: init,
sortOrder: 100,
json: json,
Response: Response,
onBeforeLoad: onBeforeLoad,
offBeforeLoad: offBeforeLoad,
unloadForm: unloadForm,
redirect: redirect
});
});