From 433207f8e4ef8a45947ab334dcf90aa6085b000c Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sat, 6 Jan 2024 20:47:26 +0800 Subject: [PATCH 01/20] Fix search bar in equipment instance list page --- package-lock.json | 13 ++ package.json | 1 + .../EquipmentInstancesListPage.tsx | 130 +++++++++--------- 3 files changed, 77 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d37b69..a2b5e18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "react-redux": "^8.1.3", "react-router-dom": "^6.18.0", "react-toastify": "^9.1.3", + "react-virtuoso": "^4.6.2", "reactjs-popup": "^2.0.6", "styled-components": "^6.1.1" }, @@ -3895,6 +3896,18 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-virtuoso": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.6.2.tgz", + "integrity": "sha512-vvlqvzPif+MvBrJ09+hJJrVY0xJK9yran+A+/1iwY78k0YCVKsyoNPqoLxOxzYPggspNBNXqUXEcvckN29OxyQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16 || >=17 || >= 18", + "react-dom": ">=16 || >=17 || >= 18" + } + }, "node_modules/reactjs-popup": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/reactjs-popup/-/reactjs-popup-2.0.6.tgz", diff --git a/package.json b/package.json index 389aa1a..2bd2909 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "react-redux": "^8.1.3", "react-router-dom": "^6.18.0", "react-toastify": "^9.1.3", + "react-virtuoso": "^4.6.2", "reactjs-popup": "^2.0.6", "styled-components": "^6.1.1" }, diff --git a/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx b/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx index 432b58a..b333d71 100644 --- a/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx +++ b/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx @@ -65,79 +65,75 @@ export default function EquipmentInstancesListPage() { width: "100%", minHeight: "100%", minWidth: "100%", - flexWrap: "wrap", }} > -
-
+ + + theme.palette.getContrastText(theme.palette.background.paper), + }, + }} + value={filter} + onChange={(_event, newValue) => { + setFilter(newValue); + }} + freeSolo + id="custom-input-demo" + options={["Available", "Broken", "Glassware", "Miscellaneous"]} + renderInput={(params) => ( +
+ +
+ )} + /> +

- - - theme.palette.getContrastText( - theme.palette.background.paper - ), - }, - }} - value={filter} - onChange={(_event, newValue) => { - setFilter(newValue); - }} - freeSolo - id="custom-input-demo" - options={["Available", "Broken", "Glassware", "Miscellaneous"]} - renderInput={(params) => ( -

- -
- )} - /> -

- Results Found:{" "} - { - equipment_instances?.data?.filter((equipment) => - filter !== null - ? // If filter is not null, we filter if it matches any criteria - equipment.equipment_name - .toLowerCase() - .includes(filter.toLowerCase()) || - equipment.category - .toLowerCase() - .includes(filter.toLowerCase()) || - equipment.last_updated - .toLowerCase() - .includes(filter?.toLowerCase()) || - equipment.status.toLowerCase() == filter.toLowerCase() - : // If filter keyword is null then we just pass through everything as if we did not filter at all - true - ).length - } -

-
+ Results Found:{" "} + { + equipment_instances?.data?.filter((equipment) => + filter !== null + ? // If filter is not null, we filter if it matches any criteria + equipment.equipment_name + .toLowerCase() + .includes(filter.toLowerCase()) || + equipment.category + .toLowerCase() + .includes(filter.toLowerCase()) || + equipment.last_updated + .toLowerCase() + .includes(filter?.toLowerCase()) || + equipment.status.toLowerCase() == filter.toLowerCase() + : // If filter keyword is null then we just pass through everything as if we did not filter at all + true + ).length + } +

+
Date: Sun, 7 Jan 2024 08:29:30 +0800 Subject: [PATCH 02/20] add sku button position and alignment --- .../EquipmentListPage/EquipmentListPage.tsx | 111 +++++++++--------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/src/Pages/EquipmentListPage/EquipmentListPage.tsx b/src/Pages/EquipmentListPage/EquipmentListPage.tsx index 332c297..58bb098 100644 --- a/src/Pages/EquipmentListPage/EquipmentListPage.tsx +++ b/src/Pages/EquipmentListPage/EquipmentListPage.tsx @@ -64,68 +64,67 @@ export default function EquipmentListPage() { display: "flex", alignItems: "center", justifyContent: "center", - height: "100%", + height: "80%", width: "100%", - minHeight: "100%", + minHeight: "80%", minWidth: "100%", - flexWrap: "wrap", - }} + }}> + +
+ +
- > - - - - - SetAddSKUModalOpen(false)} - modal - position={"top center"} - contentStyle={{ - width: "32rem", - borderRadius: 16, - borderColor: "grey", - borderStyle: "solid", - borderWidth: 1, - padding: 16, - alignContent: "center", - justifyContent: "center", - textAlign: "center", - }} - > - - + + Date: Sun, 7 Jan 2024 10:52:53 +0800 Subject: [PATCH 03/20] Update dropdown menu for new transaction --- package-lock.json | 32 ++++++ package.json | 2 + src/CountTransactionEquipments/test | 0 .../AddTransactionPage/AddTransactionPage.tsx | 97 ++++++++++++++----- 4 files changed, 107 insertions(+), 24 deletions(-) delete mode 100644 src/CountTransactionEquipments/test diff --git a/package-lock.json b/package-lock.json index a2b5e18..97891f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,12 +24,14 @@ "react-router-dom": "^6.18.0", "react-toastify": "^9.1.3", "react-virtuoso": "^4.6.2", + "react-window": "^1.8.10", "reactjs-popup": "^2.0.6", "styled-components": "^6.1.1" }, "devDependencies": { "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "@types/react-window": "^1.8.8", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "@vitejs/plugin-react": "^4.0.3", @@ -1762,6 +1764,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.5", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", @@ -3373,6 +3384,11 @@ "resolved": "https://registry.npmjs.org/media-engine/-/media-engine-1.0.3.tgz", "integrity": "sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==" }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3908,6 +3924,22 @@ "react-dom": ">=16 || >=17 || >= 18" } }, + "node_modules/react-window": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", + "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/reactjs-popup": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/reactjs-popup/-/reactjs-popup-2.0.6.tgz", diff --git a/package.json b/package.json index 2bd2909..a1000f4 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,14 @@ "react-router-dom": "^6.18.0", "react-toastify": "^9.1.3", "react-virtuoso": "^4.6.2", + "react-window": "^1.8.10", "reactjs-popup": "^2.0.6", "styled-components": "^6.1.1" }, "devDependencies": { "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "@types/react-window": "^1.8.8", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "@vitejs/plugin-react": "^4.0.3", diff --git a/src/CountTransactionEquipments/test b/src/CountTransactionEquipments/test deleted file mode 100644 index e69de29..0000000 diff --git a/src/Pages/AddTransactionPage/AddTransactionPage.tsx b/src/Pages/AddTransactionPage/AddTransactionPage.tsx index d088a53..0ea14c3 100644 --- a/src/Pages/AddTransactionPage/AddTransactionPage.tsx +++ b/src/Pages/AddTransactionPage/AddTransactionPage.tsx @@ -20,6 +20,7 @@ import { CircularProgress, MenuItem, OutlinedInput, + Autocomplete, } from "@mui/material"; import React from "react"; import Header from "../../Components/Header/Header"; @@ -126,29 +127,50 @@ export default function AddTransactionPage() {
- Items Requested - + equipments: newValue.map((item) => item.id), + }); + }} + renderInput={(params) => ( + + )} + /> - Assigned Teacher + + Assigned Teacher + - Subject + + Subject + ) => { @@ -181,7 +209,14 @@ export default function AddTransactionPage() { /> - Remarks + + Remarks + - Consumables + + Consumables + - Additional Members + + Additional Members + Date: Sun, 7 Jan 2024 10:56:28 +0800 Subject: [PATCH 04/20] Remove redundant labels --- src/Pages/AddTransactionPage/AddTransactionPage.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Pages/AddTransactionPage/AddTransactionPage.tsx b/src/Pages/AddTransactionPage/AddTransactionPage.tsx index 0ea14c3..f9c69e1 100644 --- a/src/Pages/AddTransactionPage/AddTransactionPage.tsx +++ b/src/Pages/AddTransactionPage/AddTransactionPage.tsx @@ -33,10 +33,10 @@ export default function AddTransactionPage() { equipments: [] as number[], teacher: 0, subject: "", - remarks: " ", + remarks: "", transaction_status: "Pending Approval", - consumables: " ", - additional_members: " ", + consumables: "", + additional_members: "", borrower: 0, }); /* @@ -147,7 +147,7 @@ export default function AddTransactionPage() { transaction.equipments.includes(equipment.id) ) || [] } - onChange={(event, newValue) => { + onChange={(_event, newValue) => { SetTransaction({ ...transaction, equipments: newValue.map((item) => item.id), @@ -203,7 +203,6 @@ export default function AddTransactionPage() { SetTransaction({ ...transaction, subject: e.target.value }); setError(""); }} - label={"Subject"} value={transaction.subject} placeholder={"The subject requiring the equipments"} /> @@ -224,7 +223,6 @@ export default function AddTransactionPage() { SetTransaction({ ...transaction, remarks: e.target.value }); setError(""); }} - label={"Remarks"} value={transaction.remarks} placeholder={"Optionally add a brief description of the request"} /> @@ -245,7 +243,6 @@ export default function AddTransactionPage() { SetTransaction({ ...transaction, consumables: e.target.value }); setError(""); }} - label={"Consumables"} value={transaction.consumables} placeholder={"Write down any consumables here"} /> @@ -269,7 +266,6 @@ export default function AddTransactionPage() { }); setError(""); }} - label={"Additional Members"} value={transaction.additional_members} placeholder={ "Write down any additional members borrowing on behalf of this transaction" From c1c092080cb564fe2903f6b83805b473638e3660 Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 11:04:37 +0800 Subject: [PATCH 05/20] Refresh available equipments on transaction create --- src/Pages/AddTransactionPage/AddTransactionPage.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Pages/AddTransactionPage/AddTransactionPage.tsx b/src/Pages/AddTransactionPage/AddTransactionPage.tsx index f9c69e1..07d027c 100644 --- a/src/Pages/AddTransactionPage/AddTransactionPage.tsx +++ b/src/Pages/AddTransactionPage/AddTransactionPage.tsx @@ -309,6 +309,9 @@ export default function AddTransactionPage() { queryClient.invalidateQueries({ queryKey: ["equipment_instances"], }); + queryClient.invalidateQueries({ + queryKey: ["equipment_instances_available"], + }); queryClient.invalidateQueries({ queryKey: ["transactions"], }); From a685e3fcb51f5065e211c84ae6bb5bf13203ed71 Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 12:12:05 +0800 Subject: [PATCH 06/20] Update debug backend url --- src/Components/API/API.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Components/API/API.tsx b/src/Components/API/API.tsx index 10984e0..2d6f26f 100644 --- a/src/Components/API/API.tsx +++ b/src/Components/API/API.tsx @@ -23,11 +23,11 @@ import { TransactionCreateType, } from "../Types/Types"; -const debug = false; +const debug = true; let backendURL; if (debug) { - backendURL = "http://localhost:8000/"; + backendURL = "http://localhost:8092/"; } else { backendURL = "https://csm-backend.keannu1.duckdns.org/"; } From 8810daa26caa9d1eccb9c1b7116711e5a0be6adc Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 12:20:22 +0800 Subject: [PATCH 07/20] Sort available equipments by id in ascending order --- src/Pages/AddTransactionPage/AddTransactionPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pages/AddTransactionPage/AddTransactionPage.tsx b/src/Pages/AddTransactionPage/AddTransactionPage.tsx index 07d027c..098b3eb 100644 --- a/src/Pages/AddTransactionPage/AddTransactionPage.tsx +++ b/src/Pages/AddTransactionPage/AddTransactionPage.tsx @@ -138,7 +138,7 @@ export default function AddTransactionPage() { a.id - b.id) || []} getOptionLabel={(option) => `${option.equipment_name} (ID:${option.id})` } From b5f4fc73260b3b3d597f3c2f26e273f059028d7f Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 12:20:41 +0800 Subject: [PATCH 08/20] Turn off debug flag --- src/Components/API/API.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/API/API.tsx b/src/Components/API/API.tsx index 2d6f26f..4c43e72 100644 --- a/src/Components/API/API.tsx +++ b/src/Components/API/API.tsx @@ -23,7 +23,7 @@ import { TransactionCreateType, } from "../Types/Types"; -const debug = true; +const debug = false; let backendURL; if (debug) { From e589588d8ce016b36b5956b2af0d77a6a1e96c2e Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 12:28:06 +0800 Subject: [PATCH 09/20] Fix equipment tally page --- .../Technician/TechnicianWidgets.tsx | 6 +- .../EquipmentTallyPage/EquipmentTallyPage.tsx | 130 +++++++++--------- 2 files changed, 67 insertions(+), 69 deletions(-) diff --git a/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx b/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx index 188ea7d..65726b0 100644 --- a/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx +++ b/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx @@ -38,14 +38,16 @@ export default function TechnicianWidgets() { if (isLoading) { return ( <> - +

- Loading + Loading widgets...

); diff --git a/src/Pages/EquipmentTallyPage/EquipmentTallyPage.tsx b/src/Pages/EquipmentTallyPage/EquipmentTallyPage.tsx index 6e703ab..51101bc 100644 --- a/src/Pages/EquipmentTallyPage/EquipmentTallyPage.tsx +++ b/src/Pages/EquipmentTallyPage/EquipmentTallyPage.tsx @@ -65,79 +65,75 @@ export default function EquipmentTallyPage() { width: "100%", minHeight: "100%", minWidth: "100%", - flexWrap: "wrap", }} > -
-
+ + + theme.palette.getContrastText(theme.palette.background.paper), + }, + }} + value={filter} + onChange={(_event, newValue) => { + setFilter(newValue); + }} + freeSolo + id="custom-input-demo" + options={["Glassware", "Miscellaneous"]} + renderInput={(params) => ( +
+ +
+ )} + /> +

- - - theme.palette.getContrastText( - theme.palette.background.paper - ), - }, - }} - value={filter} - onChange={(_event, newValue) => { - setFilter(newValue); - }} - freeSolo - id="custom-input-demo" - options={["Glassware", "Miscellaneous"]} - renderInput={(params) => ( -

- -
- )} - /> -

- Results Found:{" "} - { - equipments?.data?.filter((equipment) => - filter !== null - ? // If filter is not null, we filter if it matches any criteria - equipment.name - .toLowerCase() - .includes(filter.toLowerCase()) || - equipment.category - .toLowerCase() - .includes(filter.toLowerCase()) || - equipment.last_updated - .toLowerCase() - .includes(filter?.toLowerCase()) || - equipment.category.toLowerCase() == filter.toLowerCase() - : // If filter keyword is null then we just pass through everything as if we did not filter at all - true - ).length - } -

-
+ Results Found:{" "} + { + equipment_instances?.data?.filter((equipment) => + filter !== null + ? // If filter is not null, we filter if it matches any criteria + equipment.equipment_name + .toLowerCase() + .includes(filter.toLowerCase()) || + equipment.category + .toLowerCase() + .includes(filter.toLowerCase()) || + equipment.last_updated + .toLowerCase() + .includes(filter?.toLowerCase()) || + equipment.status.toLowerCase() == filter.toLowerCase() + : // If filter keyword is null then we just pass through everything as if we did not filter at all + true + ).length + } +

+
Date: Sun, 7 Jan 2024 12:30:34 +0800 Subject: [PATCH 10/20] Improve technician widgets loading --- .../Technician/TechnicianWidgets.tsx | 31 ++++--------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx b/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx index 65726b0..b412176 100644 --- a/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx +++ b/src/Components/DashboardPage/Technician/TechnicianWidgets.tsx @@ -6,7 +6,6 @@ import { UserAPI, TransactionsAPI, } from "../../API/API"; -import CircularProgress from "@mui/material/CircularProgress"; import moment from "moment"; export default function TechnicianWidgets() { @@ -34,24 +33,6 @@ export default function TechnicianWidgets() { }, ], }); - const isLoading = queries.some((result) => result.isLoading); - if (isLoading) { - return ( - <> - -

- Loading widgets... -

- - ); - } return (
{queries[1].data?.filter( (equipment) => equipment.status == "Pending" - ).length || 0} + ).length || "Loading..."}

- {queries[1].data?.length || 0} + {queries[1].data?.length || "Loading..."}

@@ -169,7 +150,7 @@ export default function TechnicianWidgets() { > {queries[1].data?.filter( (equipment) => equipment.status == "Available" - ).length || 0} + ).length || "Loading..."}

{queries[1].data?.filter( (equipment) => equipment.status == "Broken" - ).length || 0} + ).length || "Loading..."}

@@ -249,7 +230,7 @@ export default function TechnicianWidgets() { todayStartOfDay, todayEndOfDay ) - ).length || 0} + ).length || "Loading..."}

From b4ab7ae2e42035cb23f3f807c52bae84b35ae4d6 Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 12:47:23 +0800 Subject: [PATCH 11/20] Change site name --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 6010514..cd834f8 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - CITC Equipment Tracker + CSM Equipment Tracker
From 04ce14a5a0e75c3286f9595d6f084af5f771a941 Mon Sep 17 00:00:00 2001 From: Jerilyn Yare <102701655+Jy-re@users.noreply.github.com> Date: Sun, 7 Jan 2024 12:56:01 +0800 Subject: [PATCH 12/20] student and teacher dashboard responsive --- .../DashboardPage/Student/StudentDashboard.tsx | 17 +++++++---------- .../Student/StudentTransactionListView.tsx | 7 ++++--- .../Teacher/TeacherTransactionListView.tsx | 2 +- .../TransactionEntry/TransactionEntry.tsx | 4 ++-- .../TransactionFilterMenu.tsx | 3 ++- src/Pages/DashboardPage/DashboardPage.tsx | 6 +++--- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/Components/DashboardPage/Student/StudentDashboard.tsx b/src/Components/DashboardPage/Student/StudentDashboard.tsx index 24fbc03..fcc8f40 100644 --- a/src/Components/DashboardPage/Student/StudentDashboard.tsx +++ b/src/Components/DashboardPage/Student/StudentDashboard.tsx @@ -1,7 +1,6 @@ + import styles from "../../../styles"; import { Button } from "@mui/material"; -import AddBoxIcon from "@mui/icons-material/AddBox"; -import { colors } from "../../../styles"; import { useNavigate } from "react-router-dom"; export default function StudentDashboard() { const navigate = useNavigate(); @@ -17,7 +16,7 @@ export default function StudentDashboard() { justifyContent: "center", flexWrap: "wrap", marginTop: "40px", - + width: "100%" }, @@ -28,11 +27,10 @@ export default function StudentDashboard() { ...styles.flex_column, ...{ alignSelf: "center", - justifyContent: "center", - flexWrap: "wrap", backgroundColor: "#CCDDFF", - paddingInline: "90px", - borderRadius: "20px" + borderRadius: "20px", + paddingInline: "100px", + width: "100%", }, }} onClick={() => { @@ -43,9 +41,8 @@ export default function StudentDashboard() {

CLICK TO REQUEST BORROW ITEMS diff --git a/src/Components/DashboardPage/Student/StudentTransactionListView.tsx b/src/Components/DashboardPage/Student/StudentTransactionListView.tsx index ef08e2c..f41bf1f 100644 --- a/src/Components/DashboardPage/Student/StudentTransactionListView.tsx +++ b/src/Components/DashboardPage/Student/StudentTransactionListView.tsx @@ -39,10 +39,11 @@ export default function StudentTransactionListView() { ); } return ( -

+
diff --git a/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx b/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx index 69d6818..351b62a 100644 --- a/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx +++ b/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx @@ -48,7 +48,7 @@ export default function TeacherTransactionListView() {
{transactions.data ? ( diff --git a/src/Components/TransactionEntry/TransactionEntry.tsx b/src/Components/TransactionEntry/TransactionEntry.tsx index 2a47bff..757d53a 100644 --- a/src/Components/TransactionEntry/TransactionEntry.tsx +++ b/src/Components/TransactionEntry/TransactionEntry.tsx @@ -18,11 +18,11 @@ export default function TransactionEntry(props: props) { style={{ alignSelf: "center", justifySelf: "center", - width: "584px", backgroundColor: colors.header_color, borderRadius: 16, - margin: "10px", + marginTop: "10px", paddingTop: "15px", + width: "100%" }} onClick={props.onClick} diff --git a/src/Components/TransactionFilterMenu/TransactionFilterMenu.tsx b/src/Components/TransactionFilterMenu/TransactionFilterMenu.tsx index 467b007..a3c9f24 100644 --- a/src/Components/TransactionFilterMenu/TransactionFilterMenu.tsx +++ b/src/Components/TransactionFilterMenu/TransactionFilterMenu.tsx @@ -41,10 +41,11 @@ export default function TransactionFilterMenu(props: props) { alignSelf: "center", justifyContent: "center", flexWrap: "wrap", + width: "100%" }, }} > - + Filter Transactions diff --git a/src/Pages/DashboardPage/DashboardPage.tsx b/src/Pages/DashboardPage/DashboardPage.tsx index 4f493d9..6dd68b6 100644 --- a/src/Pages/DashboardPage/DashboardPage.tsx +++ b/src/Pages/DashboardPage/DashboardPage.tsx @@ -21,10 +21,10 @@ export default function Dashboard() { style={{ ...styles.flex_column, ...{ - flexWrap: "wrap", justifyContent: "center", - marginLeft: "16px", - marginRight: "16px", + alignItems: "center", + marginInline: "10px" + }, }} > From f00432aab717900ca9ccee522c24c203d4275293 Mon Sep 17 00:00:00 2001 From: psofia Date: Sun, 7 Jan 2024 16:40:28 +0800 Subject: [PATCH 13/20] unc --- .../Technician/TechnicianEquipmentButtons.tsx | 20 +-- .../EquipmentInstancesListPage.tsx | 126 +----------------- 2 files changed, 14 insertions(+), 132 deletions(-) diff --git a/src/Components/DashboardPage/Technician/TechnicianEquipmentButtons.tsx b/src/Components/DashboardPage/Technician/TechnicianEquipmentButtons.tsx index c944e3a..3e5ed98 100644 --- a/src/Components/DashboardPage/Technician/TechnicianEquipmentButtons.tsx +++ b/src/Components/DashboardPage/Technician/TechnicianEquipmentButtons.tsx @@ -68,7 +68,7 @@ export default function TechnicianEquipmentButtons() { View All

- {/* */} - {/* */} + - {/* */} +
- {/* SetAddSKUModalOpen(false)} modal @@ -285,8 +285,8 @@ export default function TechnicianEquipmentButtons() { }} > - */} - {/* + SetAddItemModalOpen(false)} modal @@ -304,7 +304,7 @@ export default function TechnicianEquipmentButtons() { }} > - */} + ); } diff --git a/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx b/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx index 4ef4751..e72d3c5 100644 --- a/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx +++ b/src/Pages/EquipmentInstancesListPage/EquipmentInstancesListPage.tsx @@ -16,22 +16,14 @@ import { useState } from "react"; import Popup from "reactjs-popup"; import Autocomplete from "@mui/material/Autocomplete"; import SearchIcon from "@mui/icons-material/Search"; -import AddItemModal from "../../Components/AddItemModal/AddItemModal"; -import AddToQueueIcon from "@mui/icons-material/AddToQueue"; -import ScienceIcon from "@mui/icons-material/Science"; -import ColorizeIcon from "@mui/icons-material/Colorize"; -import { Button } from "@mui/material"; -import { useNavigate } from "react-router-dom"; export default function EquipmentInstancesListPage() { const [editmodalOpen, SetEditModalOpen] = useState(false); const [selectedItem, SetSelectedItem] = useState(0); - const [additemmodalOpen, SetAddItemModalOpen] = useState(false); - const navigate = useNavigate(); const equipment_instances = useQuery({ queryKey: ["equipment_instances"], @@ -83,121 +75,11 @@ export default function EquipmentInstancesListPage() { minWidth: "100%", }} > - {/* ADDED/INSERTED BUTTON,POPUP, TWO CATEGORY BUTTONS*/} - + + - SetAddItemModalOpen(false)} - modal - position={"top center"} - contentStyle={{ - width: "32rem", - borderRadius: 16, - borderColor: "grey", - borderStyle: "solid", - borderWidth: 1, - padding: 16, - alignContent: "center", - justifyContent: "center", - textAlign: "center", - }} - > - - - - - + +
Date: Tue, 9 Jan 2024 06:17:30 +0800 Subject: [PATCH 14/20] Changes Dashboard, Form, Added divs lang gyud. fix fix lang gamay --- src/Components/API/API.tsx | 2 +- .../Teacher/TeacherTransactionListView.tsx | 2 +- .../TransactionEntry/TransactionEntry.tsx | 3 +- .../AddTransactionPage/AddTransactionPage.tsx | 118 ++++++++++++------ 4 files changed, 84 insertions(+), 41 deletions(-) diff --git a/src/Components/API/API.tsx b/src/Components/API/API.tsx index 4c43e72..2d6f26f 100644 --- a/src/Components/API/API.tsx +++ b/src/Components/API/API.tsx @@ -23,7 +23,7 @@ import { TransactionCreateType, } from "../Types/Types"; -const debug = false; +const debug = true; let backendURL; if (debug) { diff --git a/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx b/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx index 351b62a..592df68 100644 --- a/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx +++ b/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx @@ -48,7 +48,7 @@ export default function TeacherTransactionListView() {
{transactions.data ? ( diff --git a/src/Components/TransactionEntry/TransactionEntry.tsx b/src/Components/TransactionEntry/TransactionEntry.tsx index 757d53a..8f0ed31 100644 --- a/src/Components/TransactionEntry/TransactionEntry.tsx +++ b/src/Components/TransactionEntry/TransactionEntry.tsx @@ -22,7 +22,8 @@ export default function TransactionEntry(props: props) { borderRadius: 16, marginTop: "10px", paddingTop: "15px", - width: "100%" + width: "100%", + maxWidth: "550px" }} onClick={props.onClick} diff --git a/src/Pages/AddTransactionPage/AddTransactionPage.tsx b/src/Pages/AddTransactionPage/AddTransactionPage.tsx index c8c2cf2..13ea135 100644 --- a/src/Pages/AddTransactionPage/AddTransactionPage.tsx +++ b/src/Pages/AddTransactionPage/AddTransactionPage.tsx @@ -3,7 +3,6 @@ import styles from "../../styles"; import { colors } from "../../styles"; import TextField from "@mui/material/TextField"; import AddToQueueIcon from "@mui/icons-material/AddToQueue"; -import Button from "../../Components/Button/Button"; import { toast } from "react-toastify"; import { AvailableEquipmentInstancesAPI, @@ -21,6 +20,9 @@ import { MenuItem, OutlinedInput, Autocomplete, + Alert, + Stack + } from "@mui/material"; import React from "react"; import Header from "../../Components/Header/Header"; @@ -125,11 +127,17 @@ export default function AddTransactionPage() {

Borrowing Form

-
+
@@ -207,26 +215,7 @@ export default function AddTransactionPage() { placeholder={"The subject requiring the equipments"} /> - - - Remarks - - ) => { - SetTransaction({ ...transaction, remarks: e.target.value }); - setError(""); - }} - value={transaction.remarks} - placeholder={"Optionally add a brief description of the request"} - /> - + @@ -268,24 +259,63 @@ export default function AddTransactionPage() { }} value={transaction.additional_members} placeholder={ - "Write down any additional members borrowing on behalf of this transaction" + "1. Full Name ex. (Daniel John Padilla)\n2. Kathryn Bernardo \n3. ..." } /> + + + Remarks (optional) + + ) => { + SetTransaction({ ...transaction, remarks: e.target.value }); + setError(""); + }} + value={transaction.remarks} + placeholder={"Add a brief description of the request or N/A."} + /> +
-

{error}

+ +
-
+ +

{error}

+ + +
); } From b7f39a517b912a1b36f2a510e3d443266c66cd3a Mon Sep 17 00:00:00 2001 From: "Pongot, Jophiel" Date: Tue, 9 Jan 2024 06:31:42 +0800 Subject: [PATCH 15/20] Landing Page configs. --- src/Pages/LandingPage/LandingPage.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Pages/LandingPage/LandingPage.tsx b/src/Pages/LandingPage/LandingPage.tsx index c91d636..9058a1b 100644 --- a/src/Pages/LandingPage/LandingPage.tsx +++ b/src/Pages/LandingPage/LandingPage.tsx @@ -37,6 +37,7 @@ export default function LandingPage() { minHeight: "100%", minWidth: "100%", flexWrap: "wrap", + backgroundColor: "#F2FAF4" }} >
@@ -51,19 +52,26 @@ export default function LandingPage() { >

- CSM Inventory + Welcome! +

+ +

+ CSM Borrowing and Inventory
Monitoring and Management System

From d08b43b3ad137aefaa8d11a805fd7dcac1c46d5f Mon Sep 17 00:00:00 2001 From: "Pongot, Jophiel" Date: Tue, 9 Jan 2024 06:47:50 +0800 Subject: [PATCH 16/20] added and made chages to Login Modal --- src/Components/API/API.tsx | 2 +- src/Components/LoginModal/LoginModal.tsx | 101 +++++++++++++++-------- src/styles.tsx | 28 ++++++- 3 files changed, 90 insertions(+), 41 deletions(-) diff --git a/src/Components/API/API.tsx b/src/Components/API/API.tsx index 2d6f26f..4c43e72 100644 --- a/src/Components/API/API.tsx +++ b/src/Components/API/API.tsx @@ -23,7 +23,7 @@ import { TransactionCreateType, } from "../Types/Types"; -const debug = true; +const debug = false; let backendURL; if (debug) { diff --git a/src/Components/LoginModal/LoginModal.tsx b/src/Components/LoginModal/LoginModal.tsx index fb6a5c0..ba18222 100644 --- a/src/Components/LoginModal/LoginModal.tsx +++ b/src/Components/LoginModal/LoginModal.tsx @@ -6,7 +6,6 @@ import InputAdornment from "@mui/material/InputAdornment"; import IconButton from "@mui/material/IconButton"; import Visibility from "@mui/icons-material/Visibility"; import VisibilityOff from "@mui/icons-material/VisibilityOff"; -import LoginIcon from "@mui/icons-material/Login"; import Checkbox from "@mui/material/Checkbox"; import Button from "../Button/Button"; import { useNavigate } from "react-router-dom"; @@ -14,6 +13,8 @@ import { LoginAPI } from "../API/API"; import { useDispatch } from "react-redux"; import { auth_toggle } from "../Plugins/Redux/Slices/AuthSlice/AuthSlice"; import { toast } from "react-toastify"; +import Logo_dako from "../../assets/Logo_dako.png" + export default function LoginModal() { const navigate = useNavigate(); const [showPassword, setShowPassword] = useState(false); @@ -28,25 +29,41 @@ export default function LoginModal() { <>
- -

Welcome back!

+ +

+ Welcome back! +

+

+ Sign In to Continue +

-
+
+

{error}

+
+ +
-

{error}

- +
+ ); } diff --git a/src/styles.tsx b/src/styles.tsx index 315f0fa..73e7bb3 100644 --- a/src/styles.tsx +++ b/src/styles.tsx @@ -1,5 +1,5 @@ export const colors = { - background: "#FFFFFF", + background: "#F2FAF4", header_color: "#b2dfab", font_dark: "#2e482e", font_light: "#0e410d", @@ -11,9 +11,20 @@ export const colors = { green: "#80b28a", gray: "#8F8F8F", dark_green: "#17561D", - dark_blue: "#19639D" + dark_blue: "#19639D", + + font_dark_red: "#570404", + + dandelion: "#FBB217", + + lightgreen: "#D9FFD8", + darkgreen: "#00360C", + lightorange: "#FEFFCD", + lightred: "#ECC4B8", + + form_dark: "#000000", + form_title: "#1E1A4D" - }; const styles: { [key: string]: React.CSSProperties } = { @@ -30,7 +41,16 @@ const styles: { [key: string]: React.CSSProperties } = { overflowY: "scroll", }, - + text_normal: { + color: colors.font_dark, + fontWeight: "500", + }, + + text_dark_red: { + color: colors.font_dark_red, + fontWeight: "bold", + }, + text_dark: { color: colors.font_dark, fontWeight: "bold", From 8a53d12c8aeb720edc21784b937b221cc54cf66f Mon Sep 17 00:00:00 2001 From: "Pongot, Jophiel" Date: Tue, 9 Jan 2024 06:56:05 +0800 Subject: [PATCH 17/20] si register modal sab, scrollable and noyys kaayo iyang scroll bar. --- src/Components/LoginModal/LoginModal.tsx | 1 - .../RegisterModal/RegisterModal.tsx | 457 ++++++++++-------- src/index.css | 22 + 3 files changed, 273 insertions(+), 207 deletions(-) diff --git a/src/Components/LoginModal/LoginModal.tsx b/src/Components/LoginModal/LoginModal.tsx index ba18222..d92cd0d 100644 --- a/src/Components/LoginModal/LoginModal.tsx +++ b/src/Components/LoginModal/LoginModal.tsx @@ -7,7 +7,6 @@ import IconButton from "@mui/material/IconButton"; import Visibility from "@mui/icons-material/Visibility"; import VisibilityOff from "@mui/icons-material/VisibilityOff"; import Checkbox from "@mui/material/Checkbox"; -import Button from "../Button/Button"; import { useNavigate } from "react-router-dom"; import { LoginAPI } from "../API/API"; import { useDispatch } from "react-redux"; diff --git a/src/Components/RegisterModal/RegisterModal.tsx b/src/Components/RegisterModal/RegisterModal.tsx index ca49625..4bf18d8 100644 --- a/src/Components/RegisterModal/RegisterModal.tsx +++ b/src/Components/RegisterModal/RegisterModal.tsx @@ -1,13 +1,11 @@ import { useState } from "react"; -import styles from "../../styles"; -import { colors } from "../../styles"; +import styles, { colors } from "../../styles"; import TextField from "@mui/material/TextField"; import InputAdornment from "@mui/material/InputAdornment"; import IconButton from "@mui/material/IconButton"; import Visibility from "@mui/icons-material/Visibility"; import VisibilityOff from "@mui/icons-material/VisibilityOff"; -import { AppRegistration } from "@mui/icons-material"; -import Button from "../Button/Button"; +import Logo_dako from "../../assets/Logo_dako.png"; import { useNavigate } from "react-router-dom"; import { RegisterAPI } from "../API/API"; import { toast } from "react-toastify"; @@ -34,216 +32,263 @@ export default function RegisterModal() { const [error, setError] = useState(""); return ( <> -
- +
-

Get Started

-
+ > + -
- ) => { - setUser({ ...user, first_name: e.target.value }); - setError(""); - }} - value={user.first_name} - placeholder={"Enter your first name"} - /> - ) => - setUser({ ...user, last_name: e.target.value }) - } - value={user.last_name} - placeholder={"Enter your last name"} - /> - ) => - setUser({ ...user, email: e.target.value }) - } - value={user.email} - placeholder={"Enter your email"} - /> - - - Course - - ) => { - setUser({ ...user, course: e.target.value }); - setError(""); +

-

+

+ Enter required fields +

+
+ +
+

+ {error} +

+
+ +
+ ) => { + setUser({ ...user, first_name: e.target.value }); + setError(""); + }} + value={user.first_name} + placeholder={"Enter your first name"} + /> + ) => + setUser({ ...user, last_name: e.target.value }) + } + value={user.last_name} + placeholder={"Enter your last name"} + /> + ) => + setUser({ ...user, email: e.target.value }) + } + value={user.email} + placeholder={"Enter your email"} + /> + + + + Course + + ) => { + setUser({ ...user, course: e.target.value }); + setError(""); }} > - } - label="BS Chemistry" - style={styles.text_dark} - /> - } - label="BS Food Technology" - style={styles.text_dark} - /> - } - label="BS Applied Physics" - style={styles.text_dark} - /> - } - label="BS Environmental Science" - style={styles.text_dark} - /> -
-
-
- ) => { - setUser({ ...user, username: e.target.value }); - setError(""); - }} - value={user.username} - placeholder={"Enter username"} - /> - - setShowPassword(!showPassword)} - edge="end" - > - {showPassword ? : } - - - ), - }} - label="Password" - placeholder={"Enter password"} - onChange={(e: React.ChangeEvent) => - setUser({ ...user, password: e.target.value }) - } - value={user.password} - /> - - setShowPassword(!showPassword)} - edge="end" - > - {showPassword ? : } - - - ), - }} - label="Confirm Password" - placeholder={"Re-enter password"} - onChange={(e: React.ChangeEvent) => { - setUser({ ...user, confirm_password: e.target.value }); - setError(""); - }} - value={user.confirm_password} - /> -
-

{error}

-
-
+ +
+ +
+ +
+
); } diff --git a/src/index.css b/src/index.css index b2acf00..69476d9 100644 --- a/src/index.css +++ b/src/index.css @@ -82,3 +82,25 @@ button:focus-visible { background-color: #f9f9f9; } } + +.custom-scrollbar { + overflow-y: scroll; + max-height: 800px; + scrollbar-width: thin; /* For Firefox */ + -webkit-overflow-scrolling: touch; /* For smooth scrolling on iOS */ + -ms-overflow-style: none; /* For IE */ + scrollbar-color: transparent transparent; /* For WebKit */ +} + +.custom-scrollbar::-webkit-scrollbar { + width: 6px; /* Adjust the width as needed */ +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background-color: #c4c4c4; /* Color of the thumb */ + border-radius: 3px; /* Rounded corners of the thumb */ +} + +.custom-scrollbar::-webkit-scrollbar-track { + background-color: #f0f0f0; /* Color of the track */ +} From fa89268e0ad5cc5a76d646c22bd9b5871f943059 Mon Sep 17 00:00:00 2001 From: "Pongot, Jophiel" Date: Tue, 9 Jan 2024 07:17:14 +0800 Subject: [PATCH 18/20] added homepage navigation, and configure header --- .../Technician/TechnicianNavigation.tsx | 124 ++++++++++++++++++ src/Components/Header/Header.tsx | 52 ++++++-- src/Pages/DashboardPage/DashboardPage.tsx | 53 ++++---- src/assets/Equipment.svg | 36 +++++ src/assets/Profile-Icon.png | Bin 0 -> 783 bytes src/assets/Transaction.svg | 9 ++ src/assets/ustp-logo.png | Bin 0 -> 50682 bytes 7 files changed, 238 insertions(+), 36 deletions(-) create mode 100644 src/Components/DashboardPage/Technician/TechnicianNavigation.tsx create mode 100644 src/assets/Equipment.svg create mode 100644 src/assets/Profile-Icon.png create mode 100644 src/assets/Transaction.svg create mode 100644 src/assets/ustp-logo.png diff --git a/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx b/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx new file mode 100644 index 0000000..dfa3f0a --- /dev/null +++ b/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx @@ -0,0 +1,124 @@ +import styles from "../../../styles"; +import { useNavigate } from "react-router-dom"; +import AssessmentIcon from "@mui/icons-material/Assessment"; + +import equipment from "../../../assets/Equipment.svg"; +import transaction from "../../../assets/Transaction.svg"; + +export default function TechnicianNavigation() { + const navigate = useNavigate(); + return ( + <> +
+ +
+ +

+ Feature +

+ + + + +
+
+ + ); +} diff --git a/src/Components/Header/Header.tsx b/src/Components/Header/Header.tsx index 37984a6..b5680f7 100644 --- a/src/Components/Header/Header.tsx +++ b/src/Components/Header/Header.tsx @@ -10,26 +10,32 @@ export interface props { export default function Header(props: props) { const [SidebarOpen, SetSidebarOpen] = useState(false); return ( + +
-

- {props.label} -

+ +
+

{props.label}

+
+ +
+
+ + +
+
SetSidebarOpen(false)}> diff --git a/src/Pages/DashboardPage/DashboardPage.tsx b/src/Pages/DashboardPage/DashboardPage.tsx index 6dd68b6..ed18c6e 100644 --- a/src/Pages/DashboardPage/DashboardPage.tsx +++ b/src/Pages/DashboardPage/DashboardPage.tsx @@ -6,36 +6,39 @@ import TechnicianEquipmentButtons from "../../Components/DashboardPage/Technicia import TechnicianLogButtons from "../../Components/DashboardPage/Technician/TechnicianLogButtons"; import StudentTransactionListView from "../../Components/DashboardPage/Student/StudentTransactionListView"; import StudentDashboard from "../../Components/DashboardPage/Student/StudentDashboard"; +import TechnicianNavigation from "../../Components/DashboardPage/Technician/TechnicianNavigation"; import TeacherTransactionListView from "../../Components/DashboardPage/Teacher/TeacherTransactionListView"; export default function Dashboard() { return (
- - - - - - -
- - - -
-
- - - +
+ + + + + + + +
+ + +
+
+ + + +
); } diff --git a/src/assets/Equipment.svg b/src/assets/Equipment.svg new file mode 100644 index 0000000..5cc567e --- /dev/null +++ b/src/assets/Equipment.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Profile-Icon.png b/src/assets/Profile-Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f29dd79b19d1e7bc03ca962445f3467a26c136 GIT binary patch literal 783 zcmV+q1MvKbP)8FV+&kj~?S{I(7&N%=iSLefZW(7hL3ZlpS^L$@+#sHet+Dc})@oD8}{)8i;I z1b1?jSGj<0%0nzgcip4&0Q(f;d7YiBi;S|9=MM~{75?tg(PNb`%o9@laKa@+`Rr~m zOe@c2j}FPx5|A{aw>0SfU$F<+8JdG*wm7ZN)IL{gnV*V7TJ_ZV-VI>Zu;XFu*jPiE z8fo8TZyb>#tOtz4BV*_SWvGLE4)R^zTg15Y3*t(i%}11@#dzT?@0RQDAsF5K`b$qcGh?wZ$}pD=Dj2Lk?GhaJpI_VZS8n?!V_5>mXCF9SL#B z*7D9rBp;RSnVud1dNtV~hJp=7QsN@liQM7xMJ{*Z2{SHoZ`^qA`~%1B)hjXGs}}$O N002ovPDHLkV1k=?Z5#jq literal 0 HcmV?d00001 diff --git a/src/assets/Transaction.svg b/src/assets/Transaction.svg new file mode 100644 index 0000000..e81218f --- /dev/null +++ b/src/assets/Transaction.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/ustp-logo.png b/src/assets/ustp-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ff20f52bd517703d6c4105ddaab240fa16cc205b GIT binary patch literal 50682 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 u9khi8@Tr=>rq4X`-P%Cs)TWE96hPxY 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 literal 0 HcmV?d00001 From 209219afb4fefb175d04dad57a8715658d5ad1c3 Mon Sep 17 00:00:00 2001 From: "Pongot, Jophiel" Date: Tue, 9 Jan 2024 08:43:22 +0800 Subject: [PATCH 19/20] bonggang bonggang configuration T_T. p78a45k122y12u1245p56r4a446i41n1 --- src/App.tsx | 12 + .../Technician/TechnicianNavigation.tsx | 47 +- .../Technician/TechnicianWidgets.tsx | 544 ++++++++++++------ src/Components/Header/Header.tsx | 2 +- src/Pages/DashboardPage/DashboardPage.tsx | 7 +- .../ManageEquipmentPage.tsx | 20 + src/Pages/TransactionPage/TransactionPage.tsx | 1 + .../TransactionsListPage.tsx | 2 + src/index.css | 15 + src/styles.tsx | 2 +- 10 files changed, 439 insertions(+), 213 deletions(-) create mode 100644 src/Pages/ManageEquipmentPage/ManageEquipmentPage.tsx diff --git a/src/App.tsx b/src/App.tsx index d294418..ddc36da 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -22,6 +22,7 @@ import AddTransactionPage from "./Pages/AddTransactionPage/AddTransactionPage"; import TransactionPage from "./Pages/TransactionPage/TransactionPage"; import EquipmentInstanceTallyPage from "./Pages/EquipmentTallyPage/EquipmentTallyPage"; import TransactionReportPage from "./Pages/TransactionReportPage/TransactionReportPage"; +import ManageEquipmentPage from "./Pages/ManageEquipmentPage/ManageEquipmentPage"; const queryClient = new QueryClient(); const router = createHashRouter([ @@ -67,6 +68,17 @@ const router = createHashRouter([ ), errorElement: , }, + { + path: "/view/ManageEquipment", + element: ( + <> + + + + + ), + errorElement: , + }, { path: "/view/equipment_instances/filter/:filter_by", element: ( diff --git a/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx b/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx index dfa3f0a..ce853d5 100644 --- a/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx +++ b/src/Components/DashboardPage/Technician/TechnicianNavigation.tsx @@ -16,34 +16,35 @@ export default function TechnicianNavigation() { alignItems: "center", gap: "24px", alignSelf: "stretch", + paddingBottom: "5rem" }} > - -
- -

- Feature -

+

+ Feature +

-
-
+ + {/* Yellow Capsule */}
-

- Available Equipments -

+ {/* Pending Req */} +
+

+ {queries[1].data?.length || "Loading..."} +

-

- {queries[1].data?.filter( - (equipment) => equipment.status == "Available" - ).length || "Loading..."} -

-
-
-

- Broken Equipments -

+

+ Total Equipment +

+
+
+
+

+ Available +

+

+ {queries[1].data?.filter( + (equipment) => equipment.status == "Available" + ).length || "Loading..."} +

-

- {queries[1].data?.filter( - (equipment) => equipment.status == "Broken" - ).length || "Loading..."} -

-
-
-
-
-

- Total Transactions Today -

+

+ Pending +

+

+ {queries[1].data?.filter( + (equipment) => equipment.status == "Pending" + ).length || 0} +

-

- {queries[3].data?.filter((transaction) => - moment(transaction.timestamp, "MM-DD-YYYY hh:mm A").isBetween( - todayStartOfDay, - todayEndOfDay - ) - ).length || "Loading..."} -

-
-
-

- Total Transactions this Month -

+

+ Broken +

+

+ {queries[1].data?.filter( + (equipment) => equipment.status == "Broken" + ).length || 0} +

+
+
+

- {queries[3].data?.filter((transaction) => - moment(transaction.timestamp, "MM-DD-YYYY hh:mm A").isBetween( - thisMonthStart, - thisMonthEnd - ) - ).length || "Loading..."} + Equipment Tracking

diff --git a/src/Components/Header/Header.tsx b/src/Components/Header/Header.tsx index b5680f7..219a8d1 100644 --- a/src/Components/Header/Header.tsx +++ b/src/Components/Header/Header.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import styles, { colors } from "../../styles"; +import styles from "../../styles"; import MenuIcon from "@mui/icons-material/Menu"; import SidebarModal from "../Drawer/Drawer"; import { Drawer } from "@mui/material"; diff --git a/src/Pages/DashboardPage/DashboardPage.tsx b/src/Pages/DashboardPage/DashboardPage.tsx index ed18c6e..bc923ef 100644 --- a/src/Pages/DashboardPage/DashboardPage.tsx +++ b/src/Pages/DashboardPage/DashboardPage.tsx @@ -2,8 +2,6 @@ import Header from "../../Components/Header/Header"; import styles from "../../styles"; import RestrictedComponent from "../../Components/RestrictedComponent/RestrictedComponent"; import TechnicianWidgets from "../../Components/DashboardPage/Technician/TechnicianWidgets"; -import TechnicianEquipmentButtons from "../../Components/DashboardPage/Technician/TechnicianEquipmentButtons"; -import TechnicianLogButtons from "../../Components/DashboardPage/Technician/TechnicianLogButtons"; import StudentTransactionListView from "../../Components/DashboardPage/Student/StudentTransactionListView"; import StudentDashboard from "../../Components/DashboardPage/Student/StudentDashboard"; import TechnicianNavigation from "../../Components/DashboardPage/Technician/TechnicianNavigation"; @@ -16,8 +14,6 @@ export default function Dashboard() { - -
- + +
diff --git a/src/Pages/ManageEquipmentPage/ManageEquipmentPage.tsx b/src/Pages/ManageEquipmentPage/ManageEquipmentPage.tsx new file mode 100644 index 0000000..5bcabe9 --- /dev/null +++ b/src/Pages/ManageEquipmentPage/ManageEquipmentPage.tsx @@ -0,0 +1,20 @@ +import Header from "../../Components/Header/Header"; +import styles from "../../styles"; +import RestrictedComponent from "../../Components/RestrictedComponent/RestrictedComponent"; +import TechnicianEquipmentButtons from "../../Components/DashboardPage/Technician/TechnicianEquipmentButtons"; +import TechnicianLogButtons from "../../Components/DashboardPage/Technician/TechnicianLogButtons"; + + +export default function ManageEquipmentPage() { +return ( +
+
+
+ + + + +
+
+); +} diff --git a/src/Pages/TransactionPage/TransactionPage.tsx b/src/Pages/TransactionPage/TransactionPage.tsx index f4d7d5a..ab6ceb2 100644 --- a/src/Pages/TransactionPage/TransactionPage.tsx +++ b/src/Pages/TransactionPage/TransactionPage.tsx @@ -53,6 +53,7 @@ export default function TransactionPage() { alignContent: "center", justifyContent: "center", alignItems: "center", + marginTop: 64 }} > Date: Tue, 9 Jan 2024 11:20:15 +0800 Subject: [PATCH 20/20] basta daghan kaayo ko gi change specially katung tap to view nga makita ang mga pdf's pdf's. dili ra si student na ang makakita ra, pati ang teacher and lab technician. aside ana, daghan paa. salamat ol. in god's will. --- .../Student/StudentTransactionListView.tsx | 33 +- .../Teacher/TeacherTransactionListView.tsx | 36 +- .../StatusTextColor/StatusTextColor.tsx | 21 +- .../TransactionEntry/TransactionEntry.tsx | 27 +- .../TransactionPDF/TransactionPDF.tsx | 428 +++++++++++++----- src/Components/Types/Types.tsx | 1 + .../AddTransactionPage/AddTransactionPage.tsx | 1 + .../TransactionsListPage.tsx | 78 +++- 8 files changed, 478 insertions(+), 147 deletions(-) diff --git a/src/Components/DashboardPage/Student/StudentTransactionListView.tsx b/src/Components/DashboardPage/Student/StudentTransactionListView.tsx index f41bf1f..07c1fd7 100644 --- a/src/Components/DashboardPage/Student/StudentTransactionListView.tsx +++ b/src/Components/DashboardPage/Student/StudentTransactionListView.tsx @@ -1,6 +1,6 @@ import { useQuery } from "@tanstack/react-query"; import { TransactionsByStudentAPI } from "../../API/API"; -import styles from "../../../styles"; +import styles, { colors } from "../../../styles"; import CircularProgress from "@mui/material/CircularProgress/CircularProgress"; import React, { useState } from "react"; import TransactionEntry from "../../TransactionEntry/TransactionEntry"; @@ -70,12 +70,43 @@ export default function StudentTransactionListView() { }} transaction={transaction} /> + )) ) : ( <> )}
+ +
); diff --git a/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx b/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx index 592df68..b7f5b08 100644 --- a/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx +++ b/src/Components/DashboardPage/Teacher/TeacherTransactionListView.tsx @@ -1,14 +1,16 @@ import { useQuery } from "@tanstack/react-query"; import { TransactionsByTeacherAPI } from "../../API/API"; -import styles from "../../../styles"; +import styles, { colors } from "../../../styles"; import CircularProgress from "@mui/material/CircularProgress/CircularProgress"; import React, { useState } from "react"; import TransactionEntry from "../../TransactionEntry/TransactionEntry"; import TransactionFilterMenu from "../../TransactionFilterMenu/TransactionFilterMenu"; import Popup from "reactjs-popup"; import EditTransactionModal from "../../EditTransactionModal/EditTransactionModal"; +import { useNavigate } from "react-router-dom"; export default function TeacherTransactionListView() { + const navigate = useNavigate(); const [EditTransactionOpen, SetEditTransactionOpen] = useState(false); const [SelectedTransaction, SetSelectedTransaction] = useState(0); const transactions = useQuery({ @@ -48,7 +50,7 @@ export default function TeacherTransactionListView() {
{transactions.data ? ( @@ -69,6 +71,35 @@ export default function TeacherTransactionListView() { }} transaction={transaction} /> + )) ) : ( @@ -76,6 +107,7 @@ export default function TeacherTransactionListView() { )}
+ SetEditTransactionOpen(false)} diff --git a/src/Components/StatusTextColor/StatusTextColor.tsx b/src/Components/StatusTextColor/StatusTextColor.tsx index 4354cff..6541377 100644 --- a/src/Components/StatusTextColor/StatusTextColor.tsx +++ b/src/Components/StatusTextColor/StatusTextColor.tsx @@ -1,6 +1,6 @@ import { colors } from "../../styles"; -export default function StatusTextColor(status: string) { +export function StatusTextColor(status: string) { if ( status === "Pending Approval" || status === "Returned: Pending Checking" @@ -11,8 +11,25 @@ export default function StatusTextColor(status: string) { status === "Finalized" || status === "Borrowed" ) { - return colors.dark_green; + return colors.darkgreen; } else { return colors.red; } } + +export function StatusBGColor(status: string) { + if ( + status === "Pending Approval" || + status === "Returned: Pending Checking" + ) { + return colors.lightorange; + } else if ( + status === "Approved" || + status === "Finalized" || + status === "Borrowed" + ) { + return colors.lightgreen; + } else { + return colors.lightred; + } +} diff --git a/src/Components/TransactionEntry/TransactionEntry.tsx b/src/Components/TransactionEntry/TransactionEntry.tsx index 8f0ed31..8458658 100644 --- a/src/Components/TransactionEntry/TransactionEntry.tsx +++ b/src/Components/TransactionEntry/TransactionEntry.tsx @@ -1,13 +1,13 @@ import styles from "../../styles"; import { colors } from "../../styles"; import { TransactionType } from "../Types/Types"; -import StatusTextColor from "../StatusTextColor/StatusTextColor"; +import { StatusTextColor } from "../StatusTextColor/StatusTextColor"; import CircleSharpIcon from '@mui/icons-material/CircleSharp'; export interface props { transaction: TransactionType; onClick?: React.MouseEventHandler; - + } export default function TransactionEntry(props: props) { @@ -19,7 +19,7 @@ export default function TransactionEntry(props: props) { alignSelf: "center", justifySelf: "center", backgroundColor: colors.header_color, - borderRadius: 16, + borderRadius: "7px 7px 0px 0px", marginTop: "10px", paddingTop: "15px", width: "100%", @@ -106,28 +106,7 @@ export default function TransactionEntry(props: props) { {/* //GIWALA */} - -
-

- TAP TO VIEW -

-
diff --git a/src/Components/TransactionPDF/TransactionPDF.tsx b/src/Components/TransactionPDF/TransactionPDF.tsx index 80c3e40..767b66a 100644 --- a/src/Components/TransactionPDF/TransactionPDF.tsx +++ b/src/Components/TransactionPDF/TransactionPDF.tsx @@ -1,161 +1,355 @@ -import { Document, Page, Text, View } from "@react-pdf/renderer"; +import { Document, Page, Text, View, Image } from "@react-pdf/renderer"; import { TransactionType } from "../Types/Types"; import { colors } from "../../styles"; -import StatusTextColor from "../StatusTextColor/StatusTextColor"; +import { + StatusTextColor, + StatusBGColor, +} from "../StatusTextColor/StatusTextColor"; +import ustplogo from "../../assets/ustp-logo.png"; type props = { - transaction: TransactionType | null; + transaction: TransactionType; }; + export default function TransactionPDF(props: props) { return ( - + + {/* Whole Page */} - - + - Transaction ID: {props.transaction?.id} - - - {props.transaction?.timestamp} - - - - - + /> + + - Borrower: {props.transaction?.borrower.name}{" "} - {`(ID:${props.transaction?.borrower.id})`} + Department of Chemistry (Laboratory) - {`(${props.transaction?.borrower.course})`} + University of Science and Technology of Southern Philippines{" "} + {"\n"} + Lapasan Cagayan de Oro City {"\n"} - Teacher: {props.transaction?.teacher.name}{" "} - {`(ID:${props.transaction?.teacher.id})`} - - - Subject: {props.transaction?.subject} - - - Remarks: {props.transaction?.remarks} - - - Consumables: {props.transaction?.consumables} + BORROWER'S SLIP - - - Equipments: - + + + {/* Status */} + + + Status: {`${props.transaction.transaction_status}`} + + + + {/* Transaction ID */} + + + Transaction ID: #{props.transaction.id} + + + + + + Borrower Details + + + {/* Top Details */} + + {/* Borrower Details */} + - {props.transaction?.equipments.map((equipment) => ( + + Name:{" "} + + {props.transaction.borrower.name} + {" "} + + + Course:{" "} - {` - ${equipment.name} (ID:${equipment.id})`} - - ))} + style={{ textDecoration: "underline" }} + >{`${props.transaction.borrower.course}`}{" "} + {"\n"} + {/* Section: {props.transaction.section} */} + + + + + Timestamp:{" "} + + {props.transaction.timestamp} + + {"\n"} + Lab instructor:{" "} + + {props.transaction.teacher.name} + {" "} + + + Subject:{" "} + + {props.transaction.subject} + + + - + + {/* Equipment Section */} + - {`${props.transaction?.transaction_status}`} + Selected Equipment + {props.transaction.equipments.map((equipment) => ( + + {` - ${equipment.name} (ID:${equipment.id})`} + + ))} + {/* total Equipment */} + + + Total Equipment: {props.transaction.equipments.length} + + + {/* Consumables Area */} + + + Consumables + + + {props.transaction?.consumables} + + + + {/* Members here */} + + + Members + + + {props.transaction?.additional_members} + + {/* Remarks */} + + + + + Remarks + + + + + {props.transaction.remarks} + + diff --git a/src/Components/Types/Types.tsx b/src/Components/Types/Types.tsx index 7e362b5..ec01f8b 100644 --- a/src/Components/Types/Types.tsx +++ b/src/Components/Types/Types.tsx @@ -110,6 +110,7 @@ export type UserType = { }; export type TransactionType = { + additional_members: string; id: number; borrower: { id: number; diff --git a/src/Pages/AddTransactionPage/AddTransactionPage.tsx b/src/Pages/AddTransactionPage/AddTransactionPage.tsx index 13ea135..cea0fe1 100644 --- a/src/Pages/AddTransactionPage/AddTransactionPage.tsx +++ b/src/Pages/AddTransactionPage/AddTransactionPage.tsx @@ -112,6 +112,7 @@ export default function AddTransactionPage() { alignItems: "center", justifyContent: "center", overflowY: "scroll", + marginTop: 64 }, }} > diff --git a/src/Pages/TransactionsListPage/TransactionsListPage.tsx b/src/Pages/TransactionsListPage/TransactionsListPage.tsx index 82fb7cc..db5da6e 100644 --- a/src/Pages/TransactionsListPage/TransactionsListPage.tsx +++ b/src/Pages/TransactionsListPage/TransactionsListPage.tsx @@ -16,8 +16,10 @@ import { useState } from "react"; import EditTransactionModal from "../../Components/EditTransactionModal/EditTransactionModal"; import EditItemInstanceModal from "../../Components/EditItemInstanceModal/EditItemInstanceModal"; import SearchIcon from "@mui/icons-material/Search"; +import { useNavigate } from "react-router-dom"; export default function TransactionsListPage() { + const navigate = useNavigate(); const [EditTransactionOpen, SetEditTransactionOpen] = useState(false); const [SelectedTransaction, SetSelectedTransaction] = useState(0); const [EditEquipmentsOpen, SetEditEquipmentsOpen] = useState(false); @@ -145,6 +147,9 @@ export default function TransactionsListPage() { transaction.teacher.name .toLowerCase() .includes(filter.toLowerCase()) || + transaction.additional_members + .toLowerCase() + .includes(filter.toLowerCase()) || transaction.remarks .toLowerCase() .includes(filter?.toLowerCase()) || @@ -178,7 +183,13 @@ export default function TransactionsListPage() { Consumables - Equipments + Additional Members + + + Additional Members + + + Actions @@ -191,6 +202,9 @@ export default function TransactionsListPage() { transaction.borrower.name .toLowerCase() .includes(filter.toLowerCase()) || + transaction.additional_members + .toLowerCase() + .includes(filter.toLowerCase()) || transaction.teacher.name .toLowerCase() .includes(filter.toLowerCase()) || @@ -315,6 +329,28 @@ export default function TransactionsListPage() { > {transaction.consumables} + { + if ( + transaction.transaction_status != "Finalized" && + transaction.transaction_status != "Rejected" + ) { + SetSelectedTransaction(transaction.id); + SetEditTransactionOpen(true); + } + }} + > + {transaction.additional_members} +

Involved Items: {transaction.equipments.length} @@ -405,6 +441,46 @@ export default function TransactionsListPage() { + + + )) ) : (