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:
Daeng Deni Mardaeni
2025-05-19 09:08:33 +07:00
parent 0bb12812a5
commit 8d190cb10d
4 changed files with 47 additions and 10 deletions

View File

@@ -9,11 +9,30 @@
use Modules\Basicdata\Models\Currency;
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()
{
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)
@@ -24,8 +43,6 @@
$row->code,
$row->name,
$row->decimal_places,
$row->updated_at,
$row->deleted_at,
$row->created_at
];
}
@@ -47,7 +64,7 @@
{
return [
'A' => NumberFormat::FORMAT_NUMBER,
'B' => NumberFormat::FORMAT_NUMBER,
'D' => NumberFormat::FORMAT_NUMBER,
'E' => NumberFormat::FORMAT_DATE_DATETIME
];
}

View File

@@ -191,13 +191,16 @@
]);
}
public function export()
public function export(Request $request)
{
// Check if the authenticated user has the required permission to export currencies
if (is_null($this->user) || !$this->user->can('basic-data.export')) {
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');
}
}

View File

@@ -259,7 +259,6 @@
});
exportBtn.addEventListener('click', function() {
console.log('Exporting data...');
updateExportUrl();
applyFilters();
})

View File

@@ -20,7 +20,7 @@
<div class="flex flex-wrap gap-2.5">
<div class="h-[24px] border border-r-gray-200"></div>
@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
@can('basic-data.create')
<a class="btn btn-sm btn-primary" href="{{ route('basicdata.currency.create') }}"> Tambah Mata Uang </a>
@@ -152,6 +152,7 @@
<script type="module">
const element = document.querySelector('#currency-table');
const searchInput = document.getElementById('search');
const exportBtn = document.getElementById('export-btn');
const deleteSelectedButton = document.getElementById('deleteSelected');
const apiUrl = element.getAttribute('data-api-url');
@@ -206,11 +207,28 @@
};
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
searchInput.addEventListener('change', function () {
searchInput.addEventListener('input', function () {
const searchValue = this.value.trim();
dataTable.goPage(1);
dataTable.search(searchValue, true);
// Update export URL with search parameter
updateExportUrl();
});
function updateDeleteButtonVisibility() {