-
{/* Confirm Dialog */}
-
+
{/* Email Field */}
- setActiveTab(v)}
- tabs={tabs.map(t => ({
- ...t,
- label: (
-
- {t.label}
- 0) ||
- (t.value === 'references' && studies.refCount() > 0) ||
- (t.value === 'lookup' && studies.lookupCount() > 0) ||
- (t.value === 'drive' && studies.driveCount() > 0)
- }
- >
-
- {t.value === 'pdfs' ?
- studies.pdfCount()
- : t.value === 'references' ?
- studies.refCount()
- : t.value === 'lookup' ?
- studies.lookupCount()
- : studies.driveCount()}
-
-
-
- ),
- }))}
- />
+ setActiveTab(v)}>
+
+
+ {tab => {
+ const getCount = () => {
+ if (tab.value === 'pdfs') return studies.pdfCount();
+ if (tab.value === 'references') return studies.refCount();
+ if (tab.value === 'lookup') return studies.lookupCount();
+ if (tab.value === 'drive') return studies.driveCount();
+ return 0;
+ };
+ return (
+
+ {tab.label}
+ 0}>
+
+ {getCount()}
+
+
+
+ );
+ }}
+
+
+
diff --git a/packages/web/src/components/project/add-studies/DoiLookupSection.jsx b/packages/web/src/components/project/add-studies/DoiLookupSection.jsx
index 9ad5217f2..d30368bde 100644
--- a/packages/web/src/components/project/add-studies/DoiLookupSection.jsx
+++ b/packages/web/src/components/project/add-studies/DoiLookupSection.jsx
@@ -13,7 +13,14 @@ import {
BiRegularUpload,
} from 'solid-icons/bi';
import { FiFile, FiFileText, FiAlertCircle, FiCheck, FiDownload } from 'solid-icons/fi';
-import { Checkbox, Tooltip, showToast } from '@corates/ui';
+import { showToast } from '@/components/ui/toast';
+import {
+ Tooltip,
+ TooltipTrigger,
+ TooltipPositioner,
+ TooltipContent,
+} from '@/components/ui/tooltip';
+import { CheckboxRoot, CheckboxControl, CheckboxLabel } from '@/components/ui/checkbox';
import { getRefDisplayName } from '@/lib/referenceParser.js';
import { validatePdfFile } from '@/lib/pdfValidation.js';
@@ -104,15 +111,22 @@ export default function DoiLookupSection(props) {
0}>
- 0 &&
- studies().selectedLookupIds().size < refsWithPdf().length
+ 0 &&
+ studies().selectedLookupIds().size < refsWithPdf().length
+ ) ?
+ 'indeterminate'
+ : studies().selectedLookupIds().size === refsWithPdf().length
}
- onChange={studies().toggleSelectAllLookup}
- label={`Select all with PDF (${studies().selectedLookupIds().size}/${refsWithPdf().length})`}
- />
+ onCheckedChange={studies().toggleSelectAllLookup}
+ >
+
+
+ Select all with PDF ({studies().selectedLookupIds().size}/{refsWithPdf().length})
+
+
@@ -164,11 +178,13 @@ export default function DoiLookupSection(props) {
class='hidden'
onChange={handleManualPdfSelect}
/>
- studies().toggleLookupSelection(ref._id)}
+ onCheckedChange={() => studies().toggleLookupSelection(ref._id)}
class='mt-0.5'
- />
+ >
+
+
diff --git a/packages/web/src/components/project/add-studies/PdfUploadSection.jsx b/packages/web/src/components/project/add-studies/PdfUploadSection.jsx
index 8f21cc312..c72e4709b 100644
--- a/packages/web/src/components/project/add-studies/PdfUploadSection.jsx
+++ b/packages/web/src/components/project/add-studies/PdfUploadSection.jsx
@@ -6,9 +6,9 @@
import { For, Show } from 'solid-js';
import { BiRegularTrash } from 'solid-icons/bi';
import { CgFileDocument } from 'solid-icons/cg';
-import { FiLink, FiRefreshCw } from 'solid-icons/fi';
+import { FiLink, FiRefreshCw, FiUploadCloud } from 'solid-icons/fi';
import { VsWarning } from 'solid-icons/vs';
-import { FileUpload } from '@corates/ui';
+import { FileUpload, FileUploadDropzone, FileUploadHiddenInput } from '@/components/ui/file-upload';
export default function PdfUploadSection(props) {
const studies = () => props.studies;
@@ -21,14 +21,19 @@ export default function PdfUploadSection(props) {
+ accept={['application/pdf', '.pdf']}
+ maxFiles={Infinity}
+ onFileAccept={details => studies().handlePdfSelect(details.files)}
+ >
+
+
+
+ Click to upload or drag and drop
+
+ PDF files only
+
+
+
0}>
diff --git a/packages/web/src/components/project/add-studies/ReferenceImportSection.jsx b/packages/web/src/components/project/add-studies/ReferenceImportSection.jsx
index 2502942ef..3ae6a6afc 100644
--- a/packages/web/src/components/project/add-studies/ReferenceImportSection.jsx
+++ b/packages/web/src/components/project/add-studies/ReferenceImportSection.jsx
@@ -8,7 +8,9 @@ import { For, Show } from 'solid-js';
import { AiOutlineFileText } from 'solid-icons/ai';
import { CgFileDocument } from 'solid-icons/cg';
import { BiRegularLinkAlt } from 'solid-icons/bi';
-import { FileUpload, Checkbox } from '@corates/ui';
+import { FiUploadCloud } from 'solid-icons/fi';
+import { FileUpload, FileUploadDropzone, FileUploadHiddenInput } from '@/components/ui/file-upload';
+import { CheckboxRoot, CheckboxControl, CheckboxLabel } from '@/components/ui/checkbox';
import {
getRefDisplayName,
SUPPORTED_FORMATS,
@@ -79,15 +81,22 @@ export default function ReferenceImportSection(props) {
- 0 &&
- studies().selectedRefIds().size < studies().importedRefs().length
+ 0 &&
+ studies().selectedRefIds().size < studies().importedRefs().length
+ ) ?
+ 'indeterminate'
+ : studies().selectedRefIds().size === studies().importedRefs().length
}
- onChange={studies().toggleSelectAllRefs}
- label={`Select all (${studies().selectedRefIds().size}/${studies().importedRefs().length})`}
- />
+ onCheckedChange={studies().toggleSelectAllRefs}
+ >
+
+
+ Select all ({studies().selectedRefIds().size}/{studies().importedRefs().length})
+
+
@@ -101,11 +110,13 @@ export default function ReferenceImportSection(props) {
}`}
onClick={() => studies().toggleRefSelection(ref._id)}
>
- studies().toggleRefSelection(ref._id)}
+ onCheckedChange={() => studies().toggleRefSelection(ref._id)}
class='mt-0.5'
- />
+ >
+
+
@@ -166,13 +177,19 @@ export default function ReferenceImportSection(props) {
+ accept={MIXED_IMPORT_ACCEPT.split(',').map(t => t.trim())}
+ maxFiles={Infinity}
+ onFileAccept={details => studies().handleRefFileSelect(details.files)}
+ >
+
+
+
+ Click to upload or drag and drop
+
+ RIS, EndNote, BibTeX, or PDF files
+
+
+
Supported formats:
diff --git a/packages/web/src/components/project/all-studies-tab/AssignReviewersModal.jsx b/packages/web/src/components/project/all-studies-tab/AssignReviewersModal.jsx
index 27c66652e..107b083cc 100644
--- a/packages/web/src/components/project/all-studies-tab/AssignReviewersModal.jsx
+++ b/packages/web/src/components/project/all-studies-tab/AssignReviewersModal.jsx
@@ -7,8 +7,19 @@
*/
import { createSignal, createEffect, createMemo, Show } from 'solid-js';
-import { Dialog, Select } from '@corates/ui';
+import { SimpleSelect } from '@/components/ui/select';
+import {
+ Dialog,
+ DialogBackdrop,
+ DialogPositioner,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogBody,
+ DialogCloseTrigger,
+} from '@/components/ui/dialog';
import { BiRegularUser } from 'solid-icons/bi';
+import { FiX } from 'solid-icons/fi';
import projectStore from '@/stores/projectStore.js';
export default function AssignReviewersModal(props) {
@@ -21,7 +32,7 @@ export default function AssignReviewersModal(props) {
const [reviewer1, setReviewer1] = createSignal('');
const [reviewer2, setReviewer2] = createSignal('');
const [saving, setSaving] = createSignal(false);
- const [selectsReady, setSelectsReady] = createSignal(false);
+ const [selectsReady, setSimpleSelectsReady] = createSignal(false);
const members = () => projectStore.getMembers(props.projectId) || [];
@@ -37,7 +48,7 @@ export default function AssignReviewersModal(props) {
return allStudies.find(s => s.id === studyId) || null;
});
- // Convert members to Select items format
+ // Convert members to SimpleSelect items format
const memberItems = createMemo(() => {
const getMemberName = member =>
member?.displayName || member?.name || member?.email || 'Unknown';
@@ -67,13 +78,13 @@ export default function AssignReviewersModal(props) {
setReviewer1(study.reviewer1 || '');
setReviewer2(study.reviewer2 || '');
- // Small delay to ensure Select components are ready before rendering
- setSelectsReady(true);
+ // Small delay to ensure SimpleSelect components are ready before rendering
+ setSimpleSelectsReady(true);
} else if (!isOpen) {
// Reset when modal closes
setReviewer1('');
setReviewer2('');
- setSelectsReady(false);
+ setSimpleSelectsReady(false);
}
});
@@ -101,70 +112,83 @@ export default function AssignReviewersModal(props) {
};
return (
-
-
-
- Assign two reviewers to this study. Each reviewer will independently complete their
- assessments.
-
-
- {/* Reviewer Assignments */}
-
-
-
- Reviewer Assignments
-
-
- }>
-
-
-
+
+
+
+
+
+ Assign Reviewers
+
+
+
+
+
+
+
+ Assign two reviewers to this study. Each reviewer will independently complete their
+ assessments.
+
+
+ {/* Reviewer Assignments */}
+
+
+
+ Reviewer Assignments
+
+
+ }>
+
+
+
+
+
+
+
+
+ No team members available. Add members to the project first.
+
+
+
+
+ {/* Actions */}
+
+
+
+
-
-
-
-
- No team members available. Add members to the project first.
-
-
-
-
- {/* Actions */}
-
-
-
-
-
+
+
+
);
}
diff --git a/packages/web/src/components/project/all-studies-tab/EditPdfMetadataModal.jsx b/packages/web/src/components/project/all-studies-tab/EditPdfMetadataModal.jsx
index d7bcefa02..3e4a5f1b1 100644
--- a/packages/web/src/components/project/all-studies-tab/EditPdfMetadataModal.jsx
+++ b/packages/web/src/components/project/all-studies-tab/EditPdfMetadataModal.jsx
@@ -10,7 +10,18 @@
*/
import { createSignal, createEffect } from 'solid-js';
-import { Dialog, showToast } from '@corates/ui';
+import { showToast } from '@/components/ui/toast';
+import {
+ Dialog,
+ DialogBackdrop,
+ DialogPositioner,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogBody,
+ DialogCloseTrigger,
+} from '@/components/ui/dialog';
+import { FiX } from 'solid-icons/fi';
import { handleError } from '@/lib/error-utils.js';
export default function EditPdfMetadataModal(props) {
@@ -85,108 +96,123 @@ export default function EditPdfMetadataModal(props) {
};
return (
-
-
- {/* File info header */}
-
- {props.pdf?.fileName}
-
-
- {tagLabel()}
-
-
-
+
+
+
+
+
+ Edit PDF Metadata
+
+
+
+
+
+
+ {/* File info header */}
+
+ {props.pdf?.fileName}
+
+
+ {tagLabel()}
+
+
+
- {/* Article Title */}
-
- Article Title
-
+ {/* Article Title */}
+
+ Article Title
+
- {/* Author and Year */}
-
+ {/* Author and Year */}
+
- {/* Journal */}
-
- Journal
- setJournal(e.target.value)}
- class='w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:ring-blue-500'
- placeholder='e.g., Journal of Clinical Research'
- />
-
+ {/* Journal */}
+
+ Journal
+ setJournal(e.target.value)}
+ class='w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:ring-blue-500'
+ placeholder='e.g., Journal of Clinical Research'
+ />
+
- {/* DOI */}
-
- DOI
- setDoi(e.target.value)}
- class='w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:ring-blue-500'
- placeholder='e.g., 10.1000/xyz123'
- />
-
+ {/* DOI */}
+
+ DOI
+ setDoi(e.target.value)}
+ class='w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-blue-500 focus:ring-blue-500'
+ placeholder='e.g., 10.1000/xyz123'
+ />
+
- {/* Actions */}
-
-
-
-
-
+ {/* Actions */}
+
+
+
+
+
+
+
+
);
}
diff --git a/packages/web/src/components/project/all-studies-tab/study-card/StudyCard.jsx b/packages/web/src/components/project/all-studies-tab/study-card/StudyCard.jsx
index 5fbe23057..2304a4207 100644
--- a/packages/web/src/components/project/all-studies-tab/study-card/StudyCard.jsx
+++ b/packages/web/src/components/project/all-studies-tab/study-card/StudyCard.jsx
@@ -9,7 +9,7 @@
* Only needs study data and minimal control props.
*/
-import { Collapsible } from '@corates/ui';
+import { Collapsible, CollapsibleContent } from '@/components/ui/collapsible';
import StudyCardHeader from './StudyCardHeader.jsx';
import StudyPdfSection from './StudyPdfSection.jsx';
@@ -24,31 +24,23 @@ export default function StudyCard(props) {
return (
- {
- // Only toggle if the state is actually different
- if (open !== props.expanded) {
- props.onToggleExpanded?.();
- }
- }}
- trigger={() => (
- props.onToggleExpanded?.()}
- onAssignReviewers={() => props.onAssignReviewers?.(props.study)}
- getAssigneeName={props.getAssigneeName}
- />
- )}
- >
-
-
-
+
+ props.onToggleExpanded?.()}
+ onAssignReviewers={() => props.onAssignReviewers?.(props.study)}
+ getAssigneeName={props.getAssigneeName}
+ />
+
+
+
+
+
);
diff --git a/packages/web/src/components/project/all-studies-tab/study-card/StudyCardHeader.jsx b/packages/web/src/components/project/all-studies-tab/study-card/StudyCardHeader.jsx
index 1b6bd5116..c4cb2e386 100644
--- a/packages/web/src/components/project/all-studies-tab/study-card/StudyCardHeader.jsx
+++ b/packages/web/src/components/project/all-studies-tab/study-card/StudyCardHeader.jsx
@@ -15,7 +15,15 @@
import { Show, For } from 'solid-js';
import { BiRegularChevronRight } from 'solid-icons/bi';
import { FiUsers, FiTrash2, FiMoreVertical } from 'solid-icons/fi';
-import { Menu, Editable } from '@corates/ui';
+import { SimpleEditable } from '@/components/ui/editable';
+import {
+ Menu,
+ MenuTrigger,
+ MenuPositioner,
+ MenuContent,
+ MenuItem,
+ MenuSeparator,
+} from '@/components/ui/menu';
import projectActionsStore from '@/stores/projectActionsStore';
export default function StudyCardHeader(props) {
@@ -72,21 +80,6 @@ export default function StudyCardHeader(props) {
return parts.join(' ');
};
- const menuItems = [
- {
- value: 'assign-reviewers',
- label: 'Assign Reviewers',
- icon: ,
- },
- { separator: true },
- {
- value: 'delete',
- label: 'Delete Study',
- icon: ,
- destructive: true,
- },
- ];
-
const handleMenuSelect = details => {
switch (details.value) {
case 'assign-reviewers':
@@ -124,7 +117,7 @@ export default function StudyCardHeader(props) {
{/* Study info - editable name */}
- No reviewers
- {/* Actions menu - using Menu component with custom trigger (no indicator) */}
- }
- items={menuItems}
- onSelect={handleMenuSelect}
- placement='bottom-end'
- hideIndicator
- />
+ {/* Actions menu */}
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx b/packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx
index 22be46f74..4bae61195 100644
--- a/packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx
+++ b/packages/web/src/components/project/all-studies-tab/study-card/StudyPdfSection.jsx
@@ -7,7 +7,7 @@
import { createSignal, createMemo, Show, For } from 'solid-js';
import { FaBrandsGoogleDrive, FaSolidPlus } from 'solid-icons/fa';
-import { showToast } from '@corates/ui';
+import { showToast } from '@/components/ui/toast';
import { PdfListItem } from '@pdf';
import EditPdfMetadataModal from '@/components/project/all-studies-tab/EditPdfMetadataModal.jsx';
import projectActionsStore from '@/stores/projectActionsStore';
diff --git a/packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx b/packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx
index ce78eaa3f..bc4b689ad 100644
--- a/packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx
+++ b/packages/web/src/components/project/completed-tab/CompletedStudyRow.jsx
@@ -7,7 +7,7 @@
import { For, Show, createMemo, createSignal } from 'solid-js';
import { BiRegularChevronRight } from 'solid-icons/bi';
-import { Collapsible } from '@corates/ui';
+import { Collapsible, CollapsibleContent } from '@/components/ui/collapsible';
import { getChecklistMetadata } from '@/checklist-registry';
import { PdfListItem } from '@pdf';
import { getCompletedChecklists } from '@/lib/checklist-domain.js';
@@ -63,115 +63,117 @@ export default function CompletedStudyRow(props) {
);
};
+ // Handle row click - toggle unless clicking on interactive elements or selectable text
+ const handleRowClick = e => {
+ if (!hasPdfs()) return;
+ const target = e.target;
+ const interactive = target.closest('button, [role="button"], [data-selectable]');
+ if (interactive) return;
+ setExpanded(!expanded());
+ };
+
return (
<>
- {
- // Only toggle if there are PDFs to show
- if (hasPdfs()) {
- setExpanded(open);
- }
- }}
- trigger={
-
- {/* Chevron indicator (only if has PDFs) */}
-
-
-
-
-
-
- {/* Study info */}
-
-
- {study().name}
-
- {/* Citation line - selectable */}
-
-
- {citationLine()}
-
- · {pdfCount()} PDFs
-
-
-
-
- {pdfCount()} PDFs
-
+
+
+ {/* Chevron indicator (only if has PDFs) */}
+
+
+
+
- {/* Checklist type badge - selectable */}
- 0}>
-
+
+ {study().name}
+
+ {/* Citation line - selectable */}
+
+
- {getChecklistMetadata(completedChecklists()[0]?.type)?.name || 'Checklist'}
-
+ {citationLine()}
+
+ · {pdfCount()} PDFs
+
+
-
- {/* Checklist status badge */}
- 0}>
-
- {getStatusLabel(completedChecklists()[0]?.status)}
-
+
+ {pdfCount()} PDFs
-
- {/* View Previous Reviewers button (only for dual-reviewer studies) */}
-
-
-
-
- {/* Open checklist button */}
- 0}>
-
-
-
- }
- >
- {/* Expanded PDF Section */}
-
-
-
- {pdf => (
- props.onViewPdf?.(pdf)}
- onDownload={() => props.onDownloadPdf?.(pdf)}
- readOnly={true}
- />
- )}
-
-
+
+ {/* Checklist type badge - selectable */}
+ 0}>
+
+ {getChecklistMetadata(completedChecklists()[0]?.type)?.name || 'Checklist'}
+
+
+
+ {/* Checklist status badge */}
+ 0}>
+
+ {getStatusLabel(completedChecklists()[0]?.status)}
+
+
+
+ {/* View Previous Reviewers button (only for dual-reviewer studies) */}
+
+
+
+
+ {/* Open checklist button */}
+ 0}>
+
+
+
+
+ {/* Expanded PDF Section */}
+
+
+
+ {pdf => (
+ props.onViewPdf?.(pdf)}
+ onDownload={() => props.onDownloadPdf?.(pdf)}
+ readOnly={true}
+ />
+ )}
+
+
+
+
diff --git a/packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx b/packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx
index 43e1f4c9b..3542022c5 100644
--- a/packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx
+++ b/packages/web/src/components/project/completed-tab/PreviousReviewersView.jsx
@@ -5,8 +5,20 @@
* Displays checklists in readonly mode with tabs to switch between reviewers.
*/
-import { Show, createMemo, createSignal, createEffect } from 'solid-js';
-import { Dialog, Tabs } from '@corates/ui';
+import { Show, For, createMemo, createSignal, createEffect } from 'solid-js';
+import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import {
+ Dialog,
+ DialogBackdrop,
+ DialogPositioner,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogDescription,
+ DialogBody,
+ DialogCloseTrigger,
+} from '@/components/ui/dialog';
+import { FiX } from 'solid-icons/fi';
import { useProjectContext } from '@/components/project/ProjectContext.jsx';
import useProject from '@/primitives/useProject/index.js';
import { getOriginalReviewerChecklists } from '@/lib/checklist-domain.js';
@@ -145,56 +157,88 @@ export default function PreviousReviewersView(props) {
props.onClose();
}
}}
- title='Original Reviewer Appraisals'
- description='The original appraisals from each reviewer that were reconciled to create the final version.'
- size='2xl'
>
-
-
-
- {loading() ? 'Loading appraisals...' : 'No previous reviewer appraisals found.'}
-
+
+
+
+
+
+ Original Reviewer Appraisals
+
+ The original appraisals from each reviewer that were reconciled to create the final
+ version.
+
- }
- >
- 1}>
-
-
-
-
-
-
-
-
-
-
- {currentChecklistData()?.reviewerName || 'Reviewer'}
-
-
- {currentChecklistType() ?
- getChecklistMetadata(currentChecklistType())?.name || currentChecklistType()
- : ''}
-
+
+
+
+
+
+
+
+
+ {loading() ?
+ 'Loading appraisals...'
+ : 'No previous reviewer appraisals found.'}
+
+
+ }
+ >
+ 1}>
+
+
+
+
+ {tab => (
+
+ {tab.label}
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+ {currentChecklistData()?.reviewerName || 'Reviewer'}
+
+
+ {currentChecklistType() ?
+ getChecklistMetadata(currentChecklistType())?.name ||
+ currentChecklistType()
+ : ''}
+
+
+
+ {}}
+ getQuestionNote={questionKey => {
+ const checklistId = currentChecklistId();
+ if (!checklistId) return null;
+ return getQuestionNote(props.study.id, checklistId, questionKey);
+ }}
+ />
+
-
- {}}
- getQuestionNote={questionKey => {
- const checklistId = currentChecklistId();
- if (!checklistId) return null;
- return getQuestionNote(props.study.id, checklistId, questionKey);
- }}
- />
-
-
-
-
+
+
+
+
+
);
}
diff --git a/packages/web/src/components/project/google-drive/GoogleDrivePickerModal.jsx b/packages/web/src/components/project/google-drive/GoogleDrivePickerModal.jsx
index 2ab22df18..a1e4c4361 100644
--- a/packages/web/src/components/project/google-drive/GoogleDrivePickerModal.jsx
+++ b/packages/web/src/components/project/google-drive/GoogleDrivePickerModal.jsx
@@ -3,7 +3,19 @@
*/
import { createSignal } from 'solid-js';
-import { Dialog, showToast } from '@corates/ui';
+import { showToast } from '@/components/ui/toast';
+import {
+ Dialog,
+ DialogBackdrop,
+ DialogPositioner,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogDescription,
+ DialogBody,
+ DialogCloseTrigger,
+} from '@/components/ui/dialog';
+import { FiX } from 'solid-icons/fi';
import { importFromGoogleDrive } from '@/api/google-drive.js';
import GoogleDrivePickerLauncher from './GoogleDrivePickerLauncher.jsx';
@@ -45,35 +57,45 @@ export default function GoogleDrivePickerModal(props) {
};
return (
- !open && props.onClose()}
- title='Import from Google Drive'
- description='Select a PDF from your Google Drive to import'
- size='lg'
- >
-
- props.onClose()}
- onPick={handlePicked}
- studyId={props.studyId}
- />
+ !open && props.onClose()}>
+
+
+
+
+ Import from Google Drive
+
+
+
+
+
+
+ Select a PDF from your Google Drive to import
+
+
+ props.onClose()}
+ onPick={handlePicked}
+ studyId={props.studyId}
+ />
- {/* Action buttons */}
-
-
-
-
+ {/* Action buttons */}
+
+
+
+
+
+
+
);
}
diff --git a/packages/web/src/components/project/overview-tab/AddMemberModal.jsx b/packages/web/src/components/project/overview-tab/AddMemberModal.jsx
index fdde420d9..c739df114 100644
--- a/packages/web/src/components/project/overview-tab/AddMemberModal.jsx
+++ b/packages/web/src/components/project/overview-tab/AddMemberModal.jsx
@@ -2,7 +2,9 @@ import { createSignal, For, Show, createEffect, onCleanup } from 'solid-js';
import { debounce } from '@solid-primitives/scheduled';
import { A } from '@solidjs/router';
import { FiX, FiAlertTriangle } from 'solid-icons/fi';
-import { Select, Avatar, showToast } from '@corates/ui';
+import { showToast } from '@/components/ui/toast';
+import { SimpleSelect } from '@/components/ui/select';
+import { Avatar, AvatarImage, AvatarFallback, getInitials } from '@/components/ui/avatar';
import { apiFetch } from '@lib/apiFetch.js';
import { isUnlimitedQuota } from '@corates/shared/plans';
@@ -20,8 +22,8 @@ export default function AddMemberModal(props) {
const [searchQuery, setSearchQuery] = createSignal('');
const [searchResults, setSearchResults] = createSignal([]);
const [searching, setSearching] = createSignal(false);
- const [selectedUser, setSelectedUser] = createSignal(null);
- const [selectedRole, setSelectedRole] = createSignal('member');
+ const [selectedUser, setSimpleSelectedUser] = createSignal(null);
+ const [selectedRole, setSimpleSelectedRole] = createSignal('member');
const [adding, setAdding] = createSignal(false);
const [error, setError] = createSignal(null);
@@ -79,8 +81,8 @@ export default function AddMemberModal(props) {
debouncedSearchUsers(value);
};
- const handleSelectUser = user => {
- setSelectedUser(user);
+ const handleSimpleSelectUser = user => {
+ setSimpleSelectedUser(user);
setSearchQuery(user.displayName || user.name || user.email);
setSearchResults([]);
};
@@ -141,8 +143,8 @@ export default function AddMemberModal(props) {
const handleClose = () => {
setSearchQuery('');
setSearchResults([]);
- setSelectedUser(null);
- setSelectedRole('member');
+ setSimpleSelectedUser(null);
+ setSimpleSelectedRole('member');
setError(null);
props.onClose();
};
@@ -217,15 +219,18 @@ export default function AddMemberModal(props) {
{user => (
|