feat: enhance raw material filtering and selection in RawMaterialController and related components for improved data management
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Waiting to run
tests / ci (8.4) (push) Waiting to run
tests / ci (8.5) (push) Waiting to run

This commit is contained in:
Yoga Pangestu 2026-07-07 10:37:13 +07:00
parent 0ec51e1ffb
commit dc594c9daa
3 changed files with 18 additions and 7 deletions

View File

@ -28,13 +28,16 @@ public function index(Request $request): Response
$tableQuery = $this->parseDataTableQuery($request); $tableQuery = $this->parseDataTableQuery($request);
$isActive = $request->string('is_active')->toString(); $isActive = $request->string('is_active')->toString();
$stockStatus = $request->string('stock_status')->toString(); $stockStatus = $request->string('stock_status')->toString();
$rawMaterialId = $request->string('raw_material_id')->toString();
return Inertia::render('admin/master/raw-materials/Index', [ return Inertia::render('admin/master/raw-materials/Index', [
'rawMaterials' => $this->rawMaterialService->paginateForIndex($tableQuery, $isActive, $stockStatus), 'rawMaterials' => $this->rawMaterialService->paginateForIndex($tableQuery, $isActive, $stockStatus, $rawMaterialId),
'filters' => $this->dataTableFilters($tableQuery, [ 'filters' => $this->dataTableFilters($tableQuery, [
'is_active' => $isActive, 'is_active' => $isActive,
'stock_status' => $stockStatus, 'stock_status' => $stockStatus,
'raw_material_id' => $rawMaterialId,
]), ]),
'rawMaterialsList' => RawMaterial::query()->orderBy('name')->get(['id', 'name'])->map(fn ($r) => ['value' => (string) $r->id, 'label' => $r->name])->all(),
]); ]);
} }

View File

@ -30,7 +30,7 @@ public function __construct(
private readonly PushNotificationService $pushNotificationService, private readonly PushNotificationService $pushNotificationService,
) {} ) {}
public function paginateForIndex(array $tableQuery, string $isActive, string $stockStatus = ''): LengthAwarePaginator public function paginateForIndex(array $tableQuery, string $isActive, string $stockStatus = '', string $rawMaterialId = ''): LengthAwarePaginator
{ {
$query = RawMaterial::query() $query = RawMaterial::query()
->with([ ->with([
@ -41,11 +41,9 @@ public function paginateForIndex(array $tableQuery, string $isActive, string $st
]) ])
->when($tableQuery['search'] !== '', function (Builder $query) use ($tableQuery): void { ->when($tableQuery['search'] !== '', function (Builder $query) use ($tableQuery): void {
$search = $tableQuery['search']; $search = $tableQuery['search'];
$query->where(function (Builder $query) use ($search): void { $query->whereHas('prices', fn (Builder $query) => $query->where('variant', 'like', "%{$search}%"));
$query->where('name', 'like', "%{$search}%")
->orWhereHas('prices', fn (Builder $query) => $query->where('variant', 'like', "%{$search}%"));
});
}) })
->when($rawMaterialId !== '', fn (Builder $query) => $query->where('id', $rawMaterialId))
->when($isActive !== '', fn (Builder $query) => $query->where('is_active', $isActive === '1')) ->when($isActive !== '', fn (Builder $query) => $query->where('is_active', $isActive === '1'))
->when($stockStatus === 'out_of_stock', function (Builder $query): void { ->when($stockStatus === 'out_of_stock', function (Builder $query): void {
$query->whereHas('prices', fn (Builder $priceQuery) => $priceQuery->where('stock', '<=', 0)); $query->whereHas('prices', fn (Builder $priceQuery) => $priceQuery->where('stock', '<=', 0));

View File

@ -24,7 +24,9 @@ const props = defineProps<{
direction?: 'asc' | 'desc'; direction?: 'asc' | 'desc';
is_active?: string; is_active?: string;
stock_status?: string; stock_status?: string;
raw_material_id?: string;
}; };
rawMaterialsList: { value: string; label: string }[];
}>(); }>();
const { can } = useCan(); const { can } = useCan();
@ -34,12 +36,19 @@ const { query, setSearch, setFilter, resetFilters, syncFromServer } =
useDataTableQuery({ useDataTableQuery({
url: index.url(), url: index.url(),
initial: { ...props.filters }, initial: { ...props.filters },
filterKeys: ['is_active', 'stock_status'], filterKeys: ['is_active', 'stock_status', 'raw_material_id'],
only: ['rawMaterials', 'filters'],
}); });
useDataTableQuerySync(() => props.filters, syncFromServer); useDataTableQuerySync(() => props.filters, syncFromServer);
const filterDefs = computed<DataTableFilterDef[]>(() => [ const filterDefs = computed<DataTableFilterDef[]>(() => [
{
key: 'raw_material_id',
label: 'Nama Bahan Baku',
type: 'select',
options: props.rawMaterialsList,
},
{ {
key: 'is_active', key: 'is_active',
label: 'Status', label: 'Status',
@ -63,6 +72,7 @@ const filterDefs = computed<DataTableFilterDef[]>(() => [
const filterValues = computed(() => ({ const filterValues = computed(() => ({
is_active: query.value.is_active ?? '', is_active: query.value.is_active ?? '',
stock_status: query.value.stock_status ?? '', stock_status: query.value.stock_status ?? '',
raw_material_id: query.value.raw_material_id ?? '',
})); }));
const pagination = computed(() => ({ const pagination = computed(() => ({