diff --git a/resources/js/pages/admin/master/products/form/ProductForm.vue b/resources/js/pages/admin/master/products/form/ProductForm.vue index 7f9df60..58961c6 100644 --- a/resources/js/pages/admin/master/products/form/ProductForm.vue +++ b/resources/js/pages/admin/master/products/form/ProductForm.vue @@ -3,6 +3,7 @@ import { useForm } from '@inertiajs/vue3'; import { Plus, Save } from '@lucide/vue'; import { computed, ref } from 'vue'; import { toast } from 'vue-sonner'; +import ConfirmDialog from '@/components/ConfirmDialog.vue'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { useCan } from '@/composables/useCan'; @@ -12,6 +13,7 @@ import type { CategoryOption, ProductFormInitialData, ProductVariantFormItem } f import ProductInfoSection from './ProductInfoSection.vue'; import ProductVariantSection from './ProductVariantSection.vue'; + const { hasRole } = useCan(); const showPrices = !hasRole('admin-bahan-baku'); @@ -33,7 +35,7 @@ function createClientId(): string { return `variant-${crypto.randomUUID()}`; } -const isUploading = computed(() => +const isUploading = computed(() => variants.value.some((v) => v.media.pendingUploads > 0) ); @@ -122,8 +124,8 @@ function copyPrices(variantPrices: Record) { function pastePrices(clientId: string) { if (!copiedPrices.value) { -return; -} + return; + } setVariantField(clientId, 'prices', { ...copiedPrices.value }); } @@ -134,6 +136,23 @@ function applyToAllPrices(variantPrices: Record) { }); } +const showDeleteConfirm = ref(false); +const variantToDelete = ref(null); + +function confirmRemoveVariant(clientId: string) { + variantToDelete.value = clientId; + showDeleteConfirm.value = true; +} + +function handleRemoveVariant() { + if (variantToDelete.value) { + removeVariant(variantToDelete.value); + variantToDelete.value = null; + } + + showDeleteConfirm.value = false; +} + const form = useForm({ name: props.initialData?.name ?? '', description: props.initialData?.description ?? '', @@ -205,27 +224,16 @@ function submit() { Informasi Produk - + - + @apply-to-all-prices="applyToAllPrices(variant.prices as Record)" />
+ + diff --git a/resources/js/pages/admin/master/raw-materials/form/RawMaterialForm.vue b/resources/js/pages/admin/master/raw-materials/form/RawMaterialForm.vue index 35d2190..91a888e 100644 --- a/resources/js/pages/admin/master/raw-materials/form/RawMaterialForm.vue +++ b/resources/js/pages/admin/master/raw-materials/form/RawMaterialForm.vue @@ -3,6 +3,7 @@ import { useForm } from '@inertiajs/vue3'; import { Plus, Save } from '@lucide/vue'; import { computed, ref } from 'vue'; import { toast } from 'vue-sonner'; +import ConfirmDialog from '@/components/ConfirmDialog.vue'; import { Button } from '@/components/ui/button'; import { FieldError } from '@/components/ui/field'; import { useVariantList } from '@/composables/useVariantList'; @@ -89,6 +90,22 @@ const { const useSamePrice = ref(prices.value.length <= 1 || allPricesHaveSameValue()); +const showDeleteConfirm = ref(false); +const priceToDelete = ref(null); + +function confirmRemovePrice(clientId: string) { + priceToDelete.value = clientId; + showDeleteConfirm.value = true; +} + +function handleRemovePrice() { + if (priceToDelete.value) { + removePrice(priceToDelete.value); + priceToDelete.value = null; + } + showDeleteConfirm.value = false; +} + const form = useForm({ name: props.initialData?.name ?? '', unit: props.initialData?.unit ?? '', @@ -196,7 +213,7 @@ function submit() { @@ -216,4 +233,14 @@ function submit() { + +