Datatable kontak dan user

This commit is contained in:
Muhammad Raihan Surya 2023-11-10 10:05:22 +07:00
parent 5486e7cbbd
commit 22cfa5def0
12 changed files with 277 additions and 126 deletions

View File

@ -130,4 +130,8 @@ class AdminRefundController extends Controller
]); ]);
} }
} }
public function listRefund(Request $request){
}
} }

View File

@ -8,6 +8,7 @@ use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Throwable; use Throwable;
use Yajra\DataTables\DataTables;
class AdminSettingController extends Controller class AdminSettingController extends Controller
{ {
@ -16,10 +17,7 @@ class AdminSettingController extends Controller
*/ */
public function index() public function index()
{ {
$settings = Setting::all(); return view('admin.setting.index');
return view('admin.setting.index', [
'settings' => $settings,
]);
} }
/** /**
@ -85,4 +83,53 @@ class AdminSettingController extends Controller
} }
} }
} }
public function listSetting(Request $request){
try{
$subQuery = Setting::latest()->select('id','bulan','tahun','persentase','status');
if($request->has('search') && !empty($request->search['value'])){
$searchSetting = $request->search['value'];
if (!is_numeric($searchSetting)) {
$subQuery->where(function($a) use ($searchSetting){
$a->whereRaw('LOWER(status) LIKE ?', ['%' . strtolower($searchSetting) . '%']);
});
} else {
$subQuery->where(function($a) use ($searchSetting){
$a->where('bulan',$searchSetting)
->orWhere('tahun',$searchSetting)
->orWhere('persentase',$searchSetting);
});
}
}
$querySetting = Setting::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if($request->ajax()){
return DataTables::of($querySetting)
->addIndexColumn()
->addColumn('action', function($row){
$status = $row->status ? 'checked' : '';
$html_code = '<label class="switch">
<input type="checkbox" '.$status.'
data-id="'. $row->id.'">
<span class="slider round" data-on-text="Yes" data-off-text="No"
id="checkOnOf"></span>
</label>';
return $html_code;
})
->rawColumns(['action'])
->make(true);
}
}catch(Throwable $e){
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
}
} }

View File

@ -49,4 +49,8 @@ class AdminTransactionController extends Controller
} }
} }
public function listTransaction(Request $request){
}
} }

View File

@ -17,11 +17,7 @@ class AdminUserController extends Controller
*/ */
public function index() public function index()
{ {
$users = User::where('role', 'User') return view('admin.users.index');
->orderByRaw("CASE WHEN status = 'Progress' THEN 1 WHEN status = 'Finished' THEN 2 WHEN status = 'Rejected' THEN 3 ELSE 4 END ASC")
->latest()
->get();
return view('admin.users.index', ['users' => $users]);
} }
/** /**
@ -101,9 +97,10 @@ class AdminUserController extends Controller
if ($request->has('search') && !empty($request->search['value'])) { if ($request->has('search') && !empty($request->search['value'])) {
$searchUser = $request->search['value']; $searchUser = $request->search['value'];
$subQuery->where(function ($a) use ($searchUser) { $subQuery->where(function ($a) use ($searchUser) {
$a->whereRaw('email LIKE ?', ['%' . $searchUser . '%']) $a->whereRaw('LOWER(email) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('nama_depan LIKE ?', ['%' . $searchUser . '%']) ->orWhereRaw('LOWER(nama_depan) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('nama_belakang LIKE ?', ['%' . $searchUser . '%']); ->orWhereRaw('LOWER(nama_belakang) LIKE ?', ['%' . strtolower($searchUser) . '%'])
->orWhereRaw('LOWER(status) LIKE ?',['%'.strtolower($searchUser).'%']);
}); });
} }

View File

@ -8,6 +8,9 @@ use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Throwable;
use Yajra\DataTables\DataTables;
class UserContactController extends Controller class UserContactController extends Controller
{ {
@ -16,8 +19,7 @@ class UserContactController extends Controller
*/ */
public function index() public function index()
{ {
$contacts = Contact::where('pemilik_kontak', Auth::user()->email)->get(); return view('user.contact.index');
return view('user.contact.index', ['contacts' => $contacts]);
} }
public function getContact() public function getContact()
@ -35,29 +37,38 @@ class UserContactController extends Controller
*/ */
public function store(Request $request) public function store(Request $request)
{ {
$email_relasi = $request->input('email'); $email_relasi = $request->email;
if ($email_relasi == Auth::user()->email) { if ($email_relasi == Auth::user()->email) {
return response()->json([ return response()->json([
'status' => false, 'status' => false,
'message' => 'Kontak yang ingin didaftarkan tidak boleh sama', 'message' => 'Kontak yang ingin didaftarkan tidak boleh sama',
]); ]);
} else { }
$result = Contact::create([
try{
DB::beginTransaction();
Contact::create([
'pemilik_kontak' => Auth::user()->email, 'pemilik_kontak' => Auth::user()->email,
'relasi_kontak' => $request->input('email'), 'relasi_kontak' => $email_relasi,
]); ]);
if ($result) { DB::commit();
return response()->json([
'status' => true, return response()->json([
'message' => 'Akun berhasil masuk ke kontak', 'status' => true,
]); 'message' => 'Kontak berhasil ditambahkan.'
} else { ]);
return response()->json([
'status' => false, }catch(Throwable $e){
'message' => 'Akun gagal masuk ke kontak', DB::rollBack();
]);
} Log::error($e->getMessage());
return response()->json([
'status' => false,
'message' => 'Terjadi error di bagian server atau kontak sudah didaftarkan',
]);
} }
} }
@ -67,22 +78,25 @@ class UserContactController extends Controller
public function destroy($id) public function destroy($id)
{ {
try { try {
$result = Contact::destroy($id); DB::beginTransaction();
if ($result) {
return response()->json([ Contact::destroy($id);
'message' => 'Berhasil hapus data',
'status' => true, DB::commit();
]);
} else { return response()->json([
return response()->json([ 'message' => 'Berhasil hapus data',
'message' => 'Gagal hapus data karena ' . $result, 'status' => true,
'status' => false, ]);
]);
} } catch (Throwable $e) {
} catch (\Exception $e) { DB::rollBack();
Log::error($e->getMessage());
return response()->json([ return response()->json([
'message' => 'Gagal hapus data, karena ' . $e,
'status' => false, 'status' => false,
'message' => 'Terjadi error di bagian server.',
]); ]);
} }
} }
@ -111,4 +125,61 @@ class UserContactController extends Controller
]); ]);
} }
} }
public function listContact(Request $request){
try{
$subQuery = Contact::join('users','contacts.relasi_kontak','=','users.email')
->join('indonesia_villages','users.kode_kelurahan','=','indonesia_villages.code')
->join('indonesia_districts','indonesia_villages.district_code','=','indonesia_districts.code')
->join('indonesia_cities', 'indonesia_districts.city_code','=','indonesia_cities.code')
->join('indonesia_provinces','indonesia_cities.province_code','=','indonesia_provinces.code')
->where('pemilik_kontak', Auth::user()->email)
->select('contacts.id', 'users.email as email as email', 'users.nohp as nohp', 'users.alamat as alamat', DB::raw("CONCAT(users.nama_depan, ' ', users.nama_belakang) as nama_lengkap"),'indonesia_villages.name as kelurahan','indonesia_districts.name as kecamatan','indonesia_cities.name as kota','indonesia_provinces.name as provinsi');
if($request->has('search') && !empty($request->search['value'])){
$searchContact = $request->search['value'];
$subQuery->where(function($a) use ($searchContact){
$a->whereRaw('LOWER(users.nama_depan) LIKE ?',['%'.strtolower($searchContact).'%'])
->orWhereRaw('LOWER(users.nama_belakang) LIKE ?',['%'.strtolower($searchContact).'%']);
});
}
$queryContact = Contact::from(DB::raw("({$subQuery->toSql()}) as tmp"))
->mergeBindings($subQuery->getQuery()) // Menggabungkan binding parameters
->select('*')
->get();
if($request->ajax()){
return DataTables::of($queryContact)
->addIndexColumn()
->addColumn('action', function($row){
$village = $row->kelurahan;
$city = $row->kota;
$district = $row->kecamatan;
$province = $row->provinsi;
$html_code = '
<button class="btn btn-info open-detail-modal" data-toggle="modal"
data-target="#modaldetail" id="detailContact"
data-nama="'.$row->nama_lengkap.'"
data-nohp="'.$row->nohp.'"
data-alamat="'.$row->alamat.'"
data-email="'.$row->email.'"
data-province="'.$province.'"
data-city="'.$city.'"
data-district="'.$district.'"
data-village="'.$village.'">Detail</button>
<button class="btn btn-danger open-detail-modal" id="deleteContact"
data-id="'.$row->id.'">Hapus</button>
';
return $html_code;
})
->rawColumns(['action'])
->make(true);
}
}catch(Throwable $e){
Log::error($e->getMessage());
return response()->json(['success' => false, 'message' => 'Terjadi Kesalahan pada sisi server']);
}
}
} }

View File

@ -107,4 +107,8 @@ class UserRefundController extends Controller
'descriptions' => $refundDescription 'descriptions' => $refundDescription
]); ]);
} }
public function listRefund(Request $request){
}
} }

View File

@ -821,4 +821,8 @@ class UserTransactionController extends Controller
} }
} }
} }
public function listTransaction(Request $request){
}
} }

View File

@ -92,7 +92,7 @@ class DatabaseSeeder extends Seeder
'no_rek' => '01980921' 'no_rek' => '01980921'
]); ]);
// User::factory(20)->create(); User::factory(100)->create();
$now = Carbon::now()->tz('Asia/Jakarta'); $now = Carbon::now()->tz('Asia/Jakarta');
$bulan = $now->format('n'); $bulan = $now->format('n');

View File

@ -3,6 +3,43 @@
<script> <script>
$(document).ready(function() { $(document).ready(function() {
let listSetting = $('#table-setting').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('admin-setting.list-setting') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
}, {
data: 'bulan',
name: 'bulan',
}, {
data: 'tahun',
name: 'tahun',
}, {
data: 'persentase',
name: 'persentase'
}, {
data: 'status',
render: function(data, type, row) {
if (row.status == 'Active') {
return `<div class="badge badge-success">${row.status}</div>`;
} else {
return `<div class="badge badge-danger">${row.status}</div>`;
}
},
orderable: true,
searchable: true
}, {
data: 'action',
name: 'action',
orderable: false,
searchable: false
}]
});
$("#bulan").select2(); $("#bulan").select2();
$('#tambahModal').click(function() { $('#tambahModal').click(function() {
@ -56,15 +93,13 @@
confirmButtonText: 'OK', confirmButtonText: 'OK',
position: 'center', position: 'center',
}).then(function() { }).then(function() {
Swal.close();
if (response.status) { if (response.status) {
location.reload(); Swal.close();
listSetting.ajax.reload();
} }
console.log(response);
}); });
}, },
error: function(error) { error: function(error) {
console.log(error.responseText)
var response = JSON.parse(error.responseText); var response = JSON.parse(error.responseText);
@ -87,9 +122,7 @@
} }
}); });
const table = $('#table-5').DataTable(); // Inisialisasi DataTable $('#table-setting').on('change', '.switch input[type="checkbox"]', function() {
$('#table-5').on('change', '.switch input[type="checkbox"]', function() {
const parentRow = $(this).closest('tr'); const parentRow = $(this).closest('tr');
const csrfToken = $('meta[name="csrf-token"]').attr('content'); const csrfToken = $('meta[name="csrf-token"]').attr('content');
const statusBadge = parentRow.find('.badge'); const statusBadge = parentRow.find('.badge');
@ -98,7 +131,7 @@
const isChecked = $(this).prop('checked'); const isChecked = $(this).prop('checked');
let dataId = $(this).data("id"); let dataId = $(this).data("id");
const rowData = table.row(parentRow).data(); // Dapatkan data baris dari DataTable const rowData = listSetting.row(parentRow).data(); // Dapatkan data baris dari DataTable
$.ajaxSetup({ $.ajaxSetup({
headers: { headers: {
@ -120,7 +153,6 @@
confirmButtonText: 'OK' confirmButtonText: 'OK'
}).then(function() { }).then(function() {
if (isChecked) { if (isChecked) {
// location.reload();
statusBadge.text(onText === 'Yes' ? 'Active' : statusBadge.text(onText === 'Yes' ? 'Active' :
'Nonactive'); 'Nonactive');
statusBadge.removeClass('badge-danger').addClass( statusBadge.removeClass('badge-danger').addClass(
@ -161,7 +193,7 @@
<a class="btn btn-success active" href="#" id="tambahModal">Tambah Data Kebijakan</a> <a class="btn btn-success active" href="#" id="tambahModal">Tambah Data Kebijakan</a>
</div> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="table-5"> <table class="table table-striped" id="table-setting">
<thead> <thead>
<tr> <tr>
<th class="text-center"> <th class="text-center">
@ -175,28 +207,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach ($settings as $setting)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ DateTime::createFromFormat('n', $setting->bulan)->format('F') }}</td>
<td>{{ $setting->tahun }}</td>
<td>{{ $setting->persentase }}</td>
<td>
<div
class="badge {{ $setting->status == 'Active' ? 'badge-success' : 'badge-danger' }}">
{{ $setting->status }}
</div>
</td>
<td>
<label class="switch">
<input type="checkbox" @if ($setting->status === 'Active') checked @endif
data-id="{{ $setting->id }}">
<span class="slider round" data-on-text="Yes" data-off-text="No"
id="checkOnOf"></span>
</label>
</td>
</tr>
@endforeach
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -46,7 +46,7 @@
data: 'DT_RowIndex', data: 'DT_RowIndex',
name: 'DT_RowIndex', name: 'DT_RowIndex',
orderable: false, orderable: false,
searchable: true, searchable: false,
}, { }, {
data: 'id', data: 'id',
name: 'id', name: 'id',
@ -86,7 +86,7 @@
return data; return data;
} }
}, { }, {
data: null, data: 'status',
render: function(data, type, row) { render: function(data, type, row) {
if (row.status == 'Finished') { if (row.status == 'Finished') {
return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status}</a>`; return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success">${row.status}</a>`;

View File

@ -23,7 +23,7 @@
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="table-6"> <table class="table table-striped" id="table-contact">
<thead> <thead>
<tr class="text-center"> <tr class="text-center">
<th>#</th> <th>#</th>
@ -32,25 +32,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach ($contacts as $contact)
<tr>
<td>{{ $loop->iteration }}</td>
<td class="font-weight-600">
{{ $contact->relasiKontak->nama_depan . ' ' . $contact->relasiKontak->nama_belakang }}
</td>
<td class="text-center">
<button class="btn btn-info open-detail-modal" data-toggle="modal"
data-target="#modaldetail" id="detailContact"
data-id="{{ $contact->relasiKontak }}"
data-province="{{ $contact->relasiKontak->getProvinceName() }}"
data-city="{{ $contact->relasiKontak->getCityName() }}"
data-district="{{ $contact->relasiKontak->getDistrictName() }}"
data-village="{{ $contact->relasiKontak->getVillageName() }}">Detail</button>
<button class="btn btn-danger open-detail-modal" id="deleteContact"
data-id="{{ $contact->id }}">Hapus</button>
</td>
</tr>
@endforeach
</tbody> </tbody>
</table> </table>
</div> </div>
@ -58,10 +40,10 @@
</div> </div>
</div> </div>
</div> </div>
@include('user.contact.modal-detail-contact')
@include('user.contact.modal-add-contact')
</section> </section>
</div> </div>
@include('user.contact.modal-detail-contact')
@include('user.contact.modal-add-contact')
<script> <script>
$(document).ready(function() { $(document).ready(function() {
let check = false; let check = false;
@ -73,16 +55,19 @@
$('#modaldetail').on('show.bs.modal', function(event) { $('#modaldetail').on('show.bs.modal', function(event) {
var triggerLink = $(event.relatedTarget); var triggerLink = $(event.relatedTarget);
let dataId = triggerLink.data('id'); let dataNama = triggerLink.data('nama');
let dataEmail = triggerLink.data('email');
let dataNoHP = triggerLink.data('nohp');
let dataAlamat = triggerLink.data('alamat');
let dataProvince = triggerLink.data('province'); let dataProvince = triggerLink.data('province');
let dataCity = triggerLink.data('city'); let dataCity = triggerLink.data('city');
let dataDistrict = triggerLink.data('district'); let dataDistrict = triggerLink.data('district');
let dataVillage = triggerLink.data('village'); let dataVillage = triggerLink.data('village');
teksNama.innerHTML = dataId.nama_depan + " " + dataId.nama_belakang; teksNama.innerHTML = dataNama;
teksAlamat.innerHTML = dataId.alamat + ", " + capital(dataVillage) + ", " + capital( teksAlamat.innerHTML = dataNama + ", " + capital(dataVillage) + ", " + capital(
dataDistrict) + ", " + capital(dataCity) + ", " + capital(dataProvince); dataDistrict) + ", " + capital(dataCity) + ", " + capital(dataProvince);
teksNohp.innerHTML = dataId.nohp; teksNohp.innerHTML = dataNoHP;
teksEmail.innerHTML = dataId.email; teksEmail.innerHTML = dataEmail;
}); });
function capital(text) { function capital(text) {
@ -91,7 +76,30 @@
}); });
} }
$('#table-2').on('click', '#deleteContact', function() { let table_contact = $('#table-contact').DataTable({
processing: true,
serverSide: true,
ajax: "{{ route('user-contact.list-contact') }}",
columns: [{
data: 'DT_RowIndex',
name: 'DT_RowIndex',
orderable: false,
searchable: false,
className: 'text-center'
}, {
data: 'nama_lengkap',
name: 'nama_lengkap',
className: 'text-center'
}, {
data: 'action',
name: 'action',
orderable: false,
searchable: false,
className: 'text-center'
}],
});
$('#table-contact').on('click', '#deleteContact', function() {
let dataId = $(this).data('id'); let dataId = $(this).data('id');
const csrfToken = $('meta[name="csrf-token"]').attr('content'); const csrfToken = $('meta[name="csrf-token"]').attr('content');
Swal.fire({ Swal.fire({
@ -137,7 +145,7 @@
}).then(function() { }).then(function() {
Swal.close(); Swal.close();
if (response.status) { if (response.status) {
location.reload(); table_contact.ajax.reload();
} }
}); });
}, },
@ -157,7 +165,6 @@
}); });
}); });
$('#checkButton').on('click', function() { $('#checkButton').on('click', function() {
const email = document.querySelector('[name="email"]').value; const email = document.querySelector('[name="email"]').value;
const csrfToken = $('meta[name="csrf-token"]').attr('content'); const csrfToken = $('meta[name="csrf-token"]').attr('content');
@ -265,7 +272,8 @@
}).then(function() { }).then(function() {
Swal.close(); Swal.close();
if (response.status) { if (response.status) {
location.reload(); Swal.close();
table_contact.ajax.reload();
} }
}); });
} }

View File

@ -1,11 +1,11 @@
<div class="modal fade" id="modalForm" role="dialog"> <div class="modal fade" id="modalForm" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content"> <div class="modal-content">
<!-- Modal Header --> <!-- Modal Header -->
<div class="modal-header"> <div class="modal-header">
<h2 class="modal-title" id="exampleModalLongTitle">Tambah Kontak</h2>
<button type="button" class="close" data-dismiss="modal"> <button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
<span class="sr-only">Close</span>
</button> </button>
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
@ -14,21 +14,22 @@
<!-- Modal Body --> <!-- Modal Body -->
<div class="modal-body"> <div class="modal-body">
<p class="statusMsg"></p> <div class="section-body">
<form role="form" id="formContact"> <form role="form" id="formContact">
<div class="form-group"> <div class="form-group">
<label for="inputemail">Email</label> <label for="inputemail">Email</label>
<input type="text" class="form-control" name="email" placeholder="Enter your email" /> <input type="text" class="form-control" name="email" placeholder="Enter your email" />
</div> </div>
<div class="form-group"> <div class="form-group">
<button type="button" class="btn btn-primary" id="checkButton">Check</button> <button type="button" class="btn btn-primary" id="checkButton">Check</button>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="exampleFormControlTextarea1" class="form-label">Hasil</label> <label for="exampleFormControlTextarea1" class="form-label">Hasil</label>
<textarea class="form-control" rows="10" cols="10" readonly id="resultArea""></textarea> <textarea class="form-control" rows="10" cols="10" readonly id="resultArea""></textarea>
</div> </div>
</form> </form>
</div>
</div> </div>
<!-- Modal Footer --> <!-- Modal Footer -->