Commit b88eff76 authored by reynaldi adriantama's avatar reynaldi adriantama

group management/user management

parent 2f08a104
......@@ -32,5 +32,7 @@ urlpatterns = [
path('adduser/', views.addUser, name="adduser"),
path('getallGroups/', views.listGroup, name="getallGroups"),
path('switchStatus/', views.deactivateUser, name="switchStatus"),
path('loadUserbyId/', views.loadUserbyId, name="loadUserbyId")
path('loadUserbyId/', views.loadUserbyId, name="loadUserbyId"),
path('addGroup/', views.addGroup, name="addGroup"),
path('deleteGroup/', views.deleteGroup, name="deleteGroup")
]
......@@ -52,10 +52,22 @@ class Usermanagement(generic.TemplateView):
}
user_res.append(datas)
with conn.cursor() as grouplist_:
grouplist_.execute("SELECT * FROM auth_group ORDER BY name ASC")
allGroup = grouplist_.fetchall()
group_res = []
for rows in allGroup:
datas = {
"id" : rows[0],
"name" : rows[1],
}
group_res.append(datas)
context = {
'title' : 'user management',
'data' : user_res
'data' : user_res,
'dataGroup' : group_res
}
print(context)
......@@ -130,7 +142,7 @@ def addUser(request):
@api_view(('POST',))
def listGroup(request):
if request.method == "POST":
groupList = Group.objects.all()
groupList = Group.objects.all().order_by('name')
group = []
for g in groupList:
......@@ -246,4 +258,75 @@ def loadGroupById(iduser):
resGroup.append(i[0])
print(resGroup)
return resGroup
\ No newline at end of file
return resGroup
@api_view(('POST',))
def addGroup(request):
if request.method == "POST":
name = request.POST.get('name')
idgroup = request.POST.get('id')
try:
if idgroup:
with conn.cursor() as cursor:
cursor.execute("UPDATE auth_group SET name = '"+name+"' WHERE id="+idgroup)
result = cursor.rowcount
print(result)
data = {
"code" : 0,
"data" : "Group telah diperbaharui.",
"info" : "success"
}
else:
group = Group.objects.get(name=name)
data = {
"code" : 4,
"data" : "Group telah tersedia.",
"info" : "failed"
}
except Group.DoesNotExist:
Group.objects.create(name=name)
if Group.objects.get(name=name):
data = {
"code" : 0,
"info" : "success",
"data" : "Group berhasil ditambahkan"
}
else:
data = {
"code" : 4,
"info" : "failed",
"data" : "Group gagal ditambahkan"
}
return Response(data)
@api_view(('POST',))
def deleteGroup(request):
if request.method == "POST":
id = request.POST.get('id')
with conn.cursor() as cursor:
cursor.execute("DELETE FROM auth_group WHERE id="+id)
result = cursor.rowcount
if result > 0:
data = {
"code" : 0,
"info" : "success",
"data" : "data berhasil dihapus"
}
else:
data = {
"code" : 4,
"info" : "success",
"data" : "data berhasil dihapus"
}
return Response(data)
\ No newline at end of file
......@@ -93,6 +93,7 @@ $(function() {
// Mini
$('.select-size-xs').select2({
maximumSelectionLength: 5,
containerCssClass: 'select-xs'
});
......
......@@ -37,6 +37,6 @@
Notific{% static 'Plugin -->
<script src="{% static '/js/plugins/bootstrap-notify.js' %}"></script>
<!-- Control {% static 'for Material Dashboard: parallax effects, scripts for the example pages etc -->
<script src="{% static '/js/material-dashboard.js' %}" type="text/javascript"></script>
<!-- <script src="{% static '/js/material-dashboard.js' %}" type="text/javascript"></script> -->
<!-- Material{% static 'ard DEMO methods, don't include it in your project! -->
<script src="{% static '/demo/demo.js' %}"></script>
\ No newline at end of file
<!-- <script src="{% static '/demo/demo.js' %}"></script> -->
\ No newline at end of file
......@@ -11,6 +11,7 @@
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.Default.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet.locatecontrol/dist/L.Control.Locate.min.css" />
......@@ -56,10 +57,6 @@
margin-right: 0px;
}
th {
min-width: 150px;
}
.modal-colors{
background-color: #1a222f;
}
......@@ -67,6 +64,25 @@
.lbl-top{
margin-top: 10px;
}
.select2-selection--multiple:not([class*=bg-]) .select2-selection__choice {
background-color: #eee;
color: #333333;
margin-top: 3px;
margin-bottom: 3px;
border-radius: 0px;
}
.page_loader {
position: fixed;
background: url('../../static/img/loadingz.gif') 50% 50% no-repeat rgb(249, 249, 249);
left: 0px;
top: 0px;
width: 100%;
height: 100%;
z-index: 9999;
opacity: .5;
}
::-webkit-scrollbar {
width: 10px;
......@@ -144,7 +160,7 @@
<div class="sidebar-user">
<div class="category-content">
<div class="media">
<a href="#" class="media-left"><img src="assets/images/placeholder.jpg" class="img-circle img-sm" alt=""></a>
<a href="#" class="media-left"><img src="{% static '/img/placeholder.jpg' %}" class="img-circle img-sm" alt=""></a>
<div class="media-body">
<span class="media-heading text-semibold">{{user.username}}</span>
<div class="text-size-mini text-muted">
......@@ -172,14 +188,13 @@
<!-- Main -->
<li class="navigation-header"> <i class="icon-menu" title="Main pages"></i></li>
<li><a class="tablinks" onclick="openInfo(event, 'info-maps')" id="defaultOpen"><span>User Management</span></a></li>
<li><a href="?page=user" class="tablinks" id="defaultOpen"><i class="icon-user"></i><span>User Management</span></a></li>
<li><a href="?page=group" class="tablinks" id="defaultOpen"><i class="icon-users4"></i><span>Group</span></a></li>
<!-- <li><a class="tablinks" onclick="openInfo(event, 'info-penduduk')" id="defaultOpen"><span>Kependudukan</span></a></li>
<li><a class="tablinks" onclick="openInfo(event, 'info-pendidikan')" id="defaultOpen"><span>Pendidikan</span></a></li>
<li><a class="tablinks" onclick="openInfo(event, 'info-pekerjaan')" id="defaultOpen"><span>Pekerjaan</span></a></li>
<li><a class="tablinks" onclick="openInfo(event, 'info-poi')" id="defaultOpen"><span>POI</span></a></li> -->
</ul>
</li>
<!-- /page kits -->
</ul>
......@@ -193,6 +208,7 @@
<!-- Main content -->
<!-- User management Tab -->
<div class="content-wrapper" id="info-maps">
<div>
<!-- Page header -->
......@@ -209,7 +225,7 @@
<div class="content" style="padding: 15px;">
<!-- Main charts -->
<!-- Sales stats -->
<div class="panel panel-flat">
<div class="panel panel-flat" style="display: none;">
<div class="panel-heading">
<h6 class="panel-title">Table User</h6>
<button id="modalAddButton" class="btn btn-primary btn-sm" value="SAVE" style="bottom: 15px; float: right; display:none;" data-toggle="modal" data-target="#modal_theme_info"></button>
......@@ -218,7 +234,7 @@
<hr style="margin-top: 0px;">
<div class="panel-body">
<table class="table table-responsive datatable-show-all" id="userList">
<table class="table table-responsive datatable-show-all table-sm" id="userList">
<thead>
<tr>
<th>No.</th>
......@@ -274,6 +290,73 @@
<!-- /main charts -->
</div>
</div>
<!-- end user management tab -->
<div class="content-wrapper" id="usergroup" style="display: none;">
<div>
<!-- Page header -->
<div class="page-header page-header-default" style="margin-bottom: 0px;">
<div class="breadcrumb-line">
<ul class="breadcrumb">
<li>Group</li>
</ul>
</div>
</div>
<!-- /page header -->
<!-- Content area -->
<div class="content" style="padding: 15px;">
<!-- Main charts -->
<!-- Sales stats -->
<div class="panel panel-flat" style="display: none;">
<div class="panel-heading">
<h6 class="panel-title">Table Group</h6>
<button id="modalAddButtong" class="btn btn-primary btn-sm" value="SAVE" style="bottom: 15px; float: right; display:none;" data-toggle="modal" data-target="#modal_group"></button>
</div>
<hr style="margin-top: 0px;">
<div class="panel-body">
<table class="table table-responsive datatable-groups table-sm" id="usergroup" >
<thead>
<tr>
<th>No.</th>
<th>Name</th>
<th class="text-center">Actions</th>
</tr>
</thead>
<tbody>
{% for group in dataGroup %}
<tr>
<td>{{forloop.counter}}</td>
<td>{{group.name}}</td>
<td class="text-center">
<ul class="icons-list">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="icon-menu9"></i>
</a>
<ul class="dropdown-menu dropdown-menu-right">
<li><a onclick="deletegroup('{{group.id}}', '{{group.name}}')" ><i class="icon-user-block"></i> Delete group</a></li>
<li><a onclick="showmodalgroup('{{group.id}}', '{{group.name}}')"><i class="icon-users"></i> Edit group</a></li>
</ul>
</li>
</ul>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- /form validation -->
</div>
</div>
<!-- /main charts -->
</div>
</div>
<!-- /main content -->
</div>
<!-- /page content -->
......@@ -337,8 +420,37 @@
</div>
</div>
<div id="modal_group" class="modal fade">
<div class="modal-dialog md">
<div class="modal-content">
<div class="modal-header bg-info" style="background-color: #1a222f !important;">
<button type="button" class="close" data-dismiss="modal" onclick="destroyfade()">&times;</button>
<h6 class="modal-title modstitg">Modal Tambah Group</h6>
</div>
<div class="modal-body" style="max-height: 450px;overflow-y: auto;">
<input type="hidden" id="idgroup">
<div class="form-group">
<label class="col-lg-3 control-label lbl-top" >Nama Group</label>
<div class="col-lg-9">
<input id="inGroupName" type="text" class="form-control" value=""required>
</div>
</div>
</div>
<hr>
<div class="modal-footer">
<button type="button" class="btn btn-link" data-dismiss="modal" onclick="destroyfade()">Close</button>
<button type="button" class="btn btn-info" id="savegroup">Save changes</button>
</div>
</div>
</div>
</div>
<div class="page_loader"></div>
<!-- Core JS files -->
<script type="text/javascript" src="{% static 'js/plugins/loaders/pace.min.js' %}"></script>
......@@ -453,6 +565,19 @@
document.getElementById(infName).style.display = "block";
evt.currentTarget.className += " active";
}
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const page = urlParams.get('page')
if(page == "group"){
$("#usergroup").css("display", "block");
$("#info-maps").css("display", "none");
}else{
$("#usergroup").css("display", "none");
$("#info-maps").css("display", "block");
}
function destroyfade(){
$(".modal-backdrop").css("display","none")
......@@ -499,6 +624,48 @@
});
$('.datatable-groups').DataTable({
autoWidth: false,
columnDefs: [
{
orderable: false,
width: '100px',
targets: [ 2 ]
},
{
orderable: false,
width: '100px',
targets: [ 0 ]
}
],
dom: '<"float-left"B>frtip',
buttons: [
{
text: 'Tambah Group',
action: function ( e, dt, node, config ) {
$("#modalAddButtong").click();
$("#idgroup").val(null);
$(".modstitg").html("Tambah Group")
loadGroups(null)
}
}
],
language: {
search: '<span>Filter:</span> _INPUT_',
searchPlaceholder: 'Type to filter...',
lengthMenu: '<span>Show:</span> _MENU_',
paginate: { 'first': 'First', 'last': 'Last', 'next': '&rarr;', 'previous': '&larr;' }
},
drawCallback: function () {
$(this).find('tbody tr').slice(-3).find('.dropdown, .btn-group').addClass('dropup');
},
preDrawCallback: function() {
$(this).find('tbody tr').slice(-3).find('.dropdown, .btn-group').removeClass('dropup');
}
});
$("#modalAddButton").click(function(){
$("body").css("padding-right","0px !important")
})
......@@ -532,7 +699,7 @@
console.log(isObject);
// return false
$.ajax({
url: "{% url 'adduser' %}",
......@@ -571,7 +738,6 @@
$("#select_group").on("click", function(e){
e.preventDefault()
})
function loadGroups(isSelect){
......@@ -621,6 +787,7 @@
}
});
}
function switchuserstatus(id, isactive){
var isObject = {}
......@@ -722,4 +889,127 @@
}
});
}
loaderPage(false);
function loaderPage(stat) {
if (stat == true) {
$('.page_loader').show();
} else {
$('.page_loader').hide();
$(".panel-flat").css("display", "block")
}
};
$("#savegroup").on("click", function(){
addGroup();
})
function addGroup(){
var isObject = {}
var idgroup = $("#idgroup").val();
isObject.name = $("#inGroupName").val();
if(idgroup){
isObject.id = idgroup;
}
$.ajax({
url: "{% url 'addGroup' %}",
data: isObject,
dataType: 'json',
type: 'post',
success: function(data) {
let response = data;
if(response.code == 0){
$("#modal_group").modal('toggle');
destroyfade();
swal({
title : response.info,
text : response.data,
type : "success",
icon : "success",
confirmButtonColor: "#00BCD4"
}).then((isok) => {
window.location.href = window.location.origin+"/usermanagement/?page=group"
})
}else{
swal({
title : response.info,
text : response.data,
type : "alert",
icon : "error",
confirmButtonColor: "#00BCD4"
})
}
}
});
}
function showmodalgroup(id, name){
console.log(id);
console.log(name);
$("#idgroup").val(id);
$("#inGroupName").val(name);
$(".modstitg").html("Edit Group");
$("#modalAddButtong").click();
}
function deletegroup(id, group){
var isObject = {}
var params = id;
isObject.id = params;
swal({
title: "Hapus group?",
text: "Group "+group+" akan dihapus",
type: "warning",
showCancelButton: true,
confirmButtonClass: "btn-danger",
confirmButtonText: "Ya!",
cancelButtonText: "Tidak!",
closeOnConfirm: false,
closeOnCancel: false
}).then((isConfirm) =>{
console.log(isConfirm)
if (isConfirm.value) {
$.ajax({
url: "{% url 'deleteGroup' %}",
data: isObject,
dataType: 'json',
type: 'post',
success: function(data) {
let response = data;
if(response.code == 0){
swal({
title : "sukses",
text : "Group berhasil dihapus",
type : "success",
icon : "success",
confirmButtonColor: "#00BCD4"
}).then((isok) => {
location.reload();
})
}else{
alert("no data in database")
}
}
});
} else {
swal("Dibatalkan", "User status tidak berubah", "error");
}
});
}
</script>
\ No newline at end of file
......@@ -27,7 +27,7 @@
<div>
{% if form.errors %}
<div class="alert alert-danger">
Username atau Password kamu salah. Silahkan coba kembali.
Username atau Password salah. Silahkan coba kembali.
</div>
{% endif %}
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment