From f955244760740afb0c1743f58142b8f98ec56b97 Mon Sep 17 00:00:00 2001 From: Jay Date: Wed, 21 Aug 2024 13:46:48 +0530 Subject: [PATCH] React-placeholder --- package-lock.json | 11 + package.json | 5 +- public/favicon.ico | Bin 3870 -> 0 bytes public/index.html | 29 +- public/logo192.png | Bin 5347 -> 0 bytes public/logo512.png | Bin 9664 -> 0 bytes src/App.css | 38 -- src/App.js | 23 +- src/App.test.js | 8 - src/api-manager/.gitignore | 23 - src/api-manager/APIManager.js | 416 ------------------ src/api-manager/AutoCompleteField.js | 109 ----- src/api-manager/CrudManager.js | 416 ------------------ src/api-manager/DynamicForm/Autocomplete.js | 87 ---- .../DynamicForm/DynamicAutocomplete.js | 112 ----- src/api-manager/DynamicForm/_Autocomplete.js | 109 ----- src/api-manager/EditRow.js | 84 ---- src/api-manager/Example.js | 17 - src/api-manager/Form.js | 148 ------- src/api-manager/FormField.js | 314 ------------- src/api-manager/FormWithDrawer.js | 77 ---- src/api-manager/MultiSelect.js | 57 --- src/api-manager/Pagination.js | 98 ----- src/api-manager/Radiobutton.js | 33 -- src/api-manager/TableRow.js | 52 --- src/api-manager/example.json | 105 ----- src/api-manager/helper.js | 16 - src/api-manager/style.css | 46 -- src/api-manager/useAPIManager.js | 77 ---- src/api-manager/useApi.js | 89 ---- src/assets/bg.png | Bin 190891 -> 0 bytes src/{ => assets/img}/logo.png | Bin .../{footer.js => common/Footer.js} | 2 +- .../{header.js => common/Header.js} | 31 +- src/components/header copy.js | 216 --------- src/components/pages/APIManagerStarter.js | 21 + .../home/home.js => components/pages/Home.js} | 0 .../login.js => components/pages/Login.js} | 5 +- .../pages/Schema/APIManagerStarter.json | 79 ++++ src/{global => config}/Global.js | 2 +- .../GlobalJSON.json => config/Global.json} | 5 +- src/index.css | 13 - src/index.js | 10 +- src/logo.svg | 1 - src/reportWebVitals.js | 13 - src/setupTests.js | 5 - src/{ => utils}/auth/AuthContext.js | 9 +- src/{ => utils}/auth/auth.js | 6 +- 48 files changed, 167 insertions(+), 2850 deletions(-) delete mode 100644 public/favicon.ico delete mode 100644 public/logo192.png delete mode 100644 public/logo512.png delete mode 100644 src/App.test.js delete mode 100644 src/api-manager/.gitignore delete mode 100644 src/api-manager/APIManager.js delete mode 100644 src/api-manager/AutoCompleteField.js delete mode 100644 src/api-manager/CrudManager.js delete mode 100644 src/api-manager/DynamicForm/Autocomplete.js delete mode 100644 src/api-manager/DynamicForm/DynamicAutocomplete.js delete mode 100644 src/api-manager/DynamicForm/_Autocomplete.js delete mode 100644 src/api-manager/EditRow.js delete mode 100644 src/api-manager/Example.js delete mode 100644 src/api-manager/Form.js delete mode 100644 src/api-manager/FormField.js delete mode 100644 src/api-manager/FormWithDrawer.js delete mode 100644 src/api-manager/MultiSelect.js delete mode 100644 src/api-manager/Pagination.js delete mode 100644 src/api-manager/Radiobutton.js delete mode 100644 src/api-manager/TableRow.js delete mode 100644 src/api-manager/example.json delete mode 100644 src/api-manager/helper.js delete mode 100644 src/api-manager/style.css delete mode 100644 src/api-manager/useAPIManager.js delete mode 100644 src/api-manager/useApi.js delete mode 100644 src/assets/bg.png rename src/{ => assets/img}/logo.png (100%) rename src/components/{footer.js => common/Footer.js} (95%) rename src/components/{header.js => common/Header.js} (93%) delete mode 100644 src/components/header copy.js create mode 100644 src/components/pages/APIManagerStarter.js rename src/{pages/UI/home/home.js => components/pages/Home.js} (100%) rename src/{pages/UI/login/login.js => components/pages/Login.js} (96%) create mode 100644 src/components/pages/Schema/APIManagerStarter.json rename src/{global => config}/Global.js (75%) rename src/{global/GlobalJSON.json => config/Global.json} (71%) delete mode 100644 src/index.css delete mode 100644 src/logo.svg delete mode 100644 src/reportWebVitals.js delete mode 100644 src/setupTests.js rename src/{ => utils}/auth/AuthContext.js (97%) rename src/{ => utils}/auth/auth.js (62%) diff --git a/package-lock.json b/package-lock.json index 4d05ac0..ffac950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "react-router-dom": "^6.26.1", "react-scripts": "5.0.1", "react-toastify": "^10.0.5", + "sweetalert2": "^11.12.4", "web-vitals": "^2.1.4" } }, @@ -18652,6 +18653,16 @@ "boolbase": "~1.0.0" } }, + "node_modules/sweetalert2": { + "version": "11.12.4", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.12.4.tgz", + "integrity": "sha512-ZSpyaLbAmn4b7xjnV9x9BFD1UOrCAhIzm1D8dZ443kGxtVKqbTIA5SgXs4xeEtmFfEXUyC3RBgpSlu1AXmCiHA==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", diff --git a/package.json b/package.json index 2f32aa4..d97f494 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "hbaseapp", - "version": "0.1.0", + "name": "react-placeholder", + "version": "1.0.0", "private": true, "dependencies": { "@emotion/react": "^11.13.0", @@ -20,6 +20,7 @@ "react-router-dom": "^6.26.1", "react-scripts": "5.0.1", "react-toastify": "^10.0.5", + "sweetalert2": "^11.12.4", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html index aa069f2..ec0b93c 100644 --- a/public/index.html +++ b/public/index.html @@ -7,37 +7,16 @@ - - - React App + + Humbingo React Placeholder
- + diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/src/App.css b/src/App.css index 74b5e05..e69de29 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.js b/src/App.js index f93faa9..dfa9c29 100644 --- a/src/App.js +++ b/src/App.js @@ -1,25 +1,28 @@ import React from 'react'; -import LoginPage from './pages/UI/login/login'; import { BrowserRouter, Route, Routes } from 'react-router-dom'; -import { AuthProvider } from './auth/AuthContext'; -import { Auth } from './auth/auth'; -import Footer from './components/footer'; // Import the Footer component -import Home from './pages/UI/home/home'; + +import { AuthProvider } from './utils/auth/AuthContext'; +import { Auth } from './utils/auth/auth'; +import LoginPage from './components/pages/Login'; +import Home from './components/pages/Home'; +import APIManagerStarter from './components/pages/APIManagerStarter'; +import Footer from './components/common/Footer'; + + const App = () => { return ( -
} />} exact /> - - } />} exact /> + } />} exact /> + } />} exact /> -
+
-
+ ); }; diff --git a/src/App.test.js b/src/App.test.js deleted file mode 100644 index 1f03afe..0000000 --- a/src/App.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/src/api-manager/.gitignore b/src/api-manager/.gitignore deleted file mode 100644 index 4d29575..0000000 --- a/src/api-manager/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/src/api-manager/APIManager.js b/src/api-manager/APIManager.js deleted file mode 100644 index 789e6d5..0000000 --- a/src/api-manager/APIManager.js +++ /dev/null @@ -1,416 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { useNavigate } from "react-router-dom"; -import { toast } from "react-toastify"; -import "react-toastify/dist/ReactToastify.css"; -import Swal from "sweetalert2"; -import "./style.css"; -import useAPIManager from "./useAPIManager"; -import { - Button, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Paper, - Menu, - MenuItem, - Fade, - Card, - CardContent, -} from "@mui/material"; -import FormWithDrawer from "./FormWithDrawer"; -import MoreVertIcon from "@mui/icons-material/MoreVert"; -import Pagination from "./Pagination"; - -function APIManager(props) { - const dataSchema = props.data; - const { Get, Delete, Patch, getAPI, getHost } = useAPIManager( - props.globalConfig, - props.token - ); - const dataApi = getAPI(props.data.api); - const [apiData, setApiData] = useState([]); - const [searchQuery, setSearchQuery] = useState(""); - const [orderBy, setOrderBy] = useState(""); // Column to sort - const [order, setOrder] = useState("asc"); - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(50); - const [sortedColumn, setSortedColumn] = useState(null); - const [filteredData, setFilteredData] = useState([]); - const [anchorEls, setAnchorEls] = useState({}); // Updated state for menu anchors - const [mounted, setMounted] = useState(false); - const [nextPage, setNextPage] = useState(null); - const [previousPage, setPreviousPage] = useState(null); - const [totalCount, setTotalCount] = useState(0); - const [currentPage, setCurrentPage] = useState(1); - const [loading, setLoading] = useState(true); - - const updateFormTitle = props.updateFormTitle ? props.updateFormTitle : ""; - const createFormTitle = props.createFormTitle ? props.createFormTitle : ""; - const actionBtnName = props.actionBtnName - ? props.actionBtnName - : "Create New Data"; - const createRequired = props.createRequired === false ? false : true; - const editRequired = props.editRequired === false ? false : true; - const searchRequired = props.searchRequired === false ? false : true; - - const createField = dataSchema.createField; - const editField = dataSchema.editField; - const showField = dataSchema.showField; - const manageRecord = true; - - let navigate = useNavigate(); - const getData = async () => { - makeApiRequest(dataApi); - }; - - const makeApiRequest = async (api) => { - try { - setSearchQuery(""); - const result = await Get(api ? api : dataApi); - setNextPage(result.next); - setPreviousPage(result.previous); - setTotalCount(result.count); - setApiData(result.results); - setFilteredData(result.results); - } catch (err) { - if (err.code == "ERR_BAD_REQUEST") { - toast.error("Unauthorised access to page, Contact admin for access."); - navigate("/"); - } else { - toast.error(err.message); - } - } finally { - setLoading(false); - } - }; - - const pageChangeRequest = (url) => { - if (getPageUrl(url) != null) { - makeApiRequest(getHost() + getPageUrl(url)); - } - }; - - async function softDelete(data) { - try { - await Patch(dataApi, data["id"], { is_deleted: true }) - .then(() => { - toast.success("Record updated successfully!"); - getData(); - }) - .catch((err) => { - getData(); - toast.error(err || "Error"); - }); - } catch { - getData(); - toast.error("Something Went wrong contact Humbingo"); - } - } - - async function restore(data) { - try { - await Patch(dataApi, data["id"], { is_deleted: false }) - .then(() => { - toast.success("Record updated successfully!"); - getData(); - }) - .catch((err) => { - getData(); - toast.error(err || "Error"); - }); - } catch { - getData(); - toast.error("Something Went wrong contact Humbingo"); - } - } - - async function forceDelete(data) { - await Swal.fire({ - title: "Data will be removed permanently! Are you sure?", - icon: "warning", - showCancelButton: true, - confirmButtonColor: "#3085d6", - cancelButtonColor: "#d33", - confirmButtonText: "Yes, delete it!", - }).then(async (result) => { - if (result.isConfirmed) { - try { - await Delete(dataApi, data["id"]) - .then(() => { - toast.success("Record updated successfully!"); - getData(); - }) - .catch((err) => { - getData(); - toast.error(err || "Error"); - }); - } catch { - getData(); - toast.error("Something Went wrong contact Humbingo"); - } - } - }); - } - - const getValueFromUrl = (url, parameterName) => { - try { - const regex = new RegExp(`${parameterName}=([^&]+)`); - const match = url.match(regex); - return match ? match[1] : null; - } catch { - return null; - } - }; - - function getPageUrl(url) { - let urls = ""; - try { - const urlObject = new URL(url); - urls = urlObject.pathname + urlObject.search; - } catch { - return null; - } - return urls; - } - - useEffect(() => { - setMounted(true); - return () => { - setMounted(false); - }; - }, []); - - useEffect(() => { - if (loading && mounted) { - getData(); - } - }, [loading, mounted]); - - const handleSearchInputChange = (event) => { - const query = event.target.value; - makeApiRequest(dataApi + "?search=" + query); - setSearchQuery(query); - }; - - const handleSort = (columnKey) => { - const isAsc = orderBy === columnKey && order === "asc"; - setOrderBy(columnKey); - setOrder(isAsc ? "desc" : "asc"); - setSortedColumn(columnKey); - }; - - const sortedData = stableSort(filteredData, getComparator(order, orderBy)); - const visibleRows = sortedData.slice( - page * rowsPerPage, - page * rowsPerPage + rowsPerPage - ); - - function stableSort(array, comparator) { - const stabilizedThis = array.map((el, index) => [el, index]); - stabilizedThis.sort((a, b) => { - const order = comparator(a[0], b[0]); - if (order !== 0) return order; - return a[1] - b[1]; - }); - return stabilizedThis.map((el) => el[0]); - } - - function getComparator(order, orderBy) { - return order === "desc" - ? (a, b) => descendingComparator(a, b, orderBy) - : (a, b) => -descendingComparator(a, b, orderBy); - } - - function descendingComparator(a, b, orderBy) { - if (b[orderBy] < a[orderBy]) { - return -1; - } - if (b[orderBy] > a[orderBy]) { - return 1; - } - return 0; - } - - const handleMenuClick = (event, rowIndex) => { - setAnchorEls((prev) => ({ - ...prev, - [rowIndex]: event.currentTarget, - })); - }; - - const handleMenuClose = (rowIndex) => { - setAnchorEls((prev) => ({ - ...prev, - [rowIndex]: null, - })); - }; - - return ( - <> - {loading ? ( -
- Loading -
- ) : ( -
- - - {createRequired && ( - getData()} - buttonStyle={{ margin: "10px", backgroundColor: "#17202A" }} - /> - )} - {searchRequired && ( -
- -
- )} -
-
- - - - - {showField.map((th, index) => { - const isSorted = orderBy === th.key; - const isAsc = orderBy === th.key && order === "asc"; - return ( - handleSort(th.key)} - > - {th.label} {isSorted && (isAsc ? "▲" : "▼")} - - ); - })} - {manageRecord && ( - - Action - - )} - - - - {visibleRows.map((data, rowIndex) => ( - - {showField.map((field, i) => ( - {data[field.key]} - ))} - {manageRecord && ( - - {editRequired && ( - handleMenuClose(rowIndex)} - refreshData={() => getData()} - buttonStyle={{ fontSize: "12px", padding: "5px" }} - buttonVarient="outlined" - updateFormTitle={updateFormTitle} - submitBtnTitle="Update Data" - /> - )} - - - handleMenuClose(rowIndex)} - TransitionComponent={Fade} - > - {data.is_deleted ? ( - restore(data)}> - Show Record - - ) : ( - softDelete(data)}> - Hide Record - - )} - forceDelete(data)}> - Remove Record - - - - )} - - ))} - -
- -
-
- )} - - ); -} - -export default APIManager; diff --git a/src/api-manager/AutoCompleteField.js b/src/api-manager/AutoCompleteField.js deleted file mode 100644 index 26fe564..0000000 --- a/src/api-manager/AutoCompleteField.js +++ /dev/null @@ -1,109 +0,0 @@ -import React, { useEffect, useState } from "react"; -import TextField from "@mui/material/TextField"; -import Autocomplete from "@mui/material/Autocomplete"; -import useApi from "../useApi"; -import { toast } from "react-toastify"; - -const AutoCompleteField = (props) => { - const [api, setApi] = useState(props.api); - const searchOptionHook = props.searchOptionHook; - const fieldLabel = props.label; - const fieldName = props.name; - const optionKey = props.optionKey ? props.optionKey : "id"; - const [searchData, setSearchData] = useState([]); - const [storageData, setStorageData] = useState( - JSON.parse(localStorage.getItem("dynamicField")) - ); - const [value, setValue] = useState(""); - const { Get } = useApi(); - const [tempValue, setTempValue] = useState( - storageData - ? storageData[storageData.findIndex((item) => item.name === fieldName)] - : "" - ); - - let newApi = async () => { - let tempApi = api; - if (props.hook != undefined) { - tempApi = `${tempApi}${ - storageData[storageData.findIndex((item) => item.name === props.hook)] - .key - }/`; - } - return tempApi; - }; - - let getdata = async () => { - try{ - const tempApi = await newApi(); - let response = await Get(tempApi); - let _searchData = []; - await response.data.map((data) => { - _searchData.push({ - label: data[searchOptionHook], - key: data[optionKey], - }); - }); - setSearchData(_searchData); - }catch{ - toast.error("Something went wrong contact humbingo.") - } - // await axios - // .get(tempApi) - // .then(async (response) => { - // let _searchData = []; - // await response.data.map((data) => { - // _searchData.push({ - // label: data[searchOptionHook], - // key: data[optionKey], - // }); - // }); - - // setSearchData(_searchData); - // }) - // .catch((error) => { - // console.error(error); - // }); - }; - useEffect(() => { - getdata(); - }, []); - - let getDataFromJson = (e) => { - const acccess = e.target.value; - let respData = searchData.find((f) => f.label === acccess); - - respData ? setValue(respData.key) : console.log("this is undefined"); - if (props.onBlur != undefined) { - if (respData != undefined) { - props.onBlur(respData); - } - } - }; - - return searchData.length > 0 ? ( - <> -
-
- getDataFromJson(e)} - value={tempValue} - renderInput={(params) => ( - - )} - /> - {/* onSelect={(e) => getDataFromJson(e)} */} -
-
- - - ) : ( - "" - ); -}; - -export default AutoCompleteField; diff --git a/src/api-manager/CrudManager.js b/src/api-manager/CrudManager.js deleted file mode 100644 index 1cb342b..0000000 --- a/src/api-manager/CrudManager.js +++ /dev/null @@ -1,416 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { useNavigate } from "react-router-dom"; -import { toast } from "react-toastify"; -import "react-toastify/dist/ReactToastify.css"; -import Swal from "sweetalert2"; -import "./style.css"; -import useAPIManager from "./useAPIManager"; -import { - Button, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Paper, - Menu, - MenuItem, - Fade, - Card, - CardContent, -} from "@mui/material"; -import FormWithDrawer from "./FormWithDrawer"; -import MoreVertIcon from "@mui/icons-material/MoreVert"; -import Pagination from "./Pagination"; - -function CrudManager(props) { - const dataSchema = props.data; - const { Get, Delete, Patch, getAPI, getHost } = useAPIManager( - props.globalConfig, - props.token - ); - const dataApi = getAPI(props.data.api); - const [apiData, setApiData] = useState([]); - const [searchQuery, setSearchQuery] = useState(""); - const [orderBy, setOrderBy] = useState(""); // Column to sort - const [order, setOrder] = useState("asc"); - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(50); - const [sortedColumn, setSortedColumn] = useState(null); - const [filteredData, setFilteredData] = useState([]); - const [anchorEls, setAnchorEls] = useState({}); // Updated state for menu anchors - const [mounted, setMounted] = useState(false); - const [nextPage, setNextPage] = useState(null); - const [previousPage, setPreviousPage] = useState(null); - const [totalCount, setTotalCount] = useState(0); - const [currentPage, setCurrentPage] = useState(1); - const [loading, setLoading] = useState(true); - - const updateFormTitle = props.updateFormTitle ? props.updateFormTitle : ""; - const createFormTitle = props.createFormTitle ? props.createFormTitle : ""; - const actionBtnName = props.actionBtnName - ? props.actionBtnName - : "Create New Data"; - const createRequired = props.createRequired === false ? false : true; - const editRequired = props.editRequired === false ? false : true; - const searchRequired = props.searchRequired === false ? false : true; - - const createField = dataSchema.createField; - const editField = dataSchema.editField; - const showField = dataSchema.showField; - const manageRecord = true; - - let navigate = useNavigate(); - const getData = async () => { - makeApiRequest(dataApi); - }; - - const makeApiRequest = async (api) => { - try { - setSearchQuery(""); - const result = await Get(api ? api : dataApi); - setNextPage(result.next); - setPreviousPage(result.previous); - setTotalCount(result.count); - setApiData(result.results); - setFilteredData(result.results); - } catch (err) { - if (err.code == "ERR_BAD_REQUEST") { - toast.error("Unauthorised access to page, Contact admin for access."); - navigate("/"); - } else { - toast.error(err.message); - } - } finally { - setLoading(false); - } - }; - - const pageChangeRequest = (url) => { - if (getPageUrl(url) != null) { - makeApiRequest(getHost() + getPageUrl(url)); - } - }; - - async function softDelete(data) { - try { - await Patch(dataApi, data["id"], { is_deleted: true }) - .then(() => { - toast.success("Record updated successfully!"); - getData(); - }) - .catch((err) => { - getData(); - toast.error(err || "Error"); - }); - } catch { - getData(); - toast.error("Something Went wrong contact Humbingo"); - } - } - - async function restore(data) { - try { - await Patch(dataApi, data["id"], { is_deleted: false }) - .then(() => { - toast.success("Record updated successfully!"); - getData(); - }) - .catch((err) => { - getData(); - toast.error(err || "Error"); - }); - } catch { - getData(); - toast.error("Something Went wrong contact Humbingo"); - } - } - - async function forceDelete(data) { - await Swal.fire({ - title: "Data will be removed permanently! Are you sure?", - icon: "warning", - showCancelButton: true, - confirmButtonColor: "#3085d6", - cancelButtonColor: "#d33", - confirmButtonText: "Yes, delete it!", - }).then(async (result) => { - if (result.isConfirmed) { - try { - await Delete(dataApi, data["id"]) - .then(() => { - toast.success("Record updated successfully!"); - getData(); - }) - .catch((err) => { - getData(); - toast.error(err || "Error"); - }); - } catch { - getData(); - toast.error("Something Went wrong contact Humbingo"); - } - } - }); - } - - const getValueFromUrl = (url, parameterName) => { - try { - const regex = new RegExp(`${parameterName}=([^&]+)`); - const match = url.match(regex); - return match ? match[1] : null; - } catch { - return null; - } - }; - - function getPageUrl(url) { - let urls = ""; - try { - const urlObject = new URL(url); - urls = urlObject.pathname + urlObject.search; - } catch { - return null; - } - return urls; - } - - useEffect(() => { - setMounted(true); - return () => { - setMounted(false); - }; - }, []); - - useEffect(() => { - if (loading && mounted) { - getData(); - } - }, [loading, mounted]); - - const handleSearchInputChange = (event) => { - const query = event.target.value; - makeApiRequest(dataApi + "?search=" + query); - setSearchQuery(query); - }; - - const handleSort = (columnKey) => { - const isAsc = orderBy === columnKey && order === "asc"; - setOrderBy(columnKey); - setOrder(isAsc ? "desc" : "asc"); - setSortedColumn(columnKey); - }; - - const sortedData = stableSort(filteredData, getComparator(order, orderBy)); - const visibleRows = sortedData.slice( - page * rowsPerPage, - page * rowsPerPage + rowsPerPage - ); - - function stableSort(array, comparator) { - const stabilizedThis = array.map((el, index) => [el, index]); - stabilizedThis.sort((a, b) => { - const order = comparator(a[0], b[0]); - if (order !== 0) return order; - return a[1] - b[1]; - }); - return stabilizedThis.map((el) => el[0]); - } - - function getComparator(order, orderBy) { - return order === "desc" - ? (a, b) => descendingComparator(a, b, orderBy) - : (a, b) => -descendingComparator(a, b, orderBy); - } - - function descendingComparator(a, b, orderBy) { - if (b[orderBy] < a[orderBy]) { - return -1; - } - if (b[orderBy] > a[orderBy]) { - return 1; - } - return 0; - } - - const handleMenuClick = (event, rowIndex) => { - setAnchorEls((prev) => ({ - ...prev, - [rowIndex]: event.currentTarget, - })); - }; - - const handleMenuClose = (rowIndex) => { - setAnchorEls((prev) => ({ - ...prev, - [rowIndex]: null, - })); - }; - - return ( - <> - {loading ? ( -
- Loading -
- ) : ( -
- - - {createRequired && ( - getData()} - buttonStyle={{ margin: "10px", backgroundColor: "#17202A" }} - /> - )} - {searchRequired && ( -
- -
- )} -
-
- - - - - {showField.map((th, index) => { - const isSorted = orderBy === th.key; - const isAsc = orderBy === th.key && order === "asc"; - return ( - handleSort(th.key)} - > - {th.label} {isSorted && (isAsc ? "▲" : "▼")} - - ); - })} - {manageRecord && ( - - Action - - )} - - - - {visibleRows.map((data, rowIndex) => ( - - {showField.map((field, i) => ( - {data[field.key]} - ))} - {manageRecord && ( - - {editRequired && ( - handleMenuClose(rowIndex)} - refreshData={() => getData()} - buttonStyle={{ fontSize: "12px", padding: "5px" }} - buttonVarient="outlined" - updateFormTitle={updateFormTitle} - submitBtnTitle="Update Data" - /> - )} - - - handleMenuClose(rowIndex)} - TransitionComponent={Fade} - > - {data.is_deleted ? ( - restore(data)}> - Show Record - - ) : ( - softDelete(data)}> - Hide Record - - )} - forceDelete(data)}> - Remove Record - - - - )} - - ))} - -
- -
-
- )} - - ); -} - -export default CrudManager; diff --git a/src/api-manager/DynamicForm/Autocomplete.js b/src/api-manager/DynamicForm/Autocomplete.js deleted file mode 100644 index 314eb0c..0000000 --- a/src/api-manager/DynamicForm/Autocomplete.js +++ /dev/null @@ -1,87 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; - -import TextField from "@mui/material/TextField"; -import Autocomplete from "@mui/material/Autocomplete"; -import CircularProgress from '@mui/material/CircularProgress'; -import axios from 'axios'; - - -const CustomAutocomplete = ({ apiUrl, displayKey, valueKey, onValueChange, inputName, variant , label, sameAsSeen}) => { - - const [options, setOptions] = useState([]); - const [loading, setLoading] = useState(false); - const [inputValue, setInputValue] = useState(''); - const [selectedOption, setSelectedOption] = useState(null); - - useEffect(() => { - setLoading(true); - axios.get(apiUrl) - .then(response => { - setOptions(response.data); - }) - .catch(error => { - console.error('Error fetching data:', error); - }) - .finally(() => { - setLoading(false); - }); - }, [apiUrl]); - - const handleInputChange = (event, newValue) => { - setInputValue(newValue); - }; - - const handleOptionSelect = (event, newValue) => { - // console.log("Selected value:"); - // console.log(newValue); - setSelectedOption(newValue); - setInputValue(newValue ? newValue[displayKey] : ''); - onValueChange(newValue, inputName); // Pass the name attribute value along with the value - }; - - return ( - <> - option ? option[displayKey] : ''} - renderInput={(params) => ( - - {loading ? : null} - {params.InputProps.endAdornment} - - ), - }} - /> - - )} - - /> - - {(sameAsSeen)?:""} - - - ); -}; - -CustomAutocomplete.propTypes = { - apiUrl: PropTypes.string.isRequired, - displayKey: PropTypes.string.isRequired, - valueKey: PropTypes.string.isRequired, - onValueChange: PropTypes.func.isRequired, - inputName: PropTypes.string.isRequired, // Accept inputName prop -}; - -export default CustomAutocomplete; diff --git a/src/api-manager/DynamicForm/DynamicAutocomplete.js b/src/api-manager/DynamicForm/DynamicAutocomplete.js deleted file mode 100644 index f5456c7..0000000 --- a/src/api-manager/DynamicForm/DynamicAutocomplete.js +++ /dev/null @@ -1,112 +0,0 @@ -import React, { useState } from 'react'; -import CustomAutocomplete from './Autocomplete'; -import _Autocomplete from './_Autocomplete'; -const DynamicAutocomplete = (props) => { - // [ - // { - // "apiUrl": 'https://api.udaymotors.in/api/v1/user/', - // "displayKey": 'phone_no', - // "valueKey": 'id', - // "name": "user", - // "label":"User" - // }, - // { - // "apiUrl": 'https://api.udaymotors.in/api/v1/getInvestmentsByUserId/', - // "displayKey": 'investment_id', - // "valueKey": 'id', - // "name": "investment", - // "parent": "user", - // "parent_value_key": "id", - // "label":"Investments" - // }, - // { - // "apiUrl": 'https://api.udaymotors.in/api/v1/transaction/', - // "displayKey": 'description', - // "name": "transaction", - // "valueKey": 'id', - // "parent": "investment", - // "parent_value_key": "user_id", - // "label":"Transactions" - // }, - // ] - const [selectedValues, setSelectedValues] = useState([]); - const [currentFieldIndex, setCurrentFieldIndex] = useState(0); - const [fields, setFields] = useState(props.fields); - - const handleValueChange = (value, name) => { - const updatedValues = [...selectedValues]; - const existingIndex = updatedValues.findIndex(item => item.name === name); - if (existingIndex !== -1) { - updatedValues[existingIndex] = { value, name }; - } else { - updatedValues.push({ value, name }); - } - - setSelectedValues(updatedValues); - - // Update the API URL of the next field - const nextFieldIndex = currentFieldIndex + 1; - if (nextFieldIndex < fields.length) { - const nextField = fields[nextFieldIndex]; - const parentValue = updatedValues.find(item => item.name === nextField.parent)?.value[nextField.parent_value_key]; - if (parentValue) { - const updatedFields = [...fields]; - updatedFields[nextFieldIndex] = { - ...nextField, - apiUrl: `${nextField.apiUrl}${parentValue}/` - }; - setFields(updatedFields); - } - } - - setCurrentFieldIndex(nextFieldIndex); - }; - - const handleParentValueChange = (parentName, parentValue) => { - // Find the index of the parent field - const parentFieldIndex = fields.findIndex(field => field.name === parentName); - - // Reset the selected values and fields configurations for the subsequent fields - setSelectedValues(selectedValues.slice(0, parentFieldIndex + 1)); - setFields(fields.slice(0, parentFieldIndex + 1)); - setCurrentFieldIndex(parentFieldIndex); - }; - - return ( - fields.slice(0, currentFieldIndex + 1).map((field, index) => ( -
- { - (field.advance)? - <_Autocomplete - apiUrl={field.apiUrl} - displayKey={field.displayKey} - valueKey={field.valueKey} - inputName={field.name} - onValueChange={handleValueChange} - onParentValueChange={handleParentValueChange} - variant={field.variant} - label={field.label} - sameAsSeen={field.sameAsSeen} - - defaultObj={(field.defaultObj)?field.defaultObj:""} - /> - - : - } - -
- )) - ); -} - -export default DynamicAutocomplete; diff --git a/src/api-manager/DynamicForm/_Autocomplete.js b/src/api-manager/DynamicForm/_Autocomplete.js deleted file mode 100644 index 1db8203..0000000 --- a/src/api-manager/DynamicForm/_Autocomplete.js +++ /dev/null @@ -1,109 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; - -import TextField from "@mui/material/TextField"; -import Autocomplete from "@mui/material/Autocomplete"; -import CircularProgress from '@mui/material/CircularProgress'; -import useAPIManager from '../useAPIManager'; - - -const _Autocomplete = (props) => { - const { - apiUrl, - displayKey, - valueKey, - onValueChange, - inputName, - variant, - label, - sameAsSeen, - defaultObj, - onBlur, - onFocus, - options: propOptions - } = props; - - - const [options, setOptions] = useState(propOptions || []); - const [loading, setLoading] = useState(false); - const [inputValue, setInputValue] = useState(''); - const [selectedOption, setSelectedOption] = useState(defaultObj); - const {Get, Post} =useAPIManager(props.globalConfig, props.token); - useEffect(() => { - setLoading(true); - getSearchData(apiUrl) - }, [apiUrl]); - - const handleInputChange = (event, newValue) => { - getSearchData(apiUrl+"?search="+newValue) - setInputValue(newValue); - }; - - const getSearchData = async (api) =>{ - await Get(api) - .then(response => { - (response.results)?setOptions(response.results):setOptions(response) - - }) - .catch(error => { - console.error('Error fetching data:', error); - }) - .finally(() => { - setLoading(false); - }); - } - - const handleOptionSelect = (event, newValue) => { - setSelectedOption(newValue); - setInputValue(newValue ? newValue[displayKey] : ''); - onValueChange(newValue, inputName); // Pass the name attribute value along with the value - }; - - return ( - <> - option ? option[displayKey] : ''} - defaultValue= { defaultObj} - renderInput={(params) => ( - - {loading ? : null} - {params.InputProps.endAdornment} - - ), - }} - /> - - )} - - /> - {/* {console.log(selectedOption)} */} - - {(sameAsSeen)?:""} - - - ); -}; - -_Autocomplete.propTypes = { - apiUrl: PropTypes.string.isRequired, - displayKey: PropTypes.string.isRequired, - valueKey: PropTypes.string.isRequired, - onValueChange: PropTypes.func.isRequired, - inputName: PropTypes.string.isRequired, // Accept inputName prop -}; - -export default _Autocomplete; diff --git a/src/api-manager/EditRow.js b/src/api-manager/EditRow.js deleted file mode 100644 index d5d36ee..0000000 --- a/src/api-manager/EditRow.js +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useState } from "react"; -import Drawer from "@mui/material/Drawer"; -import { Button, TextField } from "@mui/material"; -import { firstUpperCase } from "./helper.js"; -function EditRow(props) { - const editBlock = props.editBlock ? props.editBlock : []; - const [state, setState] = React.useState({ - top: false, - left: false, - bottom: false, - right: false, - }); - const toggleDrawer = (anchor, open) => (event) => { - if ( - event.type === "keydown" && - (event.key === "Tab" || event.key === "Shift") - ) { - return; - } - setState({ ...state, [anchor]: open }); - }; - const [formFields, setFormFields] = useState(props.data); - var fields = Object.keys(formFields); - const handleSubmit = (e) => { - e.preventDefault(); - }; - function doChange(fieldName, value) { - setFormFields((prevData) => ({ - ...prevData, - [fieldName]: value, - })); - localStorage.setItem(props.data.id + "_" + fieldName, value); - } - - return ( - <> - {/* {formFields} */} - {["right"].map((anchor) => ( - - - -
-
-

Edit Details

-
- {fields.map((field, index) => { - return ( -
- {!Object.values(editBlock).includes(field) ? ( - <> - {" "} - doChange(field, e.target.value)} - label={firstUpperCase(field)} - /> -
{" "} - - ) : ( - "" - )} -
- ); - })} - - -
-
-
-
-
- ))} - - ); -} -export default EditRow; diff --git a/src/api-manager/Example.js b/src/api-manager/Example.js deleted file mode 100644 index 4179693..0000000 --- a/src/api-manager/Example.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import CrudManager from './CrudManager' -import schema from './example.json' - -const CrudManagerExample = () => { - - return ( - - <> - - {/* // */} - - - ) -} - -export default CrudManagerExample \ No newline at end of file diff --git a/src/api-manager/Form.js b/src/api-manager/Form.js deleted file mode 100644 index 747b59d..0000000 --- a/src/api-manager/Form.js +++ /dev/null @@ -1,148 +0,0 @@ -import React,{useState} from "react"; -import { Button } from "@mui/material"; -import FormField, { validateField } from "./FormField"; -import "./style.css"; -import { toast } from "react-toastify"; -import useAPIManager from "./useAPIManager"; - -const Form = (props) => { - const inputFields = props.inputFields; - const fieldDefault = props.data ? props.data : []; - const submitBtnTitle = props.submitBtnTitle ? props.submitBtnTitle : "Submit"; - const [externalErrors, setExternalErrors] = useState({}); - - const { Get, Delete, Patch, Post, getHost } = useAPIManager( - props.globalConfig, - props.token - ); - - async function handleSubmit(e) { - e.preventDefault(); - let isFormValid = true; - const newExternalErrors = {}; - inputFields.forEach((field) => { - const fieldName = field.name; - const value = e.target.elements[fieldName].value; - const validationError = validateField(value, field.type, field.label); - - - if (field.required) { // Check if the field is required - const validationError = validateField(value, field.type, field.label); - if (validationError) { - newExternalErrors[fieldName] = validationError; - toast.error(validationError); - isFormValid = false; - } - } - }); - - setExternalErrors(newExternalErrors); - - if (!isFormValid) { - return; // Don't submit if form is invalid - } - - var data = new FormData(e.target); - let formData = Object.fromEntries(data.entries()); - // console.log(formData); - - if (fieldDefault["id"]) { - - try{ - await Patch(props.api,fieldDefault["id"], formData).then(()=>{ - props.closeDrawer(); - props.refreshData(); - toast.success("Record updated successfully!"); - }) - .catch((err) => { - // console.error(err); - toast.error(err || "Error"); - }); - }catch{ - toast.error("Something Went wrong contact Humbingo"); - } - - // axios - // .patch(props.api + `${fieldDefault["id"]}` + "/", formData) - // .then((response) => { - // props.closeDrawer(); - // props.refreshData(); - // toast.success("Record updated successfully!"); - // }) - // .catch((err) => { - // // console.error(err); - // toast.error(err.response?.data?.error || "An error occurred"); - // }); - } else { - - - try{ - await Post(props.api, formData).then(()=>{ - props.closeDrawer(); - props.refreshData(); - - toast.success("Record created successfully!"); - }) - .catch((err) => { - // console.error(err); - toast.error(err.response?.data?.error || "Error"); - }); - }catch{ - toast.error("Something Went wrong contact Humbingo"); - } - // axios - // .post(props.api, formData) - // .then((response) => { - // props.closeDrawer(); - // props.refreshData(); - - // toast.success("Record created successfully!"); - // }) - // .catch((err) => { - // // console.error(err); - // toast.error(err.response?.data?.error || "An error occurred"); - // }); - } - } - return ( -
- {inputFields.map((field, index) => { - const fieldName = field["name"]; - if (props.grid) { - return ( -
-
- -
-
- ); - } else { - return ( -
- -
- ); - } - })} -
- -
- ); -}; -export default Form; diff --git a/src/api-manager/FormField.js b/src/api-manager/FormField.js deleted file mode 100644 index be7eaef..0000000 --- a/src/api-manager/FormField.js +++ /dev/null @@ -1,314 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { TextField, FormHelperText } from "@mui/material"; -import { firstUpperCase ,validateEmail,validatePassword} from "./helper.js"; -import "./style.css"; -import FormControlLabel from "@mui/material/FormControlLabel"; -import Checkbox from "@mui/material/Checkbox"; -import CustomAutocomplete from "./DynamicForm/Autocomplete.js"; -import _Autocomplete from "./DynamicForm/_Autocomplete.js"; - -import useAPIManager from './useAPIManager.js'; -export const validateField = (value, type, label) => { - let errorMessage = ""; - if (label) { - switch (type) { - case "text": - if (!value) { - errorMessage = ` ${label} is required`; - } - break; - case "select": - if (!value) { - errorMessage = ` ${label} Please Select Value`; - } - break; - case "simple-select": - if (!value) { - errorMessage = ` ${label} Please Select`; - } - break; - case "advance-select": - if (!value) { - errorMessage = ` ${label} Please Select`; - } - break; - case "datetime-local": - if (!value) { - errorMessage = `${label} Please Select `; - } - break; - case "checkbox": - if (!value) { - errorMessage = `${label} Must be Checked`; - } - break; - case "email": - if (!value || !validateEmail(value)) { - errorMessage = `${label} must be a valid email address`; - } - break; - case "password": - if (!value || !validatePassword(value)) { - errorMessage = `${label} must be at least 8 characters long`; - } - break; - case "phone": - if (!value || value.length !== 10) { - errorMessage = `${label} must be exactly 10 characters`; - } - break; - default: - if (!value || !value.trim()) { - errorMessage = `${label} Is Required`; - } - } - } - return errorMessage; -}; - -const FormField = (props) => { - const { Get, Delete, Patch, Post, getAPI } = useAPIManager( - props.globalConfig, - props.token - ); - - - const required = props.field.required; - const label = firstUpperCase(props.field.label); - let fieldLabel = required ? ( - - * {label} - - ) : ( - label - ); - const type = props.field.type; - const varient = props.field.varient; - const placeholder = props.field.placeholder; - const isDynamic = props.field.dynamic; - const hook = props.field.hook; - const defaultObj = props.field.defaultObj; - const dafaultValue = props.field.defaultValue - ? props.field.defaultValue - : props.defaultValue; - const name = props.field.name; - - let optionKey = ""; - let searchApi = ""; - let searchOptionHook = ""; - - if (props.field.search) { - searchApi = props.field.search.api ? props.field.search.api : ""; - // console.log("My Search APu 1", searchApi); - searchApi = searchApi.length > 0 ? getAPI(searchApi) : ""; - - searchOptionHook = props.field.search.label ? props.field.search.label : ""; - optionKey = props.field.search.key ? props.field.search.key : "id"; - } - const [value, setValue] = useState(dafaultValue); - const [isChecked, setIsChecked] = useState(dafaultValue); - const [storageData, setStorageData] = useState([]); - - const [error, setError] = useState( - props.field.error ? props.field.error : "" - ); - const [blurred, setBlurred] = useState(false); - const [simpleSelectOptions, setSimpleSelectOptions] = useState( - props.field.options - ); - - useEffect(() => { - const storedData = localStorage.getItem("dynamicField"); - if (storedData) { - setStorageData(JSON.parse(storedData)); - } - }, []); - - const updateKey = (name, newKey, newLabel) => { - const newData = [...storageData]; - - const dataIndex = newData.findIndex((item) => item.name === name); - - if (dataIndex !== -1) { - newData[dataIndex].key = newKey; - newData[dataIndex].label = newLabel; - } else { - newData.push({ name, key: newKey, label: newLabel }); - } - - setStorageData(newData); - // Update local storage with the new data - localStorage.setItem("dynamicField", JSON.stringify(newData)); - }; - - const changeField = async (e) => { - if (e != undefined && e != null) { - updateKey(name, e.key, e.label); - window.location.reload(); - } - }; - - let handleOnChange = (e) => { - setValue(e.target.value); - if (blurred) { - setError(validateField(e.target.value, type, label)); - } - }; - const handleChange = () => { - const newChecked = !isChecked; - setIsChecked(newChecked); - if (blurred) { - setError(validateField(newChecked, type, label)); - } - }; - const handleaAutocompleteChange = (newValue, inputName) => { - setValue(newValue); - if (blurred) { - setError(validateField(newValue.target.value, type, label)); - } - }; - const handleBlur = (e) => { - setBlurred(true); - setError(validateField(value, type, label)); - setError( - validateField(type === "checkbox" ? isChecked : value, type, label) - ); - - // Validate the field when blurred - }; - - const handleFocus = () => { - setBlurred(false); - }; - - const renderError = () => { - // Check if validation is required for this field - const isValidationRequired = required || false; - - if (isValidationRequired && error && blurred) { - return {error}; - } - return null; - }; - - function formatDate(inputDate) { - const date = new Date(inputDate); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, "0"); - const day = String(date.getDate()).padStart(2, "0"); - const hours = String(date.getHours()).padStart(2, "0"); - const minutes = String(date.getMinutes()).padStart(2, "0"); - - return `${year}-${month}-${day}T${hours}:${minutes}`; - } - - switch (type) { - case "select": - return ( - <> - {}} - variant={varient} - label={fieldLabel} - onBlur={handleBlur} - onFocus={handleFocus} - /> - {renderError()} - - ); - case "simple-select": - return ( - <> - <_Autocomplete - globalConfig={props.globalConfig} - token={props.token} - apiUrl="" - displayKey="label" - valueKey="type" - inputName={name} - onValueChange={handleaAutocompleteChange} - variant={varient} - label={label} - defaultObj={defaultObj} - options={simpleSelectOptions} - onBlur={handleBlur} - onFocus={handleFocus} - /> - {renderError()} - - ); - case "advance-select": - return ( -
- <_Autocomplete - globalConfig={props.globalConfig} - token={props.token} - apiUrl={searchApi} - displayKey={searchOptionHook} - valueKey={optionKey} - inputName={name} - onValueChange={handleaAutocompleteChange} - variant={varient} - label={fieldLabel} - onBlur={handleBlur} - onFocus={handleFocus} - defaultObj={defaultObj} - /> - {renderError()} -
- ); - case "checkbox": - return ( -
- } - label={fieldLabel} - name={name} - /> - {renderError()} -
- ); - case "datetime-local": - return ( -
- - {renderError()} -
- ); - default: - return ( -
- - {renderError()} -
- ); - } -}; - -export default FormField; diff --git a/src/api-manager/FormWithDrawer.js b/src/api-manager/FormWithDrawer.js deleted file mode 100644 index 1cfcb1d..0000000 --- a/src/api-manager/FormWithDrawer.js +++ /dev/null @@ -1,77 +0,0 @@ -import React from "react"; -import { Button } from "@mui/material"; -import Drawer from "@mui/material/Drawer"; -import Form from "./Form"; - -const FormWithDrawer = (props) => { - const [state, setState] = React.useState({ - top: false, - left: false, - bottom: false, - right: false, - }); - const toggleDrawer = (anchor, open) => (event) => { - if ( - event.type === "keydown" && - (event.key === "Tab" || event.key === "Shift") - ) { - - return; - } - setState({ ...state, [anchor]: open }); - }; - - const anchor = props.anchor ? props.anchor : "right"; - const actionBtnName = props.actionBtnName; - const data = props.data; - const buttonVarient = props.buttonVarient ? props.buttonVarient : "contained"; - const updateFormTitle = props.updateFormTitle ? props.updateFormTitle : ""; - const createFormTitle = props.createFormTitle ? props.createFormTitle : ""; - const submitBtnTitle = props.submitBtnTitle ? props.submitBtnTitle : "Submit"; - const handleCloseDrawer = () => { - setState({ ...state, [anchor]: false }); - }; - - return ( - - - - -
-
-

{createFormTitle}

-

{updateFormTitle}

-
-
-
props.refreshData()} - submitBtnTitle={submitBtnTitle} - inputFields={props.inputFields} - api={props.api} - data={data} - /> -
-
-
-
-
- ); -}; - -export default FormWithDrawer; diff --git a/src/api-manager/MultiSelect.js b/src/api-manager/MultiSelect.js deleted file mode 100644 index d474818..0000000 --- a/src/api-manager/MultiSelect.js +++ /dev/null @@ -1,57 +0,0 @@ -import React, { useEffect, useState } from "react"; -import AutoCompleteField from "./AutoCompleteField"; -import FormField from "./FormField"; - -const MultiSelect = (props) => { - const [hookObj, setHookObj] = useState([]); - - let handleOnChange = (key, value) => { - let obj = []; - console.log("Field Changed sfsdfds", key, value); - localStorage.setItem(key, value); - // setHookObj(hookObj => [...hookObj,{"name":key, "value":value}]); - console.log("Multi Dtaa", hookObj); - - }; - - let loadWithUpdatedApi = (field)=>{ - // field.search.api=localStorage.getItem(field.search.hook) ; - console.log("Sub Search Hook",field.search.hook); - field.search.api = `http://127.0.0.1:8000/api/v1/getAllGroupsJoinedByUser/${localStorage.getItem(field.search.hook)}/`; - return( handleOnChange(name, value)} - field={field} - />) - } - - useEffect(()=>{ - - },[]) - let updateRefresh = (refresh)=>{ -console.log(refresh); - } - return ( -
- {JSON.stringify(props.field)} - - {props.field.map((f) => { - return f.search.hook ? ( - loadWithUpdatedApi(f) - - ) : ( - handleOnChange(name, value)} - refresh={(refresh) => updateRefresh(refresh)} - field={f} - /> - ); - })} -
- ); -}; - - - -export default MultiSelect; diff --git a/src/api-manager/Pagination.js b/src/api-manager/Pagination.js deleted file mode 100644 index 3caaae0..0000000 --- a/src/api-manager/Pagination.js +++ /dev/null @@ -1,98 +0,0 @@ -import React from "react"; -import { Button } from "@mui/material"; -import "./style.css"; - -function Pagination({ - nextPage, - previousPage, - makeApiRequest, - getValueFromUrl, - totalCount, - rowsPerPage, - currentPage, - setCurrentPage, - dataApi, -}) { - const totalPages = Math.ceil(totalCount / rowsPerPage); - - const generatePageNumbers = () => { - const pages = []; - const maxPages = 4; - const currentPageIndex = currentPage; - - let startPage = Math.max(1, currentPageIndex - Math.floor(maxPages / 2)); - let endPage = Math.min(totalPages, startPage + maxPages - 1); - - if (endPage === totalPages) { - startPage = Math.max(1, endPage - maxPages + 1); - } else if (startPage === 1) { - endPage = Math.min(totalPages, startPage + maxPages - 1); - } - - for (let i = startPage; i <= endPage; i++) { - pages.push(i); - } - - return pages; - }; - - const handlePreviousClick = () => { - if (previousPage) { - const previousPageNumber = currentPage - 1; - setCurrentPage(previousPageNumber); - makeApiRequest(previousPage); - } - }; - - const handleNextClick = () => { - if (nextPage) { - const nextPageNumber = currentPage + 1; - setCurrentPage(nextPageNumber); - makeApiRequest(nextPage); - } - }; - - return ( -
- - {generatePageNumbers().map((page) => ( - - ))} - -
- ); -} - -export default Pagination; diff --git a/src/api-manager/Radiobutton.js b/src/api-manager/Radiobutton.js deleted file mode 100644 index 313b5e5..0000000 --- a/src/api-manager/Radiobutton.js +++ /dev/null @@ -1,33 +0,0 @@ -import * as React from "react"; -import Radio from "@mui/material/Radio"; -import RadioGroup from "@mui/material/RadioGroup"; -import FormControlLabel from "@mui/material/FormControlLabel"; -import FormControl from "@mui/material/FormControl"; -import FormLabel from "@mui/material/FormLabel"; - -export default function RadioButtonsGroup() { - return ( - - Payment In For - - } - label="Subscription" - /> - {/* } label="Penalty" /> */} - } - label="Draw Winner" - /> - {/* } label="Custom Amount" /> */} - - - ); -} diff --git a/src/api-manager/TableRow.js b/src/api-manager/TableRow.js deleted file mode 100644 index e45f020..0000000 --- a/src/api-manager/TableRow.js +++ /dev/null @@ -1,52 +0,0 @@ -import { Button } from '@mui/material'; -import React from 'react' -import EditRow from './EditRow'; -import FormWithDrawer from './FormWithDrawer'; -function TableRow(props) { - var row = []; - const readBlock = (props.readBlock) ? props.readBlock : []; - - - - function getCellArray() { - Object.keys(props.data).forEach((key) => { - console.log(readBlock); - if (!Object.values(readBlock).includes(key)) { - Object.entries(props.data).forEach((entry) => { - if (key === entry[0]) { - row.push(entry[1]); - } - }) - } - }) - } - - - function removeRow() { } - getCellArray(); - - - return ( - - { - row.map((data, index) => { - return {data} - }) - } - {(props.manage) ? <> - - - - - - - {/* */} - - : "" - } - - - - ) -} -export default TableRow \ No newline at end of file diff --git a/src/api-manager/example.json b/src/api-manager/example.json deleted file mode 100644 index 574b236..0000000 --- a/src/api-manager/example.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "api":"https://api.udaymotors.in/api/v1/group/" - , - "showField":[ - { "label": "Group Name", "key": "title" }, - { "label": "Description", "key": "description" }, - { "label": "Subscription Amount", "key": "subscription_amt" }, - { "label": "Max Allowed Users", "key": "max_users" }, - { "label": "Penalty Amount", "key": "penalty_amt" }, - { "label": "Start Date", "key": "start_date" }, - { "label": "End Date", "key": "end_date" } - ], - "createField":[ - - { - "label": "Group name", - "type": "text", - "variant": "standard", - "name": "title" - }, - { - "label": "Group Description", - "type": "text", - "variant": "standard", - "name": "description" - }, - { - "label": "Start Date", - "type": "datetime-local", - "variant": "standard", - "name": "start_date" - }, - { - "label": "End Date", - "type": "datetime-local", - "variant": "standard", - "name": "end_date" - }, - { - "label": "Max Users", - "type": "text", - "variant": "standard", - "name": "max_users" - }, - { - "label": "Subscription Amount", - "type": "text", - "variant": "standard", - "name": "subscription_amt" - }, - { - "label": "Panelty Amount", - "type": "text", - "variant": "standard", - "name": "penalty_amt" - } - - ], - "editField":[ - - { - "label": "Group name", - "type": "text", - "variant": "standard", - "name": "title" - }, - { - "label": "Group Description", - "type": "text", - "variant": "standard", - "name": "description" - }, - { - "label": "Start Date", - "type": "datetime-local", - "variant": "standard", - "name": "start_date" - }, - { - "label": "End Date", - "type": "datetime-local", - "variant": "standard", - "name": "end_date" - }, - { - "label": "Max Users", - "type": "text", - "variant": "standard", - "name": "max_users" - }, - { - "label": "Subscription Amount", - "type": "text", - "variant": "standard", - "name": "subscription_amt" - }, - { - "label": "Panelty Amount", - "type": "text", - "variant": "standard", - "name": "penalty_amt" - } - - ] -} \ No newline at end of file diff --git a/src/api-manager/helper.js b/src/api-manager/helper.js deleted file mode 100644 index e00acb1..0000000 --- a/src/api-manager/helper.js +++ /dev/null @@ -1,16 +0,0 @@ -export function camelCase(str) { - // Using replace method with regEx - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function (word, index) { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }).replace(/\s+/g, ''); -} -export function firstUpperCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); -} -export const validateEmail = (email) => { - const emailRegex = /^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$/; - return emailRegex.test(email); - }; - export const validatePassword = (password) => { - return password.length >= 8; - }; \ No newline at end of file diff --git a/src/api-manager/style.css b/src/api-manager/style.css deleted file mode 100644 index a6408f4..0000000 --- a/src/api-manager/style.css +++ /dev/null @@ -1,46 +0,0 @@ -.dynamic-form-element { - display: block; - margin-bottom: 10px; - width: 100%; -} - -.search-table { - display: flex; - align-items: center; - padding-top: 15px; - padding-bottom: 15px; - width: 100%; -} - -.search-input-table { - padding: 8px; - border: none; /* Remove border */ - border-radius: 15px; - outline: none; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); - - font-size: 16px; - width: 100%; - height: 30px; -} - -.search-input-table:focus { - background-color: #f0f0f0; /* Optional: Change background color on focus */ -} -/* pagination */ -.pagination-container { - display: flex; - justify-content: center; - align-items: center; - margin: 20px 0; -} - -.pagination-button { - margin: 0 5px; -} - -.pagination-button.active-page { - background-color: #6c757d; - color: rgb(73, 198, 207); - -} diff --git a/src/api-manager/useAPIManager.js b/src/api-manager/useAPIManager.js deleted file mode 100644 index 3d9ffd5..0000000 --- a/src/api-manager/useAPIManager.js +++ /dev/null @@ -1,77 +0,0 @@ -import axios from "axios"; - -const useAPIManager = (globalConfig, _token) => { - const authToken = _token; - const global = globalConfig; - - let token = authToken.access; - let authorization = _token - ? { - headers: { - Authorization: `Bearer ${token}`, - }, - } - : {}; - - const getAPI = (API_NAME) => global.api.host + global.api[API_NAME]; - - const getHost = () => global.api.host; - - const Post = async (api, payload) => { - let _api = getAPI(api).includes("undefined") ? api : getAPI(api); - try { - const response = await axios.post(_api, payload, authorization); - return response; - } catch (err) { - throw err; - } - }; - - const Put = async (api, id, payload) => { - let _api = getAPI(api).includes("undefined") ? api : getAPI(api); - try { - const response = await axios.put(`${_api}${id}/`, payload, authorization); - return response; - } catch (err) { - throw err; - } - }; - - const Patch = async (api, id, payload) => { - let _api = getAPI(api).includes("undefined") ? api : getAPI(api); - try { - const response = await axios.patch( - `${_api}${id}/`, - payload, - authorization - ); - return response; - } catch (err) { - throw err; - } - }; - - const Get = async (api) => { - let _api = getAPI(api).includes("undefined") ? api : getAPI(api); - try { - const response = await axios.get(_api, authorization); - return response.data; - } catch (err) { - throw err; - } - }; - - const Delete = async (api, id) => { - let _api = getAPI(api).includes("undefined") ? api : getAPI(api); - try { - const response = await axios.delete(`${_api}${id}/`, authorization); - return response; - } catch (err) { - throw err; - } - }; - - return { Post, Put, Patch, Get, Delete, getAPI, getHost }; -}; - -export default useAPIManager; diff --git a/src/api-manager/useApi.js b/src/api-manager/useApi.js deleted file mode 100644 index 357ea00..0000000 --- a/src/api-manager/useApi.js +++ /dev/null @@ -1,89 +0,0 @@ -// useApi.js -import { useContext } from 'react'; -import axios from 'axios'; -import AuthContext from '../auth/AuthContext'; -import global from '../global/GlobalJSON.json'; - - -const useApi = () => { - const { authToken } = useContext(AuthContext); - - const getAPI = (API_NAME) => global.api.host + global.api[API_NAME]; - - const getHost = () => global.api.host; - let token = authToken.access; - - const Post = async (api, payload) => { - let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); - try { - const response = await axios.post(_api, payload, { - headers: { - Authorization: `Bearer ${token}`, - }, - }); - return response; - } catch (err) { - throw err; - } - }; - - const Put = async (api, id, payload) => { - let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); - try { - const response = await axios.put(`${_api}${id}/`, payload, { - headers: { - Authorization: `Bearer ${token}`, - }, - }); - return response; - } catch (err) { - throw err; - } - }; - - const Patch = async (api, id, payload) => { - let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); - try { - const response = await axios.patch(`${_api}${id}/`, payload, { - headers: { - Authorization: `Bearer ${token}`, - }, - }); - return response; - } catch (err) { - throw err; - } - }; - - const Get = async (api) => { - let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); - try { - const response = await axios.get(_api, { - headers: { - Authorization: `Bearer ${token}`, - }, - }); - return response.data; - } catch (err) { - throw err; - } - }; - - const Delete = async (api, id) => { - let _api =(getAPI(api).includes('undefined'))?api:getAPI(api); - try { - const response = await axios.delete(`${_api}${id}/`, { - headers: { - Authorization: `Bearer ${token}`, - }, - }); - return response; - } catch (err) { - throw err; - } - }; - - return { Post, Put, Patch, Get, Delete, getAPI, getHost }; -}; - -export default useApi; diff --git a/src/assets/bg.png b/src/assets/bg.png deleted file mode 100644 index cf6efb1a0d62ee429a0556b01f7b766d24f2e2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190891 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

_a_h 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ĝ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 { const { api: { version }, diff --git a/src/components/header.js b/src/components/common/Header.js similarity index 93% rename from src/components/header.js rename to src/components/common/Header.js index b223ad9..d5f54f8 100644 --- a/src/components/header.js +++ b/src/components/common/Header.js @@ -1,4 +1,7 @@ import React, { useContext, useState } from 'react'; +import { Link, useLocation } from 'react-router-dom'; + + import { AppBar, Toolbar, @@ -14,8 +17,8 @@ import { Collapse, Divider, } from '@mui/material'; -import { Link, useLocation } from 'react-router-dom'; -import AuthContext from '../auth/AuthContext'; + + import { Menu as MenuIcon, ChevronLeft as ChevronLeftIcon, @@ -24,11 +27,7 @@ import { ExpandMore, Home as HomeIcon, People as PeopleIcon, - CalendarToday as CalendarTodayIcon, AccountBalance as AccountBalanceIcon, - Receipt as ReceiptIcon, - Paid as PaidIcon, - TimeToLeave as LeaveIcon, Settings as SettingsIcon, Help as HelpIcon, } from '@mui/icons-material'; @@ -36,6 +35,10 @@ import { styled, useTheme } from '@mui/material/styles'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; + +import AuthContext from '../../utils/auth/AuthContext'; + + const drawerWidth = 240; const Main = styled('main', { shouldForwardProp: (prop) => prop !== 'open' })( @@ -141,7 +144,7 @@ const Header = () => { - HbaseApp + React-Placeholder @@ -195,13 +198,13 @@ const Header = () => { - + { to="/department" onClick={handleNavClick} sx={{ pl: 4 }} - className={location.pathname === '/department' ? 'active' : ''} + className={location.pathname === '/page2' ? 'active' : ''} > - + { to="/employee" onClick={handleNavClick} sx={{ pl: 4 }} - className={location.pathname === '/employee' ? 'active' : ''} + className={location.pathname === '/page3' ? 'active' : ''} > - + diff --git a/src/components/header copy.js b/src/components/header copy.js deleted file mode 100644 index cdd59b8..0000000 --- a/src/components/header copy.js +++ /dev/null @@ -1,216 +0,0 @@ -// import React, { useState, useContext, useEffect } from "react"; -// import { -// AppBar, -// Toolbar, -// Typography, -// Box, -// IconButton, -// Menu, -// MenuItem, -// useMediaQuery, -// Drawer, -// List, -// ListItem, -// ListItemText, -// } from "@mui/material"; -// import { Link } from "react-router-dom"; -// import AccountCircle from "@mui/icons-material/AccountCircle"; -// import MenuIcon from "@mui/icons-material/Menu"; -// import AuthContext from "../auth/AuthContext"; -// import useApi from "../api-manager/useApi"; -// import UserTypeUpdatePassword from "../utils/userTypePassword"; - - -// const Header = () => { -// const { user, logOutUser } = useContext(AuthContext); -// const [profile, setProfile] = useState(null); -// const [userType, setUserType] = useState(null); -// const [companyName, setCompanyName] = useState(""); -// const [companyId, setCompanyId] = useState(null); -// const [dialogOpen, setDialogOpen] = useState(false); -// const { Get, Post, getHost } = useApi(); -// const isMobile = useMediaQuery("(max-width:600px)"); -// const [drawerOpen, setDrawerOpen] = useState(false); - -// const handleClose = () => { -// setProfile(null); -// }; - -// const handleMenu = (event) => { -// setProfile(event.currentTarget); -// }; - -// const toggleDrawer = (open) => (event) => { -// if ( -// event.type === "keydown" && -// (event.key === "Tab" || event.key === "Shift") -// ) { -// return; -// } -// setDrawerOpen(open); -// }; - -// const getUserType = async () => { -// try { -// const userTypeData = await Get("checkUserType"); -// setUserType(userTypeData.user_type); - -// const compId = await Get( -// `${getHost()}/api/v1/getCompanyByUserOrDeptId?user_id=${user.user_id}` -// ); -// setCompanyName(compId.company_name); -// setCompanyId(compId.company_id); -// } catch (error) { -// setCompanyName("Hey Admin"); -// } -// }; - -// useEffect(() => { -// getUserType(); -// }, []); - -// const renderLinks = () => { -// switch (userType) { -// case "department user": -// return [ -// { path: "/", label: "Home" }, -// { path: "/cheque-form", label: "Print Cheque" }, -// { path: "/history", label: "Cheque History" }, -// ]; -// case "company user": -// return [ -// { path: "/", label: "Home" }, -// { path: "/cheque-form", label: "Print Cheque" }, -// { path: "/history", label: "Cheque History" }, -// { path: "/department", label: "Departments" }, -// ]; -// case "superuser": -// return [ -// { path: "/", label: "Humbingo Home" }, -// { path: "/company", label: "Company" }, -// { path: "/AdminDepartment", label: "Departments" }, -// { path: "/licence", label: "Licence" }, -// { path: "/registree", label: "Registree" }, -// { path: "/user", label: "User" }, -// { path: "/role", label: "Role" }, -// { path: "/history", label: "Cheque History" }, -// ]; -// default: -// return []; -// } -// }; - -// const linkStyle = { -// color: "inherit", -// textDecoration: "none", -// margin: "0 10px", -// }; - -// const drawerLinks = ( -// -// -// {renderLinks().map((link, index) => ( -// -// -// -// ))} -// -// -// ); - -// const handlePasswordSubmit = async (newPassword) => { -// try { -// await Post( -// `${getHost()}/api/v1/updatePassword/company/${companyId}/`, -// { password: newPassword } -// ); -// alert("Password updated successfully"); // Replace with a better toast notification if needed -// } catch (error) { -// console.error("Error changing password:", error); -// alert("Failed to update password"); // Replace with a better toast notification if needed -// } -// setDialogOpen(false); -// }; - -// return ( -// -// -// -// -// -// -// Logo -// {!isMobile && ( -// {companyName} -// )} -// -// {!isMobile && ( -// -// {renderLinks().map((link, index) => ( -// -// {link.label} -// -// ))} -// -// )} -// -// -// -//

-// {/* {`Hello, ${user.user_id}`} */} -// setDialogOpen(true)}>Change Password -// Logout -// -// -// -// {drawerLinks} -// -// setDialogOpen(false)} -// onSubmit={handlePasswordSubmit} -// userType={userType} -// companyId={companyId} -// /> -// -// ); -// }; - -// export default Header; diff --git a/src/components/pages/APIManagerStarter.js b/src/components/pages/APIManagerStarter.js new file mode 100644 index 0000000..95def7f --- /dev/null +++ b/src/components/pages/APIManagerStarter.js @@ -0,0 +1,21 @@ +import React, { useContext } from "react"; +import APIManager from "../external/api-manager/APIManager"; +import global from "../../config/Global.json"; +import AuthContext from "../../utils/auth/AuthContext"; +import schema from "./Schema/APIManagerStarter.json"; +const APIManagerStarter = () => { + let { authToken } = useContext(AuthContext); + return ( +
+ +
+ ) +} + +export default APIManagerStarter diff --git a/src/pages/UI/home/home.js b/src/components/pages/Home.js similarity index 100% rename from src/pages/UI/home/home.js rename to src/components/pages/Home.js diff --git a/src/pages/UI/login/login.js b/src/components/pages/Login.js similarity index 96% rename from src/pages/UI/login/login.js rename to src/components/pages/Login.js index e88de12..58a63e5 100644 --- a/src/pages/UI/login/login.js +++ b/src/components/pages/Login.js @@ -1,6 +1,7 @@ import React, { useContext, useEffect, useState } from "react"; -import AuthContext from "../../../auth/AuthContext"; import { Link, useNavigate } from "react-router-dom"; +import AuthContext from "../../utils/auth/AuthContext"; + import { Container, TextField, @@ -12,7 +13,7 @@ import { InputAdornment, } from "@mui/material"; import { Visibility, VisibilityOff } from "@mui/icons-material"; -import logo from "../../../logo.png" +import logo from "../../assets/img/logo.png" const LoginPage = () => { let { loginUser } = useContext(AuthContext); diff --git a/src/components/pages/Schema/APIManagerStarter.json b/src/components/pages/Schema/APIManagerStarter.json new file mode 100644 index 0000000..42c18c0 --- /dev/null +++ b/src/components/pages/Schema/APIManagerStarter.json @@ -0,0 +1,79 @@ +{ + "api": "company", + "showField": [ + { "label": "Name", "key": "name" }, + { "label": "Address", "key": "address" }, + { "label": "Contact Number", "key": "contact_no" }, + { "label": "Email", "key": "email" }, + { "label": "Website", "key": "website" } + ], + "createField": [ + { + "label": "Name", + "type": "text", + "varient": "standard", + "name": "name", + "required":true + }, + { + "label": "Address", + "type": "text", + "varient": "standard", + "name": "address", + "required":true + }, + { + "label": "Contact Number", + "type": "number", + "varient": "standard", + "name": "contact_no", + "required":true + }, + { + "label": "Email", + "type": "email", + "varient": "standard", + "name": "email", + "required":true + }, + { + "label": "Website", + "type": "text", + "varient": "standard", + "name": "website" + } + ], + "editField": [ + { + "label": "Name", + "type": "text", + "varient": "standard", + "name": "name" + }, + { + "label": "Address", + "type": "text", + "varient": "standard", + "name": "address" + }, + { + "label": "Contact Number", + "type": "number", + "varient": "standard", + "name": "contact_no" + }, + { + "label": "Email", + "type": "email", + "varient": "standard", + "name": "email" + }, + { + "label": "Website", + "type": "text", + "varient": "standard", + "name": "website" + } + ] + } + \ No newline at end of file diff --git a/src/global/Global.js b/src/config/Global.js similarity index 75% rename from src/global/Global.js rename to src/config/Global.js index 5fa3db2..8de0a02 100644 --- a/src/global/Global.js +++ b/src/config/Global.js @@ -1,4 +1,4 @@ -import global from "../global/GlobalJSON.json" +import global from "./Global.json" export function getAPI(API_NAME) { return global.api.host + global.api[API_NAME]; diff --git a/src/global/GlobalJSON.json b/src/config/Global.json similarity index 71% rename from src/global/GlobalJSON.json rename to src/config/Global.json index fbc983c..3c5c990 100644 --- a/src/global/GlobalJSON.json +++ b/src/config/Global.json @@ -1,12 +1,15 @@ { "api": { - "host": "https://cheque-api.humbingo.in", + "host": "https://dev_api_cheque.humbingo.in", "token": "/auth/token/", "refreshToken": "/auth/token/refresh/", "user": "/api/v1/user/", "role": "/api/v1/role/", "permission": "/api/v1/permission/", "checkUserType": "/api/v1/checkUserType", + "company":"/api/v1/company", + "test":"api/v1/test/", + "version": "1.0" }, "debug": true diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/index.js b/src/index.js index d563c0f..6338704 100644 --- a/src/index.js +++ b/src/index.js @@ -1,17 +1,9 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; -import './index.css'; import App from './App'; -import reportWebVitals from './reportWebVitals'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - - - + ); -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js deleted file mode 100644 index 5253d3a..0000000 --- a/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/src/setupTests.js b/src/setupTests.js deleted file mode 100644 index 8f2609b..0000000 --- a/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; diff --git a/src/auth/AuthContext.js b/src/utils/auth/AuthContext.js similarity index 97% rename from src/auth/AuthContext.js rename to src/utils/auth/AuthContext.js index 4fd7a05..f16defe 100644 --- a/src/auth/AuthContext.js +++ b/src/utils/auth/AuthContext.js @@ -1,9 +1,12 @@ import { createContext, useEffect, useState } from "react"; -import axios from "axios"; import { useNavigate } from "react-router-dom"; -import {jwtDecode} from "jwt-decode"; // Make sure jwt-decode is imported correctly -import { getAPI } from "../global/Global"; // Make sure this function is properly defined + +import axios from "axios"; import { toast } from "react-toastify"; +import {jwtDecode} from "jwt-decode"; // Make sure jwt-decode is imported correctly + +import { getAPI } from "../../config/Global"; // Make sure this function is properly defined + const AuthContext = createContext(); diff --git a/src/auth/auth.js b/src/utils/auth/auth.js similarity index 62% rename from src/auth/auth.js rename to src/utils/auth/auth.js index cb01b4a..7ac31a0 100644 --- a/src/auth/auth.js +++ b/src/utils/auth/auth.js @@ -1,9 +1,9 @@ import {useContext } from "react" import React from 'react' -import AuthContext from "../auth/AuthContext"; -import LoginPage from "../pages/UI/login/login"; -import Header from "../components/header"; +import AuthContext from "./AuthContext"; +import LoginPage from "../../components/pages/Login"; +import Header from "../../components/common/Header";