PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.1.4
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.1.4
6.2.2 6.2.1 6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 All 155 releases
mainwp / assets / js / mainwp-users.js

mainwp-users.js in MainWP Dashboard: Self-hosted WordPress Management for Agencies 6.1.4, at assets/js/mainwp-users.js

571 lines 21.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * MainWP_User.page
3 */
4 let userCountSent = 0;
5 let userCountReceived = 0;
6
7 let updateUsersBulkActionsState = function () {
8 let checkedCount = jQuery('#mainwp-users-table input[name="user[]"]:checked').length;
9 let dropdown = jQuery('#mainwp-manage-users #mainwp-bulk-actions');
10 let applyButton = jQuery('#mainwp-do-users-bulk-actions');
11
12 if (checkedCount > 0) {
13 dropdown.removeClass('disabled');
14 dropdown.parent('.ui.dropdown').removeClass('disabled');
15 applyButton.removeClass('disabled');
16 } else {
17 dropdown.addClass('disabled');
18 dropdown.parent('.ui.dropdown').addClass('disabled');
19 dropdown.dropdown('set selected', 'none');
20 applyButton.addClass('disabled');
21 }
22 };
23
24 let import_user_stop_by_user = false;
25 let import_user_current_line_number = 0;
26 let import_user_total_import = 0;
27 let import_user_count_created_users = 0;
28 let import_user_count_create_fails = 0;
29
30 jQuery(function () {
31
32 updateUsersBulkActionsState();
33
34 jQuery(document).on('change', '#mainwp-users-table .check-column INPUT:checkbox', function () {
35 updateUsersBulkActionsState();
36 });
37
38 // Fetch users
39 jQuery(document).on('click', '#mainwp_show_users', function () {
40 mainwp_fetch_users();
41 });
42
43 // Delete single user
44 jQuery(document).on('click', '.user_submitdelete', function () {
45 let confirmation = confirm('Are you sure you want to proceed?');
46
47 if (confirmation) {
48 mainwpuser_postAction(jQuery(this), 'delete');
49 return;
50 }
51
52 return false;
53 });
54
55 // Edit single user
56 jQuery(document).on('click', '.user_getedit', function () {
57 jQuery('td.check-column input[type="checkbox"]').each(function () {
58 this.checked = false;
59 });
60 mainwp_edit_users_box_init();
61 jQuery('#mainwp-edit-users-modal').modal('setting', 'closable', false).modal('show');
62 mainwpuser_postAction(jQuery(this), 'edit');
63 return false;
64 });
65
66 // Trigger Manage Users bulk actions
67 jQuery(document).on('click', '#mainwp-do-users-bulk-actions', function () {
68 let action = jQuery('#mainwp-bulk-actions').val();
69 if (action == 'none')
70 return;
71
72 let tmp = jQuery("input[name='user[]']:checked");
73 userCountSent = tmp.length;
74
75 if (userCountSent == 0)
76 return;
77
78 let _callback = function () {
79
80 if (action == 'edit') {
81 jQuery('#mainwp-edit-users-modal').modal('setting', 'closable', false).modal('show');
82 mainwp_edit_users_box_init();
83 return;
84 }
85
86 jQuery('#mainwp-do-users-bulk-actions').attr('disabled', 'true');
87 tmp.each(
88 function (index, elem) {
89 mainwpuser_postAction(elem, action);
90 }
91 );
92 };
93
94 if (action == 'delete') {
95 let msg = __('You are about to delete %1 user(s). Are you sure you want to proceed?', userCountSent);
96 mainwp_confirm(msg, _callback);
97 return;
98 }
99
100 _callback();
101 });
102
103
104 jQuery(document).on('click', '#mainwp_btn_update_user', function () {
105 let errors = [];
106 let tmp = jQuery("input[name='user[]']:checked");
107 userCountSent = tmp.length;
108
109 if (userCountSent == 0) {
110 errors.push(__('Please search and select users.'));
111 }
112
113 if (errors.length > 0) {
114 jQuery('#mainwp_update_password_error').html(errors.join('<br />'));
115 jQuery('#mainwp_update_password_error').show();
116 return;
117 }
118
119 jQuery('#mainwp_update_password_error').hide();
120 jQuery('#mainwp_users_updating').show();
121
122 jQuery('#mainwp-do-users-bulk-actions').attr('disabled', 'true');
123 jQuery('#mainwp_btn_update_user').attr('disabled', 'true');
124
125 tmp.each(
126 function (index, elem) {
127 mainwpuser_postAction(elem, 'update_user');
128 }
129 );
130 });
131
132 jQuery(document).on('click', '#bulk_updateadminpassword', function () {
133 mainwp_confirm(
134 'You are about to update administrator passwords on selected sites. This will overwrite the current password for the admin account used for connection.',
135 function () {
136 jQuery('#mainwp-update-admin-password-form').submit()
137 }
138 );
139 return false;
140 });
141 });
142
143 let mainwp_edit_users_box_init = function () {
144
145 jQuery('form#update_user_profile select#role option[value="donotupdate"]').prop('selected', true);
146 jQuery('form#update_user_profile select#role').prop("disabled", false);
147 jQuery('form#update_user_profile input#first_name').val('');
148 jQuery('form#update_user_profile input#last_name').val('');
149 jQuery('form#update_user_profile input#nickname').val('');
150 jQuery('form#update_user_profile input#email').val('');
151 jQuery('form#update_user_profile input#url').val('');
152 jQuery('form#update_user_profile select#display_name').empty().attr('disabled', 'disabled');
153 jQuery('form#update_user_profile #description').val('');
154 jQuery('form#update_user_profile input#password').val('');
155 };
156
157 let mainwpuser_postAction = function (elem, what) {
158 let rowElement = jQuery(elem).parents('tr');
159 let userId = rowElement.find('.userId').val();
160 let userName = rowElement.find('.userName').val();
161 let websiteId = rowElement.find('.websiteId').val();
162
163 let data = mainwp_secure_data({
164 action: 'mainwp_user_' + what,
165 userId: userId,
166 userName: userName,
167 websiteId: websiteId,
168 update_password: encodeURIComponent(jQuery('#password').val()) // to fix
169 });
170
171 if (what == 'update_user') {
172 data['user_data'] = jQuery('form#update_user_profile').serialize();
173 }
174
175 rowElement.find('.row-actions').hide();
176 if (what === 'delete') {
177 rowElement.html('<td colspan="8"><i class="ui active inline loader tiny"></i> Please wait</td>');
178 }
179 jQuery.post(ajaxurl, data, function (response) { // NOSONAR - complex.
180 if (what == 'edit' && response?.user_data) {
181 let roles_filter = ['administrator', 'subscriber', 'contributor', 'author', 'editor'];
182 let disabled_change_role = false;
183 if (response.user_data.role == '' || jQuery.inArray(response.user_data.role, roles_filter) === -1) {
184 jQuery('form#update_user_profile select#role option[value="donotupdate"]').prop('selected', true);
185 disabled_change_role = true;
186 } else {
187 jQuery('form#update_user_profile select#role option[value="' + response.user_data.role + '"]').prop('selected', true);
188 if (response.is_secure_admin) {
189 disabled_change_role = true;
190 }
191 }
192
193 if (disabled_change_role) {
194 jQuery('form#update_user_profile select#role').attr('disabled', 'disabled');
195 } else {
196 jQuery('form#update_user_profile select#role').prop("disabled", false);
197 }
198
199 jQuery('form#update_user_profile input#first_name').val(response.user_data.first_name);
200 jQuery('form#update_user_profile input#last_name').val(response.user_data.last_name);
201 jQuery('form#update_user_profile input#nickname').val(response.user_data.nickname);
202 jQuery('form#update_user_profile input#email').val(response.user_data.user_email);
203 jQuery('form#update_user_profile input#url').val(response.user_data.user_url);
204 jQuery('form#update_user_profile select#display_name').empty();
205 jQuery('form#update_user_profile select#display_name').prop("disabled", false);
206 if (response.user_data.public_display) {
207 jQuery.each(response.user_data.public_display, function (index, value) {
208 let o = new Option(value);
209 if (value == response.user_data.display_name) {
210 o.selected = true;
211 }
212 jQuery('form#update_user_profile select#display_name').append(o);
213 });
214 jQuery('form#update_user_profile select#display_name option[value="' + response.user_data.display_name + '"]').prop('selected', true);
215 }
216
217 jQuery('form#update_user_profile #description').val(response.user_data.description);
218 rowElement.find('td.check-column input[type="checkbox"]')[0].checked = true;
219 return;
220 }
221
222 if (response.result) {
223 rowElement.html('<td colspan="8"><i class="green check icon"></i> ' + response.result + '</td>');
224 } else {
225 rowElement.html('<td colspan="8"><i class="times red icon"></i> Undefined error. Please try again.</td>');
226 }
227
228 userCountReceived++;
229 if (userCountReceived == userCountSent) {
230 userCountReceived = 0;
231 userCountSent = 0;
232 jQuery('#mainwp-do-users-bulk-actions').prop("disabled", false);
233
234 jQuery('#mainwp_btn_update_user').prop("disabled", false);
235 jQuery('#mainwp_users_updating').hide();
236
237
238 if (what == 'update_user' || what == 'delete') {
239 jQuery('#mainwp_users_loading_info').show();
240 jQuery('#mainwp-edit-users-modal').modal('hide');
241 mainwp_fetch_users();
242 }
243 }
244 }, 'json');
245
246 return false;
247 };
248
249 // Fetch users from child sites
250 let mainwp_fetch_users = function () {
251 let errors = [];
252 let selected_sites = [];
253 let selected_groups = [];
254 let selected_clients = [];
255
256 if (jQuery('input[name="select_by"]').val() == 'site') {
257 jQuery("input[name='selected_sites[]']:checked").each(function () {
258 selected_sites.push(jQuery(this).val());
259 });
260 if (selected_sites.length == 0) {
261 errors.push(__('Please select at least one website or group or clients.'));
262 }
263 } else if (jQuery('input[name="select_by"]').val() == 'client') {
264 jQuery("input[name='selected_clients[]']:checked").each(function () {
265 selected_clients.push(jQuery(this).val());
266 });
267 if (selected_clients.length == 0) {
268 errors.push(__('Please select at least one website or group or clients.'));
269 }
270 } else {
271 jQuery("input[name='selected_groups[]']:checked").each(function () {
272 selected_groups.push(jQuery(this).val());
273 });
274 if (selected_groups.length == 0) {
275 errors.push(__('Please select at least one website or group or clients.'));
276 }
277 }
278
279 let role = "";
280 let roles = jQuery("#mainwp_user_roles").dropdown("get value");
281 if (roles !== null) {
282 role = roles.join(',');
283 }
284
285 if (errors.length > 0) {
286 mainwp_set_message_zone('#mainwp-message-zone', errors.join('<br />'), 'yellow');
287 jQuery('#mainwp_users_loading_info').hide();
288 return;
289 } else {
290 mainwp_set_message_zone('#mainwp-message-zone');
291 }
292
293 let name = jQuery('#mainwp_search_users').val();
294
295 let data = mainwp_secure_data({
296 action: 'mainwp_users_search',
297 urole: role,
298 search: name,
299 'groups[]': selected_groups,
300 'sites[]': selected_sites,
301 'clients[]': selected_clients
302 });
303
304 jQuery('#mainwp-loading-users-row').show();
305
306 jQuery.post(ajaxurl, data, function (response) {
307 response = response.trim();
308 jQuery('#mainwp-loading-users-row').hide();
309 jQuery('#mainwp_users_loading_info').hide();
310 jQuery('#mainwp_users_main').show();
311 jQuery('#mainwp_users_wrap_table').html(response);
312 // re-initialize datatable
313 jQuery("#mainwp-users-table").DataTable().destroy();
314 jQuery('#mainwp-users-table').DataTable({
315 "responsive": true,
316 "colReorder": { columns: ":not(.check-column):not(#mainwp-users-actions)" },
317 "stateSave": true,
318 "pagingType": "full_numbers",
319 "order": [],
320 "scrollX": true,
321 "lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]],
322 "columnDefs": [{
323 "targets": 'no-sort',
324 "orderable": false
325 }],
326 "drawCallback": function () {
327 setTimeout(() => {
328 jQuery('#mainwp-users-table .ui.dropdown').dropdown();
329 jQuery('#mainwp-users-table .ui.checkbox').checkbox();
330 mainwp_datatable_fix_menu_overflow('#mainwp-users-table');
331 mainwp_table_check_columns_init(); // ajax: to fix checkbox all.
332 updateUsersBulkActionsState();
333 }, 1000);
334 },
335 select: {
336 items: 'row',
337 style: 'multi+shift',
338 selector: 'tr>td:not(.not-selectable)'
339 }
340 }).on('select', function (e, dt, type, indexes) {
341 if ('row' == type) {
342 dt.rows(indexes)
343 .nodes()
344 .to$().find('td.check-column .ui.checkbox').checkbox('set checked');
345 updateUsersBulkActionsState();
346 }
347 }).on('deselect', function (e, dt, type, indexes) {
348 if ('row' == type) {
349 dt.rows(indexes)
350 .nodes()
351 .to$().find('td.check-column .ui.checkbox').checkbox('set unchecked');
352 updateUsersBulkActionsState();
353 }
354 }).on('columns-reordered', function () {
355 setTimeout(() => {
356 jQuery('#mainwp-users-table .ui.dropdown').dropdown();
357 jQuery('#mainwp-users-table .ui.checkbox').checkbox();
358 mainwp_datatable_fix_menu_overflow('#mainwp-users-table');
359 mainwp_table_check_columns_init(); // ajax: to fix checkbox all.
360 }, 1000);
361 });
362 });
363 };
364
365
366
367 /**
368 * Bulk upload new user
369 */
370 jQuery(function () {
371 import_user_total_import = jQuery('#import_user_total_import').val();
372
373 jQuery('#import_user_btn_import').on('click', function () {
374 if (import_user_stop_by_user) {
375 import_user_stop_by_user = false;
376 jQuery('#import_user_import_logging .log').append(__('Continue import.') + "\n");
377 jQuery('#import_user_btn_import').val(__('Pause'));
378 jQuery('#MainWPBulkUploadUserLoading').show();
379 if (import_user_count_create_fails > 0) {
380 jQuery('#import_user_btn_save_csv').attr("style", 'display:inline-block;'); //Enable
381 }
382 mainwp_import_users_next();
383 } else {
384 import_user_stop_by_user = true;
385 jQuery('#import_user_import_logging .log').append(_('Paused import by user.') + "\n");
386 jQuery('#import_user_btn_import').val(__('Continue'));
387 jQuery('#MainWPBulkUploadUserLoading').hide();
388 if (import_user_count_create_fails > 0) {
389 jQuery('#import_user_btn_save_csv').attr("style", 'display:inline-block;'); //Enable
390 }
391 }
392 });
393
394
395 jQuery('#import_user_btn_save_csv').on('click', function () {
396 let fail_data = '';
397 jQuery('#import_user_import_failed_rows span').each(function () {
398 fail_data += jQuery(this).html() + "\r\n";
399 });
400 let blob = new Blob([fail_data], { type: "text/plain;charset=utf-8" });
401 saveAs(blob, "import_users_fails.csv");
402 });
403
404 if (jQuery('#import_user_do_import').val() == 1) {
405 jQuery('#MainWPBulkUploadUserLoading').show();
406 mainwp_import_users_next();
407 }
408 });
409
410
411 globalThis.mainwp_bulkupload_users = function () {
412 if (jQuery('#import_user_file_bulkupload').val() == '') {
413 feedback('mainwp-message-zone', __('Please enter CSV file for upload.'), 'yellow');
414 jQuery('#import_user_file_bulkupload').parent().parent().addClass('form-invalid');
415 } else {
416 jQuery('#createuser').submit();
417 }
418 };
419
420 let mainwp_import_users_next = function () {
421
422 if (import_user_stop_by_user)
423 return;
424
425 import_user_current_line_number++;
426
427 if (import_user_current_line_number > import_user_total_import) {
428 mainwp_import_users_finished();
429 return;
430 }
431
432 let import_data = jQuery('#user_import_csv_line_' + import_user_current_line_number).attr('encoded-data');
433 let original_line = jQuery('#user_import_csv_line_' + import_user_current_line_number).attr('original-line');
434
435 let decoded_data = false;
436 let pos_data = [];
437 let errors = [];
438
439 try {
440 decoded_data = JSON.parse(import_data);
441 } catch {
442 decoded_data = false;
443 errors.push(__('Invalid import data.'));
444 }
445
446 if (decoded_data) {
447 jQuery('#import_user_import_logging .log').append('[' + import_user_current_line_number + '] ' + original_line + '\n');
448 let valid = mainwp_import_users_valid_data(decoded_data);
449 pos_data = valid.data;
450 errors = valid.errors;
451 }
452
453 if (errors.length > 0) {
454 jQuery('#import_user_import_failed_rows').append('<span>' + original_line + '</span>');
455 jQuery('#import_user_import_logging .log').append('[' + import_user_current_line_number + ']>> Error - ' + errors.join(" ") + '\n');
456 import_user_count_create_fails++;
457 mainwp_import_users_next();
458 return;
459 }
460
461 if (0 == pos_data.length) {
462 console.log('Error: import user data!');
463 return;
464 }
465
466 pos_data.action = 'mainwp_importuser';
467 pos_data.line_number = import_user_current_line_number;
468 let data = mainwp_secure_data(pos_data);
469
470 //Add user via ajax!!
471 jQuery.post(ajaxurl, data, function (response_data) {
472 if (response_data.error != undefined)
473 return;
474 mainwp_import_users_response(response_data);
475 mainwp_import_users_next();
476 }, 'json');
477 };
478
479 /* eslint-disable complexity */
480 let mainwp_import_users_valid_data = function (decoded_data) { // NOSONAR - complexity, multi user's fields.
481
482 let errors = []; // array.
483 let val_data = {}; // object.
484
485 val_data.user_login = decoded_data.user_login == undefined ? '' : decoded_data.user_login;
486 val_data.email = decoded_data.email == undefined ? '' : decoded_data.email;
487 val_data.first_name = decoded_data.first_name == undefined ? '' : decoded_data.first_name;
488 val_data.last_name = decoded_data.last_name == undefined ? '' : decoded_data.last_name;
489 val_data.url = decoded_data.url == undefined ? '' : decoded_data.url;
490 val_data.pass1 = decoded_data.pass1 == undefined ? '' : decoded_data.pass1;
491 val_data.send_password = decoded_data.send_password == undefined ? '' : decoded_data.send_password;
492 val_data.role = decoded_data.role == undefined ? '' : decoded_data.role;
493 val_data.select_sites = decoded_data.select_sites == undefined ? '' : decoded_data.select_sites;
494 val_data.select_groups = decoded_data.select_groups == undefined ? '' : decoded_data.select_groups;
495 val_data.select_by = '';
496
497 if (val_data.user_login == '') {
498 errors.push(__('Please enter a username.'));
499 }
500
501 if (val_data.email == '') {
502 errors.push(__('Please enter an email.'));
503 }
504
505 if (val_data.pass1 == '') {
506 errors.push(__('Please enter a password.'));
507 }
508
509 let allowed_roles = ['subscriber', 'administrator', 'editor', 'author', 'contributor'];
510 if (jQuery.inArray(val_data.role, allowed_roles) == -1) {
511 errors.push(__('Please select a data role.'));
512 }
513
514 if (val_data.select_sites == '') {
515
516 let selected_groups = val_data.select_groups.split(';');
517 if (selected_groups.length == 0) {
518 errors.push(__('Please select websites or groups to add a user.'));
519 } else {
520 val_data.select_groups = selected_groups;
521 val_data.select_by = 'group';
522 }
523 } else {
524 let selected_sites = val_data.select_sites.split(';');
525 if (selected_sites.length == 0) {
526 errors.push(__('Please select websites or groups to add a user.'));
527 } else {
528 val_data.select_sites = selected_sites;
529 val_data.select_by = 'site';
530 }
531 }
532 return {
533 errors: errors,
534 data: val_data
535 };
536
537 };
538 /* eslint-enable complexity */
539
540 let mainwp_import_users_response = function (response_data) {
541 let line_num = response_data.line_number;
542 let okList = response_data.ok_list;
543 let errorList = response_data.error_list;
544 if (okList != undefined)
545 for (let iok of okList) {
546 import_user_count_created_users++;
547 jQuery('#import_user_import_logging .log').append('[' + line_num + ']>> ' + iok + '\n');
548 }
549
550 if (errorList != undefined)
551 for (let ie of errorList) {
552 import_user_count_create_fails++;
553 jQuery('#import_user_import_logging .log').append('[' + line_num + ']>> ' + ie + '\n');
554 }
555
556 if (response_data.failed_logging != '' && response_data.failed_logging != undefined) {
557 jQuery('#import_user_import_failed_rows').append('<span>' + response_data.failed_logging + '</span>');
558 }
559 jQuery('#import_user_import_logging').scrollTop(jQuery('#import_user_import_logging .log').height());
560 };
561
562 let mainwp_import_users_finished = function () {
563 jQuery('#import_user_btn_import').val('Finished').attr('disabled', 'true');
564 jQuery('#MainWPBulkUploadUserLoading').hide();
565 jQuery('#import_user_import_logging .log').append('\n' + __('Number of users to import: %1 Created users: %2 Failed: %3', import_user_total_import, import_user_count_created_users, import_user_count_create_fails) + '\n');
566 if (import_user_count_create_fails > 0) {
567 jQuery('#import_user_btn_save_csv').attr("style", 'display:inline-block;'); //Enable
568 }
569 jQuery('#import_user_import_logging').scrollTop(jQuery('#import_user_import_logging .log').height());
570 }
571