digitaldemocratic/admin/src/admin/static/js/users.js

578 lines
22 KiB
JavaScript

$(document).on('shown.bs.modal', '#modalAddDesktop', function () {
modal_add_desktops.columns.adjust().draw();
});
$(document).ready(function() {
$.ajax({
type: "GET",
"url": "/api/groups",
success: function(data)
{
data.forEach(element => {
var groupOrigins = [];
['keycloak'].forEach(o => {
if (element[o]) {
groupOrigins.push(o)
}
})
$(".groups-select").append(
'<option value="' + element.path + '">' + element.path + '</option>'
)
});
$('.groups-select').select2();
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
// $.ajax({
// type: "GET",
// "url": "/api/groups",
// success: function(data)
// {
// data.forEach(element => {
// var groupOrigins = [];
// ['keycloak', 'moodle', 'nextcloud'].forEach(o => {
// if (element[o]) {
// groupOrigins.push(o)
// }
// })
// $(".groups-select").append(
// '<option value=' + element.path + '>' + element.name + ' (' + groupOrigins.join(',') + ') </option>'
// )
// });
// $('.groups-select').select2();
// },
// error: function(data)
// {
// alert('Something went wrong on our side...')
// }
// });
$.ajax({
type: "GET",
"url": "/api/roles",
success: function(data)
{
data.forEach(element => {
$(".role-moodle-select, .role-nextcloud-select, .role-keycloak-select").append(
'<option value="' + element.name + '">' + element.name + '</option>'
)
})
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
$('.btn-global-resync').on('click', function () {
$.ajax({
type: "GET",
url:"/api/resync",
success: function(data)
{
table.ajax.reload();
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
});
// Open new user modal
$('.btn-new-user').on('click', function () {
$("#modalAddUserForm")[0].reset();
$.ajax({
type: "GET",
"url": "/api/user_password",
success: function(data)
{
$('#modalAddUser #password').val(data)
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
$('#modalAddUser #enabled').prop('checked',true).iCheck('update');
$('#modalAddUser').modal({
backdrop: 'static',
keyboard: false
}).modal('show');
});
//has uppercase
window.Parsley.addValidator('uppercase', {
requirementType: 'number',
validateString: function(value, requirement) {
var uppercases = value.match(/[A-Z]/g) || [];
return uppercases.length >= requirement;
},
messages: {
en: 'Your password must contain at least (%s) uppercase letter.'
}
});
//has lowercase
window.Parsley.addValidator('lowercase', {
requirementType: 'number',
validateString: function(value, requirement) {
var lowecases = value.match(/[a-z]/g) || [];
return lowecases.length >= requirement;
},
messages: {
en: 'Your password must contain at least (%s) lowercase letter.'
}
});
// Send new user form
$('#modalAddUser #send').on('click', function () {
var form = $('#modalAddUserForm');
form.parsley().validate();
if (form.parsley().isValid()){
formdata = form.serializeObject()
// console.log('NEW USER')
// console.log(formdata)
$.ajax({
type: "POST",
"url": "/api/user",
data: JSON.stringify(formdata),
complete: function(jqXHR, textStatus) {
switch (jqXHR.status) {
case 200:
$("#modalAddUser").modal('hide');
break;
case 409:
new PNotify({
title: "Add user error",
text: $.parseJSON(jqXHR.responseText)['msg'],
hide: true,
delay: 3000,
icon: 'fa fa-alert-sign',
opacity: 1,
type: 'error'
});
break;
case 412:
new PNotify({
title: "Add user error",
text: $.parseJSON(jqXHR.responseText)['msg'],
hide: true,
delay: 3000,
icon: 'fa fa-alert-sign',
opacity: 1,
type: 'error'
});
break;
default:
alert("Server error.");
}
}
});
}
table.ajax.reload();
});
// $("#modalEditUser #send").on('click', function(e){
// var form = $('#modalEditUserForm');
// form.parsley().validate();
// if (form.parsley().isValid()){
// data=$('#modalEditUserForm').serializeObject();
// data['id']=$('#modalEditUserForm #id').val();
// console.log('Editing user...')
// console.log(data)
// }
// });
$('#modalEditUser #send').on('click', function () {
var form = $('#modalEditUserForm');
form.parsley().validate();
if (form.parsley().isValid()){
formdata = form.serializeObject()
formdata['id']=$('#modalEditUserForm #id').val();
formdata['username']=$('#modalEditUserForm #username').val();
console.log('UPDATE USER')
console.log(formdata)
$.ajax({
type: "PUT",
"url": "/api/user/"+formdata['id'],
data: JSON.stringify(formdata),
complete: function(jqXHR, textStatus) {
switch (jqXHR.status) {
case 200:
$("#modalEditUser").modal('hide');
break;
case 404:
new PNotify({
title: "Update user error",
text: $.parseJSON(jqXHR.responseText)['msg'],
hide: true,
delay: 3000,
icon: 'fa fa-alert-sign',
opacity: 1,
type: 'error'
});
break;
case 409:
new PNotify({
title: "Add user error",
text: $.parseJSON(jqXHR.responseText)['msg'],
hide: true,
delay: 3000,
icon: 'fa fa-alert-sign',
opacity: 1,
type: 'error'
});
break;
case 412:
new PNotify({
title: "Add user error",
text: $.parseJSON(jqXHR.responseText)['msg'],
hide: true,
delay: 3000,
icon: 'fa fa-alert-sign',
opacity: 1,
type: 'error'
});
break;
default:
alert("Server error.");
}
}
});
}
table.ajax.reload();
});
//DataTable Main renderer
var table = $('#users').DataTable({
"ajax": {
"url": "/api/users",
"dataSrc": ""
},
"language": {
"loadingRecords": '<i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i><span class="sr-only">Loading...</span>',
"emptyTable": "<h1>You don't have any user created yet.</h1><br><h2>Create one using the +Add new button on top right of this page.</h2>"
},
"rowId": "id",
"deferRender": true,
"columns": [
// {
// "className": 'details-control',
// "orderable": false,
// "data": null,
// "width": "10px",
// "defaultContent": '<button class="btn btn-xs btn-info" type="button" data-placement="top" ><i class="fa fa-plus"></i></button>'
// },
{ "data": "enabled", "width": "1px" },
{ "data": "id", "width": "10px" },
{ "data": "roles", "width": "10px" },
{
"className": 'actions-control',
"orderable": false,
"data": null,
"width": "80px",
"defaultContent": '<button id="btn-delete" class="btn btn-xs" type="button" data-placement="top" ><i class="fa fa-times" style="color:darkred"></i></button> \
<button id="btn-password" class="btn btn-xs" type="button" data-placement="top" ><i class="fa fa-lock" style="color:orange"></i></button> \
<button id="btn-edit" class="btn btn-xs" type="button" data-placement="top" ><i class="fa fa-pencil" style="color:darkblue"></i></button>'
},
{ "data": "username", "width": "10px"},
{ "data": "first", "width": "10px"},
{ "data": "last", "width": "150px"},
{ "data": "email", "width": "10px"},
{ "data": "keycloak_groups", "width": "50px" },
{ "data": "quota", "width": "10px", "default": "-"},
],
"order": [[6, 'asc']],
"columnDefs": [ {
"targets": 1,
"render": function ( data, type, full, meta ) {
// return '<object data="/static/img/missing.jpg" type="image/jpeg" width="25" height="25"><img src="/avatar/'+full.id+'" title="'+full.id+'" width="25" height="25"></object>'
return '<img src="/avatar/'+full.id+'" title="'+full.id+'" width="25" height="25" onerror="if (this.src != \'/static/img/missing.jpg\') this.src = \'/static/img/missing.jpg\';">'
}},
{
"targets": 0,
"render": function ( data, type, full, meta ) {
if(full.enabled){
return '<i class="fa fa-check" style="color:lightgreen"></i>'
}else{
return '<i class="fa fa-close" style="color:darkred"></i>'
};
}},
{
"targets": 2,
"render": function ( data, type, full, meta ) {
return full.roles[0][0].toUpperCase() + full.roles[0].slice(1);
}},
{
"targets": 4,
"render": function ( data, type, full, meta ) {
return '<b>'+full.username+'</b>'
}},
{
"targets": 8,
"render": function ( data, type, full, meta ) {
grups = ''
full.keycloak_groups.forEach(element => {
grups += '<span class="label label-primary" style="margin: 5px;">' + element + '</span>'
})
return grups
}},
{
"targets": 9,
"render": function ( data, type, full, meta ) {
if(full.quota == false){
return 'Unlimited'
}else{
return full.quota
}
}},
]
} );
// $template = $(".template-detail-users");
// $('#users').find('tbody').on('click', 'td.details-control', function () {
// var tr = $(this).closest('tr');
// var row = table.row( tr );
// if ( row.child.isShown() ) {
// // This row is already open - close it
// row.child.hide();
// tr.removeClass('shown');
// }
// else {
// // Close other rows
// if ( table.row( '.shown' ).length ) {
// $('.details-control', table.row( '.shown' ).node()).click();
// }
// // Open this row
// row.child( addUserDetailPannel(row.data()) ).show();
// tr.addClass('shown');
// actionsUserDetail()
// }
// } );
$('#users').find(' tbody').on( 'click', 'button', function () {
var data = table.row( $(this).parents('tr') ).data();
// var closest=$(this).closest("div").parent();
// var pk=closest.attr("data-pk");
// console.log(pk)
switch($(this).attr('id')){
case 'btn-edit':
$("#modalEditUserForm")[0].reset();
$('#modalEditUser').modal({
backdrop: 'static',
keyboard: false
}).modal('show');
$('#modalEditUser #user-avatar').attr("src","/avatar/"+data.id)
setUserDefault('#modalEditUser', data.id);
$('#modalEdit').parsley();
break;
case 'btn-delete':
new PNotify({
title: 'Confirmation Needed',
text: "Are you sure you want to delete user: "+data['username']+"?",
hide: false,
opacity: 0.9,
confirm: {
confirm: true
},
buttons: {
closer: false,
sticker: false
},
history: {
history: false
},
addclass: 'pnotify-center'
}).get().on('pnotify.confirm', function() {
$.ajax({
type: "DELETE",
url:"/api/user/"+data.id,
success: function(data)
{
table.ajax.reload();
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
}).on('pnotify.cancel', function() {
});
break;
case 'btn-password':
$("#modalPasswdUserForm")[0].reset();
$('#modalPasswdUser').modal({
backdrop: 'static',
keyboard: false
}).modal('show');
$('#modalPasswdUserForm #id').val(data.id);
$.ajax({
type: "GET",
url:"/api/user_password",
success: function(data)
{
$('#modalPasswdUserForm #password').val(data);
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
break;
}
});
$("#modalPasswdUser #send").on('click', function(e){
var form = $('#modalPasswdUserForm');
form.parsley().validate();
if (form.parsley().isValid()){
formdata=$('#modalPasswdUserForm').serializeObject();
id=$('#modalPasswdUserForm #id').val();
$.ajax({
type: "PUT",
url:"/api/user_password/" + id,
data: JSON.stringify(formdata),
success: function(data)
{
$("#modalPasswdUser").modal('hide');
table.ajax.reload();
// groups_table.ajax.reload();
},
error: function(data)
{
alert('Something went wrong on our side...')
}
// statusCode: {
// 404: function(data) {
// // {'error': 'description}. Not able to get responseJSON from received object
// alert('User not exists in system!')
// },
// 200: function() {
// console.log("Success");
// }
// },
// error: function(data)
// {
// alert('Something went wrong on our side...')
// }
});
}
});
// function addUserDetailPannel ( d ) {
// $newPanel = $template.clone();
// $newPanel.html(function(i, oldHtml){
// return oldHtml.replace(/d.id/g, d.id).replace(/d.username/g, d.username);
// });
// return $newPanel
// }
// function actionsUserDetail(){
// $('.btn-passwd').on('click', function () {
// var closest=$(this).closest("div").parent();
// var pk=closest.attr("data-pk");
// $("#modalPasswdUserForm")[0].reset();
// $('#modalPasswdUser').modal({
// backdrop: 'static',
// keyboard: false
// }).modal('show');
// $('#modalPasswdUserForm #id').val(pk);
// });
// $('.btn-edit').on('click', function () {
// var closest=$(this).closest("div").parent();
// var pk=closest.attr("data-pk");
// $("#modalEditUserForm")[0].reset();
// $('#modalEditUser').modal({
// backdrop: 'static',
// keyboard: false
// }).modal('show');
// setUserDefault('#modalEditUser', pk);
// $('#modalEdit').parsley();
// });
// $('.btn-delete').on('click', function () {
// var closest=$(this).closest("div").parent();
// var pk=closest.attr("data-pk");
// var username=closest.attr("data-username");
// console.log(username)
// new PNotify({
// title: 'Confirmation Needed',
// text: "Are you sure you want to delete the user: "+ username+"?",
// hide: false,
// opacity: 0.9,
// confirm: {
// confirm: true
// },
// buttons: {
// closer: false,
// sticker: false
// },
// history: {
// history: false
// },
// addclass: 'pnotify-center'
// }).get().on('pnotify.confirm', function() {
// console.log('Deleting user...')
// }).on('pnotify.cancel', function() {
// });
// });
// }
function setUserDefault(div_id, user_id) {
$.ajax({
type: "GET",
url:"/api/user/" + user_id,
success: function(data)
{
console.log(data)
if (data.enabled) {
$(div_id + ' #enabled').iCheck('check')
}
$(div_id + ' #id').val(data.id);
$(div_id + ' #username').val(data.username);
$(div_id + ' #email').val(data.email);
$(div_id + ' #firstname').val(data.first);
$(div_id + ' #lastname').val(data.last);
if(data.quota == false){
$(div_id + ' #quota').val('false')
}else{
$(div_id + ' #quota').val(data.quota);
}
$(div_id + ' .groups-select').val(data.keycloak_groups);
// $(div_id + ' .role-moodle-select').val(data.keycloak_roles);
// $(div_id + ' .role-nextcloud-select').val(data.roles);
$(div_id + ' .role-keycloak-select').val(data.roles[0]);
$('.groups-select').trigger('change');
// $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change');
}
});
// MOCK
// $(div_id + ' #id').val('b57c8d3f-ee08-4a1d-9873-f40c082b9c69');
// $(div_id + ' #user-avatar').attr('src', 'static/img/usera.jpg');
// $(div_id + ' #username').val('yedcaqwvt');
// $(div_id + ' #email').val('yedcaqwvt@institutmariaespinalt.cat');
// $(div_id + ' #firstname').val('Ymisno');
// $(div_id + ' #lastname').val('Edcaqwvt tavnuoes');
// $(div_id + ' .groups-select').val(['student', 'manager']);
// $(div_id + ' .role-moodle-select').val('51cc1a95-94b7-48eb-aebb-1eba6745e09f');
// $(div_id + ' .role-nextcloud-select').val('1e21ec95-b8c7-43b8-baad-1a31ad33f388');
// $(div_id + ' .role-keycloak-select').val('13da53d5-c50b-42d9-8fbf-84f2ed7cbf9e');
// $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change');
}
});