diff --git a/src/file-processor/app/api/routes/document.py b/src/file-processor/app/api/routes/document.py index f4df7d6..56f95c7 100644 --- a/src/file-processor/app/api/routes/document.py +++ b/src/file-processor/app/api/routes/document.py @@ -14,6 +14,7 @@ from starlette.responses import Response from app.api.dependencies import get_document_service, get_current_user from app.models.document import DocumentResponse, FileDocument +from app.models.user import UserInDB from app.services.document_service import DocumentService logger = logging.getLogger(__name__) @@ -123,7 +124,7 @@ def _map_file_document_to_response( def list_documents( skip: int = Query(0, ge=0, description="Number of documents to skip"), limit: int = Query(100, ge=1, le=1000, description="Maximum number of documents to return"), - UserInDB=Depends(get_current_user), + user: UserInDB = Depends(get_current_user), document_service: DocumentService = Depends(get_document_service) ) -> List[DocumentResponse]: """ @@ -163,7 +164,8 @@ def list_documents( @router.get("/objects/{file_hash}") async def get_object_by_hash( file_hash: str = Path(..., description="SHA256 hash of the object to retrieve"), - document_service: DocumentService = Depends(get_document_service) + document_service: DocumentService = Depends(get_document_service), + user: UserInDB = Depends(get_current_user), ): """ Serve object content by its hash. diff --git a/src/frontend/src/components/common/Header.jsx b/src/frontend/src/components/common/Header.jsx index 436c874..586276c 100644 --- a/src/frontend/src/components/common/Header.jsx +++ b/src/frontend/src/components/common/Header.jsx @@ -13,7 +13,7 @@ const Header = () => { }; return ( -
+

MyDocManager

diff --git a/src/frontend/src/components/common/Layout.jsx b/src/frontend/src/components/common/Layout.jsx index 8b9cf96..5a28488 100644 --- a/src/frontend/src/components/common/Layout.jsx +++ b/src/frontend/src/components/common/Layout.jsx @@ -1,15 +1,20 @@ import Header from './Header'; import {Outlet} from 'react-router-dom'; import Menu from "./Menu.jsx"; +import styles from './Layout.module.css'; const Layout = () => { return ( -
+
-
- -
- +
+ +
+
+ +
diff --git a/src/frontend/src/components/common/Layout.module.css b/src/frontend/src/components/common/Layout.module.css new file mode 100644 index 0000000..14c5357 --- /dev/null +++ b/src/frontend/src/components/common/Layout.module.css @@ -0,0 +1,30 @@ +/* Layout Container */ +.layoutContainer { + height: 100vh; + display: flex; + flex-direction: column; + background-color: var(--color-base-200); +} + + +/* Sidebar */ +.sidebar { + width: 16rem; /* 64px = 4rem, donc 256px = 16rem */ + background-color: var(--color-base-100); + box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + overflow-y: auto; +} + +/* Main Content Area */ +.mainContent { + flex: 1; + overflow-y: auto; +} + +/* Main Content Inner Container */ +.mainContentInner { + max-width: 80rem; /* container max-width */ + margin-left: auto; + margin-right: auto; + padding: 2rem 1rem; +} \ No newline at end of file diff --git a/src/frontend/src/components/documents/DocumentCard.jsx b/src/frontend/src/components/documents/DocumentCard.jsx index cd97e09..21c3800 100644 --- a/src/frontend/src/components/documents/DocumentCard.jsx +++ b/src/frontend/src/components/documents/DocumentCard.jsx @@ -4,7 +4,8 @@ * Supports different view modes: small, large, and detail */ -import React, { memo } from 'react'; +import React, {memo} from 'react'; +import {API_BASE_URL} from "../../utils/api.js"; /** * Formats file size to human-readable format @@ -32,6 +33,18 @@ const formatDate = (dateString) => { }); }; +/** + * Builds full URL from relative path + * @param {string} relativePath - Relative API path + * @returns {string} Full URL + */ +const buildFullUrl = (relativePath) => { + if (!relativePath) return ''; + // Use the base URL from your API configuration + const baseUrl = import.meta.env.VITE_API_BASE_URL || API_BASE_URL; + return `${baseUrl}${relativePath}`; +}; + /** * DocumentCard component * @param {Object} props @@ -41,8 +54,8 @@ const formatDate = (dateString) => { * @param {function(): void} props.onDelete - Callback when delete is clicked * @returns {JSX.Element} */ -const DocumentCard = memo(({ document, viewMode, onEdit, onDelete }) => { - const { name, originalFileType, thumbnailUrl, pageCount, fileSize, createdAt, tags, categories } = document; +const DocumentCard = memo(({document, viewMode, onEdit, onDelete}) => { + const {name, originalFileType, thumbnailUrl, pageCount, fileSize, createdAt, tags, categories} = document; // Determine card classes based on view mode const getCardClasses = () => { @@ -64,9 +77,9 @@ const DocumentCard = memo(({ document, viewMode, onEdit, onDelete }) => { const renderThumbnail = () => (
{`${thumbnailUrl} { aria-label="Edit document" title="Edit" > - - + +
diff --git a/src/frontend/src/utils/api.js b/src/frontend/src/utils/api.js index d839df6..b42bbd7 100644 --- a/src/frontend/src/utils/api.js +++ b/src/frontend/src/utils/api.js @@ -12,6 +12,8 @@ const api = axios.create({ }, }); +export { API_BASE_URL }; + // Request interceptor to add authentication token api.interceptors.request.use( (config) => {