This commit is contained in:
pawan-dot 2023-01-24 18:12:19 +05:30
parent e7f53a9dc4
commit 3fc579218e
16 changed files with 1265 additions and 39 deletions

View File

@ -53,9 +53,10 @@
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "18.2", "react": "18.2",
"react-app-polyfill": "^2.0.0", "react-app-polyfill": "^2.0.0",
"react-bootstrap": "^2.7.0",
"react-date-picker": "^8.4.0", "react-date-picker": "^8.4.0",
"react-datepicker": "^4.8.0", "react-datepicker": "^4.8.0",
"react-dom": "^17.0.2", "react-dom": "^18.0.0",
"react-paginate": "^8.1.3", "react-paginate": "^8.1.3",
"react-redux": "^7.2.6", "react-redux": "^7.2.6",
"react-router-dom": "^6.7.0", "react-router-dom": "^6.7.0",

View File

@ -13,12 +13,16 @@ import {
cilFilterSquare, cilFilterSquare,
cilMedicalCross, cilMedicalCross,
cilMoney, cilMoney,
cilMugTea,
cilNewspaper, cilNewspaper,
cilNotes, cilNotes,
cilPencil, cilPencil,
cilPuzzle, cilPuzzle,
cilSitemap,
cilSpeedometer, cilSpeedometer,
cilStar, cilStar,
cilTablet,
cilTennisBall,
cilUser, cilUser,
@ -35,6 +39,12 @@ const _nav = [
}, },
{
component: CNavItem,
name: 'Temples',
icon: <CIcon icon={cilTennisBall} customClassName="nav-icon" />,
to: '/temples',
},
{ {
component: CNavItem, component: CNavItem,

View File

@ -11,7 +11,8 @@ import store from './store'
import axios from 'axios' import axios from 'axios'
const setupAxios = () => { const setupAxios = () => {
axios.defaults.baseURL = 'http://localhost:5000' axios.defaults.baseURL = 'https://atpapi.checkapp.one'
//axios.defaults.baseURL = 'http://localhost:5000'
axios.defaults.headers = { axios.defaults.headers = {
'Cache-Control': 'no-cache,no-store', 'Cache-Control': 'no-cache,no-store',
'Pragma': 'no-cache', 'Pragma': 'no-cache',

View File

@ -22,6 +22,10 @@ import Socialmedia from './views/configuration/Socialmedia.js'
import Address from './views/configuration/Address.js' import Address from './views/configuration/Address.js'
import Logo from './views/configuration/Logo.js' import Logo from './views/configuration/Logo.js'
import Login from './views/pages/login/Login' import Login from './views/pages/login/Login'
//temple
import Temples from './views/Temples/Temples'
import AddTemple from './views/Temples/AddTemple'
import EditTemple from './views/Temples/EditTemple'
const routes = [ const routes = [
@ -29,7 +33,10 @@ const routes = [
{ path: '/change_password', name: 'Change Password', element: Change_Password }, { path: '/change_password', name: 'Change Password', element: Change_Password },
{ path: '/profile/edit', name: 'Edit Profile', element: EditProfile }, { path: '/profile/edit', name: 'Edit Profile', element: EditProfile },
// { path: '/profile', name: 'Profile', element: Profile }, // { path: '/profile', name: 'Profile', element: Profile },
//Temple
{ path: '/temples', name: 'Temples', element: Temples },
{ path: '/temple/add', name: 'Add Temple', element: AddTemple },
{ path: '/temple/edit/:id', name: 'Edit Temples', element: EditTemple },
//dashboard //dashboard

View File

@ -0,0 +1,407 @@
import React, { useEffect, useState } from 'react'
import Button from '@material-ui/core/Button'
import { Link, useNavigate } from 'react-router-dom'
import swal from 'sweetalert'
import axios from 'axios'
import { isAutheticated } from 'src/auth'
// import { WebsiteURL } from '../WebsiteURL'
const AddTemple = () => {
const [WebsiteURL, setWebsiteURL] = useState('https://reinventuniforms.in/')
const token = isAutheticated()
const navigate = useNavigate()
const [data, setData] = useState({
image: '',
imageURL: '',
name: '',
address_line_1: '',
address_line_2: '',
city: '',
state_name: '',
short_url: '',
// pan: '',
// business_name: '',
// gstin: '',
// option: '',
})
const [cities, setCities] = useState([])
const [loading, setLoading] = useState(false)
const [limiter, setLimiter] = useState({
name: 100,
nameHas: 100,
})
const getRequired = () => {
axios
.get(`/api/city`, {
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: `Bearer ${token}`,
},
})
.then((res) => {
setCities([...res.data.data])
})
.catch((err) => { })
}
useEffect(() => {
getRequired()
}, [])
const handleChange = (e) => {
if (e.target.id === 'name') {
if (e.target.value.length === limiter[e.target.id] + 1) return
setLimiter((prev) => ({
...prev,
[e.target.id + 'Has']: prev[e.target.id] - e.target.value.length,
}))
setData((prev) => ({ ...prev, short_url: e.target.value.toLowerCase().replace(/\s+/g, '-') }))
}
if (e.target.id === 'city') {
const city = cities.filter((m) => e.target.value === m?._id)
setData((prev) => ({ ...prev, state_name: city[0]?.state?.state_name || '' }))
}
if (e.target.id === 'image') {
if (
e.target.files[0]?.type === 'image/jpeg' ||
e.target.files[0]?.type === 'image/png' ||
e.target.files[0]?.type === 'image/jpg'
) {
setData((prev) => ({
...prev,
imageURL: URL.createObjectURL(e.target.files[0]),
image: e.target.files[0],
}))
return
} else {
swal({
title: 'Warning',
text: 'Upload jpg, jpeg, png only.',
icon: 'error',
button: 'Close',
dangerMode: true,
})
setData((prev) => ({
...prev,
imageURL: '',
image: '',
}))
e.target.value = null
return
}
}
setData((prev) => ({ ...prev, [e.target.id]: e.target.value }))
}
const handleSubmit = () => {
if (
data.name.trim() === '' ||
// data.pan.trim() === '' ||
// data.business_name.trim() === '' ||
// data.gstin.trim() === '' ||
// data.option.trim() === '' ||
data.address_line_1.trim() === '' ||
data.address_line_2.trim() === '' ||
data.city === '' ||
data.short_url === '' ||
data.state_name === '' ||
data.imageURL.trim() === ''
) {
swal({
title: 'Warning',
text: 'Fill all mandatory fields',
icon: 'error',
button: 'Close',
dangerMode: true,
})
return
}
setLoading(true)
const formData = new FormData()
formData.set('name', data.name)
// formData.set('pan', data.pan)
// formData.set('business_name', data.business_name)
// formData.set('gstin', data.gstin)
// formData.set('option', data.option)
formData.set('address_line_1', data.address_line_1)
formData.set('address_line_2', data.address_line_2)
formData.set('city', data.city)
formData.set('state_name', data.state_name)
formData.set('url', WebsiteURL + data.short_url + '/login')
formData.set('short_url', data.short_url)
formData.append('image', data.image)
axios
.post(`/api/temple`, formData, {
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'multipart/formdata',
'Access-Control-Allow-Origin': '*',
},
})
.then((res) => {
swal({
title: 'Added',
text: 'Temple added successfully!',
icon: 'success',
button: 'Return',
})
setLoading(false)
navigate('/temples', { replace: true })
})
.catch((err) => {
setLoading(false)
const message = err.response?.data?.message || 'Something went wrong!'
swal({
title: 'Warning',
text: message,
icon: 'error',
button: 'Retry',
dangerMode: true,
})
})
}
return (
<div className="container">
<div className="row">
<div className="col-12">
<div
className="
page-title-box
d-flex
align-items-center
justify-content-between
"
>
<div style={{ fontSize: '22px' }} className="fw-bold">
Add Temple
</div>
<div style={{ display: 'flex', gap: '1rem' }}>
<h4 className="mb-0"></h4>
</div>
<div className="page-title-right">
<Button
variant="contained"
color="primary"
style={{
fontWeight: 'bold',
marginBottom: '1rem',
textTransform: 'capitalize',
marginRight: '5px',
}}
onClick={() => handleSubmit()}
disabled={loading}
>
{loading ? 'Loading' : 'Save'}
</Button>
<Link to="/temples">
<Button
variant="contained"
color="secondary"
style={{
fontWeight: 'bold',
marginBottom: '1rem',
textTransform: 'capitalize',
}}
>
Back
</Button>
</Link>
</div>
</div>
</div>
</div>
<div className="row">
<div className="col-6 my-1">
<div className="card h-100">
<div className="card-body px-5">
<div className="mb-3">
<label htmlFor="title" className="form-label">
Temple Name*
</label>
<input
type="text"
className="form-control"
id="name"
value={data.name}
maxLength={limiter.name}
onChange={(e) => handleChange(e)}
/>
<p className="pt-1 pl-2 text-secondary">Remaining characters : {limiter.nameHas}</p>
</div>
{/* <div className="mb-3">
<label htmlFor="title" className="form-label">
PAN*
</label>
<input
type="text"
className="form-control"
id="pan"
value={data.pan}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div> */}
<div className="mb-3">
<label htmlFor="title" className="form-label">
Address Line 1*
</label>
<input
type="text"
className="form-control"
id="address_line_1"
value={data.address_line_1}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div>
<div className="mb-3">
<label htmlFor="title" className="form-label">
Address Line 2*
</label>
<input
type="text"
className="form-control"
id="address_line_2"
value={data.address_line_2}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div>
{/* <div className="mb-3">
<label htmlFor="title" className="form-label">
Business Name*
</label>
<input
type="text"
className="form-control"
id="business_name"
value={data.business_name}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div> */}
{/* <div className="mb-3">
<label htmlFor="title" className="form-label">
GSTIN*
</label>
<input
type="text"
className="form-control"
id="gstin"
value={data.gstin}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div> */}
<div className="mb-3">
<label htmlFor="pageToLink" className="form-label">
City*
</label>
<select
onChange={(e) => handleChange(e)}
value={data.city}
className="form-control"
id="city"
>
<option value="">---select---</option>
{cities[0] ? (
cities.map((c, i) => (
<option key={i} value={c._id}>
{c.city_name + ', ' + c.state?.state_name}
</option>
))
) : (
<option value="" disabled>
Please add a City
</option>
)}
</select>
</div>
<div className="mb-3">
<label htmlFor="title" className="form-label">
State*
</label>
<input
type="text"
className="form-control"
id="state_name"
value={data.state_name}
disabled
/>
</div>
</div>
</div>
</div>
<div className="col-6 my-1">
<div className="card h-100">
<div className="card-body px-5">
<div className="mb-3">
<label htmlFor="title" className="form-label">
URL*
</label>
<div className="input-group mb-3">
<span className="input-group-text" id="basic-addon3">
{WebsiteURL}
</span>
<input
type="text"
className="form-control"
id="short_url"
aria-describedby="basic-addon3"
value={data.short_url}
onChange={(e) => handleChange(e)}
/>
</div>
</div>
{/* <div className="mb-3">
<label htmlFor="option" className="form-label">
Option*
</label>
<select
className="form-control"
id="option"
value={data.option}
onChange={(e) => handleChange(e)}
>
<option value="">None</option>
<option value="group">Group</option>
<option value="bundle">Bundle</option>
</select>
</div> */}
<div className="mb-3">
<label htmlFor="image" className="form-label">
Temple Banner*
</label>
<input
type="file"
className="form-control"
id="image"
accept="image/*"
onChange={(e) => handleChange(e)}
/>
<p className="pt-1 pl-2 text-secondary">Upload jpg, jpeg and png only*</p>
</div>
<div className="mb-3" style={{ height: '200px', maxWdth: '100%' }}>
<img
src={data.imageURL}
alt="Uploaded Image will be shown here"
style={{ maxHeight: '200px', maxWidth: '100%' }}
/>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
export default AddTemple

View File

@ -0,0 +1,423 @@
import React, { useEffect, useState } from 'react'
import Button from '@material-ui/core/Button'
import { Link, useNavigate, useParams } from 'react-router-dom'
import swal from 'sweetalert'
import axios from 'axios'
import { isAutheticated } from 'src/auth'
const EditTemple = () => {
const [WebsiteURL, setWebsiteURL] = useState('https://reinventuniforms.in/')
const id = useParams()?.id
const token = isAutheticated()
const navigate = useNavigate()
const [data, setData] = useState({
image: '',
imageURL: '',
name: '',
address_line_1: '',
address_line_2: '',
city: '',
state_name: '',
short_url: '',
pan: '',
business_name: '',
gstin: '',
option: '',
})
const [cities, setCities] = useState([])
const [loading, setLoading] = useState(false)
const [limiter, setLimiter] = useState({
name: 100,
nameHas: 100,
})
const getRequired = async () => {
await axios
.get(`/api/city`, {
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: `Bearer ${token}`,
},
})
.then((res) => {
setCities([...res.data.data])
})
.catch((err) => { })
axios
.get(`/api/Temple/withoutpopulate/${id}`, {
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: `Bearer ${token}`,
},
})
.then((res) => {
setData((prev) => ({
...prev,
...res.data?.data,
city: res.data?.data?.city,
imageURL: res.data?.data?.banner?.url,
}))
setLimiter((prev) => ({ ...prev, nameHas: prev.name - res.data?.data?.name?.length || 0 }))
})
.catch((err) => { })
}
useEffect(() => {
getRequired()
}, [])
useEffect(() => {
const setStateName = () => {
const city = cities.filter((m) => data.city === m?._id)
setData((prev) => ({ ...prev, state_name: city[0]?.state?.state_name || '' }))
}
setStateName()
}, [data.city])
const handleChange = (e) => {
if (e.target.id === 'name') {
if (e.target.value.length === limiter[e.target.id] + 1) return
setLimiter((prev) => ({
...prev,
[e.target.id + 'Has']: prev[e.target.id] - e.target.value.length,
}))
// setData((prev) => ({ ...prev, short_url: e.target.value.toLowerCase().replace(/\s+/g, '-') }))
}
if (e.target.id === 'image') {
if (
e.target.files[0]?.type === 'image/jpeg' ||
e.target.files[0]?.type === 'image/png' ||
e.target.files[0]?.type === 'image/jpg'
) {
setData((prev) => ({
...prev,
imageURL: URL.createObjectURL(e.target.files[0]),
image: e.target.files[0],
}))
return
} else {
swal({
title: 'Warning',
text: 'Upload jpg, jpeg, png only.',
icon: 'error',
button: 'Close',
dangerMode: true,
})
setData((prev) => ({
...prev,
imageURL: '',
image: '',
}))
e.target.value = null
return
}
}
setData((prev) => ({ ...prev, [e.target.id]: e.target.value }))
}
const handleSubmit = () => {
if (
data.name.trim() === '' ||
data.address_line_1.trim() === '' ||
data.address_line_2.trim() === '' ||
data.city === '' ||
data.short_url === '' ||
data.state_name === ''
) {
swal({
title: 'Warning',
text: 'Fill all mandatory fields',
icon: 'error',
button: 'Close',
dangerMode: true,
})
return
}
setLoading(true)
const formData = new FormData()
formData.set('name', data.name)
// formData.set('pan', data.pan)
// formData.set('business_name', data.business_name)
// formData.set('gstin', data.gstin)
// formData.set('option', data.option)
formData.set('address_line_1', data.address_line_1)
formData.set('address_line_2', data.address_line_2)
formData.set('city', data.city)
formData.set('state_name', data.state_name)
formData.set('url', WebsiteURL + data.short_url + '/login')
formData.set('short_url', data.short_url)
formData.append('image', data.image)
axios
.patch(`/api/Temple/${id}`, formData, {
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'multipart/formdata',
'Access-Control-Allow-Origin': '*',
},
})
.then((res) => {
swal({
title: 'Updated',
text: 'Temple updated successfully!',
icon: 'success',
button: 'Return',
})
setLoading(false)
navigate('/temples', { replace: true })
})
.catch((err) => {
setLoading(false)
const message = err.response?.data?.message || 'Something went wrong!'
swal({
title: 'Warning',
text: message,
icon: 'error',
button: 'Retry',
dangerMode: true,
})
})
}
return (
<div className="container">
<div className="row">
<div className="col-12">
<div
className="
page-title-box
d-flex
align-items-center
justify-content-between
"
>
<div style={{ fontSize: '22px' }} className="fw-bold">
Edit Temple
</div>
<div style={{ display: 'flex', gap: '1rem' }}>
<h4 className="mb-0"></h4>
</div>
<div className="page-title-right">
<Button
variant="contained"
color="primary"
style={{
fontWeight: 'bold',
marginBottom: '1rem',
textTransform: 'capitalize',
marginRight: '5px',
}}
onClick={() => handleSubmit()}
disabled={loading}
>
{loading ? 'Loading' : 'Update'}
</Button>
<Link to="/temples">
<Button
variant="contained"
color="secondary"
style={{
fontWeight: 'bold',
marginBottom: '1rem',
textTransform: 'capitalize',
}}
>
Back
</Button>
</Link>
</div>
</div>
</div>
</div>
<div className="row">
<div className="col-6 my-1">
<div className="card h-100">
<div className="card-body px-5">
<div className="mb-3">
<label htmlFor="title" className="form-label">
Temple Name*
</label>
<input
type="text"
className="form-control"
id="name"
value={data.name}
maxLength={limiter.name}
onChange={(e) => handleChange(e)}
/>
<p className="pt-1 pl-2 text-secondary">Remaining characters : {limiter.nameHas}</p>
</div>
{/* <div className="mb-3">
<label htmlFor="title" className="form-label">
PAN*
</label>
<input
type="text"
className="form-control"
id="pan"
value={data.pan}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div> */}
<div className="mb-3">
<label htmlFor="title" className="form-label">
Address Line 1*
</label>
<input
type="text"
className="form-control"
id="address_line_1"
value={data.address_line_1}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div>
<div className="mb-3">
<label htmlFor="title" className="form-label">
Address Line 2*
</label>
<input
type="text"
className="form-control"
id="address_line_2"
value={data.address_line_2}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div>
{/* <div className="mb-3">
<label htmlFor="title" className="form-label">
Business Name*
</label>
<input
type="text"
className="form-control"
id="business_name"
value={data.business_name}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div>
<div className="mb-3">
<label htmlFor="title" className="form-label">
GSTIN*
</label>
<input
type="text"
className="form-control"
id="gstin"
value={data.gstin}
maxLength="50"
onChange={(e) => handleChange(e)}
/>
</div> */}
<div className="mb-3">
<label htmlFor="pageToLink" className="form-label">
City*
</label>
<select
onChange={(e) => handleChange(e)}
value={data.city}
className="form-control"
id="city"
>
<option value="">---select---</option>
{cities[0] ? (
cities.map((c, i) => (
<option key={i} value={c._id}>
{c.city_name + ', ' + c.state?.state_name}
</option>
))
) : (
<option value="" disabled>
Please add a City
</option>
)}
</select>
</div>
<div className="mb-3">
<label htmlFor="title" className="form-label">
State*
</label>
<input
type="text"
className="form-control"
id="state_name"
value={data.state_name}
disabled
/>
</div>
</div>
</div>
</div>
<div className="col-6 my-1">
<div className="card h-100">
<div className="card-body px-5">
<div className="mb-3">
<label htmlFor="title" className="form-label">
URL*
</label>
<div className="input-group mb-3">
<span className="input-group-text" id="basic-addon3">
{WebsiteURL}
</span>
<input
type="text"
className="form-control"
id="short_url"
aria-describedby="basic-addon3"
value={data.short_url}
onChange={(e) => handleChange(e)}
/>
</div>
</div>
{/* <div className="mb-3">
<label htmlFor="option" className="form-label">
Option*
</label>
<select
className="form-control"
id="option"
value={data.option}
onChange={(e) => handleChange(e)}
>
<option value="">None</option>
<option value="group">Group</option>
<option value="bundle">Bundle</option>
</select>
</div> */}
<div className="mb-3">
<label htmlFor="image" className="form-label">
Temple Banner*
</label>
<input
type="file"
className="form-control"
id="image"
accept="image/*"
onChange={(e) => handleChange(e)}
/>
<p className="pt-1 pl-2 text-secondary">Upload jpg, jpeg and png only*</p>
</div>
<div className="mb-3" style={{ height: '200px', maxWdth: '100%' }}>
<img
src={data.imageURL}
alt="Uploaded Image will be shown here"
style={{ maxHeight: '200px', maxWidth: '100%' }}
/>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
export default EditTemple

View File

@ -0,0 +1,29 @@
import React, { useState, useRef } from 'react'
import Button from 'react-bootstrap/Button'
import Overlay from 'react-bootstrap/Overlay'
import Tooltip from 'react-bootstrap/Tooltip'
function OverLayButton(props) {
const { url } = props?.data || ''
const [show, setShow] = useState(false)
const target = useRef(null)
return (
<span>
<Button ref={target} onClick={() => setShow(!show)} size="sm" variant="outline-info">
URL
</Button>
<Overlay target={target.current} show={show} placement="top">
{(props) => (
<Tooltip id="overlay-example" {...props}>
<a href={url} target="_blank" className="text-white">
{url}
</a>
</Tooltip>
)}
</Overlay>
</span>
)
}
export default OverLayButton

View File

@ -0,0 +1,351 @@
import React, { useEffect } from 'react'
import Button from '@material-ui/core/Button'
import { useState } from 'react'
import { Link } from 'react-router-dom'
import axios from 'axios'
import swal from 'sweetalert'
import OverLayButton from './OverLayButton.js'
import { isAutheticated } from 'src/auth.js'
const Temples = () => {
const token = isAutheticated()
const [loading, setLoading] = useState(true)
const [success, setSuccess] = useState(true)
const [TemplesData, setTemplesData] = useState([])
const [currentPage, setCurrentPage] = useState(1)
const [itemPerPage, setItemPerPage] = useState(10)
const [showData, setShowData] = useState(TemplesData)
const handleShowEntries = (e) => {
setCurrentPage(1)
setItemPerPage(e.target.value)
}
const getCategories = () => {
axios
.get(`/api/temple`, {
headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` },
})
.then((res) => {
setTemplesData(res.data.data)
setLoading(false)
})
.catch((err) => {
console.log(err)
setLoading(false)
})
}
useEffect(() => {
getCategories()
}, [success])
useEffect(() => {
const loadData = () => {
const indexOfLastPost = currentPage * itemPerPage
const indexOfFirstPost = indexOfLastPost - itemPerPage
setShowData(TemplesData.slice(indexOfFirstPost, indexOfLastPost))
}
loadData()
}, [currentPage, itemPerPage, TemplesData])
const handleDelete = (id) => {
swal({
title: 'Are you sure?',
icon: 'error',
buttons: { Yes: { text: 'Yes', value: true }, Cancel: { text: 'Cancel', value: 'cancel' } },
}).then((value) => {
if (value === true) {
axios
.delete(`/api/temple/${id}`, {
headers: {
'Access-Control-Allow-Origin': '*',
Authorization: `Bearer ${token}`,
},
})
.then((res) => {
setSuccess((prev) => !prev)
})
.catch((err) => {
swal({
title: 'Warning',
text: 'Something went wrong!',
icon: 'error',
button: 'Retry',
dangerMode: true,
})
})
}
})
}
return (
<div className="main-content">
<div className="page-content">
<div className="container-fluid">
<div className="row">
<div className="col-12">
<div
className="
page-title-box
d-flex
align-items-center
justify-content-between
"
>
<div style={{ fontSize: '22px' }} className="fw-bold">
Temples
</div>
<div className="page-title-right">
<Link to="/temple/add">
<Button
variant="contained"
color="primary"
style={{
fontWeight: 'bold',
marginBottom: '1rem',
textTransform: 'capitalize',
}}
>
Add Temple
</Button>
</Link>
</div>
</div>
</div>
</div>
<div className="row">
<div className="col-lg-12">
<div className="card">
<div className="card-body">
<div className="row ml-0 mr-0 mb-10">
<div className="col-sm-12 col-md-12">
<div className="dataTables_length">
<label className="w-100">
Show
<select
style={{ width: '10%' }}
name=""
onChange={(e) => handleShowEntries(e)}
className="
select-w
custom-select custom-select-sm
form-control form-control-sm
"
>
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
entries
</label>
</div>
</div>
</div>
<div className="table-responsive table-shoot mt-3">
<table
className="table table-centered table-nowrap"
style={{ border: '1px solid' }}
>
<thead className="thead-info" style={{ background: 'rgb(140, 213, 213)' }}>
<tr>
<th className="text-start">Temple Name</th>
<th className="text-start">Logo</th>
<th className="text-start">City </th>
<th className="text-start">Created On</th>
<th className="text-center">Actions</th>
</tr>
</thead>
<tbody>
{!loading && showData.length === 0 && (
<tr className="text-center">
<td colSpan="6">
<h5>No Data Available</h5>
</td>
</tr>
)}
{loading ? (
<tr>
<td className="text-center" colSpan="6">
Loading...
</td>
</tr>
) : (
showData.map((temple, i) => {
return (
<tr key={i}>
<td className="text-start">{temple.name}</td>
<td className="text-start">
<img src={temple.banner.url} alt="Test Image" height="50" />
</td>
<td className="text-start">{temple?.city?.city_name}</td>
<td className="text-start">
{new Date(temple.createdAt).toLocaleString('en-IN', {
month: '2-digit',
day: 'numeric',
year: 'numeric',
// hour: 'numeric',
// minute: 'numeric',
// hour12: true,
})}
</td>
<td className=" text-center">
<OverLayButton data={{ url: temple?.url }} />
<Link to={`/temple/products/${temple._id}`}>
<button
style={{ color: 'white' }}
type="button"
className="
btn btn-primary btn-sm
waves-effect waves-light
ms-2
"
>
Products
</button>
</Link>
<Link to={`/temple/edit/${temple._id}`}>
<button
style={{ color: 'white' }}
type="button"
className="
btn btn-success btn-sm
waves-effect waves-light
ms-2
"
>
Edit
</button>
</Link>
<button
style={{ color: 'white' }}
type="button"
className="
btn btn-danger btn-sm
waves-effect waves-light
ms-2
"
onClick={() => {
handleDelete(temple._id)
}}
>
Delete
</button>
</td>
</tr>
)
})
)}
</tbody>
</table>
</div>
<div className="row mt-20">
<div className="col-sm-12 col-md-6 mb-20">
<div
className="dataTables_info"
id="datatable_info"
role="status"
aria-live="polite"
>
Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '}
{Math.min(currentPage * itemPerPage, TemplesData.length)} of{' '}
{TemplesData.length} entries
</div>
</div>
<div className="col-sm-12 col-md-6">
<div className="d-flex">
<ul className="pagination ms-auto">
<li
className={
currentPage === 1
? 'paginate_button page-item previous disabled'
: 'paginate_button page-item previous'
}
>
<span
className="page-link"
style={{ cursor: 'pointer' }}
onClick={() => setCurrentPage((prev) => prev - 1)}
>
Previous
</span>
</li>
{!(currentPage - 1 < 1) && (
<li className="paginate_button page-item">
<span
className="page-link"
style={{ cursor: 'pointer' }}
onClick={(e) => setCurrentPage((prev) => prev - 1)}
>
{currentPage - 1}
</span>
</li>
)}
<li className="paginate_button page-item active">
<span className="page-link" style={{ cursor: 'pointer' }}>
{currentPage}
</span>
</li>
{!(
(currentPage + 1) * itemPerPage - itemPerPage >
TemplesData.length - 1
) && (
<li className="paginate_button page-item ">
<span
className="page-link"
style={{ cursor: 'pointer' }}
onClick={() => {
setCurrentPage((prev) => prev + 1)
}}
>
{currentPage + 1}
</span>
</li>
)}
<li
className={
!(
(currentPage + 1) * itemPerPage - itemPerPage >
TemplesData.length - 1
)
? 'paginate_button page-item next'
: 'paginate_button page-item next disabled'
}
>
<span
className="page-link"
style={{ cursor: 'pointer' }}
onClick={() => setCurrentPage((prev) => prev + 1)}
>
Next
</span>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
export default Temples

View File

@ -6,6 +6,7 @@ import { Link } from 'react-router-dom'
import swal from 'sweetalert' import swal from 'sweetalert'
import { isAutheticated } from 'src/auth' import { isAutheticated } from 'src/auth'
function Address() { function Address() {
const token = isAutheticated() const token = isAutheticated()
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)

View File

@ -31,7 +31,7 @@ function Logo() {
configDetails.data.result.map((item) => { configDetails.data.result.map((item) => {
setHeaderlogo(item?.logo[0]?.Headerlogo) setHeaderlogo(item?.logo[0]?.Headerlogo)
setFooterlogo(item?.logo[0]?.Footerlogo) setFooterlogo(item?.logo[0]?.Footerlogo)
setAdminlogo(item?.logo[0].Adminlogo) setAdminlogo(item?.logo[0]?.Adminlogo)
}) })
} }
getConfiguration() getConfiguration()
@ -58,17 +58,19 @@ function Logo() {
formdata.append('Footerlogo', Footerlogo) formdata.append('Footerlogo', Footerlogo)
formdata.append('Adminlogo', Adminlogo) formdata.append('Adminlogo', Adminlogo)
let res = await axios.post(`/api/config/logo`, formdata, { await axios.post(`/api/config/logo`, formdata, {
headers: { headers: {
Authorization: `Bearer ${token}`, Authorization: `Bearer ${token}`,
'Content-Type': 'multipart/formdata', 'Content-Type': 'multipart/formdata',
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
}, },
}) }).then((res) => {
if (res) {
setLoading(false) setLoading(false)
swal('Success!', res.data.message, res.data.status) swal('Success!', res.data.message, res.data.status)
} }
).catch(error => {
console.log(error)
})
} }
return ( return (
@ -93,25 +95,26 @@ function Logo() {
htmlFor="basicpill-phoneno-input" htmlFor="basicpill-phoneno-input"
className="label-100 mt-3" className="label-100 mt-3"
> >
Logo htmlFor Website Header(148 x 48 px) {/* Logo htmlFor Website Header(148 x 48 px) */}
</label> </label>
<div> <div>
<input <input
type="file" type="file"
name="Logo htmlFor Website Header(148 x 48 px)" name="Logo htmlFor Website Header(148 x 48 px)"
onChange={(e) => { onChange={(e) => {
setHeaderlogo(e.target.files[0]) setHeaderlogo(e.target.files[0])
if (e.target.files && e.target.files[0]) { if (e.target.files && e.target.files[0]) {
setHeaderlogoUrl({ setHeaderlogoUrl({
image: URL.createObjectURL(e.target.files[0]), image: URL.createObjectURL(e.target.files[0]),
}) })
console.log(setHeaderlogoUrl)
} }
}} }}
className="form-control input-field col-md-6 d-inline-block" className="form-control input-field mb-3 col-md-6 d-inline-block"
id="basicpill-phoneno-input" id="basicpill-phoneno-input"
/> />
{display ? ( {display ? (
<img <img className='ms-1'
style={{ width: '100px' }} style={{ width: '100px' }}
src={HeaderlogoUrl.image ? HeaderlogoUrl.image : Headerlogo} src={HeaderlogoUrl.image ? HeaderlogoUrl.image : Headerlogo}
alt="header logo" alt="header logo"
@ -124,7 +127,7 @@ function Logo() {
htmlFor="basicpill-phoneno-input" htmlFor="basicpill-phoneno-input"
className="label-100 mt-3" className="label-100 mt-3"
> >
Logo htmlFor Website Footer(148 x 48 px) {/* Logo htmlFor Website Footer(148 x 48 px) */}
</label> </label>
<input <input
type="file" type="file"
@ -138,7 +141,7 @@ function Logo() {
}) })
} }
}} }}
className="form-control input-field col-md-6 d-inline-block" className="form-control input-field mt-1 col-md-6 d-inline-block"
id="basicpill-phoneno-input" id="basicpill-phoneno-input"
/>{' '} />{' '}
{display ? ( {display ? (
@ -154,7 +157,7 @@ function Logo() {
htmlFor="basicpill-phoneno-input" htmlFor="basicpill-phoneno-input"
className="label-100 mt-2 row ms-1" className="label-100 mt-2 row ms-1"
> >
Logo htmlFor Admin Header(148 x 48 px) {/* Logo htmlFor Admin Header(148 x 48 px) */}
</label> </label>
<input <input
type="file" type="file"

View File

@ -14,8 +14,7 @@ const AddCity = () => {
const [data, setData] = useState({ const [data, setData] = useState({
city_name: '', city_name: '',
state: '', state: '',
_id: 'Loading',
createdAt: new Date(),
}) })
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [limiter, setLimiter] = useState({ const [limiter, setLimiter] = useState({
@ -89,10 +88,11 @@ const AddCity = () => {
button: 'Return', button: 'Return',
}) })
setLoading(false) setLoading(false)
navigate.push('/cities', { replace: true }) navigate('/cities', { replace: true })
}) })
.catch((err) => { .catch((err) => {
setLoading(false) setLoading(false)
swal({ swal({
title: 'Warning', title: 'Warning',
text: 'Something went wrong!', text: 'Something went wrong!',
@ -198,14 +198,8 @@ const AddCity = () => {
)} )}
</select> </select>
</div> </div>
<div className="mb-3">
<label>Unique ID</label>
<input type="text" value={data._id} className="form-control" disabled />
</div>
<div className="mb-3">
<label>TimeStamp</label>
<input type="text" value={data.createdAt} className="form-control" disabled />
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -152,7 +152,7 @@ const Cities = () => {
className="table table-centered table-nowrap" className="table table-centered table-nowrap"
style={{ border: '1px solid' }} style={{ border: '1px solid' }}
> >
<thead className="thead-light" style={{ background: '#ecdddd' }}> <thead className="thead" style={{ background: 'rgb(140, 213, 213)' }}>
<tr> <tr>
<th className="text-start">City Name</th> <th className="text-start">City Name</th>
<th className="text-start">State Name</th> <th className="text-start">State Name</th>

View File

@ -15,8 +15,7 @@ const EditCity = () => {
const [data, setData] = useState({ const [data, setData] = useState({
city_name: '', city_name: '',
state: '', state: '',
_id: 'Loading',
createdAt: new Date(),
}) })
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [limiter, setLimiter] = useState({ const [limiter, setLimiter] = useState({
@ -206,7 +205,7 @@ const EditCity = () => {
)} )}
</select> </select>
</div> </div>
<div className="mb-3"> {/* <div className="mb-3">
<label>Unique ID</label> <label>Unique ID</label>
<input type="text" value={data._id} className="form-control" disabled /> <input type="text" value={data._id} className="form-control" disabled />
</div> </div>
@ -218,7 +217,7 @@ const EditCity = () => {
className="form-control" className="form-control"
disabled disabled
/> />
</div> </div> */}
</div> </div>
</div> </div>
</div> </div>

View File

@ -34,7 +34,7 @@ const AddState = () => {
} }
const handleSubmit = () => { const handleSubmit = () => {
if (data.state_code.trim() === '' || data.state_name.trim() === '') { if (data.state_name.trim() === '') {
swal({ swal({
title: 'Warning', title: 'Warning',
text: 'Fill all mandatory fields', text: 'Fill all mandatory fields',
@ -145,7 +145,7 @@ const AddState = () => {
Remaining characters : {limiter.state_nameHas} Remaining characters : {limiter.state_nameHas}
</p> </p>
</div> </div>
<div className="mb-3"> {/* <div className="mb-3">
<label htmlFor="city_name" className="form-label"> <label htmlFor="city_name" className="form-label">
State Code (GST)* State Code (GST)*
</label> </label>
@ -160,7 +160,7 @@ const AddState = () => {
<p className="pt-1 pl-2 text-secondary"> <p className="pt-1 pl-2 text-secondary">
Remaining characters : {limiter.state_codeHas} Remaining characters : {limiter.state_codeHas}
</p> </p>
</div> </div> */}
</div> </div>
</div> </div>
</div> </div>

View File

@ -61,7 +61,7 @@ const EditState = () => {
} }
const handleSubmit = () => { const handleSubmit = () => {
if (data.state_code.trim() === '' || data.state_name.trim() === '') { if (data.state_name.trim() === '') {
swal({ swal({
title: 'Warning', title: 'Warning',
text: 'Fill all mandatory fields', text: 'Fill all mandatory fields',
@ -172,7 +172,7 @@ const EditState = () => {
Remaining characters : {limiter.state_nameHas} Remaining characters : {limiter.state_nameHas}
</p> </p>
</div> </div>
<div className="mb-3"> {/* <div className="mb-3">
<label htmlFor="city_name" className="form-label"> <label htmlFor="city_name" className="form-label">
State Code (GST)* State Code (GST)*
</label> </label>
@ -187,7 +187,7 @@ const EditState = () => {
<p className="pt-1 pl-2 text-secondary"> <p className="pt-1 pl-2 text-secondary">
Remaining characters : {limiter.state_codeHas} Remaining characters : {limiter.state_codeHas}
</p> </p>
</div> </div> */}
</div> </div>
</div> </div>
</div> </div>

View File

@ -152,10 +152,10 @@ const States = () => {
className="table table-centered table-nowrap" className="table table-centered table-nowrap"
style={{ border: '1px solid' }} style={{ border: '1px solid' }}
> >
<thead className="thead-info" style={{ background: '#ecdddd' }}> <thead className="thead-info" style={{ background: 'rgb(140, 213, 213)' }}>
<tr> <tr>
<th className="text-start">State Name</th> <th className="text-start">State Name</th>
<th className="text-start">State Code (GST)</th> {/* <th className="text-start">State Code (GST)</th> */}
<th className="text-start">Created On</th> <th className="text-start">Created On</th>
<th className="text-start">Actions</th> <th className="text-start">Actions</th>
</tr> </tr>
@ -179,7 +179,7 @@ const States = () => {
return ( return (
<tr key={i}> <tr key={i}>
<td className="text-start">{city.state_name}</td> <td className="text-start">{city.state_name}</td>
<td className="text-start">{city.state_code}</td> {/* <td className="text-start">{city.state_code}</td> */}
<td className="text-start"> <td className="text-start">
{new Date(city.createdAt).toLocaleString('en-IN', { {new Date(city.createdAt).toLocaleString('en-IN', {
weekday: 'short', weekday: 'short',