- {previewImage ? (
+ {itemImage ? (
@@ -140,7 +137,9 @@ const AddItems = () => {
onChange={(e) => {
setItem({
...item,
- supplyDate: new Date(e.target.value).toISOString(),
+ supplyDate: new Date(e.target.value)
+ .toISOString()
+ .slice(0, 10),
});
}}
/>
@@ -251,7 +250,9 @@ const AddItems = () => {
onChange={(e) => {
setItem({
...item,
- manufactureDate: new Date(e.target.value).toISOString(),
+ manufactureDate: new Date(e.target.value)
+ .toISOString()
+ .slice(0, 10),
});
}}
/>
@@ -269,7 +270,9 @@ const AddItems = () => {
onChange={(e) => {
setItem({
...item,
- expireDate: new Date(e.target.value).toISOString(),
+ expireDate: new Date(e.target.value)
+ .toISOString()
+ .slice(0, 10),
});
}}
/>
@@ -287,7 +290,9 @@ const AddItems = () => {
onChange={(e) => {
setItem({
...item,
- purchaseDate: new Date(e.target.value).toISOString(),
+ purchaseDate: new Date(e.target.value)
+ .toISOString()
+ .slice(0, 10),
});
}}
/>
diff --git a/src/features/items-management/layout/UpdateItems.tsx b/src/features/items-management/layout/UpdateItems.tsx
index ed7947b..c7e4879 100644
--- a/src/features/items-management/layout/UpdateItems.tsx
+++ b/src/features/items-management/layout/UpdateItems.tsx
@@ -3,23 +3,30 @@ import { IoCloudUploadOutline } from 'react-icons/io5';
import { useNavigate, Link, useParams } from 'react-router-dom';
import CashierManagerNavBar from '../../cashier-management/components/navbar/CashierManagerNavBar';
import useItemUpdateService from '../services/ItemUpdateService';
+import useItemService from '../services/ItemDetailsCRUDService';
+import Loader from '../../../shared/loader/Loader';
const UpdateItems = () => {
- const [previewImage, setPreviewImage] = useState
(null);
- // const navigate = useNavigate();
const { itemId } = useParams();
+ const {
+ itemString,
+ fetchItemImage,
+ fetchItemString,
+ itemImage,
+ setItemImage,
+ updatingItemImage,
+ updateItemImage,
+ } = useItemService();
+ const [updateImage, setUpdateImage] = useState(false);
const handleImageChange = (e: ChangeEvent) => {
const file: File | null = e.target.files ? e.target.files[0] : null;
if (file) {
const reader = new FileReader();
reader.onloadend = () => {
if (typeof reader.result === 'string') {
- setPreviewImage(reader.result);
- setItem({
- ...item,
- itemImage: reader.result,
- });
+ setItemImage(file);
+ setUpdateImage(true);
}
};
reader.readAsDataURL(file);
@@ -38,6 +45,7 @@ const UpdateItems = () => {
useEffect(() => {
if (itemId) {
fetchItemById(parseInt(itemId));
+ fetchItemImage(itemId);
}
}, [itemId]);
@@ -50,23 +58,23 @@ const UpdateItems = () => {
- {previewImage ? (
-
+
+ {fetchItemString ? (
+
+ ) : updateImage ? (
![Preview]({previewImage})
-
- ) : (
-
+ ) : (
![Preview](https://randomuser.me/api/portraits/men/1.jpg)
-
- )}
+ )}
+
+
{/* First Column */}
@@ -105,9 +121,10 @@ const UpdateItems = () => {
Selling Price
{
setItem({
@@ -143,10 +160,11 @@ const UpdateItems = () => {
Supplier Price
{
setItem({
...item,
diff --git a/src/features/items-management/layout/ViewItem.tsx b/src/features/items-management/layout/ViewItem.tsx
index f8d5256..a563a46 100644
--- a/src/features/items-management/layout/ViewItem.tsx
+++ b/src/features/items-management/layout/ViewItem.tsx
@@ -2,14 +2,17 @@ import React, { useEffect } from 'react';
import { Link, useParams } from 'react-router-dom';
import useItemUpdateService from '../services/ItemUpdateService';
import CashierManagerNavBar from '../../cashier-management/components/navbar/CashierManagerNavBar';
+import useItemService from '../services/ItemDetailsCRUDService';
function ViewItem() {
const { itemId } = useParams();
const { fetchItemById, itemDetails } = useItemUpdateService();
+ const { itemString, fetchItemImage, fetchItemString } = useItemService();
useEffect(() => {
if (itemId) {
fetchItemById(parseInt(itemId));
+ fetchItemImage(itemId);
}
}, []);
@@ -24,7 +27,7 @@ function ViewItem() {
{/* Image Column */}
![{itemDetails.itemName]({itemDetails.itemImage)
diff --git a/src/features/items-management/services/ItemDetailsCRUDService.tsx b/src/features/items-management/services/ItemDetailsCRUDService.tsx
index 11542f5..a9f7705 100644
--- a/src/features/items-management/services/ItemDetailsCRUDService.tsx
+++ b/src/features/items-management/services/ItemDetailsCRUDService.tsx
@@ -93,8 +93,84 @@ const useItemService = () => {
}
}, [shouldCreate]);
+ // const createItem = async () => {
+ // console.log('createItem', item);
+ // setCreating(true);
+
+ // if (!validateItem(item)) {
+ // setCreating(false);
+ // return;
+ // }
+
+ // try {
+ // const res = await http.post('/item/save-item', item);
+ // if (res.data.code === 201) {
+ // toast.success(res.data.message);
+ // navigate('/manager-dashboard/Items');
+ // }
+ // console.log(res);
+ // } catch (error) {
+ // console.log(error);
+ // toast.error('Could not create the item');
+ // } finally {
+ // setCreating(false);
+ // }
+ // };
+
+ const [itemImage, setItemImage] = useState
();
+
const createItem = async () => {
console.log('createItem', item);
+ const formData = new FormData();
+ formData.append('itemName', item.itemName);
+ formData.append('branchId', item.branchId.toString());
+ formData.append('sellingPrice', item.sellingPrice.toString());
+ formData.append('itemBarCode', item.itemBarCode);
+ formData.append(
+ 'supplyDate',
+ item.supplyDate.toString().split('-').join('/')
+ );
+ formData.append('supplierPrice', item.supplierPrice.toString());
+ formData.append('itemManufacture', item.itemManufacture);
+ formData.append('itemQuantity', item.itemQuantity.toString());
+ formData.append('measuringUnitType', item.measuringUnitType);
+ formData.append(
+ 'manufactureDate',
+ item.manufactureDate.toString().split('-').join('/')
+ );
+ formData.append(
+ 'expireDate',
+ item.expireDate.toString().split('-').join('/')
+ );
+ formData.append(
+ 'purchaseDate',
+ item.purchaseDate.toString().split('-').join('/')
+ );
+ formData.append('warrantyPeriod', item.warrantyPeriod);
+ formData.append('rackNumber', item.rackNumber);
+ formData.append('discountedPrice', item.discountedPrice.toString());
+ formData.append(
+ 'discountedPercentage',
+ item.discountedPercentage.toString()
+ );
+ formData.append('warehouseName', item.warehouseName);
+ formData.append('itemImage', item.itemImage);
+ formData.append('itemDescription', item.itemDescription);
+ formData.append('categoryId', item.categoryId.toString());
+ formData.append('supplierId', item.supplierId.toString());
+ formData.append('specialCondition', item.specialCondition.toString());
+ formData.append('stock', item.stock.toString());
+ formData.append('discounted', item.discounted.toString());
+ formData.append('freeIssued', item.freeIssued.toString());
+
+ if (itemImage) {
+ formData.append('file', itemImage, itemImage.name);
+ }
+
+ for (const pair of formData.entries()) {
+ console.log(pair[0], pair[1]);
+ }
+
setCreating(true);
if (!validateItem(item)) {
@@ -103,7 +179,11 @@ const useItemService = () => {
}
try {
- const res = await http.post('/item/save-item', item);
+ const res = await http.post('/item/save-item-with-image', formData, {
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ },
+ });
if (res.data.code === 201) {
toast.success(res.data.message);
navigate('/manager-dashboard/Items');
@@ -151,6 +231,58 @@ const useItemService = () => {
}
};
+ const [itemString, setItemString] = useState();
+ const [fetchItemString, setFetchItemString] = useState(false);
+ const fetchItemImage = async (itemId: string) => {
+ try {
+ setFetchItemString(true);
+ const res = await http.get(`/item/view-item-image/${itemId}`, {
+ responseType: 'arraybuffer', // Ensure response type is set correctly
+ });
+ const base64String = btoa(
+ new Uint8Array(res.data).reduce(
+ (data, byte) => data + String.fromCharCode(byte),
+ ''
+ )
+ );
+ console.log(res);
+ setItemString(`data:image/jpeg;base64,${base64String}`);
+ } catch (error) {
+ console.log(error);
+ } finally {
+ setFetchItemString(false);
+ }
+ };
+
+ const [updatingItemImage, setUpdatingItemImage] = useState(false);
+ const updateItemImage = async (itemId: string) => {
+ const itemImageFormData = new FormData();
+ if (itemImage) {
+ itemImageFormData.append('file', itemImage, itemImage?.name);
+ } else {
+ toast.error('Image is not provided');
+ return;
+ }
+
+ try {
+ setUpdatingItemImage(true);
+ const res = await http.put(
+ `/item/update-item-image/${parseInt(itemId)}`,
+ itemImageFormData,
+ {
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ },
+ }
+ );
+ console.log(res);
+ } catch (error) {
+ console.log(error);
+ } finally {
+ setUpdatingItemImage(false);
+ }
+ };
+
return {
fetchAllItems,
items,
@@ -163,6 +295,13 @@ const useItemService = () => {
creating,
preSet,
deleteItem,
+ setItemImage,
+ itemImage,
+ itemString,
+ fetchItemImage,
+ fetchItemString,
+ updatingItemImage,
+ updateItemImage,
};
};
diff --git a/src/features/login/layout/LogInPageLayout.tsx b/src/features/login/layout/LogInPageLayout.tsx
index 8286e08..ff0064d 100644
--- a/src/features/login/layout/LogInPageLayout.tsx
+++ b/src/features/login/layout/LogInPageLayout.tsx
@@ -10,12 +10,12 @@ const LogInPageLayout = () => {
return (
);
};
diff --git a/src/features/login/services/useAxiosInstance.tsx b/src/features/login/services/useAxiosInstance.tsx
index e838bcd..00b603c 100644
--- a/src/features/login/services/useAxiosInstance.tsx
+++ b/src/features/login/services/useAxiosInstance.tsx
@@ -4,7 +4,8 @@ import { useEffect } from 'react';
const useAxiosInstance = () => {
const instance = axios.create({
- baseURL: 'http://localhost:8079/lifepill/v1',
+ // baseURL: 'http://localhost:8079/lifepill/v1',
+ baseURL: 'https://3.82.134.54:8079/lifepill/v1',
headers: {
'Content-type': 'application/json',
},
diff --git a/src/features/manager-dashboard/components/items/ItemsManagementWindow.tsx b/src/features/manager-dashboard/components/items/ItemsManagementWindow.tsx
index 1e03e22..b5599d3 100644
--- a/src/features/manager-dashboard/components/items/ItemsManagementWindow.tsx
+++ b/src/features/manager-dashboard/components/items/ItemsManagementWindow.tsx
@@ -91,13 +91,16 @@ const ItemsManagementWindow = () => {
Medicine ID
- Image
+ Name
|
- Name
+ Selling Price (LKR)
+ |
+
+ Purchase Date
|
- Price
+ Expire Date
|
Status
@@ -112,9 +115,21 @@ const ItemsManagementWindow = () => {
{filteredItems.map((medicine) => (
|
{medicine.itemId} |
- {medicine.itemImage} |
{medicine.itemName} |
- {medicine.sellingPrice} |
+ {medicine.sellingPrice} per {medicine.measuringUnitType} |
+
+ {medicine.purchaseDate.slice(0, 10)}
+ |
+
+ {medicine.expireDate.slice(0, 10)}
+ |
+
{
{
return (
diff --git a/src/interfaces/IItemInterface.tsx b/src/interfaces/IItemInterface.tsx
index ece5870..8356016 100644
--- a/src/interfaces/IItemInterface.tsx
+++ b/src/interfaces/IItemInterface.tsx
@@ -7,7 +7,7 @@ export interface IItemInterface {
supplierPrice: number;
itemManufacture: string;
itemQuantity: number;
- itemCategory: string;
+ itemCategoryName: string;
measuringUnitType: string;
manufactureDate: Date | null; // You can use Date type if you prefer
expireDate: Date; // You can use Date type if you prefer
diff --git a/src/shared/cashier_profile/ProfileNameCard.tsx b/src/shared/cashier_profile/ProfileNameCard.tsx
index acbadda..a122eec 100644
--- a/src/shared/cashier_profile/ProfileNameCard.tsx
+++ b/src/shared/cashier_profile/ProfileNameCard.tsx
@@ -1,11 +1,18 @@
-import React from 'react';
+import React, { useEffect } from 'react';
import { useUserContext } from '../../context/UserContext';
+import useItemService from '../../features/items-management/services/ItemDetailsCRUDService';
type Props = {};
const ProfileNameCard = (props: Props) => {
const { user } = useUserContext();
- console.log(`ProfileNameCard: ${user}`);
+ // console.log(`ProfileNameCard: ${user}`);
+ const { itemString, fetchItemImage } = useItemService();
+ useEffect(() => {
+ if (user) {
+ fetchItemImage(user.employerId.toString());
+ }
+ }, []);
return (
@@ -17,7 +24,10 @@ const ProfileNameCard = (props: Props) => {
{/* Image */}
![Recent](https://randomuser.me/api/portraits/men/1.jpg)
diff --git a/src/shared/searchbar/MedicineSearchBar.tsx b/src/shared/searchbar/MedicineSearchBar.tsx
index f51d726..841781d 100644
--- a/src/shared/searchbar/MedicineSearchBar.tsx
+++ b/src/shared/searchbar/MedicineSearchBar.tsx
@@ -4,7 +4,7 @@ const MedicineSearchBar = () => {
return (
-
+ {/*
@@ -13,7 +13,7 @@ const MedicineSearchBar = () => {
type='text'
id='search'
placeholder='Search medicine..'
- />
+ /> */}
);
|