feat: enhance raw material filtering and selection in RawMaterialController and related components for improved data management
This commit is contained in:
parent
0ec51e1ffb
commit
dc594c9daa
@ -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(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
@ -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(() => ({
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user