diff --git a/src/App.js b/src/App.js index 2a695cc..f9ebd04 100644 --- a/src/App.js +++ b/src/App.js @@ -76,13 +76,13 @@ const App = () => { } /> - {/* localStorage.getItem('authToken') ? */} - ( + + {/* ( userdata && userdata?._id ? : userdata === false ? :
- )} /> - {/* < ProtectedRoute path="/" name="Home" render={(props) => } /> */} + )} /> */} + } /> diff --git a/src/_nav.js b/src/_nav.js index a7a8cdb..c8dcff9 100644 --- a/src/_nav.js +++ b/src/_nav.js @@ -6,6 +6,7 @@ import { cilChartPie, cilCursor, cilDrop, + cilFilterSquare, cilMoney, cilNewspaper, cilNotes, @@ -77,6 +78,12 @@ const _nav = [ icon: , to: '/feedback', }, + { + component: CNavItem, + name: 'Requirements', + icon: , + to: '/requirement', + }, { component: CNavItem, name: 'Users', @@ -85,6 +92,7 @@ const _nav = [ }, + ] export default _nav diff --git a/src/components/AppSidebarNav.js b/src/components/AppSidebarNav.js index 21d30ae..9e16944 100644 --- a/src/components/AppSidebarNav.js +++ b/src/components/AppSidebarNav.js @@ -53,6 +53,7 @@ export const AppSidebarNav = ({ items }) => { {...rest} > {item.items?.map((item, index) => + item.items ? navGroup(item, index) : navItem(item, index), )} @@ -62,7 +63,9 @@ export const AppSidebarNav = ({ items }) => { return ( {items && - items.map((item, index) => (item.items ? navGroup(item, index) : navItem(item, index)))} + items.map((item, index) => + + (item.items ? navGroup(item, index) : navItem(item, index)))} ) } diff --git a/src/index.js b/src/index.js index f582681..34efee9 100644 --- a/src/index.js +++ b/src/index.js @@ -10,8 +10,8 @@ import store from './store' import axios from 'axios' const setupAxios = () => { - //axios.defaults.baseURL = 'https://cms-api-dashboard.herokuapp.com/'; - axios.defaults.baseURL = 'http://localhost:5000' + axios.defaults.baseURL = 'https://cms-api-dashboard.herokuapp.com/'; + //axios.defaults.baseURL = 'http://localhost:5000' axios.defaults.headers = { 'Cache-Control': 'no-cache,no-store', 'Pragma': 'no-cache', diff --git a/src/routes.js b/src/routes.js index cc1bbd4..678ac7d 100644 --- a/src/routes.js +++ b/src/routes.js @@ -38,6 +38,11 @@ import ViewFeedback from './views/Feedback/ViewFeedback' //cms import Users from './views/Users/users' import ViewUsers from './views/Users/ViewUsers' +//Requirement +import ViewRequirement from './views/Requirement/ViewRequirement' +import Requirement from './views/Requirement/Requirement' +import AddRequirement from './views/Requirement/AddRequirement' +import EditRequirement from './views/Requirement/EditRequirement' // DashBoard const Change_Password = React.lazy(() => import('./views/pages/register/Change_password')) @@ -91,11 +96,18 @@ const routes = [ //CMS { path: '/feedback/view/:id', name: 'ViewFeedback', component: ViewFeedback }, { path: '/feedback', name: 'Feedback', component: Feedback }, + //Requirement + { path: '/requirement/view/:id', name: 'ViewRequirement', component: ViewRequirement }, + { path: '/requirement/edit/:id', name: 'EditRequirement', component: EditRequirement }, + { path: '/requirement/add/', name: 'AddRequirement', component: AddRequirement }, + { path: '/requirement', name: 'Requirement', component: Requirement }, //Users { path: '/users/view/:id', name: 'ViewUsers', component: ViewUsers }, { path: '/users', name: 'users', component: Users }, + + //dashboard { path: '/dashboard', name: 'Dashboard', component: Dashboard }, diff --git a/src/views/Banners/AddBanner.js b/src/views/Banners/AddBanner.js index 6affc3c..5a7de33 100644 --- a/src/views/Banners/AddBanner.js +++ b/src/views/Banners/AddBanner.js @@ -42,6 +42,10 @@ const AddBanner = () => { const handleSubmit = async () => { + if (!(title && subTitle && image && section && subSection && startDate && endDate)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -53,22 +57,29 @@ const AddBanner = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.post( - `/api/banner/create`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.post( + `/api/banner/create`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "Banner Added Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "Banner Added Successfully!", "success"); - history.goBack(); + + } catch (error) { + alert(error) + setLoading(false); } - setLoading(false); + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/Banners/EditBanner.js b/src/views/Banners/EditBanner.js index 69c2974..3a0d808 100644 --- a/src/views/Banners/EditBanner.js +++ b/src/views/Banners/EditBanner.js @@ -22,7 +22,7 @@ import { CRow, } from '@coreui/react' import CIcon from '@coreui/icons-react' -import { cilPencil, cilNotes, cilCalendar } from '@coreui/icons' +import { cilPencil, cilNotes, cilCalendar, cilNoteAdd } from '@coreui/icons' const EditBanner = () => { const { id } = useParams(); const { token } = isAutheticated(); @@ -35,6 +35,8 @@ const EditBanner = () => { const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); + const [subSection, setSubSection] = useState(""); + const [category, setCategory] = useState(false); const [loading, setLoading] = useState(false); //fetch one Offer @@ -49,38 +51,51 @@ const EditBanner = () => { setTitle(res.data.banner.title) setSubTitle(res.data.banner.subTitle) setSection(res.data.banner.section) + setSubSection(res.data.banner.subSection) setStartDate(new Date(res.data.banner.startDate).toLocaleDateString()) setEndDate(new Date(res.data.banner.endDate).toLocaleDateString()) }, [id]); const handleSubmit = async () => { + if (!(title && subTitle && image && section && subSection && startDate && endDate)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); myForm.set("subTitle", subTitle); myForm.set("section", section); + myForm.set("subSection", subSection); myForm.set("startDate", startDate); myForm.set("endDate", endDate); myForm.set("image", image); setLoading({ loading: true }); - // console.log(image) - let res = await axios.put( - `/api/banner/update/${id}`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.put( + `/api/banner/update/${id}`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "Banner Updated Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "Banner Updated Successfully!", "success"); - history.goBack(); + } catch (error) { + alert(error) + setLoading(false); } + // console.log(image) + + - setLoading(false); }; const handleImage = (e) => { const files = e.target.files[0]; @@ -95,6 +110,27 @@ const EditBanner = () => { }; + + useEffect(() => { + const getData = async () => { + let res = await axios.get( + `/api/category/getAll`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + console.log(res.data) + setCategory(res.data.category) + } + if (section === "category") { + getData() + } else { + setCategory(false) + } + }, [section]) + return ( <>
@@ -141,16 +177,35 @@ const EditBanner = () => { className="form-control input-field" > - + - - + {/* */} + {category && <> + + SubSection + + + } diff --git a/src/views/Banners/ViewBanner.js b/src/views/Banners/ViewBanner.js index 7d7944a..6254868 100644 --- a/src/views/Banners/ViewBanner.js +++ b/src/views/Banners/ViewBanner.js @@ -93,6 +93,7 @@ function ViewBanner() { Section{banner?.section} + Sub Section{banner?.subSection} Start Date {new Date(`${banner?.startDate}`).toDateString()} diff --git a/src/views/CMS/EditCms.js b/src/views/CMS/EditCms.js index 36d919f..b1b55b6 100644 --- a/src/views/CMS/EditCms.js +++ b/src/views/CMS/EditCms.js @@ -47,27 +47,32 @@ const EditCms = () => { const handleSubmit = async () => { - changeState({ loading: true }); - let res = await axios.put( - `/api/restriction/update/${id}`, - { - ...state, - }, - { - headers: { - Authorization: `Bearer ${token}`, + try { + let res = await axios.put( + `/api/restriction/update/${id}`, + { + ...state, }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + //if (res.status === 200) window.location.reload(); + // console.log(res.data) + // console.log(res.status == 200) + if (res.data.success == true) { + changeState({ loading: false }); + swal("Edit CMP-Condition successfully!"); + history.goBack() } - ); - //if (res.status === 200) window.location.reload(); - // console.log(res.data) - // console.log(res.status == 200) - if (res.data.success == true) { + } catch (error) { + alert(error) changeState({ loading: false }); - swal("Edit CMP-Condition successfully!"); - history.goBack() } + }; const onCancel = () => { // window.location = "/comproducts"; diff --git a/src/views/Category/AddCategory.js b/src/views/Category/AddCategory.js index bf6bb0f..9e2bfb7 100644 --- a/src/views/Category/AddCategory.js +++ b/src/views/Category/AddCategory.js @@ -31,6 +31,10 @@ const AddProduct = () => { const handleSubmit = async () => { + if (!(name && image)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("name", name); @@ -39,22 +43,29 @@ const AddProduct = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.post( - `/api/category/create`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - // Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.post( + `/api/category/create`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + // Authorization: `Bearer ${token}`, + }, + } + ); + //console.log(res.data.data.name) + if (res.data) { + swal("success!", "Category Added Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - //console.log(res.data.data.name) - if (res.data) { - swal("success!", "Category Added Successfully!", "success"); - history.goBack(); + } catch (error) { + alert("something went wrong") + setLoading(false); } - setLoading(false); + + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/Category/EditCategory.js b/src/views/Category/EditCategory.js index 5aeafbc..cb5da18 100644 --- a/src/views/Category/EditCategory.js +++ b/src/views/Category/EditCategory.js @@ -43,6 +43,10 @@ const AddProduct = () => { const handleSubmit = async () => { + if (!(name && image)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("name", name); @@ -51,23 +55,27 @@ const AddProduct = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.put( - `/api/category/update/${id}`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - // Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.put( + `/api/category/update/${id}`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + // Authorization: `Bearer ${token}`, + }, + } + ); + //console.log(res.data.data.name) + if (res.data) { + swal("success!", "Category Edited Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - //console.log(res.data.data.name) - if (res.data) { - swal("success!", "Category Edited Successfully!", "success"); - history.goBack(); + } catch (error) { + alert("something went wrong") + setLoading(false); } - - setLoading(false); - }; + } const handleImage = (e) => { const files = e.target.files[0]; // console.log(files) diff --git a/src/views/Directory/Add_Business.js b/src/views/Directory/Add_Business.js index 0fa3a0d..f822904 100644 --- a/src/views/Directory/Add_Business.js +++ b/src/views/Directory/Add_Business.js @@ -73,6 +73,12 @@ const Add_Business = () => { const handleSubmit = async () => { + if (!(state.name && state.phone && state.email && state.Bname && state.Sname && state.country && state.city && state.description + && state.category && state.status && image)) { + alert("Please fill All required field "); + return; + } + const myForm = new FormData(); myForm.set('name', state.name) myForm.set('phone', state.phone) @@ -92,35 +98,34 @@ const Add_Business = () => { myForm.set('FacebookUrl', state.FacebookUrl) myForm.set('InstagramUrl', state.InstagramUrl) myForm.set("image", image); - // if (!(name || description || phone || email || Bname || Sname || city)) { - // alert("Please fill required field "); - // return; - // } - // const myForm = new FormData(); - // myForm.set("image", image); changeState({ loading: true }); + try { + let res = await axios.post( + `/api/directory/create/`, - let res = await axios.post( - `/api/directory/create/`, - - myForm - , - { - headers: { - "content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + myForm + , + { + headers: { + "content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + //if (res.status === 200) window.location.reload(); + console.log(res.status == 201) + if (res.status == 201) { + changeState({ loading: false }); + swal("Add Business successfully!"); + history.goBack() } - ); - //if (res.status === 200) window.location.reload(); - console.log(res.status == 201) - if (res.status == 201) { + } catch (error) { + alert(error) changeState({ loading: false }); - swal("Add Business successfully!"); - history.goBack() } + }; const onCancel = () => { // window.location = "/comproducts"; diff --git a/src/views/Directory/EditBisuness.js b/src/views/Directory/EditBisuness.js index f60eef1..d6cc3d2 100644 --- a/src/views/Directory/EditBisuness.js +++ b/src/views/Directory/EditBisuness.js @@ -94,6 +94,11 @@ const EditBisuness = () => { const handleSubmit = async () => { + if (!(state.name && state.phone && state.email && state.Building_Name && state.Street_Name && state.country && state.city && state.description + && state.category && state.status && image)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set('name', state.name) myForm.set('phone', state.phone) @@ -115,23 +120,28 @@ const EditBisuness = () => { myForm.set("image", image); changeState({ loading: true }); + try { + let res = await axios.put( + `/api/directory/update/${id}`, + myForm, + { + headers: { + "content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); - let res = await axios.put( - `/api/directory/update/${id}`, - myForm, - { - headers: { - "content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + if (res.status == 200) { + changeState({ loading: false }); + swal("Edit Business successfully!"); + history.goBack() } - ); - - if (res.status == 200) { + } catch (error) { + alert(error) changeState({ loading: false }); - swal("Edit Business successfully!"); - history.goBack() } + }; const onCancel = () => { history.goBack() diff --git a/src/views/Events/AddEvent.js b/src/views/Events/AddEvent.js index 8a3f908..eb16d91 100644 --- a/src/views/Events/AddEvent.js +++ b/src/views/Events/AddEvent.js @@ -33,6 +33,10 @@ const AddEvent = () => { const handleSubmit = async () => { + if (!(title && description && image && location)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -41,22 +45,29 @@ const AddEvent = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.post( - `/api/event/create`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.post( + `/api/event/create`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "Event Added Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "Event Added Successfully!", "success"); - history.goBack(); + } catch (error) { + alert("Something went Wrong") + setLoading(false); } - setLoading(false); + + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/Events/EditEvent.js b/src/views/Events/EditEvent.js index 0c15dbb..ba5cb76 100644 --- a/src/views/Events/EditEvent.js +++ b/src/views/Events/EditEvent.js @@ -48,6 +48,10 @@ const EditEvent = () => { }, [id]); const handleSubmit = async () => { + if (!(title && description && image && location)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -56,22 +60,30 @@ const EditEvent = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.put( - `/api/event/update/${id}`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.put( + `/api/event/update/${id}`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "Event Edit Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "Event Edit Successfully!", "success"); - history.goBack(); + + } catch (error) { + alert("Something went Wrong") + setLoading(false); } - setLoading(false); + + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/News/AddNews.js b/src/views/News/AddNews.js index 498f49c..93fa506 100644 --- a/src/views/News/AddNews.js +++ b/src/views/News/AddNews.js @@ -30,6 +30,10 @@ const AddNews = () => { const handleSubmit = async () => { + if (!(title && description && image)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -37,22 +41,29 @@ const AddNews = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.post( - `/api/news/create`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.post( + `/api/news/create`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + console.log(res.data) + if (res.data) { + swal("success!", "News Added Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - console.log(res.data) - if (res.data) { - swal("success!", "News Added Successfully!", "success"); - history.goBack(); + } catch (error) { + alert(error) + setLoading(false); } - setLoading(false); + + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/News/EditNews.js b/src/views/News/EditNews.js index 9379dd0..f0ff9d5 100644 --- a/src/views/News/EditNews.js +++ b/src/views/News/EditNews.js @@ -45,6 +45,10 @@ const EditNews = () => { }, [id]); const handleSubmit = async () => { + if (!(title && description && image)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -52,22 +56,29 @@ const EditNews = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.put( - `/api/news/update/${id}`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.put( + `/api/news/update/${id}`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "News Edit Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "News Edit Successfully!", "success"); - history.goBack(); + } catch (error) { + alert(error) + setLoading(false); } - setLoading(false); + + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/Offers/AddOffer.js b/src/views/Offers/AddOffer.js index f42e137..0b61760 100644 --- a/src/views/Offers/AddOffer.js +++ b/src/views/Offers/AddOffer.js @@ -62,6 +62,10 @@ const AddOffer = () => { const handleSubmit = async () => { + if (!(title && description && image && location && sendBisunessName)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -71,22 +75,29 @@ const AddOffer = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.post( - `/api/offer/create`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.post( + `/api/offer/create`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "Event Added Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "Event Added Successfully!", "success"); - history.goBack(); + + } catch (error) { + alert("something Went Wrong") + setLoading(false); } - setLoading(false); + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/Offers/EditOffer.js b/src/views/Offers/EditOffer.js index 3a74d85..abfc8bb 100644 --- a/src/views/Offers/EditOffer.js +++ b/src/views/Offers/EditOffer.js @@ -71,6 +71,10 @@ const EditOffer = () => { const handleSubmit = async () => { + if (!(title && description && image && location && sendBisunessName)) { + alert("Please fill All required field "); + return; + } const myForm = new FormData(); myForm.set("title", title); @@ -80,22 +84,29 @@ const EditOffer = () => { myForm.set("image", image); setLoading({ loading: true }); // console.log(image) - let res = await axios.put( - `/api/offer/update/${id}`, myForm, - { - headers: { - "Content-Type": 'multipart/form-data', - Authorization: `Bearer ${token}`, - }, + try { + let res = await axios.put( + `/api/offer/update/${id}`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(res.data) + if (res.data) { + swal("success!", "Event Added Successfully!", "success"); + setLoading(false); + history.goBack(); } - ); - // console.log(res.data) - if (res.data) { - swal("success!", "Event Added Successfully!", "success"); - history.goBack(); + } catch (error) { + alert("something Went Wrong") + setLoading(false); } - setLoading(false); + + }; const handleImage = (e) => { const files = e.target.files[0]; diff --git a/src/views/Requirement/AddRequirement.js b/src/views/Requirement/AddRequirement.js new file mode 100644 index 0000000..45528ff --- /dev/null +++ b/src/views/Requirement/AddRequirement.js @@ -0,0 +1,205 @@ + +import axios from "axios"; +import React, { useCallback, useEffect, useState } from "react"; +import { API } from "../../data"; +import { isAutheticated } from "../../auth"; +import ClipLoader from "react-spinners/ClipLoader"; +import { useHistory } from "react-router-dom"; +import swal from 'sweetalert'; + +import { + CButton, + CCard, + CCardBody, + CCol, + CContainer, + CForm, + CFormInput, + CInputGroup, + CInputGroupText, + CRow, +} from '@coreui/react' +import CIcon from '@coreui/icons-react' +import { cilPencil, cilSettings, cilLockLocked, cilUser, cilBell, cilLocationPin, cilAudioDescription, cilObjectGroup } from '@coreui/icons' +const AddRequirement = () => { + const token = isAutheticated(); + // console.log(token) + let history = useHistory(); + + const [areaOfInterest, setAreaOfInterest] = useState(""); + const [description, setDescription] = useState(""); + const [title, setTitle] = useState(""); + const [imagesPreview, setImagesPreview] = useState([]); + const [allimage, setAllImage] = useState([]); + // const [images, setImages] = useState([]); + + const [loading, setLoading] = useState(false); + + const handleImage = (e) => { + + setAllImage([...allimage, ...e.target.files]); + + // only for file preview------------------------------------ + const files = Array.from(e.target.files); + files.forEach((file) => { + const reader = new FileReader(); + + reader.onload = () => { + if (reader.readyState === 2) { + setImagesPreview((old) => [...old, reader.result]); + + } + }; + + reader.readAsDataURL(file) + }); + // ----------------------------------------------------------------------------- + }; + + const handleSubmit = async () => { + const myForm = new FormData(); + + myForm.set("title", title); + myForm.set("description", description); + myForm.set("areaOfInterest", areaOfInterest); + allimage.forEach((Singleimage) => { + myForm.append("image", Singleimage); + + }); + if (!(title && description && areaOfInterest && allimage[0])) { + alert("please fill all fields") + return + } + setLoading(true); + try { + let res = await axios.post( + `/api/requirement/create`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + if (res.data.success === true) { + swal("success!", "Requirements Added Successfully!", "success"); + history.goBack(); + setLoading(false); + } + + } catch (error) { + setLoading(false); + alert(error) + + } + + }; + + const onCancel = () => { + history.goBack() + + }; + + return ( + <> +
+ + + + + + +

Add Requirements

+
+
+ + + + + setTitle(e.target.value)} + value={title} + placeholder="Title" /> + + + + + + setAreaOfInterest(e.target.value)} + value={areaOfInterest} + placeholder="Area Of Interest" /> + + + + + + + setDescription(e.target.value)} + value={description} + placeholder="Description" /> + + + + + + {/* */} + + + +
*Please Upload maximum four images
+ + +
+ + {imagesPreview.map((image, index) => ( + Product Preview + ))} +
+
+ +
+ + +
+
+
+
+
+
+
+
+
+ + + ) +} + +export default AddRequirement \ No newline at end of file diff --git a/src/views/Requirement/EditRequirement.js b/src/views/Requirement/EditRequirement.js new file mode 100644 index 0000000..5409780 --- /dev/null +++ b/src/views/Requirement/EditRequirement.js @@ -0,0 +1,220 @@ + + +import axios from "axios"; +import React, { useCallback, useEffect, useState } from "react"; +import { API } from "../../data"; +import { isAutheticated } from "../../auth"; +import ClipLoader from "react-spinners/ClipLoader"; +import { useHistory, useParams } from "react-router-dom"; +import swal from 'sweetalert'; + +import { + CButton, + CCard, + CCardBody, + CCol, + CContainer, + CForm, + CFormInput, + CInputGroup, + CInputGroupText, + CRow, +} from '@coreui/react' +import CIcon from '@coreui/icons-react' +import { cilPencil, cilSettings, cilLockLocked, cilUser, cilBell, cilLocationPin, cilAudioDescription, cilObjectGroup } from '@coreui/icons' +const EditRequirement = () => { + const token = isAutheticated(); + const { id } = useParams() + let history = useHistory(); + const [areaOfInterest, setAreaOfInterest] = useState(""); + const [description, setDescription] = useState(""); + const [title, setTitle] = useState(""); + const [imagesPreview, setImagesPreview] = useState([]); + const [allimage, setAllImage] = useState([]); + const [loading, setLoading] = useState(false); + + //fetch one requirement + useEffect(async () => { + const res = await axios.get(`/api/requirement/getOne/${id}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + // console.log(res.data) + setTitle(res.data.Requirement.title) + setDescription(res.data.Requirement.description) + setAreaOfInterest(res.data.Requirement.areaOfInterest) + + + }, [id]); + + + const handleImage = (e) => { + + setAllImage([...allimage, ...e.target.files]); + + // only for file preview------------------------------------ + const files = Array.from(e.target.files); + files.forEach((file) => { + const reader = new FileReader(); + + reader.onload = () => { + if (reader.readyState === 2) { + setImagesPreview((old) => [...old, reader.result]); + + } + }; + + reader.readAsDataURL(file) + }); + // ----------------------------------------------------------------------------- + }; + + + const handleSubmit = async () => { + const myForm = new FormData(); + + myForm.set("title", title); + myForm.set("description", description); + myForm.set("areaOfInterest", areaOfInterest); + allimage.forEach((Singleimage) => { + myForm.append("image", Singleimage); + + }); + if (!(title && description && areaOfInterest && allimage[0])) { + alert("please fill all fields") + return + } + setLoading(true); + try { + let res = await axios.put( + `/api/requirement/update/${id}`, myForm, + { + headers: { + "Content-Type": 'multipart/form-data', + Authorization: `Bearer ${token}`, + }, + } + ); + if (res.data.success === true) { + swal("success!", "Requirements Updated Successfully!", "success"); + history.goBack(); + setLoading(false); + } + + } catch (error) { + setLoading(false); + alert(error) + + } + + }; + + const onCancel = () => { + history.goBack() + + }; + + return ( + <> +
+ + + + + + +

Edit Requirements

+
+
+ + + + + setTitle(e.target.value)} + value={title} + placeholder="Title" /> + + + + + + setAreaOfInterest(e.target.value)} + value={areaOfInterest} + placeholder="Area Of Interest" /> + + + + + + + setDescription(e.target.value)} + value={description} + placeholder="Description" /> + + + + + + {/* */} + + + +
*Please Upload maximum four images
+ +
+ {imagesPreview.map((image, index) => ( + Product Preview + ))} +
+
+ +
+ + +
+
+
+
+
+
+
+
+
+ + + ) +} + +export default EditRequirement \ No newline at end of file diff --git a/src/views/Requirement/Requirement.js b/src/views/Requirement/Requirement.js new file mode 100644 index 0000000..b18cd86 --- /dev/null +++ b/src/views/Requirement/Requirement.js @@ -0,0 +1,122 @@ + +import axios from "axios"; +import React, { useEffect, useState, useCallback, useMemo } from "react"; +import { Link } from "react-router-dom"; +import swal from 'sweetalert'; +// import { API } from "../../data"; +import { isAutheticated } from "../../auth"; +import RequirementOpt from "./RequirementOpt"; + +function Requirement() { + const [requirement, setRequirement] = useState([]) + + const token = isAutheticated(); + // console.log(token) + const getRequirement = useCallback(async () => { + let res = await axios.get( + `/api/requirement/getAll`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + setRequirement(res.data.Requirement) + + }, [token]); + + useEffect(() => { + getRequirement(); + }, [getRequirement]); + const handleApprove = async (id) => { + let status = window.confirm("Do you want to Approve"); + if (!status) return; + // console.log(email) + try { + let res = await axios.get(`/api/admin/requirement/approve/${id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + console.log(res.data) + getRequirement() + if (res.data.success == true) { + swal("success!", "Requirement Approved !", "success"); + + } + } catch (error) { + + swal("Error:!", console.log(error), "error"); + } + + }; + + + + + return ( +
+
+
+ {/* */} +
+
+
+

CMP-Requirements

+ + {/*
+
    +
  1. + CMD-App +
  2. +
  3. CMD-Category
  4. +
+
*/} +
+
+
+ {/* */} + +
+
+
+
+
+ +
+
+ + + + + + + + + + + + + {requirement && requirement.map((item, index) => + + )} + +
TitleImageArea Of InterestAdded ByAdded OnAction
+
+ + + {/* */} +
+
+
+
+
+ {/* */} +
+
+ ); +} + +export default Requirement; diff --git a/src/views/Requirement/RequirementOpt.js b/src/views/Requirement/RequirementOpt.js new file mode 100644 index 0000000..aa28b40 --- /dev/null +++ b/src/views/Requirement/RequirementOpt.js @@ -0,0 +1,132 @@ +import axios from "axios"; +import React, { useEffect, useState, useCallback, useMemo } from "react"; +import { Link } from "react-router-dom"; +import swal from 'sweetalert'; +import { isAutheticated } from "../../auth"; + + +const RequirementOpt = ({ item, handleApprove }) => { + const [user, setUser] = useState() + const [approve, setApprove] = useState(false) + const token = isAutheticated(); + useEffect(async () => { + let resp = await axios.get( + `/api/v1/admin/user/${item.addedBy}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(resp.data) + setUser(resp.data.user) + + ///approved + const getData = async () => { + try { + const response = await axios.get(`/api/requirement/getOne/${item._id}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }) + // console.log(response.data) + if (response.data.Requirement.approved === true) { + setApprove(true) + } else { + setApprove(false) + } + } catch (e) { + console.log(e) + setApprove(false) + } + } + getData() + }, [item]); + + + + const handleDelete = async (id) => { + let status = window.confirm("Do you want to delete"); + if (!status) return; + + let res = await axios.delete(`/api/requirement/delete/${id}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + // console.log(res) + if (res.data.success == true) { + swal("success!", "Requirement Deleted Successfully!", "success"); + window.location.reload(); + } + }; + //change time formate + function formatAMPM(date) { + var hours = new Date(date).getHours(); + var minutes = new Date(date).getMinutes(); + var ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + minutes = minutes < 10 ? '0' + minutes : minutes; + var strTime = hours + ':' + minutes + ' ' + ampm; + return strTime; + } + return ( + <> + + {item?.title} + + + + {item?.areaOfInterest} + {user?.name} + + {/* {item?.addedOn} */} + {new Date(`${item?.createdAt}`).toDateString()} , {`${formatAMPM(item?.createdAt)}`} + + + + + + + + + + + + + + + + + + + ) +} + +export default RequirementOpt \ No newline at end of file diff --git a/src/views/Requirement/ViewRequirement.js b/src/views/Requirement/ViewRequirement.js new file mode 100644 index 0000000..c64a9fd --- /dev/null +++ b/src/views/Requirement/ViewRequirement.js @@ -0,0 +1,142 @@ + +import axios from "axios"; +import React, { useEffect, useState, useCallback, useMemo } from "react"; +import swal from 'sweetalert'; +// import { API } from "../../data"; +import { Link, useParams } from "react-router-dom"; +import { isAutheticated } from "../../auth"; + +function ViewRequirement() { + const [requirement, setRequirement] = useState([]) + const [allImage, setAllImage] = useState([]) + const { id } = useParams(); + // console.log(id) + const token = isAutheticated(); + + const getUserDetails = useCallback(async () => { + + + let resp = await axios.get( + `/api/requirement/getOne/${id}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log(resp.data.Requirement.image) + setRequirement(resp.data.Requirement) + setAllImage(resp.data.Requirement.image) + + + }, [token]); + + useEffect(() => { + getUserDetails(); + }, [getUserDetails]); + + + // allImage.map(item => { + // console.log(item.url) + // }) + + + //change time formate + function formatAMPM(date) { + var hours = new Date(date).getHours(); + var minutes = new Date(date).getMinutes(); + var ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + minutes = minutes < 10 ? '0' + minutes : minutes; + var strTime = hours + ':' + minutes + ' ' + ampm; + return strTime; + } + + + return ( +
+
+
+ {/* */} +
+
+
+

CMP-User Details

+
+
+
+ {/* */} + +
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + {/* + + + + */} + + + {/* */} + + + + + + + + + + + + + + + +
User_Id{requirement?._id}
Title{requirement?.title}
Area Of Interest{requirement?.areaOfInterest}
Image + + +
Description
Description{requirement?.description}
Added On + {new Date(`${requirement?.createdAt}`).toDateString()} , {`${formatAMPM(requirement?.createdAt)}`} +
Updated At + {new Date(`${requirement?.updatedAt}`).toDateString()} , {`${formatAMPM(requirement?.updatedAt)}`} +
+
+ + + {/* */} +
+
+
+
+
+ {/* */} +
+
+ ); +} + +export default ViewRequirement; + diff --git a/src/views/pages/login/Login.js b/src/views/pages/login/Login.js index 1973ebd..10f83ad 100644 --- a/src/views/pages/login/Login.js +++ b/src/views/pages/login/Login.js @@ -34,20 +34,28 @@ const Login = () => { const Login = async () => { setLoading({ loading: true }) - const res = await axios.post("/api/v1/user/login/", auth); - if (res.data.success == true) { - localStorage.setItem("authToken", res.data.token) - history.push('/dashboard') + try { + const res = await axios.post("/api/v1/user/login/", auth); + if (res.data.success == true) { + localStorage.setItem("authToken", res.data.token) + history.push('/dashboard') + setLoading(false); + window.location.reload() + + + } + else { + setLoading(false); + alert("Invalid Credential"); + + } + } catch (error) { setLoading(false); - window.location.reload() - - - } - else { alert("Invalid Credentials"); - setLoading(false); + } } + return (
diff --git a/src/views/pages/register/Change_password.js b/src/views/pages/register/Change_password.js index d505333..1db3639 100644 --- a/src/views/pages/register/Change_password.js +++ b/src/views/pages/register/Change_password.js @@ -29,6 +29,10 @@ const Register = () => { const handleSubmit = async () => { + if (!(oldPassword && newPassword && confirmPassword)) { + alert("Please fill All required field "); + return; + } const token = localStorage.getItem("authToken") setLoading({ loading: true }) if (newPassword == confirmPassword) {