PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.2.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.2.1
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.2.1, at assets/js/mainwp-users.js

575 lines 21.8 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 = MainWP.I18n.t('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(MainWP.I18n.t('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(MainWP.I18n.t('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(MainWP.I18n.t('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(MainWP.I18n.t('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(MainWP.I18n.t('Continue import.') + "\n");
377 jQuery('#import_user_btn_import').val(MainWP.I18n.t('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(MainWP.I18n.t('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', MainWP.I18n.t('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 if (!jQuery('[id^="user_import_csv_line_"]').length) {
426 return;
427 }
428
429 import_user_current_line_number++;
430
431 if (import_user_current_line_number > import_user_total_import) {
432 mainwp_import_users_finished();
433 return;
434 }
435
436 let import_data = jQuery('#user_import_csv_line_' + import_user_current_line_number).attr('encoded-data');
437 let original_line = jQuery('#user_import_csv_line_' + import_user_current_line_number).attr('original-line');
438
439 let decoded_data = false;
440 let pos_data = [];
441 let errors = [];
442
443 try {
444 decoded_data = JSON.parse(import_data);
445 } catch {
446 decoded_data = false;
447 errors.push(MainWP.I18n.t('Invalid import data.'));
448 }
449
450 if (decoded_data) {
451 jQuery('#import_user_import_logging .log').append('[' + import_user_current_line_number + '] ' + original_line + '\n');
452 let valid = mainwp_import_users_valid_data(decoded_data);
453 pos_data = valid.data;
454 errors = valid.errors;
455 }
456
457 if (errors.length > 0) {
458 jQuery('#import_user_import_failed_rows').append('<span>' + original_line + '</span>');
459 jQuery('#import_user_import_logging .log').append('[' + import_user_current_line_number + ']>> Error - ' + errors.join(" ") + '\n');
460 import_user_count_create_fails++;
461 mainwp_import_users_next();
462 return;
463 }
464
465 if (0 == pos_data.length) {
466 console.log('Error: import user data!');
467 return;
468 }
469
470 pos_data.action = 'mainwp_importuser';
471 pos_data.line_number = import_user_current_line_number;
472 let data = mainwp_secure_data(pos_data);
473
474 //Add user via ajax!!
475 jQuery.post(ajaxurl, data, function (response_data) {
476 if (response_data.error != undefined)
477 return;
478 mainwp_import_users_response(response_data);
479 mainwp_import_users_next();
480 }, 'json');
481 };
482
483 /* eslint-disable complexity */
484 let mainwp_import_users_valid_data = function (decoded_data) { // NOSONAR - complexity, multi user's fields.
485
486 let errors = []; // array.
487 let val_data = {}; // object.
488
489 val_data.user_login = decoded_data.user_login == undefined ? '' : decoded_data.user_login;
490 val_data.email = decoded_data.email == undefined ? '' : decoded_data.email;
491 val_data.first_name = decoded_data.first_name == undefined ? '' : decoded_data.first_name;
492 val_data.last_name = decoded_data.last_name == undefined ? '' : decoded_data.last_name;
493 val_data.url = decoded_data.url == undefined ? '' : decoded_data.url;
494 val_data.pass1 = decoded_data.pass1 == undefined ? '' : decoded_data.pass1;
495 val_data.send_password = decoded_data.send_password == undefined ? '' : decoded_data.send_password;
496 val_data.role = decoded_data.role == undefined ? '' : decoded_data.role;
497 val_data.select_sites = decoded_data.select_sites == undefined ? '' : decoded_data.select_sites;
498 val_data.select_groups = decoded_data.select_groups == undefined ? '' : decoded_data.select_groups;
499 val_data.select_by = '';
500
501 if (val_data.user_login == '') {
502 errors.push(MainWP.I18n.t('Please enter a username.'));
503 }
504
505 if (val_data.email == '') {
506 errors.push(MainWP.I18n.t('Please enter an email.'));
507 }
508
509 if (val_data.pass1 == '') {
510 errors.push(MainWP.I18n.t('Please enter a password.'));
511 }
512
513 let allowed_roles = ['subscriber', 'administrator', 'editor', 'author', 'contributor'];
514 if (jQuery.inArray(val_data.role, allowed_roles) == -1) {
515 errors.push(MainWP.I18n.t('Please select a data role.'));
516 }
517
518 if (val_data.select_sites == '') {
519
520 let selected_groups = val_data.select_groups.split(';');
521 if (selected_groups.length == 0) {
522 errors.push(MainWP.I18n.t('Please select websites or groups to add a user.'));
523 } else {
524 val_data.select_groups = selected_groups;
525 val_data.select_by = 'group';
526 }
527 } else {
528 let selected_sites = val_data.select_sites.split(';');
529 if (selected_sites.length == 0) {
530 errors.push(MainWP.I18n.t('Please select websites or groups to add a user.'));
531 } else {
532 val_data.select_sites = selected_sites;
533 val_data.select_by = 'site';
534 }
535 }
536 return {
537 errors: errors,
538 data: val_data
539 };
540
541 };
542 /* eslint-enable complexity */
543
544 let mainwp_import_users_response = function (response_data) {
545 let line_num = response_data.line_number;
546 let okList = response_data.ok_list;
547 let errorList = response_data.error_list;
548 if (okList != undefined)
549 for (let iok of okList) {
550 import_user_count_created_users++;
551 jQuery('#import_user_import_logging .log').append('[' + line_num + ']>> ' + iok + '\n');
552 }
553
554 if (errorList != undefined)
555 for (let ie of errorList) {
556 import_user_count_create_fails++;
557 jQuery('#import_user_import_logging .log').append('[' + line_num + ']>> ' + ie + '\n');
558 }
559
560 if (response_data.failed_logging != '' && response_data.failed_logging != undefined) {
561 jQuery('#import_user_import_failed_rows').append('<span>' + response_data.failed_logging + '</span>');
562 }
563 jQuery('#import_user_import_logging').scrollTop(jQuery('#import_user_import_logging .log').height());
564 };
565
566 let mainwp_import_users_finished = function () {
567 jQuery('#import_user_btn_import').val('Finished').attr('disabled', 'true');
568 jQuery('#MainWPBulkUploadUserLoading').hide();
569 jQuery('#import_user_import_logging .log').append('\n' + MainWP.I18n.t('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');
570 if (import_user_count_create_fails > 0) {
571 jQuery('#import_user_btn_save_csv').attr("style", 'display:inline-block;'); //Enable
572 }
573 jQuery('#import_user_import_logging').scrollTop(jQuery('#import_user_import_logging .log').height());
574 }
575