diff --git a/packages/docs/guides/development-workflow.md b/packages/docs/guides/development-workflow.md index 2181aced4..1ecde3bf5 100644 --- a/packages/docs/guides/development-workflow.md +++ b/packages/docs/guides/development-workflow.md @@ -257,7 +257,6 @@ pnpm install ## Resources -- [Contributing Guide](/.github/Contributing.md) - Detailed contribution guidelines - [Architecture Diagrams](/architecture/) - System architecture - [Error Handling Guide](/guides/error-handling) - Error handling patterns - [Style Guide](/guides/style-guide) - UI/UX guidelines diff --git a/packages/landing/app.config.timestamp_1766853344755.js b/packages/landing/app.config.timestamp_1766853344755.js new file mode 100644 index 000000000..ab88ea3e8 --- /dev/null +++ b/packages/landing/app.config.timestamp_1766853344755.js @@ -0,0 +1,21 @@ +// app.config.js +import { defineConfig } from "@solidjs/start/config"; +import tailwindcss from "@tailwindcss/vite"; +var app_config_default = defineConfig({ + vite: { + plugins: [tailwindcss()], + build: { + target: ["es2020", "safari14"] + } + }, + server: { + preset: "static", + prerender: { + routes: ["/", "/about", "/contact", "/privacy", "/resources", "/security", "/terms"], + crawlLinks: true + } + } +}); +export { + app_config_default as default +}; diff --git a/packages/web/jsconfig.json b/packages/web/jsconfig.json index a70519a1e..88f23bb69 100644 --- a/packages/web/jsconfig.json +++ b/packages/web/jsconfig.json @@ -4,12 +4,11 @@ "paths": { "@/*": ["src/*"], "@components/*": ["src/components/*"], - "@auth-ui/*": ["src/components/auth-ui/*"], - "@checklist-ui/*": ["src/components/checklist-ui/*"], - "@project-ui/*": ["src/components/project-ui/*"], + "@auth/*": ["src/components/auth/*"], + "@checklist/*": ["src/components/checklist/*"], + "@project/*": ["src/components/project/*"], "@routes/*": ["src/routes/*"], "@primitives/*": ["src/primitives/*"], - "@auth/*": ["src/components/auth-ui/*"], "@offline/*": ["src/offline/*"], "@api/*": ["src/api/*"], "@config/*": ["src/config/*"], diff --git a/packages/web/src/AMSTAR2/checklist.js b/packages/web/src/AMSTAR2/checklist.js index 99453750b..d97f34ebb 100644 --- a/packages/web/src/AMSTAR2/checklist.js +++ b/packages/web/src/AMSTAR2/checklist.js @@ -198,6 +198,53 @@ function getSelectedAnswer(answers, question) { return null; } +/** + * Check if an AMSTAR2 checklist is complete (all questions have final answers). + * A question has a final answer if the last column has at least one option selected. + * + * @param {Object} checklist - The checklist object to validate + * @returns {boolean} True if all questions have final answers, false otherwise + */ +export function isAMSTAR2Complete(checklist) { + if (!checklist || typeof checklist !== 'object') return false; + + // All required AMSTAR2 questions + const requiredQuestions = [ + 'q1', + 'q2', + 'q3', + 'q4', + 'q5', + 'q6', + 'q7', + 'q8', + 'q9a', + 'q9b', + 'q10', + 'q11a', + 'q11b', + 'q12', + 'q13', + 'q14', + 'q15', + 'q16', + ]; + + // Check each required question has a final answer + for (const questionKey of requiredQuestions) { + const question = checklist[questionKey]; + if (!question || !Array.isArray(question.answers)) return false; + + // Check if the last column has at least one option selected + const lastCol = question.answers[question.answers.length - 1]; + if (!Array.isArray(lastCol)) return false; + const hasAnswer = lastCol.some(v => v === true); + if (!hasAnswer) return false; + } + + return true; +} + export function getAnswers(checklist) { if (!checklist || typeof checklist !== 'object') return null; const result = {}; diff --git a/packages/web/src/Layout.jsx b/packages/web/src/Layout.jsx index ce2664143..e4fd3aa0c 100644 --- a/packages/web/src/Layout.jsx +++ b/packages/web/src/Layout.jsx @@ -2,7 +2,7 @@ import { createSignal, onMount } from 'solid-js'; import Navbar from './components/Navbar.jsx'; import Sidebar from './components/sidebar/Sidebar.jsx'; import { Toaster } from '@corates/ui'; -import { ImpersonationBanner } from '@components/admin-ui/index.js'; +import { ImpersonationBanner } from '@/components/admin/index.js'; import { isImpersonating } from '@/stores/adminStore.js'; const SIDEBAR_STORAGE_KEY = 'corates-sidebar-open'; diff --git a/packages/web/src/Routes.jsx b/packages/web/src/Routes.jsx index 96316f832..6464ee045 100644 --- a/packages/web/src/Routes.jsx +++ b/packages/web/src/Routes.jsx @@ -1,24 +1,24 @@ import { Router, Route } from '@solidjs/router'; import Dashboard from './components/Dashboard.jsx'; -import SignIn from '@auth-ui/SignIn.jsx'; -import SignUp from '@auth-ui/SignUp.jsx'; -import CheckEmail from '@auth-ui/CheckEmail.jsx'; -import CompleteProfile from '@auth-ui/CompleteProfile.jsx'; -import ResetPassword from '@auth-ui/ResetPassword.jsx'; -import AuthLayout from '@auth-ui/AuthLayout.jsx'; +import SignIn from '@/components/auth/SignIn.jsx'; +import SignUp from '@/components/auth/SignUp.jsx'; +import CheckEmail from '@/components/auth/CheckEmail.jsx'; +import CompleteProfile from '@/components/auth/CompleteProfile.jsx'; +import ResetPassword from '@/components/auth/ResetPassword.jsx'; +import AuthLayout from '@/components/auth/AuthLayout.jsx'; import Layout from '@/Layout.jsx'; -import ChecklistYjsWrapper from '@checklist-ui/ChecklistYjsWrapper.jsx'; -import ReconciliationWrapper from '@/components/checklist-ui/compare/ReconciliationWrapper.jsx'; -import ProjectView from '@project-ui/ProjectView.jsx'; -import LocalChecklistView from '@checklist-ui/LocalChecklistView.jsx'; -import ProfilePage from '@components/profile-ui/ProfilePage.jsx'; -import SettingsPage from '@components/profile-ui/SettingsPage.jsx'; +import ChecklistYjsWrapper from '@/components/checklist/ChecklistYjsWrapper.jsx'; +import ReconciliationWrapper from '@/components/checklist/compare/ReconciliationWrapper.jsx'; +import ProjectView from '@/components/project/ProjectView.jsx'; +import LocalChecklistView from '@/components/checklist/LocalChecklistView.jsx'; +import ProfilePage from '@/components/profile/ProfilePage.jsx'; +import SettingsPage from '@/components/profile/SettingsPage.jsx'; import BillingPage from '@components/billing/BillingPage.jsx'; import NotFoundPage from '@components/NotFoundPage.jsx'; -import { AdminDashboard } from '@components/admin-ui/index.js'; -import StorageManagement from '@components/admin-ui/StorageManagement.jsx'; +import { AdminDashboard } from '@/components/admin/index.js'; +import StorageManagement from '@/components/admin/StorageManagement.jsx'; import { BASEPATH } from '@config/api.js'; -import ProtectedGuard from '@/components/auth-ui/ProtectedGuard.jsx'; +import ProtectedGuard from '@/components/auth/ProtectedGuard.jsx'; export default function AppRoutes() { return ( diff --git a/packages/web/src/components/Dashboard.jsx b/packages/web/src/components/Dashboard.jsx index 02f19ef01..a8d65803f 100644 --- a/packages/web/src/components/Dashboard.jsx +++ b/packages/web/src/components/Dashboard.jsx @@ -1,6 +1,6 @@ import { Show } from 'solid-js'; -import ProjectDashboard from '@project-ui/ProjectDashboard.jsx'; -import ChecklistsDashboard from '@checklist-ui/ChecklistsDashboard.jsx'; +import ProjectDashboard from '@/components/project/ProjectDashboard.jsx'; +import ChecklistsDashboard from '@/components/checklist/ChecklistsDashboard.jsx'; import { useBetterAuth } from '@api/better-auth-store.js'; import { API_BASE } from '@config/api.js'; diff --git a/packages/web/src/components/admin-ui/AdminDashboard.jsx b/packages/web/src/components/admin/AdminDashboard.jsx similarity index 100% rename from packages/web/src/components/admin-ui/AdminDashboard.jsx rename to packages/web/src/components/admin/AdminDashboard.jsx diff --git a/packages/web/src/components/admin-ui/ImpersonationBanner.jsx b/packages/web/src/components/admin/ImpersonationBanner.jsx similarity index 100% rename from packages/web/src/components/admin-ui/ImpersonationBanner.jsx rename to packages/web/src/components/admin/ImpersonationBanner.jsx diff --git a/packages/web/src/components/admin-ui/StatsCard.jsx b/packages/web/src/components/admin/StatsCard.jsx similarity index 100% rename from packages/web/src/components/admin-ui/StatsCard.jsx rename to packages/web/src/components/admin/StatsCard.jsx diff --git a/packages/web/src/components/admin-ui/StorageManagement.jsx b/packages/web/src/components/admin/StorageManagement.jsx similarity index 100% rename from packages/web/src/components/admin-ui/StorageManagement.jsx rename to packages/web/src/components/admin/StorageManagement.jsx diff --git a/packages/web/src/components/admin-ui/UserTable.jsx b/packages/web/src/components/admin/UserTable.jsx similarity index 100% rename from packages/web/src/components/admin-ui/UserTable.jsx rename to packages/web/src/components/admin/UserTable.jsx diff --git a/packages/web/src/components/admin-ui/index.js b/packages/web/src/components/admin/index.js similarity index 100% rename from packages/web/src/components/admin-ui/index.js rename to packages/web/src/components/admin/index.js diff --git a/packages/web/src/components/auth-ui/AuthButtons.jsx b/packages/web/src/components/auth/AuthButtons.jsx similarity index 100% rename from packages/web/src/components/auth-ui/AuthButtons.jsx rename to packages/web/src/components/auth/AuthButtons.jsx diff --git a/packages/web/src/components/auth-ui/AuthLayout.jsx b/packages/web/src/components/auth/AuthLayout.jsx similarity index 100% rename from packages/web/src/components/auth-ui/AuthLayout.jsx rename to packages/web/src/components/auth/AuthLayout.jsx diff --git a/packages/web/src/components/auth-ui/CheckEmail.jsx b/packages/web/src/components/auth/CheckEmail.jsx similarity index 100% rename from packages/web/src/components/auth-ui/CheckEmail.jsx rename to packages/web/src/components/auth/CheckEmail.jsx diff --git a/packages/web/src/components/auth-ui/CompleteProfile.jsx b/packages/web/src/components/auth/CompleteProfile.jsx similarity index 100% rename from packages/web/src/components/auth-ui/CompleteProfile.jsx rename to packages/web/src/components/auth/CompleteProfile.jsx diff --git a/packages/web/src/components/auth-ui/ErrorMessage.jsx b/packages/web/src/components/auth/ErrorMessage.jsx similarity index 100% rename from packages/web/src/components/auth-ui/ErrorMessage.jsx rename to packages/web/src/components/auth/ErrorMessage.jsx diff --git a/packages/web/src/components/auth-ui/LastLoginHint.jsx b/packages/web/src/components/auth/LastLoginHint.jsx similarity index 100% rename from packages/web/src/components/auth-ui/LastLoginHint.jsx rename to packages/web/src/components/auth/LastLoginHint.jsx diff --git a/packages/web/src/components/auth-ui/MagicLinkForm.jsx b/packages/web/src/components/auth/MagicLinkForm.jsx similarity index 100% rename from packages/web/src/components/auth-ui/MagicLinkForm.jsx rename to packages/web/src/components/auth/MagicLinkForm.jsx diff --git a/packages/web/src/components/auth-ui/ProtectedGuard.jsx b/packages/web/src/components/auth/ProtectedGuard.jsx similarity index 100% rename from packages/web/src/components/auth-ui/ProtectedGuard.jsx rename to packages/web/src/components/auth/ProtectedGuard.jsx diff --git a/packages/web/src/components/auth-ui/ResetPassword.jsx b/packages/web/src/components/auth/ResetPassword.jsx similarity index 100% rename from packages/web/src/components/auth-ui/ResetPassword.jsx rename to packages/web/src/components/auth/ResetPassword.jsx diff --git a/packages/web/src/components/auth-ui/RoleSelector.jsx b/packages/web/src/components/auth/RoleSelector.jsx similarity index 100% rename from packages/web/src/components/auth-ui/RoleSelector.jsx rename to packages/web/src/components/auth/RoleSelector.jsx diff --git a/packages/web/src/components/auth-ui/SignIn.jsx b/packages/web/src/components/auth/SignIn.jsx similarity index 100% rename from packages/web/src/components/auth-ui/SignIn.jsx rename to packages/web/src/components/auth/SignIn.jsx diff --git a/packages/web/src/components/auth-ui/SignUp.jsx b/packages/web/src/components/auth/SignUp.jsx similarity index 100% rename from packages/web/src/components/auth-ui/SignUp.jsx rename to packages/web/src/components/auth/SignUp.jsx diff --git a/packages/web/src/components/auth-ui/SocialAuthButtons.jsx b/packages/web/src/components/auth/SocialAuthButtons.jsx similarity index 100% rename from packages/web/src/components/auth-ui/SocialAuthButtons.jsx rename to packages/web/src/components/auth/SocialAuthButtons.jsx diff --git a/packages/web/src/components/auth-ui/StepIndicator.jsx b/packages/web/src/components/auth/StepIndicator.jsx similarity index 100% rename from packages/web/src/components/auth-ui/StepIndicator.jsx rename to packages/web/src/components/auth/StepIndicator.jsx diff --git a/packages/web/src/components/auth-ui/StrengthIndicator.jsx b/packages/web/src/components/auth/StrengthIndicator.jsx similarity index 100% rename from packages/web/src/components/auth-ui/StrengthIndicator.jsx rename to packages/web/src/components/auth/StrengthIndicator.jsx diff --git a/packages/web/src/components/auth-ui/TwoFactorVerify.jsx b/packages/web/src/components/auth/TwoFactorVerify.jsx similarity index 100% rename from packages/web/src/components/auth-ui/TwoFactorVerify.jsx rename to packages/web/src/components/auth/TwoFactorVerify.jsx diff --git a/packages/web/src/components/checklist-ui/AMSTAR2Checklist.jsx b/packages/web/src/components/checklist/AMSTAR2Checklist.jsx similarity index 99% rename from packages/web/src/components/checklist-ui/AMSTAR2Checklist.jsx rename to packages/web/src/components/checklist/AMSTAR2Checklist.jsx index ab6cf57c5..64da4aa69 100644 --- a/packages/web/src/components/checklist-ui/AMSTAR2Checklist.jsx +++ b/packages/web/src/components/checklist/AMSTAR2Checklist.jsx @@ -3,7 +3,7 @@ import { AMSTAR_CHECKLIST } from '@/AMSTAR2/checklist-map.js'; import { createChecklist as createAMSTAR2Checklist } from '@/AMSTAR2/checklist.js'; import { FaSolidCircleInfo } from 'solid-icons/fa'; import { Tooltip } from '@corates/ui'; -import NoteEditor from '@checklist-ui/common/NoteEditor.jsx'; +import NoteEditor from '@/components/checklist/common/NoteEditor.jsx'; export function Question1(props) { const state = () => props.checklistState().q1; diff --git a/packages/web/src/components/checklist-ui/ChecklistWithPdf.jsx b/packages/web/src/components/checklist/ChecklistWithPdf.jsx similarity index 86% rename from packages/web/src/components/checklist-ui/ChecklistWithPdf.jsx rename to packages/web/src/components/checklist/ChecklistWithPdf.jsx index bda9f9b8e..e1b24873d 100644 --- a/packages/web/src/components/checklist-ui/ChecklistWithPdf.jsx +++ b/packages/web/src/components/checklist/ChecklistWithPdf.jsx @@ -5,9 +5,9 @@ * Supports multiple checklist types via the GenericChecklist component. */ -import GenericChecklist from '@checklist-ui/GenericChecklist.jsx'; -import PdfViewer from '@/components/checklist-ui/pdf/PdfViewer.jsx'; -import SplitScreenLayout from '@checklist-ui/SplitScreenLayout.jsx'; +import GenericChecklist from '@/components/checklist/GenericChecklist.jsx'; +import PdfViewer from '@/components/checklist/pdf/PdfViewer.jsx'; +import SplitScreenLayout from '@/components/checklist/SplitScreenLayout.jsx'; export default function ChecklistWithPdf(props) { // props.checklistType - the type of checklist ('AMSTAR2', 'ROBINS_I', etc.) @@ -24,6 +24,7 @@ export default function ChecklistWithPdf(props) { // props.selectedPdfId - currently selected PDF ID // props.onPdfSelect - handler for PDF selection change // props.getQuestionNote - function to get Y.Text for a question note + // props.pdfUrl - optional PDF URL (for server-hosted PDFs) return (
@@ -33,6 +34,8 @@ export default function ChecklistWithPdf(props) { defaultRatio={50} showSecondPanel={false} headerContent={props.headerContent} + pdfUrl={props.pdfUrl} + pdfData={props.pdfData} > {/* First panel: Checklist (type-aware) */} { - const checklist = currentChecklist(); - const study = currentStudy(); - if (!checklist) return 'todo'; + // Validate checklist completion - only for AMSTAR2 checklists + const isChecklistValid = createMemo(() => { + const type = checklistType(); + const checklist = checklistForUI(); - if (checklist.status === CHECKLIST_STATUS.COMPLETED) { - // Completed checklist: navigate to appropriate tab - const isSingleReviewer = study?.reviewer1 && !study?.reviewer2; - return isSingleReviewer ? 'completed' : 'reconcile'; - } + // For non-AMSTAR2 checklists, allow completion (no validation) + if (type !== 'AMSTAR2') return true; - if (checklist.status === CHECKLIST_STATUS.AWAITING_RECONCILE) { - return 'reconcile'; - } + // For AMSTAR2, check if all questions have final answers + if (!checklist) return false; + return isAMSTAR2Complete(checklist); + }); + + // Generate PDF URL for opening in new tab + const pdfUrl = createMemo(() => { + const fileName = pdfFileName(); + if (!fileName) return null; + return getPdfUrl(params.projectId, params.studyId, fileName); + }); - return 'todo'; + // Determine back button navigation from tab query param + const getBackTab = () => { + // console.log('location', location.search); + const tabFromUrl = new URLSearchParams(location.search).get('tab'); + return tabFromUrl || 'overview'; }; // Header content for the split screen toolbar (left side) @@ -357,9 +376,16 @@ export default function ChecklistYjsWrapper() { > + + {/* Open PDF in new tab */} + +
+ +
); diff --git a/packages/web/src/components/checklist-ui/SplitScreenLayout.jsx b/packages/web/src/components/checklist/SplitScreenLayout.jsx similarity index 97% rename from packages/web/src/components/checklist-ui/SplitScreenLayout.jsx rename to packages/web/src/components/checklist/SplitScreenLayout.jsx index a579a64e6..744b27e50 100644 --- a/packages/web/src/components/checklist-ui/SplitScreenLayout.jsx +++ b/packages/web/src/components/checklist/SplitScreenLayout.jsx @@ -12,6 +12,8 @@ export default function SplitScreenLayout(props) { // props.defaultRatio - default split ratio (default: 50) // props.showSecondPanel - external control for second panel visibility // props.secondPanelLabel - label for toggle button (e.g., "PDF viewer") + // props.pdfUrl - optional PDF URL (for server-hosted PDFs) + // props.pdfData - optional PDF ArrayBuffer (for local PDFs) // Layout: 'vertical' = side by side, 'horizontal' = stacked const [layout, setLayout] = createSignal(props.defaultLayout || 'vertical'); const [splitRatio, setSplitRatio] = createSignal(props.defaultRatio || 50); @@ -92,6 +94,8 @@ export default function SplitScreenLayout(props) { defaultRatioLabel={ props.defaultRatio ? `${props.defaultRatio}/${100 - props.defaultRatio}` : '50/50' } + pdfUrl={props.pdfUrl} + pdfData={props.pdfData} />
diff --git a/packages/web/src/components/checklist-ui/common/NoteEditor.jsx b/packages/web/src/components/checklist/common/NoteEditor.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/common/NoteEditor.jsx rename to packages/web/src/components/checklist/common/NoteEditor.jsx diff --git a/packages/web/src/components/checklist-ui/compare/AnswerPanel.jsx b/packages/web/src/components/checklist/compare/AnswerPanel.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/AnswerPanel.jsx rename to packages/web/src/components/checklist/compare/AnswerPanel.jsx diff --git a/packages/web/src/components/checklist-ui/compare/ChecklistReconciliation.jsx b/packages/web/src/components/checklist/compare/ChecklistReconciliation.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/ChecklistReconciliation.jsx rename to packages/web/src/components/checklist/compare/ChecklistReconciliation.jsx diff --git a/packages/web/src/components/checklist-ui/compare/Footer.jsx b/packages/web/src/components/checklist/compare/Footer.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/Footer.jsx rename to packages/web/src/components/checklist/compare/Footer.jsx diff --git a/packages/web/src/components/checklist-ui/compare/MultiPartQuestionPage.jsx b/packages/web/src/components/checklist/compare/MultiPartQuestionPage.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/MultiPartQuestionPage.jsx rename to packages/web/src/components/checklist/compare/MultiPartQuestionPage.jsx diff --git a/packages/web/src/components/checklist-ui/compare/Navbar.jsx b/packages/web/src/components/checklist/compare/Navbar.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/Navbar.jsx rename to packages/web/src/components/checklist/compare/Navbar.jsx diff --git a/packages/web/src/components/checklist-ui/compare/NotesCompareSection.jsx b/packages/web/src/components/checklist/compare/NotesCompareSection.jsx similarity index 99% rename from packages/web/src/components/checklist-ui/compare/NotesCompareSection.jsx rename to packages/web/src/components/checklist/compare/NotesCompareSection.jsx index 63cd99d7d..d009b7f9c 100644 --- a/packages/web/src/components/checklist-ui/compare/NotesCompareSection.jsx +++ b/packages/web/src/components/checklist/compare/NotesCompareSection.jsx @@ -8,7 +8,7 @@ import { createSignal, createEffect, onCleanup, Show } from 'solid-js'; import { BiRegularChevronRight } from 'solid-icons/bi'; import { BsJournalText, BsClipboard2 } from 'solid-icons/bs'; import { Collapsible } from '@corates/ui'; -import NoteEditor from '@checklist-ui/common/NoteEditor.jsx'; +import NoteEditor from '@/components/checklist/common/NoteEditor.jsx'; const MAX_LENGTH = 2000; diff --git a/packages/web/src/components/checklist-ui/compare/ReconciliationQuestionPage.jsx b/packages/web/src/components/checklist/compare/ReconciliationQuestionPage.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/ReconciliationQuestionPage.jsx rename to packages/web/src/components/checklist/compare/ReconciliationQuestionPage.jsx diff --git a/packages/web/src/components/checklist-ui/compare/ReconciliationWithPdf.jsx b/packages/web/src/components/checklist/compare/ReconciliationWithPdf.jsx similarity index 94% rename from packages/web/src/components/checklist-ui/compare/ReconciliationWithPdf.jsx rename to packages/web/src/components/checklist/compare/ReconciliationWithPdf.jsx index fccafb44c..060351a57 100644 --- a/packages/web/src/components/checklist-ui/compare/ReconciliationWithPdf.jsx +++ b/packages/web/src/components/checklist/compare/ReconciliationWithPdf.jsx @@ -6,10 +6,10 @@ import { Show, createMemo } from 'solid-js'; import { createStore } from 'solid-js/store'; import { AiOutlineArrowLeft } from 'solid-icons/ai'; -import PdfViewer from '@/components/checklist-ui/pdf/PdfViewer.jsx'; +import PdfViewer from '@/components/checklist/pdf/PdfViewer.jsx'; import ChecklistReconciliation from './ChecklistReconciliation.jsx'; import Navbar from './Navbar.jsx'; -import SplitScreenLayout from '@/components/checklist-ui/SplitScreenLayout.jsx'; +import SplitScreenLayout from '@/components/checklist/SplitScreenLayout.jsx'; export default function ReconciliationWithPdf(props) { // props.checklist1 - First reviewer's checklist data @@ -22,6 +22,7 @@ export default function ReconciliationWithPdf(props) { // props.reviewer2Name - Display name for second reviewer // props.pdfData - ArrayBuffer of the study PDF (optional) // props.pdfFileName - Name of the PDF file (optional) + // props.pdfUrl - URL for the PDF (optional, for server-hosted PDFs) // props.pdfLoading - Whether PDF is still loading // props.pdfs - Array of PDFs for multi-PDF selection // props.selectedPdfId - Currently selected PDF ID @@ -83,9 +84,11 @@ export default function ReconciliationWithPdf(props) { {/* First panel: Reconciliation view */} { + const fileName = pdfFileName(); + if (!fileName) return null; + return getPdfUrl(params.projectId, params.studyId, fileName); + }); + // Get checklist metadata from store const checklist1Meta = createMemo(() => { const study = currentStudy(); @@ -445,6 +452,7 @@ export default function ReconciliationWrapper() { onCancel={handleCancel} pdfData={pdfData()} pdfFileName={pdfFileName()} + pdfUrl={pdfUrl()} pdfLoading={pdfLoading()} pdfs={studyPdfs()} selectedPdfId={selectedPdfId()} diff --git a/packages/web/src/components/checklist-ui/compare/SummaryView.jsx b/packages/web/src/components/checklist/compare/SummaryView.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/compare/SummaryView.jsx rename to packages/web/src/components/checklist/compare/SummaryView.jsx diff --git a/packages/web/src/components/checklist-ui/compare/navbar-utils.js b/packages/web/src/components/checklist/compare/navbar-utils.js similarity index 100% rename from packages/web/src/components/checklist-ui/compare/navbar-utils.js rename to packages/web/src/components/checklist/compare/navbar-utils.js diff --git a/packages/web/src/components/checklist-ui/compare/reconciliation-store.js b/packages/web/src/components/checklist/compare/reconciliation-store.js similarity index 100% rename from packages/web/src/components/checklist-ui/compare/reconciliation-store.js rename to packages/web/src/components/checklist/compare/reconciliation-store.js diff --git a/packages/web/src/components/checklist-ui/pdf/PdfEmptyState.jsx b/packages/web/src/components/checklist/pdf/PdfEmptyState.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfEmptyState.jsx rename to packages/web/src/components/checklist/pdf/PdfEmptyState.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfList.jsx b/packages/web/src/components/checklist/pdf/PdfList.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfList.jsx rename to packages/web/src/components/checklist/pdf/PdfList.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfListItem.jsx b/packages/web/src/components/checklist/pdf/PdfListItem.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfListItem.jsx rename to packages/web/src/components/checklist/pdf/PdfListItem.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfSelector.jsx b/packages/web/src/components/checklist/pdf/PdfSelector.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfSelector.jsx rename to packages/web/src/components/checklist/pdf/PdfSelector.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfTagBadge.jsx b/packages/web/src/components/checklist/pdf/PdfTagBadge.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfTagBadge.jsx rename to packages/web/src/components/checklist/pdf/PdfTagBadge.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfTagSelect.jsx b/packages/web/src/components/checklist/pdf/PdfTagSelect.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfTagSelect.jsx rename to packages/web/src/components/checklist/pdf/PdfTagSelect.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfToolbar.jsx b/packages/web/src/components/checklist/pdf/PdfToolbar.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfToolbar.jsx rename to packages/web/src/components/checklist/pdf/PdfToolbar.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/PdfViewer.jsx b/packages/web/src/components/checklist/pdf/PdfViewer.jsx similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/PdfViewer.jsx rename to packages/web/src/components/checklist/pdf/PdfViewer.jsx diff --git a/packages/web/src/components/checklist-ui/pdf/index.js b/packages/web/src/components/checklist/pdf/index.js similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/index.js rename to packages/web/src/components/checklist/pdf/index.js diff --git a/packages/web/src/components/checklist-ui/pdf/pdfDocument.js b/packages/web/src/components/checklist/pdf/pdfDocument.js similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/pdfDocument.js rename to packages/web/src/components/checklist/pdf/pdfDocument.js diff --git a/packages/web/src/components/checklist-ui/pdf/pdfFileHandler.js b/packages/web/src/components/checklist/pdf/pdfFileHandler.js similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/pdfFileHandler.js rename to packages/web/src/components/checklist/pdf/pdfFileHandler.js diff --git a/packages/web/src/components/checklist-ui/pdf/pdfRenderer.js b/packages/web/src/components/checklist/pdf/pdfRenderer.js similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/pdfRenderer.js rename to packages/web/src/components/checklist/pdf/pdfRenderer.js diff --git a/packages/web/src/components/checklist-ui/pdf/pdfScrollHandler.js b/packages/web/src/components/checklist/pdf/pdfScrollHandler.js similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/pdfScrollHandler.js rename to packages/web/src/components/checklist/pdf/pdfScrollHandler.js diff --git a/packages/web/src/components/checklist-ui/pdf/pdfTextSelection.js b/packages/web/src/components/checklist/pdf/pdfTextSelection.js similarity index 95% rename from packages/web/src/components/checklist-ui/pdf/pdfTextSelection.js rename to packages/web/src/components/checklist/pdf/pdfTextSelection.js index 82445c73a..3a1b9a13d 100644 --- a/packages/web/src/components/checklist-ui/pdf/pdfTextSelection.js +++ b/packages/web/src/components/checklist/pdf/pdfTextSelection.js @@ -37,6 +37,10 @@ export function createTextSelectionLayer(container, page, initialViewport) { try { const textContent = await page.getTextContent(); + + // Check again after async operation - cleanup may have run + if (!textLayerDiv) return; + textItems = textContent.items; // Clear existing content @@ -92,6 +96,8 @@ export function createTextSelectionLayer(container, page, initialViewport) { span.style.height = `${itemHeight * viewport.scale}px`; span.style.display = 'inline-block'; + // Check again before appending - cleanup may have run during loop + if (!textLayerDiv) return; textLayerDiv.appendChild(span); } } catch (err) { diff --git a/packages/web/src/components/checklist-ui/pdf/usePdfJs.js b/packages/web/src/components/checklist/pdf/usePdfJs.js similarity index 100% rename from packages/web/src/components/checklist-ui/pdf/usePdfJs.js rename to packages/web/src/components/checklist/pdf/usePdfJs.js diff --git a/packages/web/src/components/profile-ui/AccountProviderCard.jsx b/packages/web/src/components/profile/AccountProviderCard.jsx similarity index 100% rename from packages/web/src/components/profile-ui/AccountProviderCard.jsx rename to packages/web/src/components/profile/AccountProviderCard.jsx diff --git a/packages/web/src/components/profile-ui/GoogleDriveSettings.jsx b/packages/web/src/components/profile/GoogleDriveSettings.jsx similarity index 100% rename from packages/web/src/components/profile-ui/GoogleDriveSettings.jsx rename to packages/web/src/components/profile/GoogleDriveSettings.jsx diff --git a/packages/web/src/components/profile-ui/LinkedAccountsSection.jsx b/packages/web/src/components/profile/LinkedAccountsSection.jsx similarity index 100% rename from packages/web/src/components/profile-ui/LinkedAccountsSection.jsx rename to packages/web/src/components/profile/LinkedAccountsSection.jsx diff --git a/packages/web/src/components/profile-ui/MergeAccountsDialog.jsx b/packages/web/src/components/profile/MergeAccountsDialog.jsx similarity index 100% rename from packages/web/src/components/profile-ui/MergeAccountsDialog.jsx rename to packages/web/src/components/profile/MergeAccountsDialog.jsx diff --git a/packages/web/src/components/profile-ui/ProfilePage.jsx b/packages/web/src/components/profile/ProfilePage.jsx similarity index 99% rename from packages/web/src/components/profile-ui/ProfilePage.jsx rename to packages/web/src/components/profile/ProfilePage.jsx index 326fd6f80..30d0dbb28 100644 --- a/packages/web/src/components/profile-ui/ProfilePage.jsx +++ b/packages/web/src/components/profile/ProfilePage.jsx @@ -3,7 +3,7 @@ import { useBetterAuth } from '@api/better-auth-store.js'; import { FiCamera } from 'solid-icons/fi'; import { showToast } from '@corates/ui'; import { LANDING_URL, API_BASE } from '@config/api.js'; -import { ROLES, getRoleLabel } from '@components/auth-ui/RoleSelector.jsx'; +import { ROLES, getRoleLabel } from '@/components/auth/RoleSelector.jsx'; import { compressImageFile } from '@lib/imageUtils.js'; const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; diff --git a/packages/web/src/components/profile-ui/SettingsPage.jsx b/packages/web/src/components/profile/SettingsPage.jsx similarity index 100% rename from packages/web/src/components/profile-ui/SettingsPage.jsx rename to packages/web/src/components/profile/SettingsPage.jsx diff --git a/packages/web/src/components/profile-ui/TwoFactorSetup.jsx b/packages/web/src/components/profile/TwoFactorSetup.jsx similarity index 100% rename from packages/web/src/components/profile-ui/TwoFactorSetup.jsx rename to packages/web/src/components/profile/TwoFactorSetup.jsx diff --git a/packages/web/src/components/project-ui/AddStudiesForm.jsx b/packages/web/src/components/project/AddStudiesForm.jsx similarity index 100% rename from packages/web/src/components/project-ui/AddStudiesForm.jsx rename to packages/web/src/components/project/AddStudiesForm.jsx diff --git a/packages/web/src/components/project-ui/ChecklistForm.jsx b/packages/web/src/components/project/ChecklistForm.jsx similarity index 100% rename from packages/web/src/components/project-ui/ChecklistForm.jsx rename to packages/web/src/components/project/ChecklistForm.jsx diff --git a/packages/web/src/components/project-ui/ChecklistRow.jsx b/packages/web/src/components/project/ChecklistRow.jsx similarity index 100% rename from packages/web/src/components/project-ui/ChecklistRow.jsx rename to packages/web/src/components/project/ChecklistRow.jsx diff --git a/packages/web/src/components/project-ui/ContactPrompt.jsx b/packages/web/src/components/project/ContactPrompt.jsx similarity index 100% rename from packages/web/src/components/project-ui/ContactPrompt.jsx rename to packages/web/src/components/project/ContactPrompt.jsx diff --git a/packages/web/src/components/project-ui/CreateProjectForm.jsx b/packages/web/src/components/project/CreateProjectForm.jsx similarity index 100% rename from packages/web/src/components/project-ui/CreateProjectForm.jsx rename to packages/web/src/components/project/CreateProjectForm.jsx diff --git a/packages/web/src/components/project-ui/PdfPreviewPanel.jsx b/packages/web/src/components/project/PdfPreviewPanel.jsx similarity index 96% rename from packages/web/src/components/project-ui/PdfPreviewPanel.jsx rename to packages/web/src/components/project/PdfPreviewPanel.jsx index ccb938948..6ada13354 100644 --- a/packages/web/src/components/project-ui/PdfPreviewPanel.jsx +++ b/packages/web/src/components/project/PdfPreviewPanel.jsx @@ -7,7 +7,7 @@ import { Show } from 'solid-js'; import SlidingPanel from './SlidingPanel.jsx'; -import PdfViewer from '@/components/checklist-ui/pdf/PdfViewer.jsx'; +import PdfViewer from '@/components/checklist/pdf/PdfViewer.jsx'; import pdfPreviewStore from '@/stores/pdfPreviewStore.js'; export default function PdfPreviewPanel() { diff --git a/packages/web/src/components/project-ui/ProjectCard.jsx b/packages/web/src/components/project/ProjectCard.jsx similarity index 100% rename from packages/web/src/components/project-ui/ProjectCard.jsx rename to packages/web/src/components/project/ProjectCard.jsx diff --git a/packages/web/src/components/project-ui/ProjectContext.jsx b/packages/web/src/components/project/ProjectContext.jsx similarity index 100% rename from packages/web/src/components/project-ui/ProjectContext.jsx rename to packages/web/src/components/project/ProjectContext.jsx diff --git a/packages/web/src/components/project-ui/ProjectDashboard.jsx b/packages/web/src/components/project/ProjectDashboard.jsx similarity index 100% rename from packages/web/src/components/project-ui/ProjectDashboard.jsx rename to packages/web/src/components/project/ProjectDashboard.jsx diff --git a/packages/web/src/components/project-ui/ProjectHeader.jsx b/packages/web/src/components/project/ProjectHeader.jsx similarity index 100% rename from packages/web/src/components/project-ui/ProjectHeader.jsx rename to packages/web/src/components/project/ProjectHeader.jsx diff --git a/packages/web/src/components/project-ui/ProjectView.jsx b/packages/web/src/components/project/ProjectView.jsx similarity index 97% rename from packages/web/src/components/project-ui/ProjectView.jsx rename to packages/web/src/components/project/ProjectView.jsx index 1c4050ecc..88dd41dca 100644 --- a/packages/web/src/components/project-ui/ProjectView.jsx +++ b/packages/web/src/components/project/ProjectView.jsx @@ -24,11 +24,11 @@ import { getChecklistCount } from '@/lib/checklist-domain.js'; import { ProjectProvider } from './ProjectContext.jsx'; import ProjectHeader from './ProjectHeader.jsx'; import PdfPreviewPanel from './PdfPreviewPanel.jsx'; -import { OverviewTab } from './overview-tab'; -import { AllStudiesTab } from './all-studies-tab'; -import { ToDoTab } from './todo-tab'; -import { ReconcileTab } from './reconcile-tab'; -import { CompletedTab } from './completed-tab'; +import { OverviewTab } from './overview-tab/index.js'; +import { AllStudiesTab } from './all-studies-tab/index.js'; +import { ToDoTab } from './todo-tab/index.js'; +import { ReconcileTab } from './reconcile-tab/index.js'; +import { CompletedTab } from './completed-tab/index.js'; export default function ProjectView() { const params = useParams(); diff --git a/packages/web/src/components/project-ui/SlidingPanel.jsx b/packages/web/src/components/project/SlidingPanel.jsx similarity index 100% rename from packages/web/src/components/project-ui/SlidingPanel.jsx rename to packages/web/src/components/project/SlidingPanel.jsx diff --git a/packages/web/src/components/project-ui/add-studies/AddStudiesContext.jsx b/packages/web/src/components/project/add-studies/AddStudiesContext.jsx similarity index 100% rename from packages/web/src/components/project-ui/add-studies/AddStudiesContext.jsx rename to packages/web/src/components/project/add-studies/AddStudiesContext.jsx diff --git a/packages/web/src/components/project-ui/add-studies/DoiLookupSection.jsx b/packages/web/src/components/project/add-studies/DoiLookupSection.jsx similarity index 100% rename from packages/web/src/components/project-ui/add-studies/DoiLookupSection.jsx rename to packages/web/src/components/project/add-studies/DoiLookupSection.jsx diff --git a/packages/web/src/components/project-ui/add-studies/GoogleDriveSection.jsx b/packages/web/src/components/project/add-studies/GoogleDriveSection.jsx similarity index 100% rename from packages/web/src/components/project-ui/add-studies/GoogleDriveSection.jsx rename to packages/web/src/components/project/add-studies/GoogleDriveSection.jsx diff --git a/packages/web/src/components/project-ui/add-studies/PdfUploadSection.jsx b/packages/web/src/components/project/add-studies/PdfUploadSection.jsx similarity index 100% rename from packages/web/src/components/project-ui/add-studies/PdfUploadSection.jsx rename to packages/web/src/components/project/add-studies/PdfUploadSection.jsx diff --git a/packages/web/src/components/project-ui/add-studies/ReferenceImportSection.jsx b/packages/web/src/components/project/add-studies/ReferenceImportSection.jsx similarity index 100% rename from packages/web/src/components/project-ui/add-studies/ReferenceImportSection.jsx rename to packages/web/src/components/project/add-studies/ReferenceImportSection.jsx diff --git a/packages/web/src/components/project-ui/all-studies-tab/AllStudiesTab.jsx b/packages/web/src/components/project/all-studies-tab/AllStudiesTab.jsx similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/AllStudiesTab.jsx rename to packages/web/src/components/project/all-studies-tab/AllStudiesTab.jsx diff --git a/packages/web/src/components/project-ui/all-studies-tab/AssignReviewersModal.jsx b/packages/web/src/components/project/all-studies-tab/AssignReviewersModal.jsx similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/AssignReviewersModal.jsx rename to packages/web/src/components/project/all-studies-tab/AssignReviewersModal.jsx diff --git a/packages/web/src/components/project-ui/all-studies-tab/EditPdfMetadataModal.jsx b/packages/web/src/components/project/all-studies-tab/EditPdfMetadataModal.jsx similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/EditPdfMetadataModal.jsx rename to packages/web/src/components/project/all-studies-tab/EditPdfMetadataModal.jsx diff --git a/packages/web/src/components/project-ui/all-studies-tab/index.js b/packages/web/src/components/project/all-studies-tab/index.js similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/index.js rename to packages/web/src/components/project/all-studies-tab/index.js diff --git a/packages/web/src/components/project-ui/all-studies-tab/study-card/StudyCard.jsx b/packages/web/src/components/project/all-studies-tab/study-card/StudyCard.jsx similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/study-card/StudyCard.jsx rename to packages/web/src/components/project/all-studies-tab/study-card/StudyCard.jsx diff --git a/packages/web/src/components/project-ui/all-studies-tab/study-card/StudyCardHeader.jsx b/packages/web/src/components/project/all-studies-tab/study-card/StudyCardHeader.jsx similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/study-card/StudyCardHeader.jsx rename to packages/web/src/components/project/all-studies-tab/study-card/StudyCardHeader.jsx diff --git a/packages/web/src/components/project-ui/all-studies-tab/study-card/StudyPdfSection.jsx b/packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx similarity index 97% rename from packages/web/src/components/project-ui/all-studies-tab/study-card/StudyPdfSection.jsx rename to packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx index 915730638..239aed520 100644 --- a/packages/web/src/components/project-ui/all-studies-tab/study-card/StudyPdfSection.jsx +++ b/packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx @@ -8,8 +8,8 @@ import { createSignal, createMemo, Show, For } from 'solid-js'; import { FaBrandsGoogleDrive, FaSolidPlus } from 'solid-icons/fa'; import { showToast } from '@corates/ui'; -import PdfListItem from '@/components/checklist-ui/pdf/PdfListItem.jsx'; -import EditPdfMetadataModal from '@/components/project-ui/all-studies-tab/EditPdfMetadataModal.jsx'; +import PdfListItem from '@/components/checklist/pdf/PdfListItem.jsx'; +import EditPdfMetadataModal from '@/components/project/all-studies-tab/EditPdfMetadataModal.jsx'; import projectActionsStore from '@/stores/projectActionsStore'; export default function StudyPdfSection(props) { diff --git a/packages/web/src/components/project-ui/all-studies-tab/study-card/index.js b/packages/web/src/components/project/all-studies-tab/study-card/index.js similarity index 100% rename from packages/web/src/components/project-ui/all-studies-tab/study-card/index.js rename to packages/web/src/components/project/all-studies-tab/study-card/index.js diff --git a/packages/web/src/components/project-ui/completed-tab/CompletedChecklistRow.jsx b/packages/web/src/components/project/completed-tab/CompletedChecklistRow.jsx similarity index 100% rename from packages/web/src/components/project-ui/completed-tab/CompletedChecklistRow.jsx rename to packages/web/src/components/project/completed-tab/CompletedChecklistRow.jsx diff --git a/packages/web/src/components/project-ui/completed-tab/CompletedStudyCard.jsx b/packages/web/src/components/project/completed-tab/CompletedStudyCard.jsx similarity index 100% rename from packages/web/src/components/project-ui/completed-tab/CompletedStudyCard.jsx rename to packages/web/src/components/project/completed-tab/CompletedStudyCard.jsx diff --git a/packages/web/src/components/project-ui/completed-tab/CompletedStudyRow.jsx b/packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx similarity index 99% rename from packages/web/src/components/project-ui/completed-tab/CompletedStudyRow.jsx rename to packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx index d01db0b1a..8c2685246 100644 --- a/packages/web/src/components/project-ui/completed-tab/CompletedStudyRow.jsx +++ b/packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx @@ -9,7 +9,7 @@ import { For, Show, createMemo, createSignal } from 'solid-js'; import { BiRegularChevronRight } from 'solid-icons/bi'; import { Collapsible } from '@corates/ui'; import { getChecklistMetadata } from '@/checklist-registry'; -import PdfListItem from '@/components/checklist-ui/pdf/PdfListItem.jsx'; +import PdfListItem from '@/components/checklist/pdf/PdfListItem.jsx'; import { getCompletedChecklists } from '@/lib/checklist-domain.js'; import { getStatusLabel, getStatusStyle } from '@/constants/checklist-status.js'; import PreviousReviewersView from './PreviousReviewersView.jsx'; diff --git a/packages/web/src/components/project-ui/completed-tab/CompletedTab.jsx b/packages/web/src/components/project/completed-tab/CompletedTab.jsx similarity index 95% rename from packages/web/src/components/project-ui/completed-tab/CompletedTab.jsx rename to packages/web/src/components/project/completed-tab/CompletedTab.jsx index 033b96f2e..cb8210690 100644 --- a/packages/web/src/components/project-ui/completed-tab/CompletedTab.jsx +++ b/packages/web/src/components/project/completed-tab/CompletedTab.jsx @@ -3,7 +3,7 @@ import { useNavigate } from '@solidjs/router'; import { AiFillCheckCircle } from 'solid-icons/ai'; import projectStore from '@/stores/projectStore.js'; import projectActionsStore from '@/stores/projectActionsStore'; -import { useProjectContext } from '@project-ui/ProjectContext.jsx'; +import { useProjectContext } from '@/components/project/ProjectContext.jsx'; import { getStudiesForTab, isDualReviewerStudy } from '@/lib/checklist-domain.js'; import useProject from '@/primitives/useProject/index.js'; import CompletedStudyRow from './CompletedStudyRow.jsx'; @@ -25,7 +25,7 @@ export default function CompletedTab() { // Navigation helpers const openChecklist = (studyId, checklistId) => { - navigate(`/projects/${projectId}/studies/${studyId}/checklists/${checklistId}`); + navigate(`/projects/${projectId}/studies/${studyId}/checklists/${checklistId}?tab=completed`); }; const handleViewPdf = (studyId, pdf) => { diff --git a/packages/web/src/components/project-ui/completed-tab/PreviousReviewersView.jsx b/packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx similarity index 97% rename from packages/web/src/components/project-ui/completed-tab/PreviousReviewersView.jsx rename to packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx index 9de2d9279..43e1f4c9b 100644 --- a/packages/web/src/components/project-ui/completed-tab/PreviousReviewersView.jsx +++ b/packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx @@ -7,11 +7,11 @@ import { Show, createMemo, createSignal, createEffect } from 'solid-js'; import { Dialog, Tabs } from '@corates/ui'; -import { useProjectContext } from '@project-ui/ProjectContext.jsx'; +import { useProjectContext } from '@/components/project/ProjectContext.jsx'; import useProject from '@/primitives/useProject/index.js'; import { getOriginalReviewerChecklists } from '@/lib/checklist-domain.js'; import { getChecklistMetadata } from '@/checklist-registry'; -import GenericChecklist from '@/components/checklist-ui/GenericChecklist.jsx'; +import GenericChecklist from '@/components/checklist/GenericChecklist.jsx'; export default function PreviousReviewersView(props) { // props.study: Study object diff --git a/packages/web/src/components/project-ui/completed-tab/index.js b/packages/web/src/components/project/completed-tab/index.js similarity index 100% rename from packages/web/src/components/project-ui/completed-tab/index.js rename to packages/web/src/components/project/completed-tab/index.js diff --git a/packages/web/src/components/project-ui/google-drive/GoogleDrivePickerLauncher.jsx b/packages/web/src/components/project/google-drive/GoogleDrivePickerLauncher.jsx similarity index 100% rename from packages/web/src/components/project-ui/google-drive/GoogleDrivePickerLauncher.jsx rename to packages/web/src/components/project/google-drive/GoogleDrivePickerLauncher.jsx diff --git a/packages/web/src/components/project-ui/google-drive/GoogleDrivePickerModal.jsx b/packages/web/src/components/project/google-drive/GoogleDrivePickerModal.jsx similarity index 100% rename from packages/web/src/components/project-ui/google-drive/GoogleDrivePickerModal.jsx rename to packages/web/src/components/project/google-drive/GoogleDrivePickerModal.jsx diff --git a/packages/web/src/components/project-ui/overview-tab/AMSTAR2ResultsTable.jsx b/packages/web/src/components/project/overview-tab/AMSTAR2ResultsTable.jsx similarity index 96% rename from packages/web/src/components/project-ui/overview-tab/AMSTAR2ResultsTable.jsx rename to packages/web/src/components/project/overview-tab/AMSTAR2ResultsTable.jsx index 93a9dfe10..898a8dbd4 100644 --- a/packages/web/src/components/project-ui/overview-tab/AMSTAR2ResultsTable.jsx +++ b/packages/web/src/components/project/overview-tab/AMSTAR2ResultsTable.jsx @@ -1,7 +1,7 @@ import { For, Show, createMemo } from 'solid-js'; import { scoreChecklist } from '@/AMSTAR2/checklist.js'; import { CHECKLIST_STATUS } from '@/constants/checklist-status.js'; -import ScoreTag from '@/components/checklist-ui/ScoreTag.jsx'; +import ScoreTag, { ScoreTooltip } from '@/components/checklist/ScoreTag.jsx'; /** * AMSTAR2ResultsTable - Displays AMSTAR 2 quality scores for each study @@ -172,7 +172,9 @@ export default function AMSTAR2ResultsTable(props) { scope='col' class='px-6 py-3 text-left text-xs font-medium tracking-wider text-gray-500 uppercase' > - Score +
+ Rating +
@@ -184,7 +186,7 @@ export default function AMSTAR2ResultsTable(props) { {item.studyName} - + )} diff --git a/packages/web/src/components/project-ui/overview-tab/AddMemberModal.jsx b/packages/web/src/components/project/overview-tab/AddMemberModal.jsx similarity index 100% rename from packages/web/src/components/project-ui/overview-tab/AddMemberModal.jsx rename to packages/web/src/components/project/overview-tab/AddMemberModal.jsx diff --git a/packages/web/src/components/project-ui/overview-tab/ChartSection.jsx b/packages/web/src/components/project/overview-tab/ChartSection.jsx similarity index 99% rename from packages/web/src/components/project-ui/overview-tab/ChartSection.jsx rename to packages/web/src/components/project/overview-tab/ChartSection.jsx index 7aae252bb..718c7360c 100644 --- a/packages/web/src/components/project-ui/overview-tab/ChartSection.jsx +++ b/packages/web/src/components/project/overview-tab/ChartSection.jsx @@ -104,7 +104,7 @@ export default function ChartSection(props) { const [greyscale, setGreyscale] = createSignal(false); const [robvisTitle, setRobvisTitle] = createSignal('AMSTAR-2 Quality Assessment'); const [distributionTitle, setDistributionTitle] = createSignal( - 'Distribution of AMSTAR Ratings on Each Item Across Included Reviews', + 'Distribution of AMSTAR2 Ratings on Each Item Across Included Reviews', ); const [transparentExport, setTransparentExport] = createSignal(false); diff --git a/packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx b/packages/web/src/components/project/overview-tab/CircularProgress.jsx similarity index 100% rename from packages/web/src/components/project-ui/overview-tab/CircularProgress.jsx rename to packages/web/src/components/project/overview-tab/CircularProgress.jsx diff --git a/packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx b/packages/web/src/components/project/overview-tab/OverviewTab.jsx similarity index 100% rename from packages/web/src/components/project-ui/overview-tab/OverviewTab.jsx rename to packages/web/src/components/project/overview-tab/OverviewTab.jsx diff --git a/packages/web/src/components/project-ui/overview-tab/ReviewerAssignment.jsx b/packages/web/src/components/project/overview-tab/ReviewerAssignment.jsx similarity index 100% rename from packages/web/src/components/project-ui/overview-tab/ReviewerAssignment.jsx rename to packages/web/src/components/project/overview-tab/ReviewerAssignment.jsx diff --git a/packages/web/src/components/project-ui/overview-tab/index.js b/packages/web/src/components/project/overview-tab/index.js similarity index 100% rename from packages/web/src/components/project-ui/overview-tab/index.js rename to packages/web/src/components/project/overview-tab/index.js diff --git a/packages/web/src/components/project-ui/reconcile-tab/ReconcileStatusTag.jsx b/packages/web/src/components/project/reconcile-tab/ReconcileStatusTag.jsx similarity index 100% rename from packages/web/src/components/project-ui/reconcile-tab/ReconcileStatusTag.jsx rename to packages/web/src/components/project/reconcile-tab/ReconcileStatusTag.jsx diff --git a/packages/web/src/components/project-ui/reconcile-tab/ReconcileStudyRow.jsx b/packages/web/src/components/project/reconcile-tab/ReconcileStudyRow.jsx similarity index 98% rename from packages/web/src/components/project-ui/reconcile-tab/ReconcileStudyRow.jsx rename to packages/web/src/components/project/reconcile-tab/ReconcileStudyRow.jsx index 75fb6ecda..49f9978e4 100644 --- a/packages/web/src/components/project-ui/reconcile-tab/ReconcileStudyRow.jsx +++ b/packages/web/src/components/project/reconcile-tab/ReconcileStudyRow.jsx @@ -11,7 +11,7 @@ import { BsFileDiff } from 'solid-icons/bs'; import { Collapsible } from '@corates/ui'; import { CHECKLIST_STATUS } from '@/constants/checklist-status.js'; import { isReconciledChecklist } from '@/lib/checklist-domain.js'; -import PdfListItem from '@/components/checklist-ui/pdf/PdfListItem.jsx'; +import PdfListItem from '@/components/checklist/pdf/PdfListItem.jsx'; import ReconcileStatusTag from './ReconcileStatusTag.jsx'; export default function ReconcileStudyRow(props) { diff --git a/packages/web/src/components/project-ui/reconcile-tab/ReconcileTab.jsx b/packages/web/src/components/project/reconcile-tab/ReconcileTab.jsx similarity index 100% rename from packages/web/src/components/project-ui/reconcile-tab/ReconcileTab.jsx rename to packages/web/src/components/project/reconcile-tab/ReconcileTab.jsx diff --git a/packages/web/src/components/project-ui/reconcile-tab/index.js b/packages/web/src/components/project/reconcile-tab/index.js similarity index 100% rename from packages/web/src/components/project-ui/reconcile-tab/index.js rename to packages/web/src/components/project/reconcile-tab/index.js diff --git a/packages/web/src/components/project-ui/todo-tab/ToDoTab.jsx b/packages/web/src/components/project/todo-tab/ToDoTab.jsx similarity index 99% rename from packages/web/src/components/project-ui/todo-tab/ToDoTab.jsx rename to packages/web/src/components/project/todo-tab/ToDoTab.jsx index d05ad248b..05390e235 100644 --- a/packages/web/src/components/project-ui/todo-tab/ToDoTab.jsx +++ b/packages/web/src/components/project/todo-tab/ToDoTab.jsx @@ -48,7 +48,7 @@ export default function ToDoTab() { }; const openChecklist = (studyId, checklistId) => { - navigate(`/projects/${projectId}/studies/${studyId}/checklists/${checklistId}`); + navigate(`/projects/${projectId}/studies/${studyId}/checklists/${checklistId}?tab=todo`); }; const handleViewPdf = (studyId, pdf) => { diff --git a/packages/web/src/components/project-ui/todo-tab/TodoStudyRow.jsx b/packages/web/src/components/project/todo-tab/TodoStudyRow.jsx similarity index 98% rename from packages/web/src/components/project-ui/todo-tab/TodoStudyRow.jsx rename to packages/web/src/components/project/todo-tab/TodoStudyRow.jsx index 9aea1e661..c033a644c 100644 --- a/packages/web/src/components/project-ui/todo-tab/TodoStudyRow.jsx +++ b/packages/web/src/components/project/todo-tab/TodoStudyRow.jsx @@ -9,7 +9,7 @@ import { For, Show, createMemo, createSignal } from 'solid-js'; import { BiRegularChevronRight } from 'solid-icons/bi'; import { Collapsible } from '@corates/ui'; import { getChecklistMetadata } from '@/checklist-registry'; -import PdfListItem from '@/components/checklist-ui/pdf/PdfListItem.jsx'; +import PdfListItem from '@/components/checklist/pdf/PdfListItem.jsx'; import ChecklistForm from '../ChecklistForm.jsx'; import { getStatusLabel, getStatusStyle } from '@/constants/checklist-status.js'; diff --git a/packages/web/src/components/project-ui/todo-tab/index.js b/packages/web/src/components/project/todo-tab/index.js similarity index 100% rename from packages/web/src/components/project-ui/todo-tab/index.js rename to packages/web/src/components/project/todo-tab/index.js diff --git a/packages/web/vite.config.js b/packages/web/vite.config.js index 70b2e9ed5..8c61dbebf 100644 --- a/packages/web/vite.config.js +++ b/packages/web/vite.config.js @@ -11,10 +11,9 @@ export default defineConfig(({ mode }) => ({ '@components': path.resolve(__dirname, 'src/components'), '@routes': path.resolve(__dirname, 'src/routes'), '@primitives': path.resolve(__dirname, 'src/primitives'), - '@auth': path.resolve(__dirname, 'src/auth'), - '@auth-ui': path.resolve(__dirname, 'src/components/auth-ui'), - '@checklist-ui': path.resolve(__dirname, 'src/components/checklist-ui'), - '@project-ui': path.resolve(__dirname, 'src/components/project-ui'), + '@auth': path.resolve(__dirname, 'src/components/auth'), + '@checklist': path.resolve(__dirname, 'src/components/checklist'), + '@project': path.resolve(__dirname, 'src/components/project'), '@offline': path.resolve(__dirname, 'src/offline'), '@api': path.resolve(__dirname, 'src/api'), '@config': path.resolve(__dirname, 'src/config'), diff --git a/packages/workers/src/__tests__/admin.test.js b/packages/workers/src/__tests__/admin.test.js index 750f631c4..68db96137 100644 --- a/packages/workers/src/__tests__/admin.test.js +++ b/packages/workers/src/__tests__/admin.test.js @@ -93,7 +93,7 @@ async function resetSchema() { for (const table of tablesToDrop) { try { await run(`DROP TABLE IF EXISTS \`${table}\``); - } catch (error) { + } catch (_error) { // Ignore all errors during drop - tables might not exist or have constraint issues // This is safe because we're recreating the schema anyway }