From 3b0b2d602f41b82cb587d0c9b6d361abb3783c68 Mon Sep 17 00:00:00 2001 From: Gracia Date: Sat, 19 Apr 2025 02:04:40 +0700 Subject: [PATCH] update product --- .../profile/mystore/product/ProductAdapter.kt | 32 +- .../ProductOptionsBottomSheetFragment.kt | 46 +++ .../product/StoreProductDetailActivity.kt | 17 +- app/src/main/res/drawable/ic_delete.png | Bin 0 -> 425 bytes app/src/main/res/drawable/ic_location.png | Bin 0 -> 1538 bytes app/src/main/res/layout/activity_my_store.xml | 1 - .../fragment_product_options_bottom_sheet.xml | 55 +++ .../main/res/layout/item_sells_payment.xml | 318 ++++++++++++++++++ .../main/res/layout/item_sells_shipment.xml | 255 ++++++++++++++ .../main/res/menu/product_options_menu.xml | 14 + app/src/main/res/values/themes.xml | 4 +- 11 files changed, 727 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt create mode 100644 app/src/main/res/drawable/ic_delete.png create mode 100644 app/src/main/res/drawable/ic_location.png create mode 100644 app/src/main/res/layout/fragment_product_options_bottom_sheet.xml create mode 100644 app/src/main/res/layout/item_sells_payment.xml create mode 100644 app/src/main/res/layout/item_sells_shipment.xml create mode 100644 app/src/main/res/menu/product_options_menu.xml diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt index 09ff20c..ec831be 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt @@ -4,10 +4,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.PopupMenu import android.widget.TextView +import android.widget.Toast import androidx.core.content.ContextCompat +import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.Product import com.alya.ecommerce_serang.data.api.dto.ProductsItem import com.bumptech.glide.Glide @@ -22,27 +26,37 @@ class ProductAdapter( private val tvProductPrice: TextView = itemView.findViewById(R.id.tv_product_price) private val tvProductStock: TextView = itemView.findViewById(R.id.tv_product_stock) private val tvProductStatus: TextView = itemView.findViewById(R.id.tv_product_status) + private val ivMenu: ImageView = itemView.findViewById(R.id.iv_menu) fun bind(product: ProductsItem) { tvProductName.text = product.name tvProductPrice.text = "Rp${product.price}" tvProductStock.text = "Stok: ${product.stock}" - tvProductStatus.text = product.status - // Change color depending on status - tvProductStatus.setTextColor( - ContextCompat.getColor( - itemView.context, - if (product.status.equals("active", true)) - R.color.darkblue_500 else R.color.black_500 - ) - ) + if (product.status.equals("active",true)) { + tvProductStatus.text = "Aktif" + tvProductStatus.setTextColor(ContextCompat.getColor(itemView.context, R.color.darkblue_500)) + tvProductStatus.background = ContextCompat.getDrawable(itemView.context, R.drawable.bg_product_active) + } else { + tvProductStatus.text = "Nonaktif" + tvProductStatus.setTextColor(ContextCompat.getColor(itemView.context, R.color.black_500)) + tvProductStatus.background = ContextCompat.getDrawable(itemView.context, R.drawable.bg_product_inactive) + } Glide.with(itemView.context) .load(product.image) .placeholder(R.drawable.placeholder_image) .into(ivProduct) + ivMenu.setOnClickListener { + // Show Bottom Sheet when menu is clicked + val bottomSheetFragment = ProductOptionsBottomSheetFragment(product) + bottomSheetFragment.show( + (itemView.context as FragmentActivity).supportFragmentManager, + bottomSheetFragment.tag + ) + } + itemView.setOnClickListener { onItemClick(product) } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt new file mode 100644 index 0000000..f2d348a --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt @@ -0,0 +1,46 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.product + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.ProductsItem +import com.alya.ecommerce_serang.databinding.FragmentProductOptionsBottomSheetBinding +import com.google.android.material.bottomsheet.BottomSheetDialogFragment + +class ProductOptionsBottomSheetFragment(private val product: ProductsItem) : BottomSheetDialogFragment() { + + private var _binding: FragmentProductOptionsBottomSheetBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentProductOptionsBottomSheetBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.btnEditProduct.setOnClickListener { + // Handle editing product + // Example: Open the edit activity or fragment + dismiss() + } + + binding.btnDeleteProduct.setOnClickListener { + // Handle deleting product + // Example: Show confirmation dialog + dismiss() + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt index cb7a24e..a22d850 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt @@ -188,14 +188,14 @@ class StoreProductDetailActivity : AppCompatActivity() { val status = if (binding.switchIsActive.isChecked) "active" else "inactive" val categoryId = categoryList.getOrNull(binding.spinnerKategoriProduk.selectedItemPosition)?.id ?: 0 - val imageFile = imageUri?.let { File(it.path) } + val imageFile = imageUri?.let { uriToNamedFile(it, this, "productimg") } val sppirtFile = sppirtUri?.let { uriToNamedFile(it, this, "sppirt") } val halalFile = halalUri?.let { uriToNamedFile(it, this, "halal") } Log.d("File URI", "SPPIRT URI: ${sppirtUri.toString()}") Log.d("File URI", "Halal URI: ${halalUri.toString()}") - val imagePart = imageFile?.let { createPartFromFile("image", it) } + val imagePart = imageFile?.let { createPartFromFile("productimg", it) } val sppirtPart = sppirtFile?.let { createPartFromFile("sppirt", it) } val halalPart = halalFile?.let { createPartFromFile("halal", it) } @@ -219,9 +219,20 @@ class StoreProductDetailActivity : AppCompatActivity() { } } + fun getMimeType(file: File): String { + val extension = file.extension + return when (extension.lowercase()) { + "jpg", "jpeg" -> "image/jpeg" + "png" -> "image/png" + "pdf" -> "application/pdf" + else -> "application/octet-stream" + } + } + fun createPartFromFile(field: String, file: File?): MultipartBody.Part? { return file?.let { - val requestBody = RequestBody.create("application/octet-stream".toMediaTypeOrNull(), it) + val mimeType = getMimeType(it).toMediaTypeOrNull() + val requestBody = RequestBody.create(mimeType, it) MultipartBody.Part.createFormData(field, it.name, requestBody) } } diff --git a/app/src/main/res/drawable/ic_delete.png b/app/src/main/res/drawable/ic_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..3b50ef4348ae2520a9d16d889ec2d85570041655 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9FJ79h;%I?XTvD9BhG zEolBE2z0^$#g0G8J$m+_U(3O-*)ZWg{)TP;JVg}^SfP_unN`GeOVtq{d%I^kp~iU zqDt>RljP)+(p$TCeZIu=HYs6_zsh%l_J_K;xRm^=V=ydB;P{$rydM~{44$rjF6*2U FngCHZswDsb literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_location.png b/app/src/main/res/drawable/ic_location.png new file mode 100644 index 0000000000000000000000000000000000000000..4e59b4b2a67660a8f5c73bc93ff533ffaf01d4f6 GIT binary patch literal 1538 zcmV+d2L1VoP)@~0drDELIAGL9O(c600d`2O+f$vv5yPwEm(CfJ zAb074i`Xt~DXaG${7lkT+IU9DCEV9Jy!Q$At@w1`r7GmxMF zWQHH-hr}2fnz ztP)b;e|I3Hj9dwCmQq+k8U-w`KEuJ^X2b>uwW*){q+yaiSJpZZQUtn#J~>{7n$!-0 zY6SzHkl!(4oblJI`svTlVM5ILi#`UvL(Cgcu_7CJ0j({Y|MHbFfBXtHsAU1A$)1x! z=k{=hI*BlI(F)M|s82@r+zP(gg2WWHN0AYt?uRRh z6_K6jb!I1adrDFCC3i_-V8y6HEd`XC|A7$A)veWC!`BfgEYv{kSCRd|S|Q0-p8 z07VJS9WdfySbV=u*cMAGL8Ly&z%!JTuwCEgx6Zh)~G8c-D7n%$W)GQC6JyNnsxKkMKfazn<+l2;c%mpq9W^>jSm1ORcMa|0(RcOowE-~iCU+mIY+yPu7?-v!O z--zE2(x?kuVQ2lO#f&`nC&l!cp-HjPsY2rx;K{SZg+(}o8jk^k zunE$2f|o2((~b*VB3zYCOtOtm6}YoA>|xVM55 + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_sells_payment.xml b/app/src/main/res/layout/item_sells_payment.xml new file mode 100644 index 0000000..acaf5f8 --- /dev/null +++ b/app/src/main/res/layout/item_sells_payment.xml @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +