1 define([
'jquery',
'elgg',
'elgg/spinner',
'elgg/system_messages',
'elgg/security',
'elgg/i18n',
'elgg/hooks'],
function ($,
elgg, spinner, system_messages, security, i18n, hooks) {
2 var site_url =
elgg.get_site_url(),
3 action_base = site_url +
'action/',
4 fragment_pattern = /#.*$/,
5 query_pattern = /\?.*$/,
6 leading_slash_pattern = /^\
7 slashes_pattern = /(^\/|\/$)/g;
16 function Ajax(use_spinner) {
18 use_spinner = (use_spinner == null) ?
true : !!use_spinner;
21 var spinner_starts = 0;
40 function fetch(options, hook_type) {
44 metadata_extracted =
false,
45 error_displayed =
false;
53 function extract_metadata(data, status_code) {
55 status_code = status_code || 200;
57 if (!metadata_extracted) {
58 var m = data._elgg_msgs;
63 if (data.error && options.showErrorMessages) {
64 system_messages.error(data.error);
65 error_displayed =
true;
68 if (data.error || status_code !== 200) {
74 m && m.success && options.showSuccessMessages && system_messages.success(m.success);
75 delete data._elgg_msgs;
77 var deps = data._elgg_deps;
78 deps && deps.length && Ajax._require(deps);
79 delete data._elgg_deps;
81 metadata_extracted =
true;
95 hook_type = hook_type ||
'';
97 if (!$.isPlainObject(options)) {
98 throw new Error(
'options must be a plain object with key "url"');
101 if (!options.url && hook_type !==
'path:') {
102 throw new Error(
'options must be a plain object with key "url"');
106 if (options.data === undefined) {
110 if (options.showSuccessMessages === undefined) {
111 options.showSuccessMessages =
true;
114 if (options.showErrorMessages === undefined) {
115 options.showErrorMessages =
true;
118 if ($.isPlainObject(options.data)) {
119 options.data = options.data || {};
120 }
else if (options.data instanceof FormData) {
121 options.processData =
false;
122 options.contentType =
false;
124 if (typeof options.data !==
'string') {
125 throw new Error(
'if defined, options.data must be a plain object or string');
129 options.dataType =
'json';
132 orig_options = $.extend({}, options);
137 if (hook_type && typeof options.data !==
'string') {
138 options.data = hooks.trigger(Ajax.REQUEST_DATA_HOOK, hook_type, params, options.data);
143 if (!options.method) {
144 options.method =
'GET';
145 if (options.data && !$.isEmptyObject(options.data)) {
146 options.method =
'POST';
151 options.beforeSend =
function () {
152 orig_options.beforeSend && orig_options.beforeSend.apply(null, arguments);
156 options.complete =
function () {
158 if (spinner_starts < 1) {
162 orig_options.complete && orig_options.complete.apply(null, arguments);
166 var custom_error =
function() {};
168 custom_error = options.error;
171 options.error =
function (jqXHR, textStatus, errorThrown) {
172 if (!jqXHR.getAllResponseHeaders()) {
174 custom_error(jqXHR, textStatus, errorThrown);
181 var data = $.parseJSON(jqXHR.responseText);
182 if ($.isPlainObject(data)) {
183 extract_metadata(data, jqXHR.status);
186 if (window.console) {
187 console.warn(e.message);
191 if (!error_displayed && options.showErrorMessages) {
192 system_messages.error(i18n.echo(
'ajax:error'));
196 custom_error(jqXHR, textStatus, errorThrown);
199 options.dataFilter =
function (data, type) {
200 if (type !==
'json') {
204 data = $.parseJSON(data);
206 extract_metadata(data, 200);
209 options: orig_options
212 data = hooks.trigger(Ajax.RESPONSE_DATA_HOOK, hook_type, params, data);
215 jqXHR.AjaxData = data;
217 if (data.value !== undefined) {
219 return JSON.stringify(data.value);
222 return JSON.stringify(data);
225 options.url =
elgg.normalize_url(options.url);
227 'X-Elgg-Ajax-API':
'2' 235 that._ajax_options = options;
237 jqXHR = $.ajax(options);
251 this.path =
function (path, options) {
252 elgg.assertTypeOf(
'string', path);
255 if (path.indexOf(site_url) === 0) {
256 path = path.substring(site_url.length);
259 path = path.replace(fragment_pattern,
'');
263 options = options || {};
267 path = path.replace(query_pattern,
'').replace(slashes_pattern,
'');
269 return fetch(options,
'path:' + path);
281 this.view =
function (view, options) {
282 elgg.assertTypeOf(
'string', view);
284 throw new Error(
'view cannot be empty');
289 options = options || {};
290 options.url =
'ajax/view/' + view;
291 options.method = options.method ||
'GET';
294 view = view.replace(query_pattern,
'').replace(slashes_pattern,
'');
296 return fetch(options,
'view:' + view);
308 this.form =
function (action, options) {
309 elgg.assertTypeOf(
'string', action);
311 throw new Error(
'action cannot be empty');
314 action = action.replace(leading_slash_pattern,
'').replace(fragment_pattern,
'');
316 assertNotUrl(action);
318 options = options || {};
319 options.url =
'ajax/form/' + action;
320 options.method = options.method ||
'GET';
323 action = action.replace(query_pattern,
'').replace(slashes_pattern,
'');
325 return fetch(options,
'form:' + action);
337 this.action =
function (action, options) {
338 elgg.assertTypeOf(
'string', action);
340 throw new Error(
'action cannot be empty');
344 if (action.indexOf(action_base) === 0) {
345 action = action.substring(action_base.length);
348 action = action.replace(leading_slash_pattern,
'').replace(fragment_pattern,
'');
350 assertNotUrl(action);
352 options = options || {};
353 options.data = options.data || {};
356 var m = action.match(/\?(.+)$/);
357 if (m && /(^|&)__elgg_ts=/.test(m[1])) {
360 options.data = security.addToken(options.data);
363 options.method = options.method ||
'POST';
364 options.url =
'action/' + action;
367 action = action.replace(query_pattern,
'').replace(slashes_pattern,
'');
369 return fetch(options,
'action:' + action);
378 this.objectify =
function (el) {
384 $(el).trigger(
'elgg-ajax-objectify');
386 return new FormData($(el)[0]);
395 this.
forward =
function(destination) {
398 elgg.forward(destination);
407 function assertNotUrl(arg) {
408 if (/^https?:/.test(arg)) {
409 throw new Error(
'elgg/Ajax cannot be used with external URLs');
417 Ajax.REQUEST_DATA_HOOK =
'ajax_request_data';
425 Ajax.RESPONSE_DATA_HOOK =
'ajax_response_data';
430 Ajax._require = require;
elgg forward
Meant to mimic the php forward() function by simply redirecting the user to another page...
define(['jquery', 'elgg/spinner', 'elgg/Ajax', 'elgg/system_messages', 'elgg/security', 'elgg/i18n', 'jquery-ui/widgets/sortable'], function($, spinner, Ajax, system_messages, security, i18n){function freezePlugins(){$('#elgg-plugin-list-cover').css('display', 'block');};function unfreezePlugins(){$('#elgg-plugin-list-cover').css('display', 'none');};function initPluginReordering(){$('#elgg-plugin-list >.elgg-list-container > ul').sortable({items: 'li:has(>.elgg-state-draggable)', handle: '.elgg-body', forcePlaceholderSize:true, placeholder: 'elgg-plugin-placeholder', opacity:0.8, revert:500, stop:movePlugin});};function toggleSinglePlugin(){spinner.start();freezePlugins();};function toggleAllPlugins(event){event.preventDefault();if(!confirm(i18n.echo('question:areyousure'))){return;}freezePlugins();var guids=[], state=$(this).data('desiredState'), find_state=state== 'active'? 'inactive': 'active';$('.elgg-plugin.elgg-state-'+find_state+ ':visible').each(function(){var guid=$(this).data('guid');if(guid){guids.push(guid);}});if(!guids.length){system_messages.error(i18n.echo('admin:plugins:already:'+state));unfreezePlugins();return;}spinner.start();var $form=$('< form method="post"/>');$form.prop('action', security.addToken(this.href));$form.append('< input type="hidden"name="guids"value="' + guids.join(',') + '"/>');$form.appendTo("body").submit();};function movePlugin(e, ui){freezePlugins();var pluginGuid=ui.item.attr('id');pluginGuid=pluginGuid.replace('elgg-object-', '');var ajax=new Ajax();ajax.action('admin/plugins/set_priority',{data:{plugin_guid:pluginGuid, priority:ui.item.index()+1}, success:function(){unfreezePlugins();}});};function filterPluginCategory(event){event.preventDefault();$(".elgg-admin-plugins-categories > li").removeClass("elgg-state-selected");$(".elgg-plugin").hide();$(".elgg-plugin-category-"+$(this).attr("rel")).show();$(this).closest('li').addClass("elgg-state-selected");};initPluginReordering();$(document).on('click', '.elgg-admin-plugins-categories a', filterPluginCategory);$(document).on('click', '.elgg-plugins-toggle', toggleAllPlugins);$(document).on('click', '.elgg-plugin-state-change', toggleSinglePlugin);})