feat(currency): tambahkan fitur filter pada ekspor data mata uang
- Modifikasi `CurrencyController`: - Tambahkan parameter `Request` pada method `export` untuk menerima input filter `search`. - Perbarui logika ekspor agar mendukung pencarian berbasis parameter `search`. - Perubahan pada `CurrencyExport`: - Tambahkan konstruktor untuk menerima dan menyimpan parameter pencarian (`search`). - Modifikasi query pada method `collection` untuk menambahkan filter berdasarkan `code`, `name`, atau `decimal_places` yang sesuai dengan parameter `search`. - Hapus kolom `updated_at` dan `deleted_at` dari output ekspor. - Perbaikan format data pada method `columnFormats`. - Update pada view `currency/index.blade.php`: - Tambahkan elemen JavaScript untuk mengatur URL parameter `search` pada tombol ekspor. - Ganti event `change` pada input pencarian dengan `input` untuk meningkatkan respon pencarian secara real-time. - Pastikan URL ekspor diperbarui setiap kali pengguna mengetik dalam kolom pencarian. - Penyesuaian minor pada `branch/index.blade.php`: - Hapus log yang tidak relevan sebelum proses ekspor. Fitur ini memastikan proses ekspor data mata uang dapat disaring berdasarkan pencarian spesifik, memberikan fleksibilitas lebih kepada pengguna. Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
@@ -9,11 +9,30 @@
|
|||||||
use Modules\Basicdata\Models\Currency;
|
use Modules\Basicdata\Models\Currency;
|
||||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||||
|
|
||||||
class CurrencyExport implements WithColumnFormatting, WithHeadings, FromCollection, withMapping
|
class CurrencyExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||||
{
|
{
|
||||||
|
protected $search;
|
||||||
|
|
||||||
|
public function __construct($search = null)
|
||||||
|
{
|
||||||
|
$this->search = $search;
|
||||||
|
}
|
||||||
|
|
||||||
public function collection()
|
public function collection()
|
||||||
{
|
{
|
||||||
return Currency::all();
|
$query = Currency::query();
|
||||||
|
|
||||||
|
if (!empty($this->search)) {
|
||||||
|
$search = $this->search;
|
||||||
|
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->whereRaw('LOWER(code) LIKE ?', ['%' . strtolower($search) . '%'])
|
||||||
|
->orWhereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%'])
|
||||||
|
->orWhereRaw('CAST(decimal_places AS TEXT) LIKE ?', ['%' . $search . '%']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function map($row)
|
public function map($row)
|
||||||
@@ -24,8 +43,6 @@
|
|||||||
$row->code,
|
$row->code,
|
||||||
$row->name,
|
$row->name,
|
||||||
$row->decimal_places,
|
$row->decimal_places,
|
||||||
$row->updated_at,
|
|
||||||
$row->deleted_at,
|
|
||||||
$row->created_at
|
$row->created_at
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -47,7 +64,7 @@
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'A' => NumberFormat::FORMAT_NUMBER,
|
'A' => NumberFormat::FORMAT_NUMBER,
|
||||||
'B' => NumberFormat::FORMAT_NUMBER,
|
'D' => NumberFormat::FORMAT_NUMBER,
|
||||||
'E' => NumberFormat::FORMAT_DATE_DATETIME
|
'E' => NumberFormat::FORMAT_DATE_DATETIME
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,13 +191,16 @@
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function export()
|
public function export(Request $request)
|
||||||
{
|
{
|
||||||
// Check if the authenticated user has the required permission to export currencies
|
// Check if the authenticated user has the required permission to export currencies
|
||||||
if (is_null($this->user) || !$this->user->can('basic-data.export')) {
|
if (is_null($this->user) || !$this->user->can('basic-data.export')) {
|
||||||
abort(403, 'Sorry! You are not allowed to export currencies.');
|
abort(403, 'Sorry! You are not allowed to export currencies.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return Excel::download(new CurrencyExport, 'currency.xlsx');
|
// Get search parameter from request
|
||||||
|
$search = $request->get('search');
|
||||||
|
|
||||||
|
return Excel::download(new CurrencyExport($search), 'currency.xlsx');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -259,7 +259,6 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
exportBtn.addEventListener('click', function() {
|
exportBtn.addEventListener('click', function() {
|
||||||
console.log('Exporting data...');
|
|
||||||
updateExportUrl();
|
updateExportUrl();
|
||||||
applyFilters();
|
applyFilters();
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<div class="flex flex-wrap gap-2.5">
|
<div class="flex flex-wrap gap-2.5">
|
||||||
<div class="h-[24px] border border-r-gray-200"></div>
|
<div class="h-[24px] border border-r-gray-200"></div>
|
||||||
@can('basic-data.export')
|
@can('basic-data.export')
|
||||||
<a class="btn btn-sm btn-light" href="{{ route('basicdata.currency.export') }}"> Export to Excel </a>
|
<a id="export-btn" class="btn btn-sm btn-light" href="{{ route('basicdata.currency.export') }}"> Export to Excel </a>
|
||||||
@endcan
|
@endcan
|
||||||
@can('basic-data.create')
|
@can('basic-data.create')
|
||||||
<a class="btn btn-sm btn-primary" href="{{ route('basicdata.currency.create') }}"> Tambah Mata Uang </a>
|
<a class="btn btn-sm btn-primary" href="{{ route('basicdata.currency.create') }}"> Tambah Mata Uang </a>
|
||||||
@@ -152,6 +152,7 @@
|
|||||||
<script type="module">
|
<script type="module">
|
||||||
const element = document.querySelector('#currency-table');
|
const element = document.querySelector('#currency-table');
|
||||||
const searchInput = document.getElementById('search');
|
const searchInput = document.getElementById('search');
|
||||||
|
const exportBtn = document.getElementById('export-btn');
|
||||||
const deleteSelectedButton = document.getElementById('deleteSelected');
|
const deleteSelectedButton = document.getElementById('deleteSelected');
|
||||||
|
|
||||||
const apiUrl = element.getAttribute('data-api-url');
|
const apiUrl = element.getAttribute('data-api-url');
|
||||||
@@ -206,11 +207,28 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
let dataTable = new KTDataTable(element, dataTableOptions);
|
let dataTable = new KTDataTable(element, dataTableOptions);
|
||||||
|
|
||||||
|
// Update export URL with filters
|
||||||
|
function updateExportUrl() {
|
||||||
|
let url = new URL(exportBtn.href);
|
||||||
|
|
||||||
|
if (searchInput.value) {
|
||||||
|
url.searchParams.set('search', searchInput.value);
|
||||||
|
} else {
|
||||||
|
url.searchParams.delete('search');
|
||||||
|
}
|
||||||
|
|
||||||
|
exportBtn.href = url.toString();
|
||||||
|
}
|
||||||
|
|
||||||
// Custom search functionality
|
// Custom search functionality
|
||||||
searchInput.addEventListener('change', function () {
|
searchInput.addEventListener('input', function () {
|
||||||
const searchValue = this.value.trim();
|
const searchValue = this.value.trim();
|
||||||
dataTable.goPage(1);
|
dataTable.goPage(1);
|
||||||
dataTable.search(searchValue, true);
|
dataTable.search(searchValue, true);
|
||||||
|
|
||||||
|
// Update export URL with search parameter
|
||||||
|
updateExportUrl();
|
||||||
});
|
});
|
||||||
|
|
||||||
function updateDeleteButtonVisibility() {
|
function updateDeleteButtonVisibility() {
|
||||||
|
|||||||
Reference in New Issue
Block a user