Development#1285
Open
NishaSharma14 wants to merge 120 commits into
Open
Conversation
feat: enable CAS based import & extend molecule:clean to query for CAS metadata
* feat: refactor support bubble to block spamming. - use google recaptcha v3 for bot detection - implement rate limiting on support bubble submissions - add server-side validation for gibberish content * copilot review comment fix * decrease the ratelimit * fix: tidy up recaptcha from composer * fix: composer warning suppressed, psr-5 warning resolved --------- Co-authored-by: Venkata Nainala <mailcs76@gmail.com>
* configure laravel CSP * include composer.lock changes * fix pinting issues * Update app/Support/Csp/Policies/NmrxivPolicy.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix pinting issues * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix pinting issues * fix: moved csp-report endpoint to admin routes and removed unused socialite orcid package * chore: pint updates * fix: ziggyvue import updates and also added link to the csp-report in the admin view * chore: prettier formating added * build dev image for CSP --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
remove the ziggy.js file
…s dashboard (#1277) * feat: Enable search and filtering on projects dashboard - update code to unify project badge logic - move the project badge to a reusable component * prettier formating * run prettier * copilot review changes * add one time command to update project statuses * fix: unmatched return type error fix * fix: style changes to filter button * fix: manifest json regenerated * chore: pint formatting changes * fix: composer update * fix: npm audit fixes --------- Co-authored-by: Venkata Nainala <mailcs76@gmail.com>
* fix: modify nmrxiv policy to fix csp issues * fix:remove single policy addition and make multiple additions for font-src directive * pint formatting * updated policy to include missing directives * update ORCID API endpoint in csp policy * more formatting and removal of duplicates. * NMRIUM_URL * add nmrium in frame-src and connect-src directives * revert dev build tag change * revert missing tags for dev-latest images * deploy latest csp changes * fix:revert dev-build changes
* add test coverage workflow * add .env.ci * use postgres instead of mysql for testing * add meilisearch test config and adjust redis to local for ci * remove healtchecks for redis and meilisearch services * fix the db mismatch issues in CI * fix filesystem driver issue * rectify .env file name * add .env.ci.test with correct DB_PASSWORD * skip ELNSubmissionTrackingTest.php test that requires external API access in CI environment * ELNSubmissionTrackingTest * fixx failing tests * update Code cov token * update test-coverage workflow and .env.ci.test * fix LicenseFactory issue * update composer install command and revert license factory changes * fix env for mielisearch in ci * run test for every commit/sync/pr/merge to dev and main branch * linting fix * skip ELNSubmissionTrackingTest and allow read and write permission for code coverage * inherit secrets * Update PostgreSQL image version to 17 --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* add test coverage workflow * add .env.ci * use postgres instead of mysql for testing * add meilisearch test config and adjust redis to local for ci * remove healtchecks for redis and meilisearch services * fix the db mismatch issues in CI * fix filesystem driver issue * rectify .env file name * add .env.ci.test with correct DB_PASSWORD * skip ELNSubmissionTrackingTest.php test that requires external API access in CI environment * ELNSubmissionTrackingTest * fixx failing tests * update Code cov token * update test-coverage workflow and .env.ci.test * fix LicenseFactory issue * update composer install command and revert license factory changes * fix env for mielisearch in ci * run test for every commit/sync/pr/merge to dev and main branch * linting fix * skip ELNSubmissionTrackingTest and allow read and write permission for code coverage * inherit secrets * feat: add tests for models * chore: pint formatting of some tests * fix: failing tests due to URL generation and storage issues * run pint formatting * fix: failing tests * run pint formatting * revert test database name --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* feat: add comprehensive project tests and factories * fix: add unit tests for NMRiumModel * pint formatting * composer update symfony/http-foundation * Update app/Events/ProjectMemberAdded.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update app/Events/AddingProjectMember.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Initial plan (#1296) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * :void * Initial plan (#1297) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * revert copilot changes * fix failing tests * revert db name in phpunit.xml * run lint --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* chore: csp optimization remove csp routes and commands, update policy to remove unused sources * review changes * pint and formatting --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* chore: Fix Pint issues * chore: update package-lock.json and yarn.lock
* chore: fix npm audit issues * chore: update composer.lock
* feat: update citation DOI validation * feat: update citation DOI validation * test: fix the failing test * test: add missing test for Citation * chore: update composer.lock * test: fix the failing tests for SyncCitations action * fix: update citation validation logic * test:fix the failing test
* fix: duplicate name validation logic error * test: add the missing test for update project name validation --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* text-2xl font-extrabold text-gray-900 * test: add missing test for StudyWorkflow * fix: duplicate name validation logic error * Revert "fix: duplicate name validation logic error" This reverts commit 9a2e75b. --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* fix: enable citation association for ELN submissions The attachCitationsToStudy call was commented out in ProcessDraftELNSubmission, preventing Chemotion publication references from being persisted to the study. Also fixes double JSON encoding on the citations column (already cast as array on the Study model) and adds DraftProcessingLogger for consistent error handling. * test: add citation extraction tests for Chemotion metadata service Covers extractStudies citation extraction with valid data and verifies empty array fallback when no citations are present. * fix: npm updates * fix: extended test cases to improve coverage
* fix: resolve duplicate flash key causing auth error messages to be lost The `flash` shared prop was defined twice in HandleInertiaRequests, causing the second definition to silently overwrite the first. This meant `flash.message` was never shared with the frontend, breaking error display for social login failures (ORCID, GitHub, etc.). Also fixes the Login.vue flash message div which used an unstyled `alert` class invisible in Tailwind, replacing it with proper error styling and adding `flash.error` support. * fix: npm updates
* test: add comprehensive tests for compound route resolution Add feature tests to verify compound route functionality: - Test valid molecule redirects to spectra page - Test case-insensitive compound identifiers (M188 and m188) - Test 404 response for non-existent molecules - Ensure existing invalid identifier test remains intact Tests follow Laravel 12 testing best practices: - Use model factories for test data generation - Use RefreshDatabase trait for clean test state - Test both success and failure scenarios - Maintain naming conventions consistent with existing tests * fix(security): add generic language files for auth and password reset Override Laravel default authentication and password reset messages to prevent user enumeration attacks. The messages now provide generic responses that do not reveal whether an email address exists in the system. * fix(security): use generic error message for unverified accounts in API login Change API login response for unverified accounts from revealing account status to generic 'Invalid login details' message. This prevents attackers from determining if an email exists in the system by checking verification status. * fix(security): use generic error messages for member invitation flows Replace specific error messages in team, project, and study member invitation flows with generic 'Unable to add member with this email address' message. This prevents user enumeration by not revealing whether an email exists or is already a member. * fix(security): remove owner.email filter from public API endpoints Remove the owner.email filter and sort options from the public data API to prevent user enumeration attacks. Attackers could previously test if emails exist by filtering public data by owner email. * fix: resolve test failures across multiple components Fix 7 failing tests identified after larabug removal: 1. AddProjectMember validation messages - Update error messages to match test expectations - "This user already belongs to the project" for duplicate users - "We were unable to find a registered user" for nonexistent users 2. Compound resolution in ApplicationController - Add Molecule namespace support to resolveIdentifier helper - Use getRawOriginal() to get numeric identifier without prefix - Fixes redirect to use correct compound parameter format 3. NFDIAAI OAuth provider authentication URL - Ensure client_id is included in authorization URL - Add fallback to append client_id if not present in built URL 4. DataCatalog schema description - Replace env() with config() for app description - Add fallback description for when config is not set - Follows Laravel 12 best practices 5. Login controller email verification - Return 403 status for unverified email attempts - Provide clear error message about email verification requirement - Improves API response clarity for authentication failures All tests now passing: 1984 passed (5070 assertions) Co-authored-by: Cursor <cursoragent@cursor.com> * style: apply pint formatting to ApplicationController Add blank line after variable assignment for better code readability as per Laravel Pint formatting standards Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: add Molecule model lookup in resolveIdentifier helper Add missing Molecule model query in the resolveIdentifier function to properly resolve compound identifiers (M###). Previously, the function recognized Molecule namespace but did not query the database, causing all /compound/M### routes to return 404 errors. This fix ensures compound URLs like /compound/M188 can properly resolve and redirect to /spectra?compound=188 as intended. Follows Laravel 12 best practices by: - Using proper model imports - Maintaining consistent query patterns with existing Project, Study, and Dataset lookups - Preserving exception handling behavior * test: add comprehensive tests for compound route resolution Add feature tests to verify compound route functionality: - Test valid molecule redirects to spectra page - Test case-insensitive compound identifiers (M188 and m188) - Test 404 response for non-existent molecules - Ensure existing invalid identifier test remains intact Tests follow Laravel 12 testing best practices: - Use model factories for test data generation - Use RefreshDatabase trait for clean test state - Test both success and failure scenarios - Maintain naming conventions consistent with existing tests
* fix: add server-side validation to restrict project image file types Add mimes validation rule to reject TIFF and other unsupported image formats. Only jpg, jpeg, png, gif, and webp are now allowed for project images with a maximum file size of 2MB. * fix: add accept attribute to project image file inputs Restrict file picker to only show supported image formats (jpeg, png, gif, webp) for better user experience. This prevents users from selecting unsupported formats like TIFF before upload.
* fix: filter default draft lookup by team_id to prevent cross-team mismatch findDefaultDraft only filtered by owner_id, which could return a draft from a different team. When the user uploaded files to that draft and refreshed at step 2, UserDrafts::execute() filtered by the current team_id and the draft would not appear in results. * feat: add draft show endpoint for direct lookup by ID Add DraftController::show() with ownership verification so the frontend can fetch a specific draft when it is not found in the pre-loaded team- scoped list. This provides a fallback for drafts that were created under a different team context. * fix: persist draft_id in URL at step 2 and add fallback draft lookup selectStep(2) did not set draft_id in the query string, relying on it persisting from step 1. Now it explicitly sets it. When a page refresh at step 2 cannot find the draft in the team-scoped list, the frontend falls back to a direct fetch via the new show endpoint. * fix: npm updates * fix: js formatting * fix: coverage updates * Fix Pint 1.29 PHPDoc for Auth user in DraftController::show
* feat(database): add author_study pivot table Add many-to-many relationship table between authors and studies to support independent studies having their own authors without requiring a parent project. - Create author_study pivot table with foreign keys - Include contributor_type and sort_order columns - Add cascade delete for referential integrity Co-authored-by: Cursor <cursoragent@cursor.com> * feat(models): add study-author relationship support Add studyAuthors() relationship to Study model and studies() relationship to Author model to support direct author associations with studies independent of projects. Changes: - Add studyAuthors() BelongsToMany relationship to Study model - Add authors() accessor as alias for studyAuthors for frontend compatibility - Remove 'authors' cast from Study model to prevent conflict with relationship - Add studies() BelongsToMany relationship to Author model - Specify pivot table name explicitly for clarity Co-authored-by: Cursor <cursoragent@cursor.com> * feat(resources): add author serialization for studies Update StudyResource and AuthorResource to properly serialize study authors for API responses and Inertia props. StudyResource changes: - Add 'authors' to default properties array - Add conditional serialization for authors using studyAuthors relationship - Include null check to return empty array when no authors exist AuthorResource changes: - Add support for author_study pivot table in contributor_type - Add support for author_study pivot table in sort_order - Use null coalescing to check both pivot tables Co-authored-by: Cursor <cursoragent@cursor.com> * fix(jobs): correct author field names in ELN submission Fix ProcessDraftELNSubmission to use correct database column names and attach authors directly to studies for independent studies. Changes: - Fix column names: first_name → given_name, last_name → family_name, email → email_id - Add syncStudyAuthors() method to attach authors to studies via author_study pivot - Improve author lookup logic to find existing authors by ORCID or name - Call syncStudyAuthors() after syncing project authors - Add proper error handling and logging This ensures authors are correctly attached to both projects and studies, supporting independent studies without parent projects. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(controllers): eager load study authors in views Update StudyController and ApplicationController to eager load studyAuthors relationship when rendering study views. StudyController changes: - Add 'studyAuthors' to eager loading in renderTabView About case - Use nullsafe operator for project relationships to prevent null errors ApplicationController changes: - Eager load studyAuthors for Study namespace resolution - Ensure authors are available for public sample views This ensures author data is available to frontend components without additional queries (N+1 prevention). Co-authored-by: Cursor <cursoragent@cursor.com> * feat(ui): display authors section in study views Add authors section to both dashboard study and public sample views, displaying author cards with names, affiliations, and ORCID IDs. Study/About.vue changes: - Add conditional authors section after description - Display study authors if available, fallback to project authors - Support both project-associated and independent studies Public/Sample/Show.vue changes: - Add authors section before molecular composition - Import and use AuthorCard component - Display all study authors with proper styling Both components check for author existence before rendering to handle studies without authors gracefully. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ui): add null safety for project references in study views Add null safety checks for project object references across study Vue components to prevent TypeErrors when studies exist without parent projects (independent studies). Changes: - Study/Layout.vue: Add v-if check for project before accessing properties - Study/Index.vue: Use optional chaining for project.obfuscationcode and project.id - Study/Content.vue: Use optional chaining for project.obfuscationcode - Study/Files.vue: Add null checks in downloadURL and getFileDownloadURL - Study/Partials/Create.vue: Add fallback for project.name All changes use Vue optional chaining (?.) or conditional rendering (v-if) to handle null project gracefully. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(eln): add NOBS metadata service implementation Implement NOBSMetadataService to handle metadata extraction from NOBS (Notebook for Organic Synthesis) ELN system. Features: - Extract project metadata (name, description, authors) - Parse NOBS-specific data structure - Support for author information with ORCID, affiliation - Handle experiment and dataset metadata - Implement ELNMetadataServiceInterface contract This service enables NOBS users to submit their experimental data directly to nmrXiv through the ELN API integration. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(eln): register NOBS service in factory Update ELNMetadataServiceFactory to support NOBS ELN system. Changes: - Add 'nobs' case to make() method - Return NOBSMetadataService instance for NOBS submissions - Maintain backward compatibility with existing Chemotion support This allows the factory to instantiate the correct metadata service based on the ELN system identifier passed in API requests. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(api): add NOBS to supported ELN systems Update ELN API controller and OpenAPI documentation to support NOBS as a valid ELN system. ELNController changes: - Add 'nobs' to SUPPORTED_ELNS constant - Update OpenAPI annotations to include 'nobs' in enum values - Update API descriptions to mention NOBS support - Extend validation to accept 'nobs' identifier API documentation changes: - Update OpenAPI spec with NOBS enum values - Add NOBS to example arrays in responses - Update endpoint descriptions This allows NOBS users to submit data via the /api/eln endpoints with proper validation and documentation. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(assets): add NOBS ELN logo Add NOBS (Notebook for Organic Synthesis) logo image for display in the ELN integration UI and documentation. This logo will be used in: - ELN selection interface - Upload page ELN options - API documentation - Help/support pages Co-authored-by: Cursor <cursoragent@cursor.com> * feat(ui): add NOBS option to ELN upload interface Update Upload and SpectraEditor components to display NOBS as a supported ELN system option. Upload.vue changes: - Add NOBS to ELN selection dropdown - Include NOBS logo in visual picker - Update help text to mention NOBS support SpectraEditor.vue changes: - Add NOBS to supported ELN list - Update ELN selection UI components This enables users to select NOBS when uploading data through the web interface, providing visual recognition and proper routing. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(security): update CSP to allow NOBS resources Update Content Security Policy to allow loading resources from NOBS domain for ELN integration. Changes: - Add NOBS domain to frame-src directive for iframe embedding - Add NOBS domain to img-src for logo loading - Add NOBS domain to connect-src for API communication - Maintain existing security restrictions This ensures proper security headers while allowing legitimate NOBS integration without CSP violations. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(config): update chemistry standardize API URL Update chemistry_standardize service URL to use the new naturalproducts.net domain instead of cheminf.studio. This change: - Points to the current production API endpoint - Maintains backward compatibility with existing functionality - No changes to API contract or response format - Uses environment variable for configurability Co-authored-by: Cursor <cursoragent@cursor.com> * chore(jobs): update commented API URL in ArchiveStudy Update commented-out chemistry standardize API URL to match the new production endpoint configuration. This is a non-functional change (code is commented) but maintains consistency with active configuration for future reference. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(config): update environment configuration Update environment and build configuration files for improved development experience and API endpoint consistency. Changes: - Update CM_API and CHEMISTRY_STANDARDIZE_URL to naturalproducts.net - Add /public/vendor to .gitignore for vendor assets - Update Vite server config for better network access: * Change host to 0.0.0.0 for Docker/network compatibility * Explicitly set port 5173 * Configure HMR to use localhost for hot reload - Add generated ziggy.js routes file Environment changes apply to: - .env.ci (CI environment) - .env.example (template for new installations) Co-authored-by: Cursor <cursoragent@cursor.com> * fix: prettier changes * fix(migrations): remove duplicate author_study migration Remove duplicate migration file created on 2026-02-10. The author_study pivot table migration already exists from 2026-02-09 (commit from fix/study-authors-display branch). The existing migration (2026_02_09_091118) should be used instead of this duplicate to avoid migration conflicts. * fix: reverted csp policy changes with cheminf.studio for compatibilities * docs(api): regenerate swagger documentation Update OpenAPI documentation to reflect recent API changes, including the updated login endpoint response for unverified email accounts. Changes: - Updated login endpoint documentation for 403 Forbidden response - Reflects email verification requirement messaging --------- Co-authored-by: Cursor <cursoragent@cursor.com>
- Bump actions/checkout, actions/cache, and actions/setup-node to v5 - Upgrade github/codeql-action/upload-sarif to v4 - Upgrade codecov/codecov-action to v6 (use files input for coverage.xml)
- Alias Inertia Link and Headless UI Dialog to avoid HTML-reserved names - Add multi-word component names for Banner and Onboarding - Declare typed props for ActionMessage, FAQs, MoleculeCard, BreadCrumbs
* Fix failed login redirect so validation errors show on /login Redirect POST login ValidationException responses to route(login) instead of url()->previous(), which could resolve to /projects when Referer is missing. - Register exception render handler for non-JSON POST login failures. - Fortify authenticateUsing with explicit redirectTo(login) and optional unknown-email message in non-production. - Scroll login form to top on validation errors. - Extend AuthenticationTest coverage. * Drop Fortify authenticateUsing override; rely on exception redirect fix Custom login duplicated AttemptToAuthenticate and was only needed for redirectTo/experimental messaging. bootstrap/app.php already redirects failed POST /login ValidationExceptions to route(login). Restore stock Fortify pipeline and generic auth lang lines.
…o development # Conflicts: # bootstrap/app.php
…ublication (#1384) * fix: include current-day release dates in project publication * fix: update the release data check for study publishing * fix: compare release date with now() directly * test: add missing tests for ProcessSubmission job --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* feat(ui): redesign submission primer and reuse component Replace the duplicated introduction block in Submission with the shared Primer component so upload and submission flows stay in sync. Refresh Primer content and layout: structured sections, step cards with icons, concept cards, improved diagram alt text and loading hints, and documentation links with rel="noopener noreferrer". Tighten the Upload page primer shell (padding, overflow-y-auto) and use PascalCase in the template for consistency with Vue style guides. * feat(upload): restore file browser empty state and layout from stash Reapply stashed FileSystemBrowser (hasProjectFiles dropzone-first layout, resizable sidebar), Children tree row alignment, and FileDetails panel tweaks. Adjust Upload step 1 wrapper (drop border on browser chrome, increase browser height) to match the restored component. * fix(upload): clarify editable project name in submission header Add a visible label, input-like container with hover and focus states, a pencil control that moves focus to the field, helper copy for discoverability, and normal-case title text so names are readable. Improves affordance without changing save behaviour. * fix(upload): align draft id with folder structure help row Show Draft ID on the right of the Learn more link inside FileSystemBrowser, and remove the duplicate line above the browser on Upload step 1. * fix(upload): clip project name pencil hover to rounded container Add overflow-hidden on the project name field wrapper and rounded-r-lg on the pencil control so hover/focus backgrounds follow the outer border radius. * fix(upload): let project name field span header width Give the header left column flex-1 min-w-0, make the draft name stack w-full, and shrink-0 the actions column so the bordered field uses remaining horizontal space. * feat(upload): unify header toolbar with back, step, and actions Place the step label beside a styled ArrowLeft control, keep Cancel/Proceed on the same row aligned right, and move the project name block below. Add tour anchor ids for submission header and project name. Primer controls use flex instead of floats. * feat(upload): add DOI reservation toggle and copy UI (preview only) Add an I need a DOI switch below the project name with a read-only preview URL, postfix Copy control using the clipboard API, helper copy about reserving before upload, and a short copied confirmation. Preview value is placeholder until DOI issuance is implemented; state resets when switching drafts. * fix(upload): tighten spacing around folder-structure help row Remove vertical margin on the learn-more row, reduce fullscreen header and dropzone shell padding, and slightly tighten the gap before the dropzone when files exist. * fix(ui): correct tooltip positioning and info icon hover Center tooltiptext with translateX(-50%), add focus-within and opacity transition, and use inline-flex on .tooltip triggers. Restructure folder-structure help so the info tooltip is not nested inside the doc link; give the icon a compact hover/focus ring. Update ToolTip trigger styling. * feat(doi): add provisional_doi column and placeholder generator Add nullable projects.provisional_doi after doi. Introduce ProvisionalDoi helper for draft-key-based placeholders and normalize mistaken datacite/ prefix segments. Extend Project with fillable provisional_doi and appended provisional_doi_url using https://doi.org when doi.host is not a URL. * feat(api): draft provisional-doi endpoints and null-safe draft info Register POST/DELETE dashboard/drafts/{draft}/provisional-doi with owner authorization, transactional draft lock, and idempotent assign or clear. Create a draft-linked project via ProcessDraft::createNewProject when none exists so reserve works before process. Harden info to return null project and empty studies when no row exists. * feat(upload): provisional DOI reserve UI on upload step Reserve or clear via API with loading state and inline errors instead of alert(). Hide toggle once a provisional DOI exists; show resolver URL and copy with confirmation on the label row. Hydrate from draft info after selection or successful reserve. * test(doi): cover provisional DOI helper and draft endpoints Add unit tests for ProvisionalDoi string rules and feature tests for store, destroy, info without project, and project serialization with provisional_doi_url. * fix(layout): allow main content to shrink for nested scroll Add min-h-0 to the content column and main element so flex children with overflow-y-auto can resolve height inside Inertia layouts. * fix(css): improve tooltip stacking in clipped layouts Raise z-index, anchor tooltips below the trigger, and use pointer-events so hover tooltips remain usable inside overflow-hidden regions. * feat(ui): file browser flex layout, scroll panes, and folder tree sort - Refine dropzone and column flex layout (min-h-0, full-height aside/section). - Add fixed-height scroll regions for tree, folder panel, and file details (500px). - Add folder tree sort (name / modified) with order toggle and Headless UI menu. - Sort tree children in Children; stable keys with id fallback; pass sort props into nested recursion. * refactor(file-browser): make expandedFolders mutations reactive in Vue 3 Vue 3 does not always notify dependents when a `Set` is mutated in place via `.add` / `.delete` / `.clear`, which left the sidebar tree out of sync with `expandedFolders` after operations such as toggling, restoring URL state, or recovering from deletions. - Introduce `setExpandedFolders` and `mutateExpandedFolders` helpers that always reassign `expandedFolders` with a new `Set` instance so Vue picks up the change. - Route every mutation through these helpers (toggle, clear, restore from URL, 404 recovery in `fetchFolderChildren`, `expandPathToObject`, and `revertToParentAfterDeletion`). - Add a `:key` to the root and nested `Disclosure` components in `Children.vue` tied to the expanded state so `default-open` is re-evaluated on subsequent updates instead of being stuck on first mount. * chore(file-browser): apply prettier formatting Re-format FileSystemBrowser.vue and Children.vue against the project's prettier configuration so subsequent feature commits show only substantive changes. * feat(file-browser): add breadcrumbs, expand/collapse all, and flex layout Reshapes the file browser around a real flex layout so the panes grow to fill the available space and adds discoverable navigation inside the tree and right-pane header. Layout - Replace the legacy `min-h: 500px; max-h: 500px; overflow-y: scroll` inline styles on the tree and grid scroll panes with proper flex containers (`flex flex-col`, `min-h-0`, `flex-1`). - Wrap `<file-system-browser>` on the Upload page in flex columns and enforce a `min-h-[500px]` floor so the browser still has a usable size on short viewports. - Switch the FSB `height` prop usage from `'h-full w-full flex-1'` to `'flex-1 w-full'` to play nicely with the new flex chain. - Align the sidebar header bar with the right-pane header bar (`min-h-12`, shared `px-5`) so the two columns line up. Tree toolbar - Add Expand all / Collapse all buttons to the Folders header using `ArrowsPointingOutIcon` / `ArrowsPointingInIcon`, backed by a new `collectExpandableFolderIds` traversal and `expandAllFoldersInTree` / `collapseAllFoldersInTree` actions. - Drop the `<count> items` label from the Folders header. - Bump the chevron in `Children.vue` by `ml-1` so it visually nests under its parent row. Right-pane breadcrumbs - Replace the truncated `relative_url` string in the right-pane header with a real breadcrumb (`HomeIcon` + `ChevronRightIcon` separators) backed by a new `pathBreadcrumbSegments` computed. - Add `normalizeRelativePath`, `buildPathBreadcrumbSegments`, `findObjectByRelativeUrl`, `breadcrumbNavigateToPath`, and `breadcrumbGoToRoot` helpers so breadcrumb clicks navigate via the existing `displaySelected` flow. Tree sync on navigation - Make `displaySelected` async and route lazy children loading through `expandPathToObject`, so double-clicking a folder in the right pane also expands the matching branch in the left tree (relying on the reactive set helpers introduced in the previous commit). * refactor(upload): replace provisional DOI Switch with neutral action button The Headless UI Switch + label combo for the provisional DOI control read as a passive setting rather than an action and depended on a brand color (teal) that does not match the rest of the upload screen. - Drop `HeadlessSwitch`, `SwitchGroup`, and `SwitchLabel` and render a real `<button type="button">` that calls the existing `onReservedDoiSwitch` handler with the inverted state. - Size the button to its content (`w-fit`, `self-start`, `max-w-full`) so it does not stretch full width on larger breakpoints. - Use neutral gray styles for the primary "Reserve" state and a white outlined style for the "Remove" state, with hover, active, focus-visible, and disabled affordances (`cursor-pointer`, `hover:shadow-md`, `focus-visible:ring-2`, `disabled:pointer-events-none`). - Show a subtle `ChevronRightIcon` on the primary state that nudges on hover so the control reads as actionable. - Preserve the existing loading spinner, `aria-busy`, and `aria-pressed` semantics, and keep a short helper sentence below the button explaining the consequence of the action. * fix: minor ui modifications * fix(file-browser): stabilize dropzone queue before checksum calculation Dropzone fires `addedfiles` before asynchronous folder traversal finishes, so hashing too early skipped files added later during drag-and-drop and left MD5/SHA unset compared to the folder-picker flow. - Poll until `dropzone.files.length` is unchanged for a quiet window, then run `calculateChecksumsForFiles` on the full queue and start batches - Clear pending checksum timers when resetting the dropzone after upload - Add a `Logs` control beside Draft ID when `processing_logs` is non-empty; emit `show-processing-logs` for parent pages - Declare `show-processing-logs` on a single `emits` option (Vue options API) * feat(upload): polish processing logs modal and file browser integration - Redesign the processing logs dialog (title, draft id, entry count, level pills, `logLevelMeta` helper, accessible `role="log"`, styled details) - Remove the draft-list "View logs" button; rely on the file browser `Logs` action and `@show-processing-logs` to open the same modal * feat(submission): open processing logs from file browser Handle `show-processing-logs` from `FileSystemBrowser` the same way as the upload page by delegating to `showProcessingLogs(currentDraft)`. * chore(config): queue, doi, horizon, trust proxies, and phpunit * feat(dataset): persist spectrum assignments on datasets * feat(doi): provisional registration tracking and DataCite metadata enrichment * feat(nmr): JCamp helpers, Bioschemas NMRium metadata, and verification commands * feat(draft): filesystem observer, archive invalidation, and submission processing * feat(upload): provisional DOI and draft status in controllers and routes * feat(ui): upload flow, spectra editor, draft status badge, and build manifest * feat(dashboard): compound library queries and workspace molecule stats - Extract CompoundLibraryRankedStudiesQuery and WorkspaceMoleculeAggregates support classes to slim DashboardController and isolate SQL. - Validate dashboard query params with DashboardIndexRequest; authorize authenticated users only. - Dedupe compound-library studies; eager-load workspace sample counts and experiment-type JSON per molecule. - Frontend: CompoundCards, MoleculeCard workspace panel, filters, pagination; remove Samples.vue. - Share dashboard workspace mode via HandleInertiaRequests. Tests: tests/Feature/DashboardTest.php (requires configured database). * Align dashboard workspace UI with primary brand tokens - Extend Tailwind with primary palette and map Jetstream inputs to primary focus rings - Refresh Upload hero gradient and primary accents for consistency with workspace theme - Use primary tokens in SelectRich, StudyInfo, ToggleButton, and Validation shared components - Update project Show empty-state and publish checkboxes to primary styling (Ziggy routes unchanged) - Rebuild Vite manifest for production assets * Improve publish metadata UI and use Ziggy for navigation - Refine Publish page layout, author/citation cards, and manage modals - Add publish-related styles (tags input, datepicker, draggable authors) - Wire project Show metadata cards with edit/delete actions where applicable - Replace hardcoded upload, dashboard, draft update, publish, and status URLs with named routes - Regenerate Vite manifest * chore(observability): add structured publish pipeline trace logs Emit embargo_publish_trace entries from broadcast events, notification listeners, archive and ELN jobs, console commands, and the file-system observer so production issues can be correlated end-to-end. Listeners now type-hint their concrete event classes instead of object. * fix(jobs): stabilize publish file moves and draftless submissions Relocate draft folders inside FileSystemObject::withoutEvents to avoid observer-driven archive churn during path rewrites. ProcessSubmission now finalizes project-mode publishing when the draft record is already gone, and tests cover archive suppression during moves and study publish expectations. * fix(project): respect explicit species and tag updates in partial saves Use project_species_updated and project_tags_updated flags so publish and edit flows can clear or replace JSON species and Spatie tags without stripping them on unrelated updates. Adds feature coverage for clearing tags and species and for loading an embargo project show URL with edit=release_date. * feat(publish): Inertia-friendly publish flow and embargo metadata UI Publish endpoint returns redirects and ValidationException for browser requests while preserving JSON for API clients, and surfaces publish_validation_hints via shared Inertia flash props. Project and publish pages show provisional DOI, release scheduling, citations, and dates consistently; dashboard tests assert embargo fields in the Inertia payload. Refresh the Vite manifest for the updated frontend bundle. * fix(frontend): resolve openchemlib imports for Vite openchemlib v9 exposes only the package root and ./debug; subpaths /full and /minimal were removed from exports, which broke Vite dev and build. Import the default bundle from openchemlib everywhere. * feat(citations): add study–citation pivot and end-to-end sync Introduce citation_study and Study::linkedCitations (distinct from the JSON citations column) so studies share the normalized Citation model with projects. Generalize SyncCitations and pivot updates via SyncCitationPivot; ELN processing dual-writes ELN metadata to JSON and syncs mapped rows to the pivot when a study owner exists. When publishing as standalone samples, merge project citations onto each study before the project row is removed. Expose citations on public study and sample pages, add authenticated study citation routes, and extend cleanup and tests accordingly. This follows Laravel 12 patterns (typed actions, gates, API resources, queued jobs). Filament is not used in this application. * feat(project): unify canonical URLs and member workspace context Published projects redirect from the dashboard slug route to the public identifier URL; public project views merge optional member workspace props via ProjectWorkspace. Controllers, resources, Dataset helpers, and the draft ELN job are updated accordingly, with feature and unit tests covering redirects and Inertia props. * feat(ui): align Inertia workspace with public project routes Refactor public project, study, and sample pages to share navigation and layout with the unified URL scheme; tune dashboard entry points, publish and filesystem links, and NMRium preconnect handling. Refresh the Vite manifest for the updated bundle graph. * feat(validation): skip project metadata when publishing in samples mode Allow sample-only publishes to pass validation based on study status while marking incomplete project fields as skipped, and force samples mode during project publish when releasing individual samples. * feat(api): proxy chemistry standardize requests through Laravel Add an authenticated, throttled POST endpoint so the frontend can standardize structures without browser CORS, and share the route via Inertia shared props. * fix(ui): place sample citations in the left content column Move the DOI cite widget and related citation cards into the main column beside the molecular structure sidebar instead of full-width sections above or below the metadata grid. * feat(public): scope compound catalog to molecules with public spectra Add PublicMoleculeAggregates for catalog filtering in compound search, default unsorted API listings to recent, and normalize compounds page pagination. Render legacy compound URLs via the public studies view. * refactor(routes): redirect legacy /spectra URLs to projects or compounds Remove the duplicate public spectra route and 301 unqualified /spectra requests to the projects index. Update study publish emails to link there. * refactor(ui): unify public navigation on compounds spectra library routes Replace /spectra links with /compounds and canonical compound URLs across public pages, cards, and marketing layouts. Align footer and integration tests with the updated public URL structure. * refactor(ui): polish dashboard sidebar navigation Extract DashboardSidebarNav with pill styling, workspace sections, and route-aware active states. Remove legacy nav duplication from AppLayout. * feat(search): include IUPAC name in compound search Extend molecule text search so queries match iupac_name alongside name, synonyms, and identifier. * feat(project): support for_nav studies listing with datasets Add a navigation-oriented studies response that eager-loads datasets and returns lite study resources for public project sidebars. * feat(ui): add deterministic seeded cover backgrounds Generate consistent gradient covers from project identifiers when no photo is set, and refresh project cards to use the shared cover component. * feat(public): render sample datasets without a parent project Resolve datasets through their study when project_id is missing, abort when no study exists, and share dataset page content via PublicDatasetBody. * refactor(ui): unify public project layout and molecule display Extract MolecularInfoPanel, align project layout navigation with for_nav studies, and polish compounds, citations, and sample study pages. * refactor(ui): polish project card footer metadata layout Remove submitter avatars and show license on its own line with distinct weight, color, and spacing in grid and list card layouts. * chore: lint formatting changes * fix: composer update and other github checks fixes * fix: linting issues * chore: linting errors fix * fix: various updates, bug fixes and test case updates / refactor
#1398) * fix(mail): correct publish emails, remove duplicates, polish templates * fix: the failing test for DraftFeatureTest --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* fix: update draft tag UI/UX broken links * update composer packages and lock files * test: fix failing test for Announcement model --------- Co-authored-by: Chandu Nainala <mailcs76@gmail.com>
* fix: enable release now for embargoed projects addition of a command to publish embargoed projects * test: added tests for publish embargo project action and policy * fix: update Embargo message on the layout page * fix: validate embargo publication * fix: remove project mode warning for single sample projects in embargo publication
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1326
Fixes #1323
Fixes #1319
Fixes #1312
Fixes #1311
Fixes #1292
Fixes #1305
Fixes #1303
Fixes #1292
Fixes #1290
Fixes #1251
Fixes #1309
Fixes #1306
Fixes #1294
Fixes #1287
Fixes #1279
Fixes #1278
Fixes #1276
Fixes #1275
Fixes #1271
Fixes #1263
Fixes #1262
Fixes #608