From 4289a8290b964b440460a9902f4a0c3a58ca935a Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 27 Aug 2023 21:01:35 +0200 Subject: [PATCH] added permissions and changed to url paths --- src/Components/AppRoutes/index.js | 49 ++++ .../CreateEquipmentDocumentationModal.js | 33 +-- .../EditEquipmentDocumentationModal.js | 24 +- .../ViewEquipmentDocumentation.js | 275 +++++++++++------- src/Pages/EquipmentDocumentation/index.js | 85 ++++-- src/utils.js | 4 +- 6 files changed, 290 insertions(+), 180 deletions(-) diff --git a/src/Components/AppRoutes/index.js b/src/Components/AppRoutes/index.js index 06c3243..6a39f2d 100644 --- a/src/Components/AppRoutes/index.js +++ b/src/Components/AppRoutes/index.js @@ -17,6 +17,9 @@ const PageNotFound = lazy(() => import("../../Pages/PageNotFound")); const EquipmentDocumentationOverview = lazy(() => import("../../Pages/EquipmentDocumentation") ); +const ViewEquipmentDocumentations = lazy(() => + import("../../Pages/EquipmentDocumentation/ViewEquipmentDocumentation") +); function SuspenseFallback({ children }) { return ( @@ -72,6 +75,52 @@ export default function AppRoutes() { /> )} + {hasPermission( + appContext.userPermissions, + Constants.PERMISSIONS.EQUIPMENT_DOCUMENTATION.VIEW + ) && ( + + + + } + /> + )} + + {hasPermission( + appContext.userPermissions, + Constants.PERMISSIONS.EQUIPMENT_DOCUMENTATION.EDIT + ) && ( + + + + } + /> + )} + + {hasPermission( + appContext.userPermissions, + Constants.PERMISSIONS.EQUIPMENT_DOCUMENTATION.CREATE + ) && ( + + + + } + /> + )} + - - - setIsOpen(false)} - stockItemId={stockItemId} - fetchDocumentation={fetchDocumentation} - /> - + ); } diff --git a/src/Pages/EquipmentDocumentation/EditEquipmentDocumentationModal.js b/src/Pages/EquipmentDocumentation/EditEquipmentDocumentationModal.js index 9b8e0bc..9d81627 100644 --- a/src/Pages/EquipmentDocumentation/EditEquipmentDocumentationModal.js +++ b/src/Pages/EquipmentDocumentation/EditEquipmentDocumentationModal.js @@ -1,26 +1,18 @@ -import { EditOutlined } from "@ant-design/icons"; -import { useState } from "react"; import { EquipmentDocumentationViewEditComponent } from "."; export default function EditEquipmentDocumentationModal({ + isOpen, stockItemId, documentationId, fetchDocumentation, }) { - const [isOpen, setIsOpen] = useState(false); - return ( - <> - setIsOpen(true)} /> - - setIsOpen(false)} - stockItemId={stockItemId} - documentationId={documentationId} - fetchDocumentation={fetchDocumentation} - /> - + ); } diff --git a/src/Pages/EquipmentDocumentation/ViewEquipmentDocumentation.js b/src/Pages/EquipmentDocumentation/ViewEquipmentDocumentation.js index 5af691e..0605c50 100644 --- a/src/Pages/EquipmentDocumentation/ViewEquipmentDocumentation.js +++ b/src/Pages/EquipmentDocumentation/ViewEquipmentDocumentation.js @@ -1,23 +1,44 @@ -import { Card, Col, Popover, Result, Row, Spin, Typography } from "antd"; +import { + Button, + Card, + Col, + Popover, + Result, + Row, + Spin, + Typography, +} from "antd"; import { useEffect, useState } from "react"; import CreateEquipmentDocumentationModal from "./CreateEquipmentDocumentationModal"; -import { AppStyle, Constants, FormatDatetime, myFetch } from "../../utils"; +import { + AppStyle, + Constants, + FormatDatetime, + hasPermission, + myFetch, +} from "../../utils"; import { BookOutlined, + EditOutlined, InfoCircleOutlined, + PlusOutlined, ToolOutlined, } from "@ant-design/icons"; import EditEquipmentDocumentationModal from "./EditEquipmentDocumentationModal"; -import { NoteComponent } from "."; +import { NoteComponent, ScannerComponent } from "."; import { useTranslation } from "react-i18next"; import { MyAvatar } from "../../Components/MyAvatar"; import { useAppContext } from "../../Contexts/AppContext"; +import { useNavigate, useParams } from "react-router-dom"; -export default function ViewEquipmentDocumentations({ scannerResult }) { +export default function ViewEquipmentDocumentations({ + isEditEquipmentDocumentationModalOpen, + isCreateEquipmentDocumentationModalOpen, +}) { const { t } = useTranslation(); + const navigate = useNavigate(); const appContext = useAppContext(); - - console.log("render ViewEquipmentDocumentations"); + const { paramStockId, paramDocumentationId } = useParams(); const [equipmentDocumentationResponse, setEquipmentDocumentationResponse] = useState(null); @@ -27,73 +48,50 @@ export default function ViewEquipmentDocumentations({ scannerResult }) { const fetchDocumentation = () => { setIsEquipmentDocumentationLoading(true); - myFetch(`/equipment/documentations/${scannerResult}`, "GET").then( - (data) => { - const updatedData = { ...data }; + myFetch(`/equipment/documentations/${paramStockId}`, "GET").then((data) => { + const updatedData = { ...data }; - // sort by date - // last created will be on top of the list - updatedData.Documentations = data.Documentations.sort( - (a, b) => new Date(b.CreatedAt) - new Date(a.CreatedAt) - ); + // sort by date + // last created will be on top of the list + updatedData.Documentations = data.Documentations.sort( + (a, b) => new Date(b.CreatedAt) - new Date(a.CreatedAt) + ); - setIsEquipmentDocumentationLoading(false); - setEquipmentDocumentationResponse(updatedData); - } + setIsEquipmentDocumentationLoading(false); + setEquipmentDocumentationResponse(updatedData); + }); + }; + + useEffect(() => fetchDocumentation(), [paramStockId]); + + const CreateEquipmentDocumentationButton = ({ buttonBlock }) => { + if ( + !hasPermission( + appContext.userPermissions, + Constants.PERMISSIONS.EQUIPMENT_DOCUMENTATION.CREATE + ) + ) + return null; + + return ( + ); }; - useEffect(() => fetchDocumentation(), [scannerResult]); - - const CreateDocumentationButton = () => { - const InvexStockItemThumbnail = ({ width }) => { - return ( - - ); - }; - + const InvexStockItemThumbnail = ({ width }) => { return ( - - - {equipmentDocumentationResponse.Documentations.length !== 0 && ( - } - > - <> - - - - )} - - - {scannerResult} - - - - - - - + ); }; @@ -173,11 +171,15 @@ export default function ViewEquipmentDocumentations({ scannerResult }) { /> - + {hasPermission( + appContext.userPermissions, + Constants.PERMISSIONS.EQUIPMENT_DOCUMENTATION.EDIT + ) && ( + navigate(`edit/${documentation.Id}`)} + /> + )} @@ -197,70 +199,129 @@ export default function ViewEquipmentDocumentations({ scannerResult }) { if (isEquipmentDocumentationLoading) { return ( -
- -
+ <> + + +
+ +
+ ); } - if (equipmentDocumentationResponse === null) return null; + if (equipmentDocumentationResponse === null) return ; // backend unauthorized to access invex if (equipmentDocumentationResponse.Status === 401) { return ( - + <> + + + + ); } // stock item doesn't exists on invex if (equipmentDocumentationResponse.Status === 404) { return ( - + <> + + + + ); } if (equipmentDocumentationResponse.Documentations.length === 0) { return ( - , - ]} - /> + <> + + + , + ]} + /> + ); } return ( <> - + + + + + {equipmentDocumentationResponse.Documentations.length !== 0 && ( + } + > + <> + + + + )} + + + {paramStockId} + + + + + + + {equipmentDocumentationResponse.Documentations.map( (documentation, index) => ( ) )} + + + + ); } diff --git a/src/Pages/EquipmentDocumentation/index.js b/src/Pages/EquipmentDocumentation/index.js index 8867b4f..44adc8b 100644 --- a/src/Pages/EquipmentDocumentation/index.js +++ b/src/Pages/EquipmentDocumentation/index.js @@ -25,7 +25,6 @@ import { import { AppStyle, Constants, myFetch } from "../../utils"; import { useEffect, useRef, useState } from "react"; import { QrScanner } from "@yudiel/react-qr-scanner"; -import ViewEquipmentDocumentations from "./ViewEquipmentDocumentation"; import MyModal, { MyModalCloseCreateButtonFooter, MyModalCloseSaveButtonFooter, @@ -34,14 +33,42 @@ import Webcam from "react-webcam"; import TextArea from "antd/es/input/TextArea"; import { useTranslation } from "react-i18next"; import MyTypography from "../../Components/MyTypography"; +import { useNavigate } from "react-router-dom"; export default function EquipmentDocumentationOverview() { const { t } = useTranslation(); + + return ( + <> + + + + + ); +} + +export function ScannerComponent() { + const navigate = useNavigate(); + const { t } = useTranslation(); + + const handleScannedEquipment = (scannedEquipment) => { + navigate( + `${Constants.ROUTE_PATHS.EQUIPMENT_DOCUMENTATION_VIEW}${scannedEquipment}` + ); + }; + const [messageApi, messageContextHolder] = message.useMessage({ maxCount: 2, }); - const [scannerResult, setScannerResult] = useState(""); const [isScannerActive, setIsScannerActive] = useState(false); const [inputValue, setInputValue] = useState(""); @@ -73,6 +100,7 @@ export default function EquipmentDocumentationOverview() { return ( <> {messageContextHolder} + @@ -94,8 +122,11 @@ export default function EquipmentDocumentationOverview() { return; } - setScannerResult(JSON.parse(result).stockitem.toString()); setIsScannerActive(false); + + handleScannedEquipment( + JSON.parse(result).stockitem.toString() + ); }} onError={(error) => console.error(error?.message)} /> @@ -143,7 +174,7 @@ export default function EquipmentDocumentationOverview() { return; } - setScannerResult(inputValue); + handleScannedEquipment(inputValue); }} > {t( @@ -156,20 +187,6 @@ export default function EquipmentDocumentationOverview() { - - {scannerResult === "" ? ( - - ) : ( - - )} ); } @@ -179,11 +196,11 @@ export const EmptyNote = { Image: null, Description: "" }; export function EquipmentDocumentationViewEditComponent({ createMode, isOpen, - onCancel, fetchDocumentation, stockItemId, documentationId, }) { + const navigate = useNavigate(); const { t } = useTranslation(); const [title, setTitle] = useState( createMode @@ -201,6 +218,12 @@ export function EquipmentDocumentationViewEditComponent({ useState(false); const documentationResponse = useRef(); + const handleCancel = () => { + navigate( + `${Constants.ROUTE_PATHS.EQUIPMENT_DOCUMENTATION_VIEW}${stockItemId}` + ); + }; + const handleCreate = () => { setIsDocumentationUploading(true); @@ -219,12 +242,14 @@ export function EquipmentDocumentationViewEditComponent({ notes: updatedNotes, }; - myFetch(`/equipment/documentation/create`, "POST", body, {}).then( - (data) => { - setIsDocumentationUploading(false); - fetchDocumentation(); - onCancel(); - } + myFetch(`/equipment/documentation/create`, "POST", body, {}).then(() => { + setIsDocumentationUploading(false); + fetchDocumentation(); + handleCancel(); + }); + + navigate( + `${Constants.ROUTE_PATHS.EQUIPMENT_DOCUMENTATION_VIEW}${stockItemId}` ); }; @@ -248,10 +273,10 @@ export function EquipmentDocumentationViewEditComponent({ notes: updatedNotes, }; - myFetch(`/equipment/documentation/edit`, "POST", body, {}).then((data) => { + myFetch(`/equipment/documentation/edit`, "POST", body, {}).then(() => { setIsDocumentationUploading(false); fetchDocumentation(); - onCancel(); + handleCancel(); }); }; @@ -329,7 +354,7 @@ export function EquipmentDocumentationViewEditComponent({ return ( ) : ( ) diff --git a/src/utils.js b/src/utils.js index c1ff791..628d585 100644 --- a/src/utils.js +++ b/src/utils.js @@ -46,7 +46,7 @@ export const Constants = { WS_ADDRESS: wsAddress, ROUTE_PATHS: { EQUIPMENT_DOCUMENTATION: "/equipment-documentation", - //EQUIPMENT_DOCUMENTATION_VIEW: "/equipment-documentation/", + EQUIPMENT_DOCUMENTATION_VIEW: "/equipment-documentation/", EQUIPMENT_DOCUMENTATION_CREATE: "/equipment-documentation/create/", GROUP_TASKS: "/group-tasks", GROUP_TASKS_VIEW: "/group-tasks/", @@ -86,6 +86,8 @@ export const Constants = { PERMISSIONS: { EQUIPMENT_DOCUMENTATION: { VIEW: "equipment_documentation.view", + CREATE: "equipment_documentation.create", + EDIT: "equipment_documentation.edit", }, GROUP_TASKS: { OVERVIEW: {