From d07b8e52e9a51a4d205b679a2278444f7acdc5ea Mon Sep 17 00:00:00 2001 From: Nisha Sharma Date: Thu, 9 Oct 2025 11:06:47 +0200 Subject: [PATCH 001/116] CAS_API_TOKEN --- .env.example | 4 +- app/Console/Commands/SanitizeMolecules.php | 100 +- app/Http/Controllers/CasController.php | 92 + config/services.php | 9 +- public/build/manifest.json | 3924 ++++++++++---------- resources/js/Pages/Upload.vue | 411 +- routes/web.php | 4 + 7 files changed, 2454 insertions(+), 2090 deletions(-) create mode 100644 app/Http/Controllers/CasController.php diff --git a/.env.example b/.env.example index 9c88138b1..3c6398a6a 100644 --- a/.env.example +++ b/.env.example @@ -118,9 +118,9 @@ DATACITE_PREFIX= DATACITE_ENDPOINT= NMRKIT_URL=https://nodejs.nmrxiv.org -CAS_URL=https://commonchemistry.cas.org PUBCHEM_URL=https://pubchem.ncbi.nlm.nih.gov -COMMON_CHEMISTRY_URL=https://commonchemistry.cas.org +COMMON_CHEMISTRY_URL=https://commonchemistry.cas.org/api +CAS_API_TOKEN= CHEMISTRY_STANDARDIZE_URL=https://api.cheminf.studio/latest/chem/standardize BACKUP_KEEP_DAYS=7 \ No newline at end of file diff --git a/app/Console/Commands/SanitizeMolecules.php b/app/Console/Commands/SanitizeMolecules.php index ad6313f94..a3c877087 100644 --- a/app/Console/Commands/SanitizeMolecules.php +++ b/app/Console/Commands/SanitizeMolecules.php @@ -27,37 +27,51 @@ class SanitizeMolecules extends Command */ public function handle(): void { - $molecules = Molecule::all(); - - foreach ($molecules as $molecule) { - echo $molecule->id; - echo "\r\n"; - $inchi = $molecule->standard_inchi; - if ($inchi) { - $data = $this->fetchPubChemIUPACProperties($inchi); - $molecule->synonyms = $data['synonyms']; - $molecule->iupac_name = (array_key_exists('IUPACName', $data['properties']) ? $data['properties']['IUPACName'] : $molecule->iupac_name); - $molecule->molecular_formula = (array_key_exists('MolecularFormula', $data['properties']) ? $data['properties']['MolecularFormula'] : $molecule->molecular_formula); - $molecule->molecular_weight = (array_key_exists('MolecularWeight', $data['properties']) ? $data['properties']['MolecularWeight'] : $molecule->molecular_weight); - $molecule->Save(); - } - if (! $molecule->canonical_smiles) { - echo $molecule->id; - echo "\r\n"; - $molecule->sdf = ' + $totalMolecules = Molecule::count(); + $this->info("Processing {$totalMolecules} molecules..."); + + if ($totalMolecules === 0) { + $this->info('No molecules found to process.'); + + return; + } + + $progressBar = $this->output->createProgressBar($totalMolecules); + $progressBar->start(); + + Molecule::chunk(100, function ($molecules) use ($progressBar) { + foreach ($molecules as $molecule) { + $inchi = $molecule->standard_inchi; + if ($inchi) { + $data = $this->fetchPubChemIUPACProperties($inchi); + $molecule->synonyms = $data['synonyms']; + $molecule->iupac_name = (array_key_exists('IUPACName', $data['properties']) ? $data['properties']['IUPACName'] : $molecule->iupac_name); + $molecule->molecular_formula = (array_key_exists('MolecularFormula', $data['properties']) ? $data['properties']['MolecularFormula'] : $molecule->molecular_formula); + $molecule->molecular_weight = (array_key_exists('MolecularWeight', $data['properties']) ? $data['properties']['MolecularWeight'] : $molecule->molecular_weight); + $molecule->save(); + } + if (! $molecule->canonical_smiles) { + $molecule->sdf = ' '.$molecule->sdf; - $standardisedMOL = $this->standardizeMolecule($molecule->sdf); - $molecule->canonical_smiles = array_key_exists('canonical_smiles', $standardisedMOL) ? $standardisedMOL['canonical_smiles'] : null; - $molecule->standard_inchi = array_key_exists('inchi', $standardisedMOL) ? $standardisedMOL['inchi'] : null; - $molecule->inchi_key = array_key_exists('canonicalinchikey_smiles', $standardisedMOL) ? $standardisedMOL['inchikey'] : null; - $molecule->save(); - } - if ($molecule->canonical_smiles) { - $cas = $this->fetchCAS($molecule->canonical_smiles); - $molecule->cas = $cas; - $molecule->save(); + $standardisedMOL = $this->standardizeMolecule($molecule->sdf); + $molecule->canonical_smiles = array_key_exists('canonical_smiles', $standardisedMOL) ? $standardisedMOL['canonical_smiles'] : null; + $molecule->standard_inchi = array_key_exists('inchi', $standardisedMOL) ? $standardisedMOL['inchi'] : null; + $molecule->inchi_key = array_key_exists('canonicalinchikey_smiles', $standardisedMOL) ? $standardisedMOL['inchikey'] : null; + $molecule->save(); + } + if ($molecule->canonical_smiles) { + $cas = $this->fetchCAS($molecule->canonical_smiles); + $molecule->cas = $cas; + $molecule->save(); + } + + $progressBar->advance(); } - } + }); + + $progressBar->finish(); + $this->newLine(); + $this->info('Molecule sanitization completed successfully!'); } protected function fetchPubChemIUPACProperties($inchi) @@ -98,22 +112,38 @@ protected function fetchPubChemIUPACProperties($inchi) protected function fetchCAS($smiles) { try { - $ccBase = rtrim(config('services.common_chemistry.base_url'), '/'); - $ccApi = trim(config('services.common_chemistry.api_path'), '/'); - $response = Http::get($ccBase.'/'.$ccApi.'/search', [ + $ccBase = rtrim(config('services.cas.base_url'), '/'); + $apiToken = config('services.cas.api_token'); + + if (! $apiToken) { + $this->error('CAS API token not configured'); + + return null; + } + + $response = Http::withHeaders([ + 'X-API-KEY' => $apiToken, + ])->get($ccBase.'/search', [ 'q' => $smiles, ]); + if (! $response->failed()) { $data = $response->json(); - if ($data['count'] > 0) { + if (isset($data['count']) && $data['count'] > 0) { $cas = $data['results'][0]['rn']; return $cas; } + } else { + $this->warn('CAS API failed with status: '.$response->status().' for molecule'); } } catch (\Illuminate\Http\Client\ConnectionException $e) { - echo 'timed out: '.$smiles; + $this->warn('CAS API connection timeout for molecule'); + } catch (\Exception $e) { + $this->error('Error fetching CAS: '.$e->getMessage()); } + + return null; } protected function standardizeMolecule($mol) @@ -124,7 +154,7 @@ protected function standardizeMolecule($mol) return $response->json(); } catch (\Illuminate\Http\Client\ConnectionException $e) { - echo 'timed out: '.$mol; + $this->warn('Chemistry standardize API timeout'); } } } diff --git a/app/Http/Controllers/CasController.php b/app/Http/Controllers/CasController.php new file mode 100644 index 000000000..fa8981f41 --- /dev/null +++ b/app/Http/Controllers/CasController.php @@ -0,0 +1,92 @@ +validate([ + 'cas_rn' => 'required|string|max:20', + ]); + + $casNumber = $request->input('cas_rn'); + $token = config('services.cas.api_token') ?? env('CAS_API_TOKEN'); + $baseUrl = config('services.cas.base_url') ?? env('COMMON_CHEMISTRY_URL', self::DEFAULT_BASE_URL); + + if (! $token) { + Log::error('CAS API token not configured'); + + return response()->json([ + 'error' => 'CAS API token not configured', + ], 500); + } + + try { + $response = Http::timeout(self::REQUEST_TIMEOUT) + ->withHeaders([ + 'X-API-KEY' => $token, + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', + ]) + ->get("{$baseUrl}/detail", [ + 'cas_rn' => $casNumber, + ]); + + if ($response->successful()) { + return response()->json($response->json()); + } + + // Handle specific error cases + if ($response->status() === 404) { + return response()->json([ + 'error' => "Details not found for CAS number {$casNumber}. Please enter a valid CAS Registry Number.", + ], 404); + } + + if ($response->status() === 401) { + return response()->json([ + 'error' => 'API authentication failed - invalid or missing CAS API token', + ], 401); + } + + if ($response->status() === 403) { + return response()->json([ + 'error' => 'Access forbidden - check CAS API token permissions', + ], 403); + } + + if ($response->status() === 429) { + return response()->json([ + 'error' => 'Rate limit exceeded - please wait before making another request', + ], 429); + } + + return response()->json([ + 'error' => 'CAS API server error - please try again later', + ], $response->status()); + + } catch (\Exception $e) { + Log::error('CAS API Exception', [ + 'message' => $e->getMessage(), + 'cas_number' => $casNumber, + ]); + + return response()->json([ + 'error' => 'CAS API server error - please try again later', + ], 500); + } + } +} diff --git a/config/services.php b/config/services.php index 88e0bd2e0..efc590b8b 100644 --- a/config/services.php +++ b/config/services.php @@ -48,12 +48,13 @@ // Allow overriding the PUG REST path if needed 'pug_rest_path' => env('PUBCHEM_PUG_PATH', '/rest/pug'), ], - 'common_chemistry' => [ - 'base_url' => env('COMMON_CHEMISTRY_URL', 'https://commonchemistry.cas.org'), - 'api_path' => env('COMMON_CHEMISTRY_API_PATH', '/api'), - ], 'chemistry_standardize' => [ 'url' => env('CHEMISTRY_STANDARDIZE_URL', 'https://api.cheminf.studio/latest/chem/standardize'), ], + 'cas' => [ + 'api_token' => env('CAS_API_TOKEN'), + 'base_url' => env('COMMON_CHEMISTRY_URL', 'https://commonchemistry.cas.org/api'), + ], + ]; diff --git a/public/build/manifest.json b/public/build/manifest.json index 11b583482..b6f31c9cf 100644 --- a/public/build/manifest.json +++ b/public/build/manifest.json @@ -1,513 +1,524 @@ { - "_AccessDialogue-ik0ZUjMt.js": { - "file": "assets/AccessDialogue-ik0ZUjMt.js", + "_AccessDialogue-CmRWCSId.js": { + "file": "assets/AccessDialogue-CmRWCSId.js", "name": "AccessDialogue", "imports": [ "resources/js/app.js", - "_ActionMessage-en-kdd4A.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", - "_ToolTip-nolQgoq4.js", - "_transition-BBPlwnLi.js" + "_ActionMessage-CEgylh_C.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", + "_ToolTip-tz4DL0Vl.js", + "_transition-Bywo_EjD.js" ] }, - "_ActionMessage-en-kdd4A.js": { - "file": "assets/ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js": { + "file": "assets/ActionMessage-CEgylh_C.js", "name": "ActionMessage", "imports": [ "resources/js/app.js" ] }, - "_ActionSection-DTDZCkQU.js": { - "file": "assets/ActionSection-DTDZCkQU.js", + "_ActionSection-CsGa58iF.js": { + "file": "assets/ActionSection-CsGa58iF.js", "name": "ActionSection", "imports": [ - "_SectionTitle-DPTXcgQk.js", + "_SectionTitle-Bj5MtmBO.js", "resources/js/app.js" ] }, - "_AnnouncementBanner-DT1-C9Zs.js": { - "file": "assets/AnnouncementBanner-DT1-C9Zs.js", + "_AnnouncementBanner-BXZ3u3vr.js": { + "file": "assets/AnnouncementBanner-BXZ3u3vr.js", "name": "AnnouncementBanner", "imports": [ "resources/js/app.js", - "_XMarkIcon-BlHATxl7.js" + "_XMarkIcon-DbRu9S20.js" ] }, - "_AppLayout-CHKJyPg6.js": { - "file": "assets/AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js": { + "file": "assets/AppLayout-CLQ7DcQE.js", "name": "AppLayout", "imports": [ - "_ApplicationLogo-CyFTWMH_.js", - "resources/js/app.js", - "_transition-BBPlwnLi.js", - "_ToolTip-nolQgoq4.js", - "_form-M9Q1t-4r.js", - "_use-outside-click-B2dJh7J0.js", - "_use-text-value-Bz3IoE8a.js", - "_hidden-CqBIuuIi.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_ApplicationLogo-DYFr7BLm.js", + "resources/js/app.js", + "_transition-Bywo_EjD.js", + "_ToolTip-tz4DL0Vl.js", + "_form-hbU7ivqE.js", + "_use-outside-click-COymWbdY.js", + "_use-text-value--_X_TXkd.js", + "_hidden-Bz-eybui.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", "resources/js/Pages/Study/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_vue-tags-input-Brt1BEPT.js", - "_InputError-_cziYJpt.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_SelectRich-Bz_F4CjK.js" - ] - }, - "_ApplicationLogo-CyFTWMH_.js": { - "file": "assets/ApplicationLogo-CyFTWMH_.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_vue-tags-input-66HPPbTM.js", + "_InputError-Bq6mbTW3.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_SelectRich-FFXaNP-j.js" + ] + }, + "_ApplicationLogo-DYFr7BLm.js": { + "file": "assets/ApplicationLogo-DYFr7BLm.js", "name": "ApplicationLogo", "imports": [ "resources/js/app.js" ] }, - "_AuthenticationCard-Cs_JTLTM.js": { - "file": "assets/AuthenticationCard-Cs_JTLTM.js", + "_AuthenticationCard-C4lnueVA.js": { + "file": "assets/AuthenticationCard-C4lnueVA.js", "name": "AuthenticationCard", "imports": [ "resources/js/app.js" ] }, - "_AuthenticationCardLogo-D4hJZYMy.js": { - "file": "assets/AuthenticationCardLogo-D4hJZYMy.js", + "_AuthenticationCardLogo-DGWLzXZC.js": { + "file": "assets/AuthenticationCardLogo-DGWLzXZC.js", "name": "AuthenticationCardLogo", "imports": [ "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js" + "_ApplicationLogo-DYFr7BLm.js" ] }, - "_BreadCrumbs-C1HWokih.js": { - "file": "assets/BreadCrumbs-C1HWokih.js", + "_BreadCrumbs-DBmI2F7S.js": { + "file": "assets/BreadCrumbs-DBmI2F7S.js", "name": "BreadCrumbs", "imports": [ "resources/js/app.js" ] }, - "_Button-BeZ53GAN.js": { - "file": "assets/Button-BeZ53GAN.js", + "_Button-CDBxb6x8.js": { + "file": "assets/Button-CDBxb6x8.js", "name": "Button", "imports": [ "resources/js/app.js" ] }, - "_CalendarDaysIcon-DXIhKiXL.js": { - "file": "assets/CalendarDaysIcon-DXIhKiXL.js", + "_CalendarDaysIcon-1aB0Hww7.js": { + "file": "assets/CalendarDaysIcon-1aB0Hww7.js", "name": "CalendarDaysIcon", "imports": [ "resources/js/app.js" ] }, - "_Checkbox-D4qUGLva.js": { - "file": "assets/Checkbox-D4qUGLva.js", + "_Checkbox-ClxBeW_q.js": { + "file": "assets/Checkbox-ClxBeW_q.js", "name": "Checkbox", "imports": [ "resources/js/app.js" ] }, - "_CircleStackIcon-CLKdXbYt.js": { - "file": "assets/CircleStackIcon-CLKdXbYt.js", + "_CircleStackIcon-DP236pKy.js": { + "file": "assets/CircleStackIcon-DP236pKy.js", "name": "CircleStackIcon", "imports": [ "resources/js/app.js" ] }, - "_Citation-Ccc7Otfp.js": { - "file": "assets/Citation-Ccc7Otfp.js", + "_Citation-6nihkRjJ.js": { + "file": "assets/Citation-6nihkRjJ.js", "name": "Citation", "imports": [ "resources/js/app.js" ] }, - "_CitationCard-BeGEzoPQ.js": { - "file": "assets/CitationCard-BeGEzoPQ.js", + "_CitationCard-BfC9h-1A.js": { + "file": "assets/CitationCard-BfC9h-1A.js", "name": "CitationCard", "imports": [ - "_Tag-C0ErVfEP.js", + "_Tag-B7nzd99-.js", "resources/js/app.js" ] }, - "_ClipboardDocumentIcon-LpWWgcRu.js": { - "file": "assets/ClipboardDocumentIcon-LpWWgcRu.js", + "_ClipboardDocumentIcon-0LAEA0cq.js": { + "file": "assets/ClipboardDocumentIcon-0LAEA0cq.js", "name": "ClipboardDocumentIcon", "imports": [ "resources/js/app.js" ] }, - "_ConfirmationModal-kI7bXJ7P.js": { - "file": "assets/ConfirmationModal-kI7bXJ7P.js", + "_ConfirmationModal-CCL_ECcJ.js": { + "file": "assets/ConfirmationModal-CCL_ECcJ.js", "name": "ConfirmationModal", "imports": [ - "_Modal-DgpRXIz_.js", + "_Modal-D61CKu2W.js", "resources/js/app.js" ] }, - "_DOIBadge-DbmigWol.js": { - "file": "assets/DOIBadge-DbmigWol.js", + "_DOIBadge-Bk_LImDc.js": { + "file": "assets/DOIBadge-Bk_LImDc.js", "name": "DOIBadge", "imports": [ "resources/js/app.js" ] }, - "_DangerButton-DQvgNoGf.js": { - "file": "assets/DangerButton-DQvgNoGf.js", + "_DangerButton-CjzdR-BN.js": { + "file": "assets/DangerButton-CjzdR-BN.js", "name": "DangerButton", "imports": [ "resources/js/app.js" ] }, - "_Depictor2D-BwsYzoZc.js": { - "file": "assets/Depictor2D-BwsYzoZc.js", + "_Depictor2D-DgJuFKO3.js": { + "file": "assets/Depictor2D-DgJuFKO3.js", "name": "Depictor2D", "imports": [ "resources/js/app.js" ] }, - "_Depictor3D-3-ODGpqr.js": { - "file": "assets/Depictor3D-3-ODGpqr.js", + "_Depictor3D-CWlOEgTQ.js": { + "file": "assets/Depictor3D-CWlOEgTQ.js", "name": "Depictor3D", "imports": [ "resources/js/app.js" ] }, - "_DialogModal-D90r7WOa.js": { - "file": "assets/DialogModal-D90r7WOa.js", + "_DialogModal-C_jQV6cQ.js": { + "file": "assets/DialogModal-C_jQV6cQ.js", "name": "DialogModal", "imports": [ - "_Modal-DgpRXIz_.js", + "_Modal-D61CKu2W.js", "resources/js/app.js" ] }, - "_FlashMessages-BWK0DmX4.js": { - "file": "assets/FlashMessages-BWK0DmX4.js", + "_FlashMessages-DwOEal7U.js": { + "file": "assets/FlashMessages-DwOEal7U.js", "name": "FlashMessages", "imports": [ "resources/js/app.js" ] }, - "_FormSection-B02w6tsA.js": { - "file": "assets/FormSection-B02w6tsA.js", + "_FormSection-Cq0uML9d.js": { + "file": "assets/FormSection-Cq0uML9d.js", "name": "FormSection", "imports": [ - "_SectionTitle-DPTXcgQk.js", + "_SectionTitle-Bj5MtmBO.js", "resources/js/app.js" ] }, - "_HomeIcon-jA7JVb1d.js": { - "file": "assets/HomeIcon-jA7JVb1d.js", + "_HomeIcon-DOPSBUau.js": { + "file": "assets/HomeIcon-DOPSBUau.js", "name": "HomeIcon", "imports": [ "resources/js/app.js" ] }, - "_Icon-LvTHXBEf.js": { - "file": "assets/Icon-LvTHXBEf.js", + "_Icon-UQabWdLG.js": { + "file": "assets/Icon-UQabWdLG.js", "name": "Icon", "imports": [ "resources/js/app.js" ] }, - "_Input-YhVrcc3z.js": { - "file": "assets/Input-YhVrcc3z.js", + "_Input-BBvS1pPL.js": { + "file": "assets/Input-BBvS1pPL.js", "name": "Input", "imports": [ "resources/js/app.js" ] }, - "_InputError-_cziYJpt.js": { - "file": "assets/InputError-_cziYJpt.js", + "_InputError-Bq6mbTW3.js": { + "file": "assets/InputError-Bq6mbTW3.js", "name": "InputError", "imports": [ "resources/js/app.js" ] }, - "_Label-UsCugFRJ.js": { - "file": "assets/Label-UsCugFRJ.js", + "_Label-CKqC8ocS.js": { + "file": "assets/Label-CKqC8ocS.js", "name": "Label", "imports": [ "resources/js/app.js" ] }, - "_LoadingButton-DTYXsfTb.js": { - "file": "assets/LoadingButton-DTYXsfTb.js", + "_LoadingButton-tGgWNr9y.js": { + "file": "assets/LoadingButton-tGgWNr9y.js", "name": "LoadingButton", "imports": [ "resources/js/app.js" ] }, - "_LockClosedIcon-CR0ZnIYx.js": { - "file": "assets/LockClosedIcon-CR0ZnIYx.js", + "_LockClosedIcon-DoYQYr1z.js": { + "file": "assets/LockClosedIcon-DoYQYr1z.js", "name": "LockClosedIcon", "imports": [ "resources/js/app.js" ] }, - "_MagnifyingGlassIcon-DcGwaQES.js": { - "file": "assets/MagnifyingGlassIcon-DcGwaQES.js", + "_MagnifyingGlassIcon-DJJrSKqN.js": { + "file": "assets/MagnifyingGlassIcon-DJJrSKqN.js", "name": "MagnifyingGlassIcon", "imports": [ - "_portal-BN7pnaLs.js", + "_portal-zqSGPRwE.js", "resources/js/app.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js" + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js" ] }, - "_ManageCitation-DVdxyOjH.js": { - "file": "assets/ManageCitation-DVdxyOjH.js", + "_ManageCitation-D_KBjPrw.js": { + "file": "assets/ManageCitation-D_KBjPrw.js", "name": "ManageCitation", "imports": [ - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_InputError-_cziYJpt.js", - "_LoadingButton-DTYXsfTb.js", - "_DangerButton-DQvgNoGf.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_InputError-Bq6mbTW3.js", + "_LoadingButton-tGgWNr9y.js", + "_DangerButton-CjzdR-BN.js", "resources/js/app.js", - "_SelectRich-Bz_F4CjK.js", - "_CitationCard-BeGEzoPQ.js", - "_AppLayout-CHKJyPg6.js", - "_vue-tags-input-Brt1BEPT.js" + "_SelectRich-FFXaNP-j.js", + "_CitationCard-BfC9h-1A.js", + "_AppLayout-CLQ7DcQE.js", + "_vue-tags-input-66HPPbTM.js" ] }, - "_Modal-DgpRXIz_.js": { - "file": "assets/Modal-DgpRXIz_.js", + "_Modal-D61CKu2W.js": { + "file": "assets/Modal-D61CKu2W.js", "name": "Modal", "imports": [ "resources/js/app.js" ] }, - "_Pagination-D2c0qPBA.js": { - "file": "assets/Pagination-D2c0qPBA.js", + "_Pagination-4Zz3NIj8.js": { + "file": "assets/Pagination-4Zz3NIj8.js", "name": "Pagination", "imports": [ "resources/js/app.js" ] }, - "_ProjectCard-BIH2uWNr.js": { - "file": "assets/ProjectCard-BIH2uWNr.js", + "_ProjectCard-DzWfUkKR.js": { + "file": "assets/ProjectCard-DzWfUkKR.js", "name": "ProjectCard", "imports": [ "resources/js/app.js", - "_Tag-C0ErVfEP.js", - "_ScaleIcon-D-U9hhEq.js", - "_ToolTip-nolQgoq4.js" + "_Tag-B7nzd99-.js", + "_ScaleIcon-RUfkP89l.js", + "_ToolTip-tz4DL0Vl.js" ] }, - "_ScaleIcon-D-U9hhEq.js": { - "file": "assets/ScaleIcon-D-U9hhEq.js", + "_ScaleIcon-RUfkP89l.js": { + "file": "assets/ScaleIcon-RUfkP89l.js", "name": "ScaleIcon", "imports": [ "resources/js/app.js" ] }, - "_SecondaryButton-DN-3UxyP.js": { - "file": "assets/SecondaryButton-DN-3UxyP.js", + "_SecondaryButton-CEPsOuZB.js": { + "file": "assets/SecondaryButton-CEPsOuZB.js", "name": "SecondaryButton", "imports": [ "resources/js/app.js" ] }, - "_SectionBorder-a1TDi9dK.js": { - "file": "assets/SectionBorder-a1TDi9dK.js", + "_SectionBorder-D9fdELcY.js": { + "file": "assets/SectionBorder-D9fdELcY.js", "name": "SectionBorder", "imports": [ "resources/js/app.js" ] }, - "_SectionTitle-DPTXcgQk.js": { - "file": "assets/SectionTitle-DPTXcgQk.js", + "_SectionTitle-Bj5MtmBO.js": { + "file": "assets/SectionTitle-Bj5MtmBO.js", "name": "SectionTitle", "imports": [ "resources/js/app.js" ] }, - "_SelectOrcidId-BKg2-d9d.js": { - "file": "assets/SelectOrcidId-BKg2-d9d.js", + "_SelectOrcidId-B3OWABnw.js": { + "file": "assets/SelectOrcidId-B3OWABnw.js", "name": "SelectOrcidId", "imports": [ - "_SecondaryButton-DN-3UxyP.js", - "_DialogModal-D90r7WOa.js", - "_LoadingButton-DTYXsfTb.js", + "_SecondaryButton-CEPsOuZB.js", + "_DialogModal-C_jQV6cQ.js", + "_LoadingButton-tGgWNr9y.js", "resources/js/app.js" ] }, - "_SelectRich-Bz_F4CjK.js": { - "file": "assets/SelectRich-Bz_F4CjK.js", + "_SelectRich-FFXaNP-j.js": { + "file": "assets/SelectRich-FFXaNP-j.js", "name": "SelectRich", "imports": [ "resources/js/app.js", - "_hidden-CqBIuuIi.js", - "_use-outside-click-B2dJh7J0.js", + "_hidden-Bz-eybui.js", + "_use-outside-click-COymWbdY.js", "_micro-task-CxIZtCgj.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js" + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js" ] }, - "_ShareIcon-DzTi42Z_.js": { - "file": "assets/ShareIcon-DzTi42Z_.js", + "_ShareIcon-BseqdhFj.js": { + "file": "assets/ShareIcon-BseqdhFj.js", "name": "ShareIcon", "imports": [ "resources/js/app.js" ] }, - "_ShowProjectDates-DJu2zUu8.js": { - "file": "assets/ShowProjectDates-DJu2zUu8.js", + "_ShowProjectDates-_qLxLUtb.js": { + "file": "assets/ShowProjectDates-_qLxLUtb.js", "name": "ShowProjectDates", "imports": [ "resources/js/app.js", - "_CalendarDaysIcon-DXIhKiXL.js" + "_CalendarDaysIcon-1aB0Hww7.js" ] }, - "_SpectraViewer-CJuqKuBl.js": { - "file": "assets/SpectraViewer-CJuqKuBl.js", + "_SpectraViewer-DcqWbehW.js": { + "file": "assets/SpectraViewer-DcqWbehW.js", "name": "SpectraViewer", "imports": [ "resources/js/app.js" ] }, - "_StarIcon-nK0OpJ-d.js": { - "file": "assets/StarIcon-nK0OpJ-d.js", + "_StarIcon-CCtiX7yZ.js": { + "file": "assets/StarIcon-CCtiX7yZ.js", "name": "StarIcon", "imports": [ "resources/js/app.js" ] }, - "_StructureSearch-DnmY8xCK.js": { - "file": "assets/StructureSearch-DnmY8xCK.js", + "_StructureSearch-CRXoMpsa.js": { + "file": "assets/StructureSearch-CRXoMpsa.js", "name": "StructureSearch", "imports": [ "resources/js/app.js", - "_ToolTip-nolQgoq4.js", - "_transition-BBPlwnLi.js" + "_ToolTip-tz4DL0Vl.js", + "_transition-Bywo_EjD.js" ] }, - "_StudyCard-Cz1XgFY5.js": { - "file": "assets/StudyCard-Cz1XgFY5.js", + "_StudyCard-Wz6EiuYb.js": { + "file": "assets/StudyCard-Wz6EiuYb.js", "name": "StudyCard", "imports": [ "resources/js/app.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, - "_StudyCardPublic-C3L2kbPz.js": { - "file": "assets/StudyCardPublic-C3L2kbPz.js", + "_StudyCardPublic-6ow66_FI.js": { + "file": "assets/StudyCardPublic-6ow66_FI.js", "name": "StudyCardPublic", "imports": [ "resources/js/app.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, - "_SuccessButton-DTQkJmvH.js": { - "file": "assets/SuccessButton-DTQkJmvH.js", + "_SuccessButton-BZB6RwmQ.js": { + "file": "assets/SuccessButton-BZB6RwmQ.js", "name": "SuccessButton", "imports": [ "resources/js/app.js" ] }, - "_Tag-C0ErVfEP.js": { - "file": "assets/Tag-C0ErVfEP.js", + "_Tag-B7nzd99-.js": { + "file": "assets/Tag-B7nzd99-.js", "name": "Tag", "imports": [ "resources/js/app.js" ] }, - "_ToolTip-nolQgoq4.js": { - "file": "assets/ToolTip-nolQgoq4.js", + "_ToggleButton-CoCfphcG.js": { + "file": "assets/ToggleButton-CoCfphcG.js", + "name": "ToggleButton", + "imports": [ + "resources/js/app.js", + "_switch-MJ_b_OD-.js" + ] + }, + "_ToolTip-tz4DL0Vl.js": { + "file": "assets/ToolTip-tz4DL0Vl.js", "name": "ToolTip", "imports": [ "resources/js/app.js", - "_use-outside-click-B2dJh7J0.js", - "_use-text-value-Bz3IoE8a.js" + "_use-outside-click-COymWbdY.js", + "_use-text-value--_X_TXkd.js" ] }, - "_ValidationErrors-KOwN-GdQ.js": { - "file": "assets/ValidationErrors-KOwN-GdQ.js", + "_ValidationErrors-Biy54BrN.js": { + "file": "assets/ValidationErrors-Biy54BrN.js", "name": "ValidationErrors", "imports": [ "resources/js/app.js" ] }, - "_XMarkIcon-BlHATxl7.js": { - "file": "assets/XMarkIcon-BlHATxl7.js", + "_XMarkIcon-DbRu9S20.js": { + "file": "assets/XMarkIcon-DbRu9S20.js", "name": "XMarkIcon", "imports": [ "resources/js/app.js" ] }, - "_description-DcnxNVih.js": { - "file": "assets/description-DcnxNVih.js", + "_description-zSg19fXS.js": { + "file": "assets/description-zSg19fXS.js", "name": "description", "imports": [ "resources/js/app.js" ] }, - "_form-M9Q1t-4r.js": { - "file": "assets/form-M9Q1t-4r.js", + "_form-hbU7ivqE.js": { + "file": "assets/form-hbU7ivqE.js", "name": "form", "imports": [ "resources/js/app.js" ] }, - "_hidden-CqBIuuIi.js": { - "file": "assets/hidden-CqBIuuIi.js", + "_hidden-Bz-eybui.js": { + "file": "assets/hidden-Bz-eybui.js", "name": "hidden", "imports": [ "resources/js/app.js" ] }, - "_index-YKNeHp9l.js": { - "file": "assets/index-YKNeHp9l.js", + "_index-xRLJPoYp.js": { + "file": "assets/index-xRLJPoYp.js", "name": "index", "imports": [ "resources/js/app.js" ] }, - "_main-CITaNMI7.css": { - "file": "assets/main-CITaNMI7.css", - "src": "_main-CITaNMI7.css" - }, - "_main-DXi3cydN.js": { - "file": "assets/main-DXi3cydN.js", + "_main-BtTLwAA8.js": { + "file": "assets/main-BtTLwAA8.js", "name": "main", "imports": [ - "resources/js/app.js", - "_switch-BC4tMLrX.js" + "resources/js/app.js" ], "css": [ "assets/main-CITaNMI7.css" ] }, + "_main-CITaNMI7.css": { + "file": "assets/main-CITaNMI7.css", + "src": "_main-CITaNMI7.css" + }, "_micro-task-CxIZtCgj.js": { "file": "assets/micro-task-CxIZtCgj.js", "name": "micro-task" }, - "_pickBy-BJxaniJK.js": { - "file": "assets/pickBy-BJxaniJK.js", + "_pickBy-BE8tcV81.js": { + "file": "assets/pickBy-BE8tcV81.js", "name": "pickBy", "imports": [ "resources/js/app.js" ] }, - "_portal-BN7pnaLs.js": { - "file": "assets/portal-BN7pnaLs.js", + "_portal-zqSGPRwE.js": { + "file": "assets/portal-zqSGPRwE.js", "name": "portal", "imports": [ - "_use-outside-click-B2dJh7J0.js", + "_use-outside-click-COymWbdY.js", "resources/js/app.js", - "_hidden-CqBIuuIi.js" + "_hidden-Bz-eybui.js" ] }, - "_style-BWEy7pLa.js": { - "file": "assets/style-BWEy7pLa.js", + "_style-D0KUwiFO.css": { + "file": "assets/style-D0KUwiFO.css", + "src": "_style-D0KUwiFO.css" + }, + "_style-WcBfnrYe.js": { + "file": "assets/style-WcBfnrYe.js", "name": "style", "imports": [ "resources/js/app.js" @@ -516,2045 +527,2034 @@ "assets/style-D0KUwiFO.css" ] }, - "_style-D0KUwiFO.css": { - "file": "assets/style-D0KUwiFO.css", - "src": "_style-D0KUwiFO.css" - }, - "_switch-BC4tMLrX.js": { - "file": "assets/switch-BC4tMLrX.js", + "_switch-MJ_b_OD-.js": { + "file": "assets/switch-MJ_b_OD-.js", "name": "switch", "imports": [ - "_form-M9Q1t-4r.js", + "_form-hbU7ivqE.js", "resources/js/app.js", - "_hidden-CqBIuuIi.js", - "_description-DcnxNVih.js" + "_hidden-Bz-eybui.js", + "_description-zSg19fXS.js" ] }, - "_transition-BBPlwnLi.js": { - "file": "assets/transition-BBPlwnLi.js", + "_transition-Bywo_EjD.js": { + "file": "assets/transition-Bywo_EjD.js", "name": "transition", "imports": [ - "_portal-BN7pnaLs.js", - "_hidden-CqBIuuIi.js", + "_portal-zqSGPRwE.js", + "_hidden-Bz-eybui.js", "resources/js/app.js", - "_use-outside-click-B2dJh7J0.js", + "_use-outside-click-COymWbdY.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js" + "_description-zSg19fXS.js" ] }, - "_use-outside-click-B2dJh7J0.js": { - "file": "assets/use-outside-click-B2dJh7J0.js", + "_use-outside-click-COymWbdY.js": { + "file": "assets/use-outside-click-COymWbdY.js", "name": "use-outside-click", "imports": [ "resources/js/app.js" ] }, - "_use-text-value-Bz3IoE8a.js": { - "file": "assets/use-text-value-Bz3IoE8a.js", + "_use-text-value--_X_TXkd.js": { + "file": "assets/use-text-value--_X_TXkd.js", "name": "use-text-value", "imports": [ "resources/js/app.js" ] }, - "_vue-datepicker-CnCqvQWS.js": { - "file": "assets/vue-datepicker-CnCqvQWS.js", - "name": "vue-datepicker", - "imports": [ - "resources/js/app.js" - ] - }, - "_vue-tags-input-Brt1BEPT.js": { - "file": "assets/vue-tags-input-Brt1BEPT.js", + "_vue-tags-input-66HPPbTM.js": { + "file": "assets/vue-tags-input-66HPPbTM.js", "name": "vue-tags-input", "imports": [ "resources/js/app.js" ] }, "resources/js/Pages/API/Index.vue": { - "file": "assets/Index-B_kNbGY_.js", + "file": "assets/Index-73a7JTZb.js", "name": "Index", "src": "resources/js/Pages/API/Index.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/API/Partials/ApiTokenManager.vue", - "_AppLayout-CHKJyPg6.js", - "resources/js/app.js", - "_ActionMessage-en-kdd4A.js", - "_ActionSection-DTDZCkQU.js", - "_SectionTitle-DPTXcgQk.js", - "_Button-BeZ53GAN.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_Modal-DgpRXIz_.js", - "_DangerButton-DQvgNoGf.js", - "_DialogModal-D90r7WOa.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_Checkbox-D4qUGLva.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", - "_SecondaryButton-DN-3UxyP.js", - "_SectionBorder-a1TDi9dK.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "resources/js/app.js", + "_ActionMessage-CEgylh_C.js", + "_ActionSection-CsGa58iF.js", + "_SectionTitle-Bj5MtmBO.js", + "_Button-CDBxb6x8.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_Modal-D61CKu2W.js", + "_DangerButton-CjzdR-BN.js", + "_DialogModal-C_jQV6cQ.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_Checkbox-ClxBeW_q.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", + "_SecondaryButton-CEPsOuZB.js", + "_SectionBorder-D9fdELcY.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js" + "_vue-tags-input-66HPPbTM.js" ] }, "resources/js/Pages/API/Partials/ApiTokenManager.vue": { - "file": "assets/ApiTokenManager-CeV0w-Uh.js", + "file": "assets/ApiTokenManager-BMx5oV7G.js", "name": "ApiTokenManager", "src": "resources/js/Pages/API/Partials/ApiTokenManager.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", - "_ActionSection-DTDZCkQU.js", - "_Button-BeZ53GAN.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_DialogModal-D90r7WOa.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_Checkbox-D4qUGLva.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", - "_SecondaryButton-DN-3UxyP.js", - "_SectionBorder-a1TDi9dK.js", + "_ActionMessage-CEgylh_C.js", + "_ActionSection-CsGa58iF.js", + "_Button-CDBxb6x8.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_DialogModal-C_jQV6cQ.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_Checkbox-ClxBeW_q.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", + "_SecondaryButton-CEPsOuZB.js", + "_SectionBorder-D9fdELcY.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/About.vue": { - "file": "assets/About-C2MBuC1a.js", + "file": "assets/About-B10ttvE6.js", "name": "About", "src": "resources/js/Pages/About.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_FlashMessages-BWK0DmX4.js", - "_MagnifyingGlassIcon-DcGwaQES.js", - "_XMarkIcon-BlHATxl7.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js" + "_ApplicationLogo-DYFr7BLm.js", + "_FlashMessages-DwOEal7U.js", + "_MagnifyingGlassIcon-DJJrSKqN.js", + "_XMarkIcon-DbRu9S20.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js" ] }, "resources/js/Pages/Announcement/Index.vue": { - "file": "assets/Index-DxsnI-zI.js", + "file": "assets/Index-BDuaNay8.js", "name": "Index", "src": "resources/js/Pages/Announcement/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_BreadCrumbs-C1HWokih.js", - "_Icon-LvTHXBEf.js", + "_AppLayout-CLQ7DcQE.js", + "_BreadCrumbs-DBmI2F7S.js", + "_Icon-UQabWdLG.js", "resources/js/Pages/Announcement/Partials/Create.vue", "resources/js/Pages/Announcement/Partials/Edit.vue", - "_DangerButton-DQvgNoGf.js", - "_SecondaryButton-DN-3UxyP.js", - "_DialogModal-D90r7WOa.js", - "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_DangerButton-CjzdR-BN.js", + "_SecondaryButton-CEPsOuZB.js", + "_DialogModal-C_jQV6cQ.js", + "resources/js/app.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_Modal-DgpRXIz_.js", - "_main-DXi3cydN.js", - "_vue-datepicker-CnCqvQWS.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_Modal-D61CKu2W.js", + "_ToggleButton-CoCfphcG.js", + "_main-BtTLwAA8.js" ] }, "resources/js/Pages/Announcement/Partials/Create.vue": { - "file": "assets/Create-DAea-_qG.js", + "file": "assets/Create-eJhfxOpT.js", "name": "Create", "src": "resources/js/Pages/Announcement/Partials/Create.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_main-DXi3cydN.js", - "_vue-datepicker-CnCqvQWS.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_ToggleButton-CoCfphcG.js", + "_main-BtTLwAA8.js", "resources/js/app.js", - "_Modal-DgpRXIz_.js", - "_switch-BC4tMLrX.js", - "_form-M9Q1t-4r.js", - "_hidden-CqBIuuIi.js", - "_description-DcnxNVih.js" + "_Modal-D61CKu2W.js", + "_switch-MJ_b_OD-.js", + "_form-hbU7ivqE.js", + "_hidden-Bz-eybui.js", + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Announcement/Partials/Edit.vue": { - "file": "assets/Edit-C2SXE6wi.js", + "file": "assets/Edit-Dn3TORRU.js", "name": "Edit", "src": "resources/js/Pages/Announcement/Partials/Edit.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_main-DXi3cydN.js", - "_vue-datepicker-CnCqvQWS.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_ToggleButton-CoCfphcG.js", + "_main-BtTLwAA8.js", "resources/js/app.js", - "_Modal-DgpRXIz_.js", - "_switch-BC4tMLrX.js", - "_form-M9Q1t-4r.js", - "_hidden-CqBIuuIi.js", - "_description-DcnxNVih.js" + "_Modal-D61CKu2W.js", + "_switch-MJ_b_OD-.js", + "_form-hbU7ivqE.js", + "_hidden-Bz-eybui.js", + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Auth/ConfirmPassword.vue": { - "file": "assets/ConfirmPassword-CN8-SrS5.js", + "file": "assets/ConfirmPassword-DRDSEuM7.js", "name": "ConfirmPassword", "src": "resources/js/Pages/Auth/ConfirmPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Auth/ForgotPassword.vue": { - "file": "assets/ForgotPassword-BfvBue6n.js", + "file": "assets/ForgotPassword-Dp8GMNo_.js", "name": "ForgotPassword", "src": "resources/js/Pages/Auth/ForgotPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Auth/Login.vue": { - "file": "assets/Login-B7tQmNCC.js", + "file": "assets/Login-A47T4ISl.js", "name": "Login", "src": "resources/js/Pages/Auth/Login.vue", "isDynamicEntry": true, "imports": [ - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Checkbox-D4qUGLva.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Checkbox-ClxBeW_q.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", "resources/js/app.js", - "_AnnouncementBanner-DT1-C9Zs.js", - "_ApplicationLogo-CyFTWMH_.js", - "_XMarkIcon-BlHATxl7.js" + "_AnnouncementBanner-BXZ3u3vr.js", + "_ApplicationLogo-DYFr7BLm.js", + "_XMarkIcon-DbRu9S20.js" ] }, "resources/js/Pages/Auth/Register.vue": { - "file": "assets/Register-B7F0JPAT.js", + "file": "assets/Register-FQ3W_-aW.js", "name": "Register", "src": "resources/js/Pages/Auth/Register.vue", "isDynamicEntry": true, "imports": [ - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Checkbox-D4qUGLva.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Checkbox-ClxBeW_q.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", "resources/js/app.js", - "_AnnouncementBanner-DT1-C9Zs.js", - "_InputError-_cziYJpt.js", - "_SelectOrcidId-BKg2-d9d.js", - "_ApplicationLogo-CyFTWMH_.js", - "_XMarkIcon-BlHATxl7.js", - "_SecondaryButton-DN-3UxyP.js", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_LoadingButton-DTYXsfTb.js" + "_AnnouncementBanner-BXZ3u3vr.js", + "_InputError-Bq6mbTW3.js", + "_SelectOrcidId-B3OWABnw.js", + "_ApplicationLogo-DYFr7BLm.js", + "_XMarkIcon-DbRu9S20.js", + "_SecondaryButton-CEPsOuZB.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_LoadingButton-tGgWNr9y.js" ] }, "resources/js/Pages/Auth/ResetPassword.vue": { - "file": "assets/ResetPassword-Di6AURK2.js", + "file": "assets/ResetPassword-Bc43mCPa.js", "name": "ResetPassword", "src": "resources/js/Pages/Auth/ResetPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Auth/SetPassword.vue": { - "file": "assets/SetPassword-CiZKZB5b.js", + "file": "assets/SetPassword-CQWC296w.js", "name": "SetPassword", "src": "resources/js/Pages/Auth/SetPassword.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Auth/TwoFactorChallenge.vue": { - "file": "assets/TwoFactorChallenge-COh8bep4.js", + "file": "assets/TwoFactorChallenge-DWNEfpNh.js", "name": "TwoFactorChallenge", "src": "resources/js/Pages/Auth/TwoFactorChallenge.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ValidationErrors-KOwN-GdQ.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ValidationErrors-Biy54BrN.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Auth/VerifyEmail.vue": { - "file": "assets/VerifyEmail-BXK2XSFO.js", + "file": "assets/VerifyEmail-IFPwiZjI.js", "name": "VerifyEmail", "src": "resources/js/Pages/Auth/VerifyEmail.vue", "isDynamicEntry": true, "imports": [ - "_AuthenticationCard-Cs_JTLTM.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_Button-BeZ53GAN.js", + "_AuthenticationCard-C4lnueVA.js", + "_AuthenticationCardLogo-DGWLzXZC.js", + "_Button-CDBxb6x8.js", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js" + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Console/Index.vue": { - "file": "assets/Index-C32wZDoJ.js", + "file": "assets/Index-B-Ms6xCD.js", "name": "Index", "src": "resources/js/Pages/Console/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_Icon-LvTHXBEf.js", - "_ToolTip-nolQgoq4.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_Icon-UQabWdLG.js", + "_ToolTip-tz4DL0Vl.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Console/Spectra/Index.vue": { - "file": "assets/Index-N8muZAU4.js", + "file": "assets/Index-CDYUSBEM.js", "name": "Index", "src": "resources/js/Pages/Console/Spectra/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_BreadCrumbs-C1HWokih.js", + "_AppLayout-CLQ7DcQE.js", + "_BreadCrumbs-DBmI2F7S.js", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Console/Spectra/Snapshot.vue": { - "file": "assets/Snapshot-DyaGak3d.js", + "file": "assets/Snapshot-BLFSsdzj.js", "name": "Snapshot", "src": "resources/js/Pages/Console/Spectra/Snapshot.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_BreadCrumbs-C1HWokih.js", + "_AppLayout-CLQ7DcQE.js", + "_BreadCrumbs-DBmI2F7S.js", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Console/Users/Create.vue": { - "file": "assets/Create-D7NjTOjw.js", + "file": "assets/Create-DybwVwhY.js", "name": "Create", "src": "resources/js/Pages/Console/Users/Create.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_BreadCrumbs-C1HWokih.js", + "_AppLayout-CLQ7DcQE.js", + "_BreadCrumbs-DBmI2F7S.js", "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_FormSection-B02w6tsA.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ActionMessage-en-kdd4A.js", - "_SelectOrcidId-BKg2-d9d.js", - "_LoadingButton-DTYXsfTb.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_FormSection-Cq0uML9d.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ActionMessage-CEgylh_C.js", + "_SelectOrcidId-B3OWABnw.js", + "_LoadingButton-tGgWNr9y.js" ] }, "resources/js/Pages/Console/Users/Edit.vue": { - "file": "assets/Edit-1P3b-wFo.js", + "file": "assets/Edit-Cop33f-H.js", "name": "Edit", "src": "resources/js/Pages/Console/Users/Edit.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_BreadCrumbs-C1HWokih.js", + "_AppLayout-CLQ7DcQE.js", + "_BreadCrumbs-DBmI2F7S.js", "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "resources/js/Pages/Console/Users/Partials/UserPassword.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_FormSection-B02w6tsA.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ActionMessage-en-kdd4A.js", - "_SelectOrcidId-BKg2-d9d.js", - "_LoadingButton-DTYXsfTb.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_FormSection-Cq0uML9d.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ActionMessage-CEgylh_C.js", + "_SelectOrcidId-B3OWABnw.js", + "_LoadingButton-tGgWNr9y.js" ] }, "resources/js/Pages/Console/Users/Index.vue": { - "file": "assets/Index-CRKizBBM.js", + "file": "assets/Index-BJ1HH44w.js", "name": "Index", "src": "resources/js/Pages/Console/Users/Index.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_pickBy-BJxaniJK.js", + "_AppLayout-CLQ7DcQE.js", + "_pickBy-BE8tcV81.js", "resources/js/app.js", - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_BreadCrumbs-C1HWokih.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_BreadCrumbs-DBmI2F7S.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_Modal-DgpRXIz_.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_Modal-D61CKu2W.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Console/Users/Partials/UserPassword.vue": { - "file": "assets/UserPassword-CyMPI1F7.js", + "file": "assets/UserPassword-DgtahLgF.js", "name": "UserPassword", "src": "resources/js/Pages/Console/Users/Partials/UserPassword.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", - "_Button-BeZ53GAN.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", + "_ActionMessage-CEgylh_C.js", + "_Button-CDBxb6x8.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js" + "_SectionTitle-Bj5MtmBO.js" ] }, "resources/js/Pages/Console/Users/Partials/UserProfile.vue": { - "file": "assets/UserProfile-BeE4N6VE.js", + "file": "assets/UserProfile-CIBmSZAV.js", "name": "UserProfile", "src": "resources/js/Pages/Console/Users/Partials/UserProfile.vue", "isDynamicEntry": true, "imports": [ - "_Button-BeZ53GAN.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", - "_ActionMessage-en-kdd4A.js", - "_SecondaryButton-DN-3UxyP.js", - "_SelectOrcidId-BKg2-d9d.js", + "_Button-CDBxb6x8.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", + "_ActionMessage-CEgylh_C.js", + "_SecondaryButton-CEPsOuZB.js", + "_SelectOrcidId-B3OWABnw.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_LoadingButton-DTYXsfTb.js" + "_SectionTitle-Bj5MtmBO.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_LoadingButton-tGgWNr9y.js" ] }, "resources/js/Pages/Dashboard.vue": { - "file": "assets/Dashboard-Y2ySNqPK.js", + "file": "assets/Dashboard-C3MUJ1U7.js", "name": "Dashboard", "src": "resources/js/Pages/Dashboard.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Project/Index.vue", - "_StudyCard-Cz1XgFY5.js", - "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_ToolTip-nolQgoq4.js", - "_use-outside-click-B2dJh7J0.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_hidden-CqBIuuIi.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_StudyCard-Wz6EiuYb.js", + "resources/js/app.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_ToolTip-tz4DL0Vl.js", + "_use-outside-click-COymWbdY.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_hidden-Bz-eybui.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", "_micro-task-CxIZtCgj.js", - "_switch-BC4tMLrX.js", - "_description-DcnxNVih.js", + "_switch-MJ_b_OD-.js", + "_description-zSg19fXS.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_ShowProjectDates-DJu2zUu8.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_StarIcon-nK0OpJ-d.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js", - "_portal-BN7pnaLs.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_ShowProjectDates-_qLxLUtb.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_StarIcon-CCtiX7yZ.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js", + "_portal-zqSGPRwE.js" ] }, "resources/js/Pages/PrivacyPolicy.vue": { - "file": "assets/PrivacyPolicy-DLOW5_ms.js", + "file": "assets/PrivacyPolicy-BGQkBOHl.js", "name": "PrivacyPolicy", "src": "resources/js/Pages/PrivacyPolicy.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCardLogo-DGWLzXZC.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Profile/Partials/DeleteUserForm.vue": { - "file": "assets/DeleteUserForm-B21rvH5a.js", + "file": "assets/DeleteUserForm-E8cIfgYK.js", "name": "DeleteUserForm", "src": "resources/js/Pages/Profile/Partials/DeleteUserForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_DialogModal-D90r7WOa.js", - "_DangerButton-DQvgNoGf.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", + "_ActionSection-CsGa58iF.js", + "_DialogModal-C_jQV6cQ.js", + "_DangerButton-CjzdR-BN.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue": { - "file": "assets/LogoutOtherBrowserSessionsForm-pFo_1hKd.js", + "file": "assets/LogoutOtherBrowserSessionsForm-Cj1dLz23.js", "name": "LogoutOtherBrowserSessionsForm", "src": "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", - "_ActionSection-DTDZCkQU.js", - "_Button-BeZ53GAN.js", - "_DialogModal-D90r7WOa.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", + "_ActionMessage-CEgylh_C.js", + "_ActionSection-CsGa58iF.js", + "_Button-CDBxb6x8.js", + "_DialogModal-C_jQV6cQ.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue": { - "file": "assets/TwoFactorAuthenticationForm-DG4rJx3v.js", + "file": "assets/TwoFactorAuthenticationForm-DW4Jo42E.js", "name": "TwoFactorAuthenticationForm", "src": "resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_Button-BeZ53GAN.js", - "_DialogModal-D90r7WOa.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", + "_ActionSection-CsGa58iF.js", + "_Button-CDBxb6x8.js", + "_DialogModal-C_jQV6cQ.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", "resources/js/app.js", - "_DangerButton-DQvgNoGf.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_DangerButton-CjzdR-BN.js", + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue": { - "file": "assets/UpdatePasswordForm-BF5pF7Sl.js", + "file": "assets/UpdatePasswordForm-Dx3yj66e.js", "name": "UpdatePasswordForm", "src": "resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", - "_Button-BeZ53GAN.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", + "_ActionMessage-CEgylh_C.js", + "_Button-CDBxb6x8.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js" + "_SectionTitle-Bj5MtmBO.js" ] }, "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue": { - "file": "assets/UpdateProfileInformationForm-CEKe7wdR.js", + "file": "assets/UpdateProfileInformationForm-BxI2aE-K.js", "name": "UpdateProfileInformationForm", "src": "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue", "isDynamicEntry": true, "imports": [ - "_Button-BeZ53GAN.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", - "_ActionMessage-en-kdd4A.js", - "_SecondaryButton-DN-3UxyP.js", - "_SelectOrcidId-BKg2-d9d.js", + "_Button-CDBxb6x8.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", + "_ActionMessage-CEgylh_C.js", + "_SecondaryButton-CEPsOuZB.js", + "_SelectOrcidId-B3OWABnw.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_LoadingButton-DTYXsfTb.js" + "_SectionTitle-Bj5MtmBO.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_LoadingButton-tGgWNr9y.js" ] }, "resources/js/Pages/Profile/Show.vue": { - "file": "assets/Show-Ck0VJ4ef.js", + "file": "assets/Show-DVBjHg5R.js", "name": "Show", "src": "resources/js/Pages/Profile/Show.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Profile/Partials/DeleteUserForm.vue", - "_SectionBorder-a1TDi9dK.js", + "_SectionBorder-D9fdELcY.js", "resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue", "resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue", "resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue", "resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_ActionSection-DTDZCkQU.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js", - "_ActionMessage-en-kdd4A.js", - "_FormSection-B02w6tsA.js", - "_Label-UsCugFRJ.js", - "_SelectOrcidId-BKg2-d9d.js", - "_LoadingButton-DTYXsfTb.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_ActionSection-CsGa58iF.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js", + "_ActionMessage-CEgylh_C.js", + "_FormSection-Cq0uML9d.js", + "_Label-CKqC8ocS.js", + "_SelectOrcidId-B3OWABnw.js", + "_LoadingButton-tGgWNr9y.js" ] }, "resources/js/Pages/Project/Index.vue": { - "file": "assets/Index-yoZXuPE0.js", + "file": "assets/Index-CfFkUvJc.js", "name": "Index", "src": "resources/js/Pages/Project/Index.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_Tag-C0ErVfEP.js", - "_ShowProjectDates-DJu2zUu8.js", - "_StarIcon-nK0OpJ-d.js", - "_CalendarDaysIcon-DXIhKiXL.js" + "_Tag-B7nzd99-.js", + "_ShowProjectDates-_qLxLUtb.js", + "_StarIcon-CCtiX7yZ.js", + "_CalendarDaysIcon-1aB0Hww7.js" ] }, "resources/js/Pages/Project/Partials/Activity.vue": { - "file": "assets/Activity-BFDhycvi.js", + "file": "assets/Activity-Bb2dyQXQ.js", "name": "Activity", "src": "resources/js/Pages/Project/Partials/Activity.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js" + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Project/Partials/Archive.vue": { - "file": "assets/Archive-jTMIdgJT.js", + "file": "assets/Archive-C9KDHr7G.js", "name": "Archive", "src": "resources/js/Pages/Project/Partials/Archive.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_DialogModal-D90r7WOa.js", - "_DangerButton-DQvgNoGf.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", - "_LoadingButton-DTYXsfTb.js", + "_ActionSection-CsGa58iF.js", + "_DialogModal-C_jQV6cQ.js", + "_DangerButton-CjzdR-BN.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", + "_LoadingButton-tGgWNr9y.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Project/Partials/Create.vue": { - "file": "assets/Create-Dk23NJD5.js", + "file": "assets/Create-N38d3VDe.js", "name": "Create", "src": "resources/js/Pages/Project/Partials/Create.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", "resources/js/app.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", - "_Modal-DgpRXIz_.js", - "_hidden-CqBIuuIi.js", - "_use-outside-click-B2dJh7J0.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", + "_Modal-D61CKu2W.js", + "_hidden-Bz-eybui.js", + "_use-outside-click-COymWbdY.js", "_micro-task-CxIZtCgj.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_description-DcnxNVih.js" + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Project/Partials/Delete.vue": { - "file": "assets/Delete-BhQ6M_mC.js", + "file": "assets/Delete-BPioXnjf.js", "name": "Delete", "src": "resources/js/Pages/Project/Partials/Delete.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_DialogModal-D90r7WOa.js", - "_DangerButton-DQvgNoGf.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", - "_LoadingButton-DTYXsfTb.js", + "_ActionSection-CsGa58iF.js", + "_DialogModal-C_jQV6cQ.js", + "_DangerButton-CjzdR-BN.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", + "_LoadingButton-tGgWNr9y.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Project/Partials/Details.vue": { - "file": "assets/Details-ClDYE0ds.js", + "file": "assets/Details-D4xpwE_Y.js", "name": "Details", "src": "resources/js/Pages/Project/Partials/Details.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/app.js", - "_InputError-_cziYJpt.js", + "_InputError-Bq6mbTW3.js", "resources/js/Pages/Project/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_SecondaryButton-DN-3UxyP.js", - "_SelectRich-Bz_F4CjK.js", - "_Button-BeZ53GAN.js", - "_vue-tags-input-Brt1BEPT.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_style-WcBfnrYe.js", + "_SecondaryButton-CEPsOuZB.js", + "_SelectRich-FFXaNP-j.js", + "_Button-CDBxb6x8.js", + "_vue-tags-input-66HPPbTM.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js" + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js" ] }, "resources/js/Pages/Project/Partials/Restore.vue": { - "file": "assets/Restore-DRQFLrd8.js", + "file": "assets/Restore-BUISLYm3.js", "name": "Restore", "src": "resources/js/Pages/Project/Partials/Restore.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_DialogModal-D90r7WOa.js", - "_SuccessButton-DTQkJmvH.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", - "_LoadingButton-DTYXsfTb.js", + "_ActionSection-CsGa58iF.js", + "_DialogModal-C_jQV6cQ.js", + "_SuccessButton-BZB6RwmQ.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", + "_LoadingButton-tGgWNr9y.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Project/Partials/Unarchive.vue": { - "file": "assets/Unarchive-DCxiAQpk.js", + "file": "assets/Unarchive-DV2PcgO4.js", "name": "Unarchive", "src": "resources/js/Pages/Project/Partials/Unarchive.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_DialogModal-D90r7WOa.js", - "_DangerButton-DQvgNoGf.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", - "_LoadingButton-DTYXsfTb.js", + "_ActionSection-CsGa58iF.js", + "_DialogModal-C_jQV6cQ.js", + "_DangerButton-CjzdR-BN.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", + "_LoadingButton-tGgWNr9y.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Project/Settings.vue": { - "file": "assets/Settings-8X7TaFtd.js", + "file": "assets/Settings-BuXu-skx.js", "name": "Settings", "src": "resources/js/Pages/Project/Settings.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", "resources/js/Pages/Project/Partials/Delete.vue", "resources/js/Pages/Project/Partials/Restore.vue", "resources/js/Pages/Project/Partials/Archive.vue", "resources/js/Pages/Project/Partials/Unarchive.vue", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_ActionSection-DTDZCkQU.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js", - "_LoadingButton-DTYXsfTb.js", - "_SuccessButton-DTQkJmvH.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_ActionSection-CsGa58iF.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js", + "_LoadingButton-tGgWNr9y.js", + "_SuccessButton-BZB6RwmQ.js" ] }, "resources/js/Pages/Project/Show.vue": { - "file": "assets/Show-LYPWHO8R.js", + "file": "assets/Show-DFiNPGyW.js", "name": "Show", "src": "resources/js/Pages/Project/Show.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_AccessDialogue-ik0ZUjMt.js", + "_AppLayout-CLQ7DcQE.js", + "_AccessDialogue-CmRWCSId.js", "resources/js/app.js", "resources/js/Pages/Study/Index.vue", "resources/js/Pages/Project/Partials/Details.vue", - "_ManageCitation-DVdxyOjH.js", - "_ToolTip-nolQgoq4.js", - "_Citation-Ccc7Otfp.js", - "_CitationCard-BeGEzoPQ.js", - "_DOIBadge-DbmigWol.js", - "_Tag-C0ErVfEP.js", - "_vue-datepicker-CnCqvQWS.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_SecondaryButton-DN-3UxyP.js", - "_SuccessButton-DTQkJmvH.js", - "_ShowProjectDates-DJu2zUu8.js", - "_StarIcon-nK0OpJ-d.js", - "_transition-BBPlwnLi.js", - "_ApplicationLogo-CyFTWMH_.js", - "_form-M9Q1t-4r.js", - "_use-outside-click-B2dJh7J0.js", - "_use-text-value-Bz3IoE8a.js", - "_hidden-CqBIuuIi.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_ManageCitation-D_KBjPrw.js", + "_ToolTip-tz4DL0Vl.js", + "_Citation-6nihkRjJ.js", + "_CitationCard-BfC9h-1A.js", + "_DOIBadge-Bk_LImDc.js", + "_Tag-B7nzd99-.js", + "_main-BtTLwAA8.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_SecondaryButton-CEPsOuZB.js", + "_SuccessButton-BZB6RwmQ.js", + "_ShowProjectDates-_qLxLUtb.js", + "_StarIcon-CCtiX7yZ.js", + "_transition-Bywo_EjD.js", + "_ApplicationLogo-DYFr7BLm.js", + "_form-hbU7ivqE.js", + "_use-outside-click-COymWbdY.js", + "_use-text-value--_X_TXkd.js", + "_hidden-Bz-eybui.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", "_micro-task-CxIZtCgj.js", - "_switch-BC4tMLrX.js", - "_description-DcnxNVih.js", + "_switch-MJ_b_OD-.js", + "_description-zSg19fXS.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_DangerButton-DQvgNoGf.js", - "_ActionMessage-en-kdd4A.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_StudyCard-Cz1XgFY5.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js", + "_vue-tags-input-66HPPbTM.js", + "_DangerButton-CjzdR-BN.js", + "_ActionMessage-CEgylh_C.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_StudyCard-Wz6EiuYb.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js", "resources/js/Pages/Project/Partials/Activity.vue", - "_portal-BN7pnaLs.js", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_LoadingButton-DTYXsfTb.js", - "_CalendarDaysIcon-DXIhKiXL.js" + "_portal-zqSGPRwE.js", + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_LoadingButton-tGgWNr9y.js", + "_CalendarDaysIcon-1aB0Hww7.js" ] }, "resources/js/Pages/Project/Validation.vue": { - "file": "assets/Validation-BuR-YoLK.js", + "file": "assets/Validation-LhUR8CEZ.js", "name": "Validation", "src": "resources/js/Pages/Project/Validation.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Public/Compounds.vue": { - "file": "assets/Compounds-BWtivRbM.js", + "file": "assets/Compounds-Bd8Er1ft.js", "name": "Compounds", "src": "resources/js/Pages/Public/Compounds.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "_Depictor2D-BwsYzoZc.js", + "_AppLayout-CLQ7DcQE.js", + "_Depictor2D-DgJuFKO3.js", "resources/js/app.js", - "_StructureSearch-DnmY8xCK.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_StructureSearch-CRXoMpsa.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Public/Datasets.vue": { - "file": "assets/Datasets-BJfzgAz_.js", + "file": "assets/Datasets-DlQUn5nj.js", "name": "Datasets", "src": "resources/js/Pages/Public/Datasets.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_ScaleIcon-D-U9hhEq.js", - "_pickBy-BJxaniJK.js", - "_Pagination-D2c0qPBA.js", - "_ToolTip-nolQgoq4.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ScaleIcon-RUfkP89l.js", + "_pickBy-BE8tcV81.js", + "_Pagination-4Zz3NIj8.js", + "_ToolTip-tz4DL0Vl.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Public/Embed/Dataset.vue": { - "file": "assets/Dataset-_Heg7Lpc.js", + "file": "assets/Dataset-DsPP9f-K.js", "name": "Dataset", "src": "resources/js/Pages/Public/Embed/Dataset.vue", "isDynamicEntry": true, "imports": [ - "_SpectraViewer-CJuqKuBl.js", + "_SpectraViewer-DcqWbehW.js", "resources/js/app.js" ] }, "resources/js/Pages/Public/Embed/Sample.vue": { - "file": "assets/Sample-BCOyxtZc.js", + "file": "assets/Sample-COVSNdQl.js", "name": "Sample", "src": "resources/js/Pages/Public/Embed/Sample.vue", "isDynamicEntry": true, "imports": [ - "_SpectraViewer-CJuqKuBl.js", + "_SpectraViewer-DcqWbehW.js", "resources/js/app.js" ] }, "resources/js/Pages/Public/Project/Dataset.vue": { - "file": "assets/Dataset-DqE3zXJ8.js", + "file": "assets/Dataset-DPwvdlSc.js", "name": "Dataset", "src": "resources/js/Pages/Public/Project/Dataset.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_SpectraViewer-CJuqKuBl.js", - "_DOIBadge-DbmigWol.js", - "_Depictor2D-BwsYzoZc.js", - "resources/js/app.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_ShareIcon-DzTi42Z_.js", - "_ToolTip-nolQgoq4.js", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_SpectraViewer-DcqWbehW.js", + "_DOIBadge-Bk_LImDc.js", + "_Depictor2D-DgJuFKO3.js", + "resources/js/app.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_ShareIcon-BseqdhFj.js", + "_ToolTip-tz4DL0Vl.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js" ] }, "resources/js/Pages/Public/Project/Files.vue": { - "file": "assets/Files-DnH89gZ4.js", + "file": "assets/Files-BFdlDKyD.js", "name": "Files", "src": "resources/js/Pages/Public/Project/Files.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_AppLayout-CHKJyPg6.js", - "resources/js/app.js", - "_HomeIcon-jA7JVb1d.js", - "_DOIBadge-DbmigWol.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "resources/js/app.js", + "_HomeIcon-DOPSBUau.js", + "_DOIBadge-Bk_LImDc.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Public/Project/Layout.vue": { - "file": "assets/Layout-CHLLTuYx.js", + "file": "assets/Layout-DgKcKCow.js", "name": "Layout", "src": "resources/js/Pages/Public/Project/Layout.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_DOIBadge-DbmigWol.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_DOIBadge-Bk_LImDc.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Public/Project/License.vue": { - "file": "assets/License-CVJL2TaW.js", + "file": "assets/License-Drc9R5UY.js", "name": "License", "src": "resources/js/Pages/Public/Project/License.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", "resources/js/app.js", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_DOIBadge-DbmigWol.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_DOIBadge-Bk_LImDc.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js" ] }, "resources/js/Pages/Public/Project/Samples.vue": { - "file": "assets/Samples-D5Og4oEy.js", + "file": "assets/Samples-CC_kzFUt.js", "name": "Samples", "src": "resources/js/Pages/Public/Project/Samples.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_StudyCardPublic-C3L2kbPz.js", - "resources/js/app.js", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_StudyCardPublic-6ow66_FI.js", + "resources/js/app.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_DOIBadge-DbmigWol.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_DOIBadge-Bk_LImDc.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, "resources/js/Pages/Public/Project/Show.vue": { - "file": "assets/Show-B8SxMSNE.js", + "file": "assets/Show-CTqnEJuZ.js", "name": "Show", "src": "resources/js/Pages/Public/Project/Show.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_CitationCard-BeGEzoPQ.js", - "_index-YKNeHp9l.js", - "_Citation-Ccc7Otfp.js", - "resources/js/app.js", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_CitationCard-BfC9h-1A.js", + "_index-xRLJPoYp.js", + "_Citation-6nihkRjJ.js", + "resources/js/app.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_DOIBadge-DbmigWol.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_DOIBadge-Bk_LImDc.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js" ] }, "resources/js/Pages/Public/Project/Study.vue": { - "file": "assets/Study-Cuecv2qR.js", + "file": "assets/Study-BM0EPES0.js", "name": "Study", "src": "resources/js/Pages/Public/Project/Study.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Project/Layout.vue", - "_SpectraViewer-CJuqKuBl.js", - "_Depictor2D-BwsYzoZc.js", - "_Depictor3D-3-ODGpqr.js", - "_DOIBadge-DbmigWol.js", - "resources/js/app.js", - "_Citation-Ccc7Otfp.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_ShareIcon-DzTi42Z_.js", - "_ToolTip-nolQgoq4.js", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_SpectraViewer-DcqWbehW.js", + "_Depictor2D-DgJuFKO3.js", + "_Depictor3D-CWlOEgTQ.js", + "_DOIBadge-Bk_LImDc.js", + "resources/js/app.js", + "_Citation-6nihkRjJ.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_ShareIcon-BseqdhFj.js", + "_ToolTip-tz4DL0Vl.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_ScaleIcon-D-U9hhEq.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_ScaleIcon-RUfkP89l.js" ] }, "resources/js/Pages/Public/Projects.vue": { - "file": "assets/Projects-B4MQYtn2.js", + "file": "assets/Projects-C8-CEDMZ.js", "name": "Projects", "src": "resources/js/Pages/Public/Projects.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_pickBy-BJxaniJK.js", - "_AppLayout-CHKJyPg6.js", - "_ProjectCard-BIH2uWNr.js", - "_Pagination-D2c0qPBA.js", - "_ToolTip-nolQgoq4.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_pickBy-BE8tcV81.js", + "_AppLayout-CLQ7DcQE.js", + "_ProjectCard-DzWfUkKR.js", + "_Pagination-4Zz3NIj8.js", + "_ToolTip-tz4DL0Vl.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_ScaleIcon-D-U9hhEq.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_ScaleIcon-RUfkP89l.js" ] }, "resources/js/Pages/Public/Sample/Layout.vue": { - "file": "assets/Layout-YKKHEvZ3.js", + "file": "assets/Layout-usUDpIZk.js", "name": "Layout", "src": "resources/js/Pages/Public/Sample/Layout.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Public/Sample/Show.vue": { - "file": "assets/Show-4rgJH1Gv.js", + "file": "assets/Show-DRfAJIAq.js", "name": "Show", "src": "resources/js/Pages/Public/Sample/Show.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Public/Sample/Layout.vue", - "_SpectraViewer-CJuqKuBl.js", - "_Depictor2D-BwsYzoZc.js", - "_DOIBadge-DbmigWol.js", - "resources/js/app.js", - "_Citation-Ccc7Otfp.js", - "_ShowProjectDates-DJu2zUu8.js", - "_Depictor3D-3-ODGpqr.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_ShareIcon-DzTi42Z_.js", - "_ToolTip-nolQgoq4.js", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_SpectraViewer-DcqWbehW.js", + "_Depictor2D-DgJuFKO3.js", + "_DOIBadge-Bk_LImDc.js", + "resources/js/app.js", + "_Citation-6nihkRjJ.js", + "_ShowProjectDates-_qLxLUtb.js", + "_Depictor3D-CWlOEgTQ.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_ShareIcon-BseqdhFj.js", + "_ToolTip-tz4DL0Vl.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_CalendarDaysIcon-DXIhKiXL.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_CalendarDaysIcon-1aB0Hww7.js" ] }, "resources/js/Pages/Public/Studies.vue": { - "file": "assets/Studies-Cqq6oSe1.js", + "file": "assets/Studies-DPmPfE2T.js", "name": "Studies", "src": "resources/js/Pages/Public/Studies.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_StudyCardPublic-C3L2kbPz.js", - "_pickBy-BJxaniJK.js", - "_Pagination-D2c0qPBA.js", - "_ToolTip-nolQgoq4.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_StudyCardPublic-6ow66_FI.js", + "_pickBy-BE8tcV81.js", + "_Pagination-4Zz3NIj8.js", + "_ToolTip-tz4DL0Vl.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, "resources/js/Pages/Publish.vue": { - "file": "assets/Publish-hH9xC6np.js", + "file": "assets/Publish-C_S8CYw0.js", "name": "Publish", "src": "resources/js/Pages/Publish.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "resources/js/app.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", - "_vue-tags-input-Brt1BEPT.js", - "_vue-datepicker-CnCqvQWS.js", - "_main-DXi3cydN.js", - "_ManageCitation-DVdxyOjH.js", - "_CitationCard-BeGEzoPQ.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js", - "_SelectRich-Bz_F4CjK.js", - "_index-YKNeHp9l.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_SuccessButton-DTQkJmvH.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "resources/js/app.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", + "_vue-tags-input-66HPPbTM.js", + "_main-BtTLwAA8.js", + "_ManageCitation-D_KBjPrw.js", + "_CitationCard-BfC9h-1A.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js", + "_SelectRich-FFXaNP-j.js", + "_ToggleButton-CoCfphcG.js", + "_index-xRLJPoYp.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_SuccessButton-BZB6RwmQ.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_Button-BeZ53GAN.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_Button-CDBxb6x8.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_DangerButton-DQvgNoGf.js", - "_LoadingButton-DTYXsfTb.js", - "_Tag-C0ErVfEP.js" + "_DangerButton-CjzdR-BN.js", + "_LoadingButton-tGgWNr9y.js", + "_Tag-B7nzd99-.js" ] }, "resources/js/Pages/Recent.vue": { - "file": "assets/Recent-LlZwN1ji.js", + "file": "assets/Recent-B5vkuzsh.js", "name": "Recent", "src": "resources/js/Pages/Recent.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Project/Index.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_ShowProjectDates-DJu2zUu8.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_StarIcon-nK0OpJ-d.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_ShowProjectDates-_qLxLUtb.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_StarIcon-CCtiX7yZ.js" ] }, "resources/js/Pages/SharedWithMe.vue": { - "file": "assets/SharedWithMe-DJxlrQo6.js", + "file": "assets/SharedWithMe-BF-EqtH4.js", "name": "SharedWithMe", "src": "resources/js/Pages/SharedWithMe.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Project/Index.vue", - "_StudyCard-Cz1XgFY5.js", + "_StudyCard-Wz6EiuYb.js", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_ShowProjectDates-DJu2zUu8.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_StarIcon-nK0OpJ-d.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_ShowProjectDates-_qLxLUtb.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_StarIcon-CCtiX7yZ.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, "resources/js/Pages/Starred.vue": { - "file": "assets/Starred-BEZlfQZx.js", + "file": "assets/Starred-D4pVg5c9.js", "name": "Starred", "src": "resources/js/Pages/Starred.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Project/Index.vue", "resources/js/app.js", - "_StudyCard-Cz1XgFY5.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_StudyCard-Wz6EiuYb.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_ShowProjectDates-DJu2zUu8.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_StarIcon-nK0OpJ-d.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_ShowProjectDates-_qLxLUtb.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_StarIcon-CCtiX7yZ.js", + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, "resources/js/Pages/Study/About.vue": { - "file": "assets/About-CC3p4f6l.js", + "file": "assets/About-B592y87z.js", "name": "About", "src": "resources/js/Pages/Study/About.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Study/Content.vue", - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_ToolTip-nolQgoq4.js", - "_InputError-_cziYJpt.js", - "_Depictor2D-BwsYzoZc.js", + "_ToolTip-tz4DL0Vl.js", + "_InputError-Bq6mbTW3.js", + "_Depictor2D-DgJuFKO3.js", "resources/js/Pages/Study/Layout.vue", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_style-BWEy7pLa.js", - "_Button-BeZ53GAN.js", - "_SelectRich-Bz_F4CjK.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_SecondaryButton-DN-3UxyP.js", - "_vue-tags-input-Brt1BEPT.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_CircleStackIcon-CLKdXbYt.js", - "_ApplicationLogo-CyFTWMH_.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_style-WcBfnrYe.js", + "_Button-CDBxb6x8.js", + "_SelectRich-FFXaNP-j.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_SecondaryButton-CEPsOuZB.js", + "_vue-tags-input-66HPPbTM.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_CircleStackIcon-DP236pKy.js", + "_ApplicationLogo-DYFr7BLm.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Study/Content.vue": { - "file": "assets/Content-C5vNxgyz.js", + "file": "assets/Content-DUuLNc8W.js", "name": "Content", "src": "resources/js/Pages/Study/Content.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Study/Layout.vue", "resources/js/app.js", - "_CircleStackIcon-CLKdXbYt.js", - "_AppLayout-CHKJyPg6.js", + "_CircleStackIcon-DP236pKy.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", - "_InputError-_cziYJpt.js", + "_ActionMessage-CEgylh_C.js", + "_InputError-Bq6mbTW3.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_style-BWEy7pLa.js", - "_Button-BeZ53GAN.js", - "_SelectRich-Bz_F4CjK.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_SecondaryButton-DN-3UxyP.js", - "_vue-tags-input-Brt1BEPT.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_ToolTip-nolQgoq4.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_ApplicationLogo-CyFTWMH_.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_style-WcBfnrYe.js", + "_Button-CDBxb6x8.js", + "_SelectRich-FFXaNP-j.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_SecondaryButton-CEPsOuZB.js", + "_vue-tags-input-66HPPbTM.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_ToolTip-tz4DL0Vl.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_ApplicationLogo-DYFr7BLm.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Study/Datasets.vue": { - "file": "assets/Datasets-BOtWM-Lu.js", + "file": "assets/Datasets-LF1aoj65.js", "name": "Datasets", "src": "resources/js/Pages/Study/Datasets.vue", "isDynamicEntry": true, "imports": [ "resources/js/Pages/Study/Content.vue", - "_LoadingButton-DTYXsfTb.js", - "_SpectraViewer-CJuqKuBl.js", - "_AppLayout-CHKJyPg6.js", + "_LoadingButton-tGgWNr9y.js", + "_SpectraViewer-DcqWbehW.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_ShareIcon-DzTi42Z_.js", - "_ToolTip-nolQgoq4.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_ShareIcon-BseqdhFj.js", + "_ToolTip-tz4DL0Vl.js", "resources/js/Pages/Study/Layout.vue", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", - "_InputError-_cziYJpt.js", + "_ActionMessage-CEgylh_C.js", + "_InputError-Bq6mbTW3.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_style-BWEy7pLa.js", - "_Button-BeZ53GAN.js", - "_SelectRich-Bz_F4CjK.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_SecondaryButton-DN-3UxyP.js", - "_vue-tags-input-Brt1BEPT.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_ApplicationLogo-CyFTWMH_.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_style-WcBfnrYe.js", + "_Button-CDBxb6x8.js", + "_SelectRich-FFXaNP-j.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_SecondaryButton-CEPsOuZB.js", + "_vue-tags-input-66HPPbTM.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_ApplicationLogo-DYFr7BLm.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_CircleStackIcon-CLKdXbYt.js" + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_CircleStackIcon-DP236pKy.js" ] }, "resources/js/Pages/Study/Files.vue": { - "file": "assets/Files-BfmAZaic.js", + "file": "assets/Files-DprFoc8Y.js", "name": "Files", "src": "resources/js/Pages/Study/Files.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", "resources/js/Pages/Study/Content.vue", - "_ToolTip-nolQgoq4.js", - "_HomeIcon-jA7JVb1d.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ToolTip-tz4DL0Vl.js", + "_HomeIcon-DOPSBUau.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", "resources/js/Pages/Study/Layout.vue", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_CircleStackIcon-CLKdXbYt.js" + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_CircleStackIcon-DP236pKy.js" ] }, "resources/js/Pages/Study/Index.vue": { - "file": "assets/Index-B2ew-iWC.js", + "file": "assets/Index-ootzQUWA.js", "name": "Index", "src": "resources/js/Pages/Study/Index.vue", "isDynamicEntry": true, "imports": [ - "_StudyCard-Cz1XgFY5.js", + "_StudyCard-Wz6EiuYb.js", "resources/js/app.js", - "_Depictor2D-BwsYzoZc.js", - "_LockClosedIcon-CR0ZnIYx.js" + "_Depictor2D-DgJuFKO3.js", + "_LockClosedIcon-DoYQYr1z.js" ] }, "resources/js/Pages/Study/Integrations.vue": { - "file": "assets/Integrations-DSyzxd_0.js", + "file": "assets/Integrations-DBU5bZub.js", "name": "Integrations", "src": "resources/js/Pages/Study/Integrations.vue", "isDynamicEntry": true, @@ -2562,92 +2562,92 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_CircleStackIcon-CLKdXbYt.js" + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_CircleStackIcon-DP236pKy.js" ] }, "resources/js/Pages/Study/Layout.vue": { - "file": "assets/Layout-pUbI04TF.js", + "file": "assets/Layout-C3VP99UR.js", "name": "Layout", "src": "resources/js/Pages/Study/Layout.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", "resources/js/Pages/Study/Partials/Details.vue", - "_AccessDialogue-ik0ZUjMt.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AccessDialogue-CmRWCSId.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_ActionMessage-en-kdd4A.js", + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js" + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js" ] }, "resources/js/Pages/Study/MolecularIdentifications.vue": { - "file": "assets/MolecularIdentifications-i1d-ZP7N.js", + "file": "assets/MolecularIdentifications-DmQDYTMc.js", "name": "MolecularIdentifications", "src": "resources/js/Pages/Study/MolecularIdentifications.vue", "isDynamicEntry": true, @@ -2655,47 +2655,47 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_CircleStackIcon-CLKdXbYt.js" + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_CircleStackIcon-DP236pKy.js" ] }, "resources/js/Pages/Study/Notifications.vue": { - "file": "assets/Notifications-DEa604IB.js", + "file": "assets/Notifications-BtNLXtd0.js", "name": "Notifications", "src": "resources/js/Pages/Study/Notifications.vue", "isDynamicEntry": true, @@ -2703,129 +2703,129 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_CircleStackIcon-CLKdXbYt.js" + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_CircleStackIcon-DP236pKy.js" ] }, "resources/js/Pages/Study/Partials/Activity.vue": { - "file": "assets/Activity-Dj19hagn.js", + "file": "assets/Activity-DVtf11Lv.js", "name": "Activity", "src": "resources/js/Pages/Study/Partials/Activity.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js" + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Study/Partials/Create.vue": { - "file": "assets/Create-C5FePIWm.js", + "file": "assets/Create-CUCHZF8m.js", "name": "Create", "src": "resources/js/Pages/Study/Partials/Create.vue", "isDynamicEntry": true, "imports": [ - "_DialogModal-D90r7WOa.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", + "_DialogModal-C_jQV6cQ.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", "resources/js/app.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", - "_Modal-DgpRXIz_.js", - "_hidden-CqBIuuIi.js", - "_use-outside-click-B2dJh7J0.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", + "_Modal-D61CKu2W.js", + "_hidden-Bz-eybui.js", + "_use-outside-click-COymWbdY.js", "_micro-task-CxIZtCgj.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_description-DcnxNVih.js" + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Study/Partials/Delete.vue": { - "file": "assets/Delete-DipVpgbe.js", + "file": "assets/Delete-BDPV1RtX.js", "name": "Delete", "src": "resources/js/Pages/Study/Partials/Delete.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_DialogModal-D90r7WOa.js", - "_DangerButton-DQvgNoGf.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", + "_ActionSection-CsGa58iF.js", + "_DialogModal-C_jQV6cQ.js", + "_DangerButton-CjzdR-BN.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Study/Partials/Details.vue": { - "file": "assets/Details-BKyLbtc9.js", + "file": "assets/Details-BGqq8_bf.js", "name": "Details", "src": "resources/js/Pages/Study/Partials/Details.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_ActionMessage-en-kdd4A.js", - "_InputError-_cziYJpt.js", + "_ActionMessage-CEgylh_C.js", + "_InputError-Bq6mbTW3.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_Button-BeZ53GAN.js", - "_SelectRich-Bz_F4CjK.js", - "_SecondaryButton-DN-3UxyP.js", - "_vue-tags-input-Brt1BEPT.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_XMarkIcon-BlHATxl7.js", - "_transition-BBPlwnLi.js", - "_hidden-CqBIuuIi.js", - "_use-outside-click-B2dJh7J0.js", + "_style-WcBfnrYe.js", + "_Button-CDBxb6x8.js", + "_SelectRich-FFXaNP-j.js", + "_SecondaryButton-CEPsOuZB.js", + "_vue-tags-input-66HPPbTM.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_XMarkIcon-DbRu9S20.js", + "_transition-Bywo_EjD.js", + "_hidden-Bz-eybui.js", + "_use-outside-click-COymWbdY.js", "_micro-task-CxIZtCgj.js", - "_form-M9Q1t-4r.js", - "_use-text-value-Bz3IoE8a.js", - "_portal-BN7pnaLs.js", - "_description-DcnxNVih.js" + "_form-hbU7ivqE.js", + "_use-text-value--_X_TXkd.js", + "_portal-zqSGPRwE.js", + "_description-zSg19fXS.js" ] }, "resources/js/Pages/Study/Protocols.vue": { - "file": "assets/Protocols--446F7vj.js", + "file": "assets/Protocols-BjJjPkvj.js", "name": "Protocols", "src": "resources/js/Pages/Study/Protocols.vue", "isDynamicEntry": true, @@ -2833,357 +2833,357 @@ "resources/js/Pages/Study/Content.vue", "resources/js/app.js", "resources/js/Pages/Study/Layout.vue", - "_AppLayout-CHKJyPg6.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", "resources/js/Pages/Study/Partials/Details.vue", - "_ActionMessage-en-kdd4A.js", + "_ActionMessage-CEgylh_C.js", "resources/js/Pages/Study/Partials/Activity.vue", - "_style-BWEy7pLa.js", - "_ClipboardDocumentIcon-LpWWgcRu.js", - "_AccessDialogue-ik0ZUjMt.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js", - "_Citation-Ccc7Otfp.js", - "_StarIcon-nK0OpJ-d.js", - "_CircleStackIcon-CLKdXbYt.js" + "_style-WcBfnrYe.js", + "_ClipboardDocumentIcon-0LAEA0cq.js", + "_AccessDialogue-CmRWCSId.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js", + "_Citation-6nihkRjJ.js", + "_StarIcon-CCtiX7yZ.js", + "_CircleStackIcon-DP236pKy.js" ] }, "resources/js/Pages/Study/Settings.vue": { - "file": "assets/Settings-CwRNoR-R.js", + "file": "assets/Settings-B1fziMi4.js", "name": "Settings", "src": "resources/js/Pages/Study/Settings.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/app.js", "resources/js/Pages/Study/Partials/Delete.vue", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_ActionSection-DTDZCkQU.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_ActionSection-CsGa58iF.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js" ] }, "resources/js/Pages/Teams/Create.vue": { - "file": "assets/Create-BmXQS1bW.js", + "file": "assets/Create-xm6SyZw3.js", "name": "Create", "src": "resources/js/Pages/Teams/Create.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Teams/Partials/CreateTeamForm.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_FormSection-B02w6tsA.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js", - "_Label-UsCugFRJ.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_FormSection-Cq0uML9d.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js", + "_Label-CKqC8ocS.js" ] }, "resources/js/Pages/Teams/Partials/CreateTeamForm.vue": { - "file": "assets/CreateTeamForm-8ktvOCah.js", + "file": "assets/CreateTeamForm-BaHFaZsx.js", "name": "CreateTeamForm", "src": "resources/js/Pages/Teams/Partials/CreateTeamForm.vue", "isDynamicEntry": true, "imports": [ - "_Button-BeZ53GAN.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", + "_Button-CDBxb6x8.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js" + "_SectionTitle-Bj5MtmBO.js" ] }, "resources/js/Pages/Teams/Partials/DeleteTeamForm.vue": { - "file": "assets/DeleteTeamForm-DGmHUVQk.js", + "file": "assets/DeleteTeamForm-DsOkQ9xK.js", "name": "DeleteTeamForm", "src": "resources/js/Pages/Teams/Partials/DeleteTeamForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionSection-DTDZCkQU.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_SecondaryButton-DN-3UxyP.js", - "_InputError-_cziYJpt.js", - "_Input-YhVrcc3z.js", + "_ActionSection-CsGa58iF.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_SecondaryButton-CEPsOuZB.js", + "_InputError-Bq6mbTW3.js", + "_Input-BBvS1pPL.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Teams/Partials/TeamMemberManager.vue": { - "file": "assets/TeamMemberManager-CCRD0Gjf.js", + "file": "assets/TeamMemberManager-0NqNmGlb.js", "name": "TeamMemberManager", "src": "resources/js/Pages/Teams/Partials/TeamMemberManager.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", - "_ActionSection-DTDZCkQU.js", - "_Button-BeZ53GAN.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_DialogModal-D90r7WOa.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", - "_SecondaryButton-DN-3UxyP.js", - "_SectionBorder-a1TDi9dK.js", + "_ActionMessage-CEgylh_C.js", + "_ActionSection-CsGa58iF.js", + "_Button-CDBxb6x8.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_DialogModal-C_jQV6cQ.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", + "_SecondaryButton-CEPsOuZB.js", + "_SectionBorder-D9fdELcY.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js", - "_Modal-DgpRXIz_.js" + "_SectionTitle-Bj5MtmBO.js", + "_Modal-D61CKu2W.js" ] }, "resources/js/Pages/Teams/Partials/UpdateTeamNameForm.vue": { - "file": "assets/UpdateTeamNameForm-DTV7kEvV.js", + "file": "assets/UpdateTeamNameForm-C2eOwYcC.js", "name": "UpdateTeamNameForm", "src": "resources/js/Pages/Teams/Partials/UpdateTeamNameForm.vue", "isDynamicEntry": true, "imports": [ - "_ActionMessage-en-kdd4A.js", - "_Button-BeZ53GAN.js", - "_FormSection-B02w6tsA.js", - "_Input-YhVrcc3z.js", - "_InputError-_cziYJpt.js", - "_Label-UsCugFRJ.js", + "_ActionMessage-CEgylh_C.js", + "_Button-CDBxb6x8.js", + "_FormSection-Cq0uML9d.js", + "_Input-BBvS1pPL.js", + "_InputError-Bq6mbTW3.js", + "_Label-CKqC8ocS.js", "resources/js/app.js", - "_SectionTitle-DPTXcgQk.js" + "_SectionTitle-Bj5MtmBO.js" ] }, "resources/js/Pages/Teams/Show.vue": { - "file": "assets/Show-NMRdF6Sp.js", + "file": "assets/Show-C8XAd2iY.js", "name": "Show", "src": "resources/js/Pages/Teams/Show.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Teams/Partials/DeleteTeamForm.vue", - "_SectionBorder-a1TDi9dK.js", + "_SectionBorder-D9fdELcY.js", "resources/js/Pages/Teams/Partials/TeamMemberManager.vue", "resources/js/Pages/Teams/Partials/UpdateTeamNameForm.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_ActionSection-DTDZCkQU.js", - "_SectionTitle-DPTXcgQk.js", - "_Input-YhVrcc3z.js", - "_ActionMessage-en-kdd4A.js", - "_FormSection-B02w6tsA.js", - "_Label-UsCugFRJ.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_ActionSection-CsGa58iF.js", + "_SectionTitle-Bj5MtmBO.js", + "_Input-BBvS1pPL.js", + "_ActionMessage-CEgylh_C.js", + "_FormSection-Cq0uML9d.js", + "_Label-CKqC8ocS.js" ] }, "resources/js/Pages/TermsOfService.vue": { - "file": "assets/TermsOfService-DuGKP2J-.js", + "file": "assets/TermsOfService-COn6gccN.js", "name": "TermsOfService", "src": "resources/js/Pages/TermsOfService.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_AuthenticationCardLogo-D4hJZYMy.js", - "_ApplicationLogo-CyFTWMH_.js" + "_AuthenticationCardLogo-DGWLzXZC.js", + "_ApplicationLogo-DYFr7BLm.js" ] }, "resources/js/Pages/Trashed.vue": { - "file": "assets/Trashed-Dg2SY0HZ.js", + "file": "assets/Trashed-BKU77BJh.js", "name": "Trashed", "src": "resources/js/Pages/Trashed.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", + "_AppLayout-CLQ7DcQE.js", "resources/js/Pages/Project/Index.vue", "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_DialogModal-D90r7WOa.js", - "_Modal-DgpRXIz_.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_InputError-_cziYJpt.js", - "_SelectRich-Bz_F4CjK.js", - "_switch-BC4tMLrX.js", + "_DialogModal-C_jQV6cQ.js", + "_Modal-D61CKu2W.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_InputError-Bq6mbTW3.js", + "_SelectRich-FFXaNP-j.js", + "_switch-MJ_b_OD-.js", "resources/js/Pages/Study/Partials/Create.vue", - "_vue-tags-input-Brt1BEPT.js", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js", - "_Tag-C0ErVfEP.js", - "_ShowProjectDates-DJu2zUu8.js", - "_CalendarDaysIcon-DXIhKiXL.js", - "_StarIcon-nK0OpJ-d.js" + "_vue-tags-input-66HPPbTM.js", + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js", + "_Tag-B7nzd99-.js", + "_ShowProjectDates-_qLxLUtb.js", + "_CalendarDaysIcon-1aB0Hww7.js", + "_StarIcon-CCtiX7yZ.js" ] }, "resources/js/Pages/Upload.vue": { - "file": "assets/Upload-CxGyy3ky.js", + "file": "assets/Upload-DMvXycII.js", "name": "Upload", "src": "resources/js/Pages/Upload.vue", "isDynamicEntry": true, "imports": [ - "_AppLayout-CHKJyPg6.js", - "resources/js/app.js", - "_InputError-_cziYJpt.js", - "_SecondaryButton-DN-3UxyP.js", - "_Button-BeZ53GAN.js", - "_DialogModal-D90r7WOa.js", - "_Depictor2D-BwsYzoZc.js", - "_Depictor3D-3-ODGpqr.js", - "_vue-tags-input-Brt1BEPT.js", - "_index-YKNeHp9l.js", - "_SelectRich-Bz_F4CjK.js", - "_ApplicationLogo-CyFTWMH_.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_AppLayout-CLQ7DcQE.js", + "resources/js/app.js", + "_InputError-Bq6mbTW3.js", + "_SecondaryButton-CEPsOuZB.js", + "_Button-CDBxb6x8.js", + "_DialogModal-C_jQV6cQ.js", + "_Depictor2D-DgJuFKO3.js", + "_Depictor3D-CWlOEgTQ.js", + "_vue-tags-input-66HPPbTM.js", + "_index-xRLJPoYp.js", + "_SelectRich-FFXaNP-j.js", + "_ApplicationLogo-DYFr7BLm.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_ToolTip-nolQgoq4.js", - "_use-text-value-Bz3IoE8a.js", - "_form-M9Q1t-4r.js", - "_XMarkIcon-BlHATxl7.js", - "_FlashMessages-BWK0DmX4.js", - "_AnnouncementBanner-DT1-C9Zs.js", + "_description-zSg19fXS.js", + "_ToolTip-tz4DL0Vl.js", + "_use-text-value--_X_TXkd.js", + "_form-hbU7ivqE.js", + "_XMarkIcon-DbRu9S20.js", + "_FlashMessages-DwOEal7U.js", + "_AnnouncementBanner-BXZ3u3vr.js", "resources/js/Pages/Project/Partials/Create.vue", - "_switch-BC4tMLrX.js", - "_Modal-DgpRXIz_.js", + "_switch-MJ_b_OD-.js", + "_Modal-D61CKu2W.js", "resources/js/Pages/Study/Partials/Create.vue", - "_ConfirmationModal-kI7bXJ7P.js", - "_DangerButton-DQvgNoGf.js" + "_ConfirmationModal-CCL_ECcJ.js", + "_DangerButton-CjzdR-BN.js" ] }, "resources/js/Pages/Welcome.vue": { - "file": "assets/Welcome-ETa99rTk.js", + "file": "assets/Welcome-C_vCXEV7.js", "name": "Welcome", "src": "resources/js/Pages/Welcome.vue", "isDynamicEntry": true, "imports": [ "resources/js/app.js", - "_ApplicationLogo-CyFTWMH_.js", - "_ProjectCard-BIH2uWNr.js", - "_StructureSearch-DnmY8xCK.js", - "_ToolTip-nolQgoq4.js", - "_FlashMessages-BWK0DmX4.js", - "_CircleStackIcon-CLKdXbYt.js", - "_XMarkIcon-BlHATxl7.js", - "_MagnifyingGlassIcon-DcGwaQES.js", - "_Tag-C0ErVfEP.js", - "_ScaleIcon-D-U9hhEq.js", - "_transition-BBPlwnLi.js", - "_portal-BN7pnaLs.js", - "_use-outside-click-B2dJh7J0.js", - "_hidden-CqBIuuIi.js", + "_ApplicationLogo-DYFr7BLm.js", + "_ProjectCard-DzWfUkKR.js", + "_StructureSearch-CRXoMpsa.js", + "_ToolTip-tz4DL0Vl.js", + "_FlashMessages-DwOEal7U.js", + "_CircleStackIcon-DP236pKy.js", + "_XMarkIcon-DbRu9S20.js", + "_MagnifyingGlassIcon-DJJrSKqN.js", + "_Tag-B7nzd99-.js", + "_ScaleIcon-RUfkP89l.js", + "_transition-Bywo_EjD.js", + "_portal-zqSGPRwE.js", + "_use-outside-click-COymWbdY.js", + "_hidden-Bz-eybui.js", "_micro-task-CxIZtCgj.js", - "_description-DcnxNVih.js", - "_use-text-value-Bz3IoE8a.js" + "_description-zSg19fXS.js", + "_use-text-value--_X_TXkd.js" ] }, "resources/js/app.js": { - "file": "assets/app-BjT44t0T.js", + "file": "assets/app-2iakyDsC.js", "name": "app", "src": "resources/js/app.js", "isEntry": true, @@ -3275,7 +3275,7 @@ "resources/js/Pages/Welcome.vue" ], "css": [ - "assets/app-C76kSpTX.css" + "assets/app-B0SkGexY.css" ] } } \ No newline at end of file diff --git a/resources/js/Pages/Upload.vue b/resources/js/Pages/Upload.vue index 2ee4007b4..6a04dc171 100644 --- a/resources/js/Pages/Upload.vue +++ b/resources/js/Pages/Upload.vue @@ -1499,115 +1499,192 @@ Input - -
+ +
+ +
+ + +
-

- Paste - SMILES, - MOL, - or - SDF - content - below - or - drag - and - drop - .mol/.sdf - files -

- Auto-detects - and - loads - format - automatically +

+ Paste + SMILES, + MOL, + or + SDF + content + below + or + drag + and + drop + .mol/.sdf + files +

+
+ Auto-detects + and + loads + format + automatically +
+
- -
-
- +
+ +
- Clear - + Detected: + {{ + detectedFormat + }} +
+
+
-
- Detected: - {{ - detectedFormat - }} + +
+
+
+
+

+ Enter a CAS Registry Number to import chemical structure +

+
+ Format: XXX-XX-X (e.g., 58-08-2 for Caffeine) +
+
+ +
+
+ +
+ +
+ +
+ +
@@ -2211,6 +2288,12 @@ export default { percentage: 100, editor: null, + // Chemical input tabs and CAS support + activeInputTab: "structure", // "structure" or "cas" + casInput: "", + casLoading: false, + casError: "", + showPrimer: false, busy: false, @@ -2348,6 +2431,14 @@ export default { this.percentage = newMax; } }, + activeInputTab(newTab, oldTab) { + // Clear errors when switching tabs + if (newTab === 'structure' && oldTab === 'cas') { + this.casError = ""; + } else if (newTab === 'cas' && oldTab === 'structure') { + this.errorMessage = ""; + } + }, }, mounted() { const urlSearchParams = new URLSearchParams(window.location.search); @@ -3214,6 +3305,7 @@ export default { } }, loadStructure() { + console.log("loadStructure method called.."); this.errorMessage = ""; if (!this.chemicalInput || this.chemicalInput.trim() === "") { @@ -3292,6 +3384,138 @@ export default { } }, + clearCasInput() { + this.casInput = ""; + this.casError = ""; + }, + + async fetchFromCAS(casNumber) { + try { + // Use backend API proxy to avoid CORS issues + const response = await axios.get('/cas/detail', { + params: { + cas_rn: casNumber + }, + timeout: 30000, // 30 second timeout + }); + + return response.data; + } catch (error) { + // Use error message from backend controller + const errorMessage = error.response?.data?.error || + error.response?.data?.message || + 'CAS API server error - please try again later'; + throw new Error(errorMessage); + } + }, + + async importFromCAS() { + if (!this.casInput.trim()) { + this.casError = "Please enter a CAS Registry Number"; + return; + } + + const casNumber = this.casInput.trim(); + + this.casLoading = true; + this.casError = ""; + + try { + // Fetch data from CAS Common Chemistry API + const casData = await this.fetchFromCAS(casNumber); + + // Validate that we have the required data + if (!casData.smile && !casData.canonicalSmile) { + this.casError = `No structural data (SMILES) available for CAS number ${casNumber}`; + return; + } + + // Process the CAS response + this.processCASResponse(casData); + + } catch (error) { + // Use error messages from backend controller + this.casError = error.message; + } finally { + this.casLoading = false; + } + }, + + processCASResponse(casData) { + try { + // Extract SMILES from CAS response + let smiles = casData.smile || casData.canonicalSmile; + + if (!smiles) { + this.casError = "No SMILES data available for this CAS number"; + return; + } + + // Clear any existing errors + this.errorMessage = ""; + this.casError = ""; + + // Set the chemical input to the SMILES from CAS + this.chemicalInput = smiles; + this.detectedFormat = "SMILES (from CAS)"; + + // Switch to structure tab to show the loaded molecule + this.switchToStructureTab(); + + // Load the structure using existing workflow + if (this.editor) { + this.editor.setSmiles(smiles); + } + + // Use existing standardization workflow + this.processCASMolecule(casData, smiles); + + } catch (error) { + this.casError = "Failed to process CAS response data"; + } + }, + + async processCASMolecule(casData, smiles) { + try { + // Create a molecule object from SMILES to standardize + let mol = OCL.Molecule.fromSmiles(smiles); + let molfile = mol.toMolfile(); + + // Use existing standardization workflow + const response = await this.standardizeMolecules(molfile); + + // Add CAS-specific data to the standardized molecule + const standardizedMol = response.data; + standardizedMol.cas_number = casData.rn; + standardizedMol.cas_name = casData.name; + standardizedMol.molecular_formula = casData.molecularFormula?.replace(/<[^>]*>/g, '') || standardizedMol.molecular_formula; + + // Add synonyms if available + if (casData.synonyms && casData.synonyms.length > 0) { + standardizedMol.synonyms = casData.synonyms.slice(0, 5); // Limit to first 5 synonyms + } + + // Integrate with existing molecule association workflow + if (this.selectedStudy) { + this.associateMoleculeToStudy(standardizedMol, this.selectedStudy); + + // Clear CAS input after successful association + this.clearCasInput(); + + // Show success message + this.$emit('show-notification', { + type: 'success', + message: `Successfully imported ${casData.name} (CAS: ${casData.rn}) from CAS Registry` + }); + } else { + this.casError = "Please select a study before importing molecules"; + } + + } catch (error) { + this.casError = `Failed to standardize molecule: ${error.message}`; + } + }, + handlePaste() { // Allow default paste behavior, then auto-load structure this.$nextTick(() => { @@ -3352,6 +3576,19 @@ export default { } }, + // Tab switching methods with error clearing + switchToStructureTab() { + this.activeInputTab = "structure"; + // Clear CAS-related errors when switching away from CAS tab + this.casError = ""; + }, + + switchToCasTab() { + this.activeInputTab = "cas"; + // Clear structure-related errors when switching away from structure tab + this.errorMessage = ""; + }, + // Legacy method name for backward compatibility loadSmiles() { this.loadStructure(); diff --git a/routes/web.php b/routes/web.php index c9822f216..690c5fd10 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,6 +10,7 @@ use App\Http\Controllers\Auth\MyWelcomeController; use App\Http\Controllers\Auth\SocialController; use App\Http\Controllers\AuthorController; +use App\Http\Controllers\CasController; use App\Http\Controllers\CitationController; use App\Http\Controllers\DashboardController; use App\Http\Controllers\DatasetController; @@ -160,6 +161,9 @@ Route::get('upload', [UploadController::class, 'upload'])->name('upload'); Route::get('publish/{draft}', [UploadController::class, 'publish'])->name('publish'); + // CAS Common Chemistry API Proxy + Route::get('/cas/detail', [CasController::class, 'fetchCasData'])->name('cas.detail'); + Route::prefix('dashboard')->group(function () { Route::get('ssubmission', [DashboardController::class, 'dashboard']) ->name('submission'); From 3043071e4b549d70b530ae7c289c6ce158f51f37 Mon Sep 17 00:00:00 2001 From: Nisha Sharma Date: Thu, 9 Oct 2025 11:27:09 +0200 Subject: [PATCH 002/116] run formatting --- resources/js/Pages/Upload.vue | 215 ++++++++++++++++++++++++---------- 1 file changed, 156 insertions(+), 59 deletions(-) diff --git a/resources/js/Pages/Upload.vue b/resources/js/Pages/Upload.vue index 6a04dc171..5afa227bf 100644 --- a/resources/js/Pages/Upload.vue +++ b/resources/js/Pages/Upload.vue @@ -1500,35 +1500,52 @@ -
-
@@ -244,92 +164,10 @@ - - + @@ -379,94 +217,16 @@ - - +
@@ -927,30 +687,24 @@ diff --git a/resources/js/Mixins/Global.js b/resources/js/Mixins/Global.js index d6ebe8ba2..408ef7e05 100644 --- a/resources/js/Mixins/Global.js +++ b/resources/js/Mixins/Global.js @@ -2,7 +2,7 @@ import * as marked from "marked"; import DOMPurify from "dompurify"; import { copyText } from "vue3-clipboard"; import pluralize from "pluralize"; -import OCL from "openchemlib/full"; +import OCL from "openchemlib"; export default { methods: { @@ -162,6 +162,19 @@ export default { timeStyle: "short", }).format(date); }, + /** + * Unified date+time display for record metadata (Published / Created / Updated rows). + */ + formatRecordTimestamp(timestamp) { + if (!timestamp) { + return ""; + } + const date = new Date(timestamp); + return new Intl.DateTimeFormat(undefined, { + dateStyle: "medium", + timeStyle: "short", + }).format(date); + }, md(data) { if (!data) return ""; diff --git a/resources/js/Pages/About.vue b/resources/js/Pages/About.vue index fdf2ad00f..3240f07fd 100644 --- a/resources/js/Pages/About.vue +++ b/resources/js/Pages/About.vue @@ -49,12 +49,6 @@ > Projects - - Spectra -
-
-
- - - -
- -
-
-
-
-
- - Showing - {{ - (currentProjectsPage - 1) * - projectsPerPage + - 1 - }} - to - {{ - Math.min( - currentProjectsPage * projectsPerPage, - filteredProjects.length - ) - }} - of {{ filteredProjects.length }} - {{ - selectedProjectStatus !== "all" - ? selectedProjectStatus + " " - : "" - }}projects - -
-
- - + {{ workspaceCopy.title }} + +

+ {{ workspaceCopy.description }} +

+ - -
- -
-
-
-
-
+
-
- - -
- + mode="listing" + :projects="workspaceProjects" + > + +
-
- +

+ Compound library +

+
+
+ + + +
+
+ -
-
- Page {{ currentProjectsPage }} of - {{ totalProjectPages }} -
-
- -
+
-
-
-
-
-
- + + +
+
+

+ Projects +

+

+ Search by name or description, narrow by status, + then open a project to manage compounds, spectra, + and files. +

+
+ +
+
+
+ + +
+
+ Filter by status + +
+
+ +
+

Showing + {{ + projects.from + }} + – + {{ + projects.to + }} + of + {{ + projects.total + }} {{ - (currentSamplesPage - 1) * samplesPerPage + - 1 - }} - to - {{ - Math.min( - currentSamplesPage * samplesPerPage, - filteredSamples.length - ) - }} - of {{ filteredSamples.length }} - {{ - selectedSampleStatus !== "all" - ? selectedSampleStatus + " " - : "" - }}samples - + filters.projects_status !== "all" + ? " " + filters.projects_status + " " + : " " + }}projects + + · Page {{ projects.current_page }} of + {{ projects.last_page }} + +

+
+ +
-
- - - -
- + +
+ +
+ +
+ +
+
+ +
+
+
-
-
- -
- -
- -
+
+ +
+
- -
+
- -
+
+

+ Compound library +

+

+ Every compound record in this workspace, including + entries inside projects and standalone submissions. + Search, filter by visibility, then open a record to + continue. +

+
-
-
- Page {{ currentSamplesPage }} of {{ totalSamplePages }} -
-
- -
+
+ Filter by visibility + +
+
+ +
- Next - -
-
-
-
-
-
-
-
- + Showing + {{ + samples.from + }} + – + {{ + samples.to + }} + of + {{ + samples.total + }} + + + compounds + + · Page {{ samples.current_page }} of + {{ samples.last_page }} + +

+
+ +
+
+ +
+ +
+ +
- - - + +
+
- Create Your First Project +
+ +
+
+ +
-
- nmrXiv is organized around projects. Each project can - include multiple samples, and each sample is assigned - its own URL. To begin uploading projects or samples, use - the Submit Data button. For more information, please - refer to our - - documentation . + +
+
-
- - + + +
+
+
+
+ +

+ Your workspace is empty +

+

+ Projects and compounds will appear here once you begin a + submission. Use Upload to add datasets and metadata to + nmrXiv. +

+
+ +

Submission guide - Need Help? - - + — step-by-step help for preparing your data. +

-
+
    import AppLayout from "@/Layouts/AppLayout.vue"; import TeamProjects from "@/Pages/Project/Index.vue"; -import TeamSamples from "@/Shared/Samples.vue"; +import CompoundCards from "@/Shared/CompoundCards.vue"; import Create from "@/Shared/CreateButton.vue"; import Onboarding from "@/App/Onboarding.vue"; import SearchInput from "@/Shared/SearchInput.vue"; import EmptySearchState from "@/Shared/EmptySearchState.vue"; import StatusFilter from "@/Shared/StatusFilter.vue"; +import Pagination from "@/Shared/Pagination.vue"; +import StudyCard from "@/Shared/StudyCard.vue"; +import { + ClockIcon, + StarIcon, + TrashIcon, + UserGroupIcon, +} from "@heroicons/vue/24/outline"; import { useMagicKeys } from "@vueuse/core"; import { getCurrentInstance } from "vue"; import { watchEffect } from "vue"; -import { Link } from "@inertiajs/vue3"; +import { Link, router } from "@inertiajs/vue3"; const { meta, u } = useMagicKeys(); @@ -626,15 +913,62 @@ export default { components: { AppLayout, TeamProjects, - TeamSamples, + CompoundCards, Create, Onboarding, SearchInput, EmptySearchState, StatusFilter, + Pagination, + StudyCard, Link, + UserGroupIcon, + ClockIcon, + StarIcon, + TrashIcon, + }, + props: { + user: { + type: Object, + required: true, + }, + team: { + type: Object, + default: null, + }, + projects: { + type: Object, + required: true, + }, + samples: { + type: Object, + required: true, + }, + teamRole: { + type: [String, Object], + default: null, + }, + filters: { + type: Object, + required: true, + }, + hasProjects: { + type: Boolean, + default: false, + }, + hasSamples: { + type: Boolean, + default: false, + }, + workspaceProjects: { + type: Array, + default: () => [], + }, + workspaceStudies: { + type: Array, + default: () => [], + }, }, - props: ["user", "team", "projects", "samples", "teamRole", "filters"], setup() { const app = getCurrentInstance(); const openDatasetCreateDialog = (data) => { @@ -657,19 +991,13 @@ export default { }, data() { return { - selectedTab: "projects", - searchProjectQuery: "", - currentProjectsPage: 1, - projectsPerPage: 10, - searchSampleQuery: "", - currentSamplesPage: 1, - samplesPerPage: 10, - searchDebounceTimer: null, - selectedProjectStatus: "all", - selectedSampleStatus: "all", + projectSearchTimer: null, + sampleSearchTimer: null, + perPageOptions: [5, 10, 25, 50], + /** Compound library tab: page size options (default 12). */ + samplesPerPageOptions: [12, 24, 36, 48, 50], }; }, - computed: { mailFromAddress() { return String(this.$page.props.mailFromAddress); @@ -679,51 +1007,8 @@ export default { return "mailto:" + String(this.$page.props.mailFromAddress); }, - filteredProjects() { - let filtered = this.projects; - - // Apply status filter first - if (this.selectedProjectStatus !== "all") { - filtered = filtered.filter((project) => { - return project.status === this.selectedProjectStatus; - }); - } - - // Apply search filter - if (this.searchProjectQuery) { - const q = this.searchProjectQuery.toLowerCase().trim(); - filtered = filtered.filter((project) => { - const name = (project.name || "").toLowerCase(); - const description = ( - project.description || "" - ).toLowerCase(); - const idText = String(project.id || "").toLowerCase(); - const uuid = String(project.uuid || "").toLowerCase(); - return ( - name.includes(q) || - description.includes(q) || - idText.includes(q) || - uuid.includes(q) - ); - }); - } - - return filtered; - }, - - paginatedProjects() { - const start = (this.currentProjectsPage - 1) * this.projectsPerPage; - return this.filteredProjects.slice( - start, - start + this.projectsPerPage - ); - }, - - totalProjectPages() { - return Math.max( - 1, - Math.ceil(this.filteredProjects.length / this.projectsPerPage) - ); + selectedTab() { + return this.filters.tab === "samples" ? "samples" : "projects"; }, editableTeamRole() { @@ -733,80 +1018,91 @@ export default { ); }, - filteredSamples() { - let filtered = this.samples; - - // Apply status filter first - if (this.selectedSampleStatus !== "all") { - filtered = filtered.filter((sample) => { - return sample.status === this.selectedSampleStatus; - }); + showDashboardLists() { + if (!this.team) { + return false; } + return this.hasProjects || this.hasSamples || this.isWorkspaceView; + }, - // Apply search filter - if (this.searchSampleQuery) { - const q = this.searchSampleQuery.toLowerCase().trim(); - filtered = filtered.filter((sample) => { - const name = (sample.name || "").toLowerCase(); - const description = ( - sample.description || "" - ).toLowerCase(); - const idText = String(sample.id || "").toLowerCase(); - const uuid = String(sample.uuid || "").toLowerCase(); - return ( - name.includes(q) || - description.includes(q) || - idText.includes(q) || - uuid.includes(q) - ); - }); - } + isWorkspaceView() { + const w = this.filters.workspace || "default"; - return filtered; + return ["shared", "recent", "starred", "trashed"].includes(w); }, - paginatedSamples() { - const start = (this.currentSamplesPage - 1) * this.samplesPerPage; - return this.filteredSamples.slice( - start, - start + this.samplesPerPage - ); + workspaceSectionHeadingId() { + return "dashboard-workspace-heading"; }, - totalSamplePages() { - return Math.max( - 1, - Math.ceil(this.filteredSamples.length / this.samplesPerPage) - ); + workspaceCopy() { + const w = this.filters.workspace || "default"; + /** @type {Record>} */ + const map = { + shared: { + title: "Shared with me", + description: + "Projects and compounds others have shared with you appear here once you accept an invitation.", + emptyProjectsTitle: "Nothing shared yet", + emptyProjectsBody: + "When a colleague invites you to a project or grants access, it will be listed here. Invitations are sent by email—accept them to see shared items in this workspace.", + emptyIcon: "UserGroupIcon", + }, + recent: { + title: "Recent", + description: + "Projects you have edited recently, across teams you belong to, sorted by latest activity.", + emptyProjectsTitle: "No recent projects", + emptyProjectsBody: + "Once you create or update a project, it will appear here for quicker access. Open the main workspace view to start or continue a submission.", + emptyIcon: "ClockIcon", + }, + starred: { + title: "Starred", + description: + "Pin projects and compounds you refer to often. Starred items are personal to your account.", + emptyProjectsTitle: "No starred items", + emptyProjectsBody: + "Use the star action on a project or compound card to add it here. Starred items stay easy to find across sessions.", + emptyIcon: "StarIcon", + }, + trashed: { + title: "Trash", + description: + "Projects you delete are retained here until they are permanently removed or restored.", + emptyProjectsTitle: "Trash is empty", + emptyProjectsBody: + "Deleted projects will appear in this list. You may restore a project from its menu while it remains in trash, subject to your workspace rules.", + emptyIcon: "TrashIcon", + }, + }; + + const entry = map[w] ?? map.recent; + const iconMap = { + UserGroupIcon, + ClockIcon, + StarIcon, + TrashIcon, + }; + + return { + ...entry, + emptyIcon: iconMap[entry.emptyIcon] ?? ClockIcon, + }; }, - }, - watch: { - searchProjectQuery() { - // Debounce the search query to avoid excessive pagination resets - if (this.searchDebounceTimer) { - clearTimeout(this.searchDebounceTimer); - } - this.searchDebounceTimer = setTimeout(() => { - this.currentProjectsPage = 1; - }, 300); // 300ms debounce delay - }, - selectedProjectStatus() { - // Reset to first page when status filter changes - this.currentProjectsPage = 1; - }, - selectedSampleStatus() { - // Reset to first page when status filter changes - this.currentSamplesPage = 1; - }, - searchSampleQuery() { - // Debounce the search query to avoid excessive pagination resets - if (this.searchDebounceTimer) { - clearTimeout(this.searchDebounceTimer); - } - this.searchDebounceTimer = setTimeout(() => { - this.currentSamplesPage = 1; - }, 300); // 300ms debounce delay + showProjectsPerPageSelect() { + const total = Number(this.projects?.total) || 0; + const per = Number(this.filters.projects_per_page) || 10; + + return total >= per; + }, + + showSamplesPerPageSelect() { + const total = Number(this.samples?.total) || 0; + const per = Number(this.filters.samples_per_page) || 12; + + return total >= per; }, }, @@ -816,26 +1112,169 @@ export default { draft_id: this.filters.draft_id, }); } - - const urlSearchParams = new URLSearchParams(window.location.search); - const params = Object.fromEntries(urlSearchParams.entries()); - this.selectedTab = params["tab"] ? params["tab"] : "projects"; }, beforeUnmount() { - // Clean up the search debounce timer to prevent memory leaks - if (this.searchDebounceTimer) { - clearTimeout(this.searchDebounceTimer); - } + clearTimeout(this.projectSearchTimer); + clearTimeout(this.sampleSearchTimer); }, methods: { + /** + * Omit default / empty query keys so bookmarks and Inertia visits stay readable. + * + * @param {Record} merged + */ + compactDashboardParams(merged) { + const tab = merged.tab === "samples" ? "samples" : "projects"; + const projectsPage = Number(merged.projects_page) || 1; + const samplesPage = Number(merged.samples_page) || 1; + const projectsPerPage = Number(merged.projects_per_page) || 10; + const samplesPerPage = Number(merged.samples_per_page) || 12; + const projectsStatus = merged.projects_status || "all"; + const samplesStatus = merged.samples_status || "all"; + const projectsQ = String(merged.projects_q || "").trim(); + const samplesQ = String(merged.samples_q || "").trim(); + const workspace = merged.workspace || "default"; + + /** @type {Record} */ + const out = {}; + + if (workspace !== "default") { + out.workspace = workspace; + } + + if (tab !== "projects") { + out.tab = tab; + } + if (projectsPage !== 1) { + out.projects_page = projectsPage; + } + if (samplesPage !== 1) { + out.samples_page = samplesPage; + } + if (projectsPerPage !== 10) { + out.projects_per_page = projectsPerPage; + } + if (samplesPerPage !== 12) { + out.samples_per_page = samplesPerPage; + } + if (projectsStatus !== "all") { + out.projects_status = projectsStatus; + } + if (samplesStatus !== "all") { + out.samples_status = samplesStatus; + } + if (projectsQ !== "") { + out.projects_q = projectsQ; + } + if (samplesQ !== "") { + out.samples_q = samplesQ; + } + if (merged.action) { + out.action = merged.action; + } + if ( + merged.draft_id !== null && + merged.draft_id !== undefined && + merged.draft_id !== "" + ) { + out.draft_id = merged.draft_id; + } + + return out; + }, + + dashboardUrl(overrides = {}) { + const merged = { ...this.filters, ...overrides }; + + return this.route("dashboard", this.compactDashboardParams(merged)); + }, + + visitDashboard(overrides = {}) { + router.get( + this.dashboardUrl(overrides), + {}, + { + preserveScroll: true, + replace: true, + } + ); + }, + + onTabSelect(event) { + this.visitDashboard({ tab: event.target.value }); + }, + + onProjectsSearchInput(value) { + clearTimeout(this.projectSearchTimer); + this.projectSearchTimer = setTimeout(() => { + this.visitDashboard({ + projects_q: value || "", + projects_page: 1, + }); + }, 300); + }, + + onSamplesSearchInput(value) { + clearTimeout(this.sampleSearchTimer); + this.sampleSearchTimer = setTimeout(() => { + this.visitDashboard({ + samples_q: value || "", + samples_page: 1, + }); + }, 300); + }, + + onProjectsStatus(status) { + this.visitDashboard({ + projects_status: status, + projects_page: 1, + }); + }, + + onSamplesStatus(status) { + this.visitDashboard({ + samples_status: status, + samples_page: 1, + }); + }, + + onProjectsPerPageChange(event) { + const n = Number(event.target.value); + if (!Number.isFinite(n)) { + return; + } + this.visitDashboard({ + projects_per_page: n, + projects_page: 1, + }); + }, + + onSamplesPerPageChange(event) { + const n = Number(event.target.value); + if (!Number.isFinite(n)) { + return; + } + this.visitDashboard({ + samples_per_page: n, + samples_page: 1, + }); + }, + clearProjectFilters() { - this.searchProjectQuery = ""; - this.selectedProjectStatus = "all"; + this.visitDashboard({ + projects_q: "", + projects_status: "all", + projects_page: 1, + }); }, + clearSampleFilters() { - this.searchSampleQuery = ""; - this.selectedSampleStatus = "all"; + this.visitDashboard({ + samples_q: "", + samples_status: "all", + samples_page: 1, + }); }, }, }; diff --git a/resources/js/Pages/Predict.vue b/resources/js/Pages/Predict.vue index 7d989f63a..f6ce5c9db 100644 --- a/resources/js/Pages/Predict.vue +++ b/resources/js/Pages/Predict.vue @@ -27,12 +27,6 @@ > Projects - - Spectra - Projects - - Spectra - { - this.editor = OCL.StructureEditor.createSVGEditor( - "predictionEditor", - 1 - ); + this.editor = createStructureEditor("predictionEditor"); }); }, methods: { diff --git a/resources/js/Pages/Project/Index.vue b/resources/js/Pages/Project/Index.vue index 80ee4dc5f..8c305dc88 100644 --- a/resources/js/Pages/Project/Index.vue +++ b/resources/js/Pages/Project/Index.vue @@ -1,5 +1,5 @@ diff --git a/resources/js/Pages/Project/Partials/Details.vue b/resources/js/Pages/Project/Partials/Details.vue index e5f650855..8629577da 100644 --- a/resources/js/Pages/Project/Partials/Details.vue +++ b/resources/js/Pages/Project/Partials/Details.vue @@ -979,6 +979,7 @@ export default defineComponent({ tags: [], doi: this.project.doi, tags_array: [], + project_tags_updated: true, photo: null, }), open: false, diff --git a/resources/js/Pages/Project/Settings.vue b/resources/js/Pages/Project/Settings.vue index 0fdd77fd3..3b652cd8a 100644 --- a/resources/js/Pages/Project/Settings.vue +++ b/resources/js/Pages/Project/Settings.vue @@ -10,7 +10,12 @@ > {{ project.name }} / Settings diff --git a/resources/js/Pages/Project/Show.vue b/resources/js/Pages/Project/Show.vue index 9aa5dfbd2..52241d5ec 100644 --- a/resources/js/Pages/Project/Show.vue +++ b/resources/js/Pages/Project/Show.vue @@ -1,3 +1,8 @@ + + + diff --git a/resources/js/Pages/Public/Sample/Show.vue b/resources/js/Pages/Public/Sample/Show.vue index 476f9de32..489238940 100644 --- a/resources/js/Pages/Public/Sample/Show.vue +++ b/resources/js/Pages/Public/Sample/Show.vue @@ -5,10 +5,6 @@
    -

    @@ -29,104 +25,84 @@ + +

    + + +
@@ -134,442 +110,229 @@
-
- -
- - + + +
+ + Share + +
+ - -
- - Share - -
- - -
- -
-
- -
- + />
-
-
-
-
-
-
- -
-
- #{{ study.data.identifier }} -
-
+ +
+ +
+ + +
-
- -
- -
-
- -
- +
+ +
+
- Keywords - -
-
- -
-
-
-
-

- Submitter -

-
-
-
- -
+
- - - - Submitted via: - - - - - - {{ study.data.external_id }} - - - - - -
-
- - -
-
- -
-
- -
-
-
- -
 
-
-
-

- Molecular Composition -

-
-
-
+
+
- -
- Sample chemical composition -
+ Authors +
-
-
-

- No structures associated with the - sample yet! -

-

- Get started by adding a new - molecule. -

-
+
+
+
+
-
-
-
-
+ -
-

- Spectra -

+ +
+
-
-
- -
-
-
-
-

- Datasets +
+
+

+ Spectra Datasets

{{ study.data.datasets.length }} {{ study.data.datasets.length === 1 - ? "Dataset" - : "Datasets" + ? "dataset" + : "datasets" }}

No datasets available

-

+

There are no spectra datasets associated with this study yet.

@@ -594,215 +359,278 @@

-
- - {{ - dataset.type.replace( - /,\s*$/, - "" - ) - }} - -
+ + {{ + dataset.type.replace( + /,\s*$/, + "" + ) + }} +
- -
-
-
-
- -
-
-
- -
- - - -
- - -
-

- License Information -

- - - - -
-
- License -
-
- - {{ study.data.license.title }} - - + +
-
+ +
+
+
- +
+
+ +
+ -

-
+ Description +
+

+
-
-
+
- +
+
+

- Description - + Keywords +

+
+ + + + + {{ tag.name["en"] }} + +
-
-
-

- -
+
@@ -817,13 +645,14 @@ import SampleLayout from "@/Pages/Public/Sample/Layout.vue"; import { ShareIcon, ClipboardDocumentIcon } from "@heroicons/vue/24/solid"; import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/vue"; import SpectraViewer from "@/Shared/SpectraViewer.vue"; -import Depictor2D from "@/Shared/Depictor2D.vue"; import DOIBadge from "@/Shared/DOIBadge.vue"; +import MolecularInfoPanel from "@/Shared/MolecularInfoPanel.vue"; +import Tag from "@/Shared/Tag.vue"; import { Head } from "@inertiajs/vue3"; import Citation from "@/Shared/Citation.vue"; import ShowProjectDates from "@/Shared/ShowProjectDates.vue"; -import Depictor3D from "@/Shared/Depictor3D.vue"; import AuthorCard from "@/Shared/AuthorCard.vue"; +import CitationCard from "@/Shared/CitationCard.vue"; export default { components: { SampleLayout, @@ -834,13 +663,14 @@ export default { MenuItem, MenuItems, SpectraViewer, - Depictor2D, - Depictor3D, DOIBadge, + MolecularInfoPanel, + Tag, Head, Citation, ShowProjectDates, AuthorCard, + CitationCard, }, props: ["project", "tab", "study"], data() { @@ -855,6 +685,83 @@ export default { url() { return String(this.$page.props.url); }, + /** + * Molecules for composition UI: prefer nested sample.molecules, fall back + * to study.data.molecules (StudyResource always exposes the latter). + */ + compositionMolecules() { + const fromSample = this.study?.data?.sample?.molecules; + if (Array.isArray(fromSample) && fromSample.length > 0) { + return fromSample; + } + const top = this.study?.data?.molecules; + if (Array.isArray(top) && top.length > 0) { + return top; + } + + return []; + }, + studyIdentifier() { + const identifier = this.study?.data?.identifier; + + return identifier != null && String(identifier).length > 0 + ? identifier + : null; + }, + hasMolecularCompositionSidebar() { + return this.compositionMolecules.length > 0; + }, + hasKeywords() { + return (this.study?.data?.tags?.length ?? 0) > 0; + }, + hasPublicationDates() { + return ( + Boolean(this.study?.data?.release_date) || + Boolean(this.study?.data?.created_at) + ); + }, + hasLicense() { + return Boolean(this.study?.data?.license); + }, + hasStudyCitations() { + return (this.study?.data?.citations?.length ?? 0) > 0; + }, + citationsHeading() { + const count = this.study?.data?.citations?.length ?? 0; + + return count === 1 ? "Citation" : "Citations"; + }, + showDoiCitation() { + return this.study?.data?.is_public && this.study?.data?.doi != null; + }, + hasSidebarContentAboveCitation() { + return ( + Boolean(this.studyIdentifier) || + this.hasPublicationDates || + this.hasKeywords || + this.hasMolecularCompositionSidebar + ); + }, + hasSidebarContentAboveStudyCitations() { + return this.hasSidebarContentAboveCitation || this.hasLicense; + }, + hasSidebarContentAboveDoiCitation() { + return ( + this.hasSidebarContentAboveStudyCitations || + this.hasStudyCitations + ); + }, + hasInfoSidebar() { + return ( + Boolean(this.studyIdentifier) || + this.showDoiCitation || + this.hasMolecularCompositionSidebar || + this.hasKeywords || + this.hasPublicationDates || + this.hasStudyCitations || + this.hasLicense + ); + }, }, mounted() { axios @@ -863,6 +770,24 @@ export default { this.schema = response.data; }); }, - methods: {}, + methods: { + datasetHref(dataset) { + if (dataset?.public_url) { + try { + return new URL(dataset.public_url).pathname; + } catch { + return dataset.public_url; + } + } + + if (dataset?.identifier) { + const id = String(dataset.identifier).replace(/^NMRXIV:/i, ""); + + return `/dataset/${id}`; + } + + return "#"; + }, + }, }; diff --git a/resources/js/Pages/Public/Studies.vue b/resources/js/Pages/Public/Studies.vue index 100693dac..ef2e3e8b4 100644 --- a/resources/js/Pages/Public/Studies.vue +++ b/resources/js/Pages/Public/Studies.vue @@ -477,6 +477,23 @@ export default { }; }, computed: { + compoundNumericId() { + const raw = this.molecule?.identifier; + if (raw === null || raw === undefined) { + return ""; + } + const s = String(raw).replace(/^NMRXIV:M/i, ""); + const lead = s.match(/^(\d+)/); + + return lead ? lead[1] : ""; + }, + listUrl() { + if (this.compoundNumericId) { + return `/compound/M${this.compoundNumericId}`; + } + + return "/projects"; + }, pageTitle() { if (this.molecule && this.molecule.identifier) { let title = `${this.molecule.identifier}`; @@ -505,7 +522,11 @@ export default { form: { deep: true, handler: throttle(function () { - this.$inertia.get("/spectra", pickBy(this.form), { + const params = pickBy(this.form); + if (this.compoundNumericId) { + params.compound = this.compoundNumericId; + } + this.$inertia.get(this.listUrl, params, { preserveState: true, }); }, 150), diff --git a/resources/js/Pages/Publish.vue b/resources/js/Pages/Publish.vue index e8b490c02..d47edfd93 100644 --- a/resources/js/Pages/Publish.vue +++ b/resources/js/Pages/Publish.vue @@ -6,7 +6,7 @@
Step 3 / 3 - Publish data @@ -18,11 +18,12 @@ class="text-sm text-gray-700 uppercase font-bold tracking-widest" > ← @@ -40,375 +41,755 @@
-
- - - + - - Saving... -
+ aria-hidden="true" + > + + + + + {{ + saveStatusSavingLabel + }} + {{ + saveStatusSavedLabel + }} + {{ saveStatusErrorLabel }} + +
+
-
-
-
+
-
-
+
- - +
+ - - Invalid project name - contains - "DRAFT" - please update the project - name to publish -
-
-
-
-
- -
- + Project Description + + +
+ +
+
- -
-
-
+
+
+ +
+ +
+
+
+ -
+
+ +
+
+ +
+
+
+
+ + + + + + +
+
+
+
+
+
+ +
+
+ + > + Citation +
+
+
+
-
-
- - - +
+ +
-
+
-
-
-
- +
+
+
+
+

+ Use the grip to drag authors + into the order they should + appear in the publication. +

+ + + +
+ +
+
+
-
-
- -
-
-
-
-
-
- Author + Project Image -
-
-
+ +
-
-
-
-
-
- - Project Image - -
- -
- -
+
+ + +
-
- - -
+ Select A New Photo + - - Select A New Photo - - - +
@@ -441,114 +823,217 @@
-
- - +
- + +
+ + +
-

- Your data becomes publicly accessible - right away with a DOI. Please select a - future date if you would like to embargo - your data for peer review. Need help? - Read more +

- - -
-

- Scheduled Release - (Embargo): +

+
+
+ +
-
-
-
- -
-
+
+
-
- + Your data becomes publicly + accessible right away with a DOI. + Choose + Embargo above if + you want a scheduled release for + peer review. Need help? + Read more +

+
+ + +
+

+ Scheduled Release + (Embargo): - How to choose the right - license? +

+ You can: +

+
    +
  • + + Share reviewer access links + for confidential peer + review - - +
  • +
  • + + Receive advance + notifications before + publication +
  • +
  • + + Modify the release date or + publish instantly from your + dashboard +
  • +
+
+
+
+
+ +

+ Publishing as individual samples always uses + immediate public release. Embargo scheduling + is only available when you publish as a + project. +

+
+
+ + @@ -566,7 +1051,7 @@ id="conditions" v-model="publishForm.conditions" type="checkbox" - class="rounded mt-1 border-gray-300 text-indigo-600 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" + class="rounded mt-1 border-gray-300 text-primary-600 shadow-sm focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50" name="conditions" />
@@ -599,7 +1084,7 @@ id="terms" v-model="publishForm.terms" type="checkbox" - class="rounded border-gray-300 text-indigo-600 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50" + class="rounded border-gray-300 text-primary-600 shadow-sm focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50" name="terms" />
@@ -607,14 +1092,14 @@ Terms of Service and Privacy Policy and hereby also grant nmrXiv @@ -660,7 +1145,7 @@ NOT RIGHT YET @@ -760,7 +1245,7 @@ class="m-3 relative clear-both border-dotted border-2 border-gray-300 rounded-lg" >

Go to Dashboard @@ -800,6 +1285,7 @@ @@ -814,7 +1300,7 @@ Click to read more.

@@ -829,11 +1315,11 @@ > Cancel - - Publish as Sample + + Publish each sample on its own - - Publish as Project + + Group as one publication
@@ -887,10 +1373,7 @@ > Cancel - + Yes, Proceed @@ -911,8 +1394,8 @@ Once the data is published you will no longer be - able to change the data uploaded! This sample will - be published as an individual sample. + able to change the data uploaded! These samples will + be published as individual records.

@@ -928,13 +1411,9 @@ project later if desired. - Opting for an Embargo publication grants your sample - a DOI, yet it stays private exclusively for you. You - have the option to share the sample with others and - can adjust the release date or promptly make it - public through the sample's dashboard view. But once - the data is published you will no longer be able to - change the data uploaded! + Individual samples publish with immediate public + release when processing completes. Uploaded content + can no longer be edited after publication.
@@ -946,12 +1425,11 @@ Publish Now - + Publish with Embargo @@ -977,8 +1455,15 @@ import AuthorCard from "@/Shared/AuthorCard.vue"; import StudyInfo from "@/Shared/StudyInfo.vue"; import SelectRich from "@/Shared/SelectRich.vue"; import CitationCard from "@/Shared/CitationCard.vue"; -import { PencilIcon } from "@heroicons/vue/24/solid"; -import ToggleButton from "@/Shared/ToggleButton.vue"; +import { PlusIcon } from "@heroicons/vue/24/solid"; +import { + Bars3Icon, + ChevronDownIcon, + ChevronUpIcon, + DocumentTextIcon, + UserGroupIcon, +} from "@heroicons/vue/24/outline"; +import Draggable from "vuedraggable"; import "ontology-elements/dist/index.js"; import JetConfirmationModal from "@/Jetstream/ConfirmationModal.vue"; import JetSuccessButton from "@/Jetstream/SuccessButton.vue"; @@ -997,11 +1482,16 @@ export default { JetSecondaryButton, JetSuccessButton, JetConfirmationModal, - PencilIcon, + PlusIcon, + DocumentTextIcon, + UserGroupIcon, Validation, - ToggleButton, StudyInfo, CitationCard, + Draggable, + Bars3Icon, + ChevronDownIcon, + ChevronUpIcon, }, props: ["user", "team", "project", "teamRole", "draft"], @@ -1018,12 +1508,15 @@ export default { return { publishForm: this.$inertia.form({ _method: "PUT", + suppress_project_updated_flash: true, name: "", description: "", error_message: null, tags: [], tag: "", tags_array: [], + project_tags_updated: true, + project_species_updated: true, owner_id: null, species: [], photo: null, @@ -1035,7 +1528,7 @@ export default { }), licenses: null, license: null, - returnUrl: "/dashboard", + returnUrl: route("dashboard"), errors: null, projectSpecies: "", status: "draft", @@ -1045,6 +1538,23 @@ export default { showSingleSampleModal: false, draftWarningConfirmed: false, photoPreview: null, + /** + * Status of background autosaves driven by blur/change events. + * One of: 'idle' | 'saving' | 'saved' | 'error'. + */ + saveStatus: "idle", + /** 'default' | 'authorOrder' — drives copy in the save-status pill */ + saveStatusVariant: "default", + saveStatusTimer: null, + /** Local list for drag-and-drop author order on this page */ + orderedAuthors: [], + /** Author ids in order when a drag started (to detect real changes) */ + publishAuthorsOrderBeforeDrag: [], + authorOrderSaveInProgress: false, + /** 'public' = immediate release; 'embargo' = date picker shown */ + releaseVisibility: "public", + /** When publishing as samples, optional metadata starts collapsed */ + samplesMetadataExpanded: false, }; }, computed: { @@ -1069,6 +1579,9 @@ export default { return this.tabs.find((t) => t.current); }, isImmediatePublication() { + if (this.releaseVisibility === "public") { + return true; + } if (!this.publishForm.release_date) return true; const today = new Date(); const releaseDate = new Date(this.publishForm.release_date); @@ -1078,6 +1591,10 @@ export default { return releaseDate.getTime() === today.getTime(); }, hasDraftInName() { + if (!this.publishForm.enableProjectMode) { + return false; + } + return ( this.publishForm.name && this.publishForm.name.toLowerCase().includes("draft") @@ -1091,6 +1608,62 @@ export default { (!this.hasDraftInName || this.draftWarningConfirmed) ); }, + hasPublicationCitations() { + return ( + Array.isArray(this.project?.citations) && + this.project.citations.length > 0 + ); + }, + hasPublicationAuthors() { + return ( + Array.isArray(this.project?.authors) && + this.project.authors.length > 0 + ); + }, + saveStatusSavingLabel() { + return this.saveStatusVariant === "authorOrder" + ? "Updating author order…" + : "Saving…"; + }, + saveStatusSavedLabel() { + return this.saveStatusVariant === "authorOrder" + ? "Author order updated" + : "Saved"; + }, + saveStatusErrorLabel() { + return this.saveStatusVariant === "authorOrder" + ? "Couldn't update author order" + : "Couldn't save changes"; + }, + }, + watch: { + "project.authors": { + deep: true, + handler() { + this.syncOrderedAuthorsFromProject(); + }, + }, + "publishForm.enableProjectMode"(enabled) { + if (!enabled) { + this.samplesMetadataExpanded = false; + this.applySampleModeReleaseSchedule(); + } + }, + }, + beforeUnmount() { + if (this.saveStatusTimer) { + clearTimeout(this.saveStatusTimer); + this.saveStatusTimer = null; + } + }, + created() { + this.releaseVisibility = this.computeInitialReleaseVisibility(); + if (this.releaseVisibility === "public") { + const d = new Date(); + d.setHours(0, 0, 0, 0); + this.publishForm.release_date = d; + } + this.syncOrderedAuthorsFromProject(); }, mounted() { @@ -1118,12 +1691,27 @@ export default { } this.loadLicenses(); + this.applySampleModeReleaseSchedule(); + this.$nextTick(() => { const urlSearchParams = new URLSearchParams(window.location.search); const params = Object.fromEntries(urlSearchParams.entries()); let edit = params["edit"]; + if ( + !this.publishForm.enableProjectMode && + ["citation", "keywords", "organism", "authors"].includes(edit) + ) { + this.samplesMetadataExpanded = true; + } + if (edit == "citation") { + this.$nextTick(() => { + const el = document.getElementById("project-citations"); + if (el) { + this.scrollTo(el); + } + }); this.toggleManageCitation(); } else if (edit == "title") { this.scrollTo(document.getElementById("project-name")); @@ -1138,11 +1726,28 @@ export default { } else if (edit == "release") { this.scrollTo(document.getElementById("release")); } else if (edit == "authors") { + this.$nextTick(() => { + const el = document.getElementById("project-authors"); + if (el) { + this.scrollTo(el); + } + }); this.toggleManageAuthor(); } }); }, methods: { + setPublishProjectMode(enabled) { + if (this.publishForm.enableProjectMode === enabled) { + return; + } + this.publishForm.enableProjectMode = enabled; + this.updateDraft(); + }, + onPublishModeSelect(event) { + const value = event.target.value; + this.setPublishProjectMode(value === "project"); + }, selectNewPhoto() { this.$refs.photo.click(); }, @@ -1168,18 +1773,34 @@ export default { }, 2500); }); }, + setSaveStatus(status, variant = "default") { + if (this.saveStatusTimer) { + clearTimeout(this.saveStatusTimer); + this.saveStatusTimer = null; + } + this.saveStatusVariant = variant; + this.saveStatus = status; + if (status === "saved" || status === "error") { + this.saveStatusTimer = setTimeout(() => { + this.saveStatus = "idle"; + this.saveStatusVariant = "default"; + }, 2500); + } + }, updateDraft() { - axios.put("/dashboard/drafts/" + this.draft.id, { - project_enabled: this.publishForm.enableProjectMode ? 1 : 0, - }); + this.setSaveStatus("saving"); + axios + .put(route("dashboard.draft.update", this.draft.id), { + project_enabled: this.publishForm.enableProjectMode ? 1 : 0, + }) + .then(() => this.setSaveStatus("saved")) + .catch(() => this.setSaveStatus("error")); }, updateProject(callbacks = {}) { const { onSuccess = null, onError = null } = callbacks; - // Reset draft warning when name changes this.draftWarningConfirmed = false; - // if (this.publishForm.enableProjectMode) { if (this.$refs.photo) { this.publishForm.photo = this.$refs.photo.files[0]; } @@ -1207,16 +1828,21 @@ export default { this.publishForm.tags_array = this.publishForm.tags ? this.publishForm.tags.map((a) => a.text) : []; + + this.setSaveStatus("saving"); this.publishForm.post( route("dashboard.project.update", this.project.id), { preserveScroll: true, + preserveState: true, onSuccess: () => { + this.setSaveStatus("saved"); if (onSuccess) { onSuccess(); } }, onError: () => { + this.setSaveStatus("error"); if (onError) { onError(); } @@ -1224,6 +1850,17 @@ export default { } ); }, + onPublishKeywordsChanged(newTags) { + const list = Array.isArray(newTags) ? newTags : []; + this.publishForm.tags = list.map((t) => + typeof t === "object" && t !== null + ? { ...t } + : { text: String(t) } + ); + this.$nextTick(() => { + this.updateProject(); + }); + }, updateSpecies(species) { if (species && species != "") { this.publishForm.species.push(species); @@ -1234,6 +1871,7 @@ export default { removeSpecies(index) { if (index > -1) { this.publishForm.species.splice(index, 1); + this.updateProject(); } }, getTarget(id) { @@ -1260,6 +1898,43 @@ export default { return this.project.release_date; } }, + computeInitialReleaseVisibility() { + if (!this.project.release_date) { + return "public"; + } + const today = new Date(); + today.setHours(0, 0, 0, 0); + const release = new Date(this.project.release_date); + release.setHours(0, 0, 0, 0); + return release.getTime() > today.getTime() ? "embargo" : "public"; + }, + setReleaseVisibility(mode) { + if (!this.publishForm.enableProjectMode) { + return; + } + if (this.releaseVisibility === mode) { + return; + } + this.releaseVisibility = mode; + if (mode === "public") { + const d = new Date(); + d.setHours(0, 0, 0, 0); + this.publishForm.release_date = d; + } else { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const release = this.publishForm.release_date + ? new Date(this.publishForm.release_date) + : new Date(); + release.setHours(0, 0, 0, 0); + if (release.getTime() <= today.getTime()) { + const tomorrow = new Date(today); + tomorrow.setDate(tomorrow.getDate() + 1); + this.publishForm.release_date = tomorrow; + } + } + this.updateProject(); + }, loadLicenses() { if (this.$page.props.licenses) { this.licenses = this.$page.props.licenses; @@ -1284,6 +1959,105 @@ export default { toggleManageCitation() { this.manageCitationElement.toggleDialog(); }, + onCitationCardEdit(citation) { + const modal = this.manageCitationElement; + if (!modal.showDialog) { + modal.toggleDialog(); + } + this.$nextTick(() => { + modal.edit(citation); + }); + }, + onCitationCardDelete(citation) { + this.manageCitationElement.confirmDeletion(citation); + }, + onAuthorCardEdit(author) { + const modal = this.manageAuthorElement; + if (!modal.showDialog) { + modal.toggleDialog(); + } + this.$nextTick(() => { + modal.edit(author); + }); + }, + onAuthorCardDelete(author) { + this.manageAuthorElement.confirmDeletion(author); + }, + + syncOrderedAuthorsFromProject() { + const raw = this.project?.authors; + if (!Array.isArray(raw) || raw.length === 0) { + this.orderedAuthors = []; + + return; + } + this.orderedAuthors = [...raw].sort((a, b) => { + const ao = a.pivot?.sort_order ?? 0; + const bo = b.pivot?.sort_order ?? 0; + + return ao - bo; + }); + }, + + serializeAuthorForSync(author) { + return { + id: author.id, + title: author.title ?? null, + given_name: author.given_name, + family_name: author.family_name, + orcid_id: author.orcid_id ?? null, + email_id: author.email_id ?? null, + affiliation: author.affiliation ?? null, + ror_id: author.ror_id ?? null, + contributor_type: + (author.pivot && author.pivot.contributor_type) || + author.contributor_type || + "Researcher", + }; + }, + + onPublishAuthorDragStart() { + this.publishAuthorsOrderBeforeDrag = this.orderedAuthors.map( + (a) => a.id + ); + }, + + onPublishAuthorDragEnd() { + const after = this.orderedAuthors.map((a) => a.id); + const before = this.publishAuthorsOrderBeforeDrag; + const unchanged = + after.length === before.length && + after.every((id, i) => id === before[i]); + if (unchanged) { + return; + } + this.persistPublishAuthorOrder(); + }, + + persistPublishAuthorOrder() { + this.authorOrderSaveInProgress = true; + this.setSaveStatus("saving", "authorOrder"); + const form = this.$inertia.form({ + authors: this.orderedAuthors.map((a) => + this.serializeAuthorForSync(a) + ), + }); + form.post(route("author.save", this.project.id), { + preserveScroll: true, + preserveState: true, + only: ["project"], + onSuccess: () => { + this.setSaveStatus("saved", "authorOrder"); + }, + onError: () => { + this.syncOrderedAuthorsFromProject(); + this.setSaveStatus("error", "authorOrder"); + }, + onFinish: () => { + this.authorOrderSaveInProgress = false; + }, + }); + }, handlePublishClick() { // Check if name contains "DRAFT" and hasn't been confirmed yet if (this.hasDraftInName && !this.draftWarningConfirmed) { @@ -1354,7 +2128,32 @@ export default { }); } }, + applySampleModeReleaseSchedule() { + if (this.publishForm.enableProjectMode) { + return; + } + this.releaseVisibility = "public"; + const d = new Date(); + d.setHours(0, 0, 0, 0); + const prev = this.publishForm.release_date + ? new Date(this.publishForm.release_date) + : null; + if (prev) { + prev.setHours(0, 0, 0, 0); + } + const needsPersist = !prev || prev.getTime() !== d.getTime(); + this.publishForm.release_date = d; + if (needsPersist) { + this.updateProject(); + } + }, isReleasedToday() { + if (!this.publishForm.enableProjectMode) { + return true; + } + if (this.releaseVisibility === "public") { + return true; + } var currentDate = new Date(); var releaseDate = new Date(this.publishForm.release_date); if (releaseDate > currentDate) { diff --git a/resources/js/Pages/Study/About.vue b/resources/js/Pages/Study/About.vue index 31056ce9c..93c705d93 100644 --- a/resources/js/Pages/Study/About.vue +++ b/resources/js/Pages/Study/About.vue @@ -655,7 +655,8 @@ import { } from "@heroicons/vue/24/solid"; import StudyContent from "@/Pages/Study/Content.vue"; import slider from "vue3-slider"; -import OCL from "openchemlib/full"; +import OCL from "openchemlib"; +import { createStructureEditor } from "@/Utils/structureEditor"; import ToolTip from "@/Shared/ToolTip.vue"; import JetInputError from "@/Jetstream/InputError.vue"; import Depictor2D from "@/Shared/Depictor2D.vue"; @@ -712,15 +713,31 @@ export default { return this.$page.props.chemistryStandardizeUrl; }, }, + watch: { + canUpdateStudy(value) { + if (value && !this.editor) { + this.$nextTick(() => { + this.initStructureEditor(); + }); + } + }, + }, mounted() { this.$nextTick(() => { - this.editor = OCL.StructureEditor.createSVGEditor( - "structureSearchEditor", - 1 - ); + this.initStructureEditor(); }); }, methods: { + initStructureEditor() { + if (this.editor) { + return; + } + const host = document.getElementById("structureSearchEditor"); + if (!host) { + return; + } + this.editor = createStructureEditor("structureSearchEditor"); + }, openStudyDetailsPane() { this.emitter.emit("openStudyDetails", {}); }, diff --git a/resources/js/Pages/Study/Files.vue b/resources/js/Pages/Study/Files.vue index 55fe02f55..13ef9f361 100644 --- a/resources/js/Pages/Study/Files.vue +++ b/resources/js/Pages/Study/Files.vue @@ -639,7 +639,7 @@ import { router } from "@inertiajs/vue3"; import StudyContent from "@/Pages/Study/Content.vue"; import FileDetails from "@/Shared/FileDetails.vue"; import axiosRetry from "axios-retry"; -import OCL from "openchemlib/minimal"; +import OCL from "openchemlib"; import { FolderIcon, diff --git a/resources/js/Pages/Study/Index.vue b/resources/js/Pages/Study/Index.vue index 323942a77..c77d6175b 100644 --- a/resources/js/Pages/Study/Index.vue +++ b/resources/js/Pages/Study/Index.vue @@ -211,6 +211,17 @@ export default { default: false, type: Boolean, }, + editable: { + default: false, + type: Boolean, + }, + /** + * "dashboard" uses authenticated project studies JSON; "public" uses public studies listing. + */ + studiesEndpoint: { + default: "dashboard", + type: String, + }, }, data() { return { @@ -224,10 +235,9 @@ export default { if (this.project) { this.loading = true; if (!this.preview) { - if (this.project?.id) { - this.fetchStudies( - route("dashboard.project.studies", this.project.id) - ); + const url = this.initialStudiesUrl(); + if (url) { + this.fetchStudies(url); } } else { if (this.project?.obfuscationcode) { @@ -243,11 +253,34 @@ export default { } }, methods: { + initialStudiesUrl() { + if (!this.project?.id) { + return null; + } + if (this.studiesEndpoint === "public") { + return route("project.studies", this.project.id); + } + + return route("dashboard.project.studies", this.project.id); + }, + studiesListingBaseUrl() { + if (!this.project?.id) { + return null; + } + if (this.studiesEndpoint === "public") { + return route("project.studies", this.project.id); + } + + return route("dashboard.project.studies", this.project.id); + }, openDatasetCreateDialog() { if (this.project?.id && this.project?.draft_id) { + const returnUrl = + this.project.public_url || + "/dashboard/projects/" + this.project.id; this.emitter.emit("openDatasetCreateDialog", { draft_id: this.project.draft_id, - return_url: "/projects/" + this.project.id, + return_url: returnUrl, }); } }, @@ -260,9 +293,8 @@ export default { update(link) { if (!link) { link = {}; - link["url"] = - route("dashboard.project.studies", this.project.id) + - "?page=1"; + const base = this.studiesListingBaseUrl(); + link["url"] = base ? base + "?page=1" : null; } if (link.url) { this.loading = true; @@ -271,11 +303,13 @@ export default { }, reset() { let link = {}; - link["url"] = - route("dashboard.project.studies", this.project.id) + "?page=1"; + const base = this.studiesListingBaseUrl(); + link["url"] = base ? base + "?page=1" : null; this.query = ""; this.loading = true; - this.executeQuery(link); + if (link.url) { + this.executeQuery(link); + } }, executeQuery(link) { this.fetchStudies(link.url + "&search=" + this.query); diff --git a/resources/js/Pages/Study/Layout.vue b/resources/js/Pages/Study/Layout.vue index 6a57f158b..4fe63392c 100644 --- a/resources/js/Pages/Study/Layout.vue +++ b/resources/js/Pages/Study/Layout.vue @@ -83,6 +83,8 @@ project.obfuscationcode, ] ) + : project.identifier + ? project.public_url : route( 'dashboard.projects', [project.id] diff --git a/resources/js/Pages/Upload.vue b/resources/js/Pages/Upload.vue index e3fdb7507..f8dc14907 100644 --- a/resources/js/Pages/Upload.vue +++ b/resources/js/Pages/Upload.vue @@ -5,11 +5,11 @@
-
-
- Step - {{ currentStep.id }} - - / 3 - - - - Introduction - - File Upload - - - Auto Processing, Assignments and Validation - - -

+
+ +
- - +
+ + + + + Step + {{ + currentStep.id + }} + / 3 - + + File Upload + + + Auto Processing, Assignments and + Validation + - - - ← - - - - - - ← - - + Submit data to nmrXiv + +
+ +
+
+ + + Cancel + + + + + + Cancel + + + + + + + + + Proceed + + + + + + + + + + + Proceed + + + + + Finish + + + +
+
+
- + +
+
+ + Project name + +

+ Click the name or pencil to edit. Press + Enter to save. +

+
+

{{ currentDraft.name }}

- - - Submit data to nmrXiv -

-
-
-
-
-
-
- -
-
- -
-
+
- - Proceed - -
-
- - + +
+
- Cancel - - - - - - Cancel - - + - + Copied to clipboard. + +
+ + +
@@ -251,9 +486,9 @@ -
-
-
+
+
+
- - {{ - formatStatus( - draft.status - ) - }} - + />

-
- -
@@ -578,39 +737,117 @@
-
-
-
- +
+
+
+
-
-
+
+
+
-
- Draft ID: - {{ currentDraft.key }} +
+ role="alert" + class="flex gap-3 rounded-lg border border-red-200 bg-red-50/95 px-4 py-3 shadow-sm ring-1 ring-red-900/5 dark:border-red-900/60 dark:bg-red-950/50 dark:ring-red-500/10" + > +
-
-
+
+
@@ -619,107 +856,190 @@ class="mt-2" />
-
+
- SUMMARY + Summary
- {{ - pluralize( - "SAMPLE", - studies.length - ) - }} - ({{ studies.length }})
- - - + + {{ + pluralize( + "SAMPLE", + studies.length + ) + }} + ({{ + studies.length + }}) +
- Show Compound - detailsHide Compound - details -
-
-
-
+ {{ study.name - }} + }} + @@ -767,38 +1089,96 @@
- -
+ + + {{ + study + .datasets + .length + }} + {{ + pluralize( + "dataset", + study + .datasets + .length + ) + }} + + +
    +
  • -
    - {{ + {{ ds.name - }} - ({{ - ds.type - }}) -
    -
-
+ }} + · + {{ + ds.type + }} + +
@@ -836,7 +1216,7 @@
- +
@@ -993,85 +1373,10 @@ >
-
-
-
- - - - -
-
-

- Processing - uploaded - data: - Please - wait - for - your - samples - to - be - processed. -

-
-
    -
  • - Processed: - {{ - studies.length - - inprogressStudies.length - }} - out - of - {{ - studies.length - }} - samples -
  • -
-
-
-
-
-
-
- - {{ - selectedStudy.name - }} - - + Sample + name + +
+

+ Click + the + name + or + pencil + to + edit. + Press + Enter + to + save. +

+ + Saving… + +
+
+
- {{ - studyNameDraft - }} - - + + +
+
+
+
+
+
+

+ Saving… + Loading + spectra +  · + {{ + loader + .iframe + .sampleLabel + }} +

+
-

Chemical composition +

+ + + {{ + selectedStudyMoleculeCount + }} + {{ + selectedStudyMoleculeCount + }} + molecule(s) + in + this + sample +
-
+
-
-
+
+ +
+
+

+ Two + ways + to + record + assignments +

+
    +
  1. + Paste + an + ACS-style + assignment + string + (or + a + list + of + atom-number + / + peak + pairs) + into + the + textarea + for + each + spectrum + below + and + hit + Save. +
  2. +
  3. + Use + the + NMRium + viewer + above + to + assign + atoms + graphically: + press + r + for + ranges, + click + Auto + Ranges + Picking, + then + drag + a + range + link + onto + an + atom + in + the + structure. + Diastereotopic + atoms + expand + with + Shift + + + click. + Assigned + atoms + turn + yellow. + Full + guide + ↗ +
  4. +
+
+ +
+ No + spectra + are + attached + to + this + sample + yet, + so + there + is + nothing + to + assign. +
+ +
+ +
+
+
+
+ + {{ + group.label + }} + +
+ Saving… + +
+ +
+ + +

+ {{ + groupAssignmentErrors[ + group + .key + ] + }} +

+
+
+
+
+
+
+
-
-

- Sample - Details -

-
+
-
+
@@ -2128,44 +3096,126 @@
-
- + + + + + + +
@@ -2206,98 +3256,168 @@ @close="showLogsDialog = false" > + + +
+
+
+
+ +
+

+ Processing uploaded data +

+

+ Please wait while your samples are being + processed. This may take a few minutes. +

+
+
+ +
+
+ + Processed + + + {{ processedStudiesCount }} / + {{ totalStudiesCount }} samples + +
+
+
+
+
+
+ +
+
+
+
+
+
@@ -2325,6 +3565,7 @@ import FileSystemBrowser from "./../Shared/FileSystemBrowser.vue"; import Validation from "@/Shared/Validation.vue"; import SearchInput from "@/Shared/SearchInput.vue"; import EmptySearchState from "@/Shared/EmptySearchState.vue"; +import DraftStatusBadge from "@/Shared/DraftStatusBadge.vue"; import { TrashIcon, PencilIcon, @@ -2336,6 +3577,14 @@ import { CheckIcon, ExclamationCircleIcon, } from "@heroicons/vue/24/solid"; +import { + ArrowLeftIcon, + ClipboardDocumentIcon, + ChevronRightIcon, + ChevronDownIcon, + ArrowsPointingOutIcon, + ArrowsPointingInIcon, +} from "@heroicons/vue/24/outline"; import SpectraEditor from "@/Shared/SpectraEditor.vue"; import Depictor from "@/Shared/Depictor.vue"; import Depictor2D from "@/Shared/Depictor2D.vue"; @@ -2343,6 +3592,8 @@ import slider from "vue3-slider"; import VueTagsInput from "@sipec/vue3-tags-input"; import "ontology-elements/dist/index.js"; import Global from "@/Mixins/Global.js"; +import OCL from "openchemlib"; +import { createStructureEditor } from "@/Utils/structureEditor"; export default { components: { @@ -2356,6 +3607,7 @@ export default { FileSystemBrowser, SearchInput, EmptySearchState, + DraftStatusBadge, TrashIcon, PencilIcon, EyeIcon, @@ -2371,6 +3623,12 @@ export default { InformationCircleIcon, CheckIcon, ExclamationCircleIcon, + ArrowLeftIcon, + ClipboardDocumentIcon, + ChevronRightIcon, + ChevronDownIcon, + ArrowsPointingOutIcon, + ArrowsPointingInIcon, }, mixins: [Global], props: ["draft_id"], @@ -2383,11 +3641,33 @@ export default { loading: false, loadingStep: false, - spectraLoadingStatus: false, - spectraLoadingMessage: null, + /** Single source for upload overlays: import = centered modal; iframe = thin bar over NMRium. */ + loader: { + kind: "idle", + importMeta: null, + bannerMessage: null, + iframe: null, + }, + studySaving: false, + checkStudyStatusTimerId: null, showCompoundDetails: true, hideDownArrow: false, + chemicalCompositionExpanded: false, + + assignmentsExpanded: false, + assignmentsDraft: {}, + assignmentsSavedAt: {}, + assignmentsErrors: {}, + assignmentsSavingId: null, + activeAssignmentGroup: null, + groupAssignmentDraft: {}, + groupAssignmentSavedAt: {}, + groupAssignmentErrors: {}, + groupAssignmentSavingKey: null, + + sampleDetailsExpanded: false, + currentDraft: null, drafts: [], searchDraftQuery: "", @@ -2409,12 +3689,27 @@ export default { project: null, studies: null, studiesToImport: [], + processingWarnings: [], studySpecies: null, inprogressStudies: [], + /** + * Tracks whether processing is taking longer than expected so we + * can surface a "Contact support" affordance inside the + * processing overlay. + */ + isProcessingStuck: false, + processingStuckTimer: null, + processingStuckThresholdMs: 90 * 1000, selectedStudy: null, - isEditingStudyName: false, studyNameDraft: "", + /** + * Map of study.id -> boolean indicating whether the dataset chips + * for that sample are expanded in the sidebar. Empty by default, + * so every sample's dataset list starts collapsed. + */ + expandedStudyIds: {}, + studyForm: this.$inertia.form({ _method: "POST", name: "", @@ -2435,11 +3730,13 @@ export default { chemicalInput: "", detectedFormat: "", isDragging: false, - percentage: 100, + percentage: 99.99, + /** 'pure' | 'mixture' | 'unknown' — unknown stores no pivot percentage */ + compositionSampleType: "pure", editor: null, // Chemical input tabs and CAS support - activeInputTab: "structure", // "structure" or "cas" + activeInputTab: "editor", // "structure" | "cas" | "editor" casInput: "", casLoading: false, casError: "", @@ -2493,9 +3790,77 @@ export default { showSummary: true, showLogsDialog: false, selectedDraftForLogs: null, + + needsReservedDoi: false, + doiCopySucceeded: false, + doiCopyResetTimer: null, + provisionalDoiLoading: false, + provisionalDoiError: null, + + /** Populated from parallel GET /info during mounted deep-link (step 2). */ + prefetchedStepTwoPayload: null, }; }, computed: { + /** + * Whether the full-screen processing overlay should be shown. + * Surfaced while we're on step 2 and at least one study is still + * being processed. + */ + showProcessingOverlay() { + return ( + Array.isArray(this.inprogressStudies) && + this.inprogressStudies.length > 0 && + this.currentStep && + this.currentStep.id == "2" + ); + }, + totalStudiesCount() { + return Array.isArray(this.studies) ? this.studies.length : 0; + }, + processedStudiesCount() { + const total = this.totalStudiesCount; + const inProgress = Array.isArray(this.inprogressStudies) + ? this.inprogressStudies.length + : 0; + return Math.max(0, total - inProgress); + }, + processingProgressPercent() { + const total = this.totalStudiesCount; + if (!total) { + return 0; + } + return Math.round((this.processedStudiesCount / total) * 100); + }, + contactSupportHref() { + const draftRef = this.currentDraft + ? ` (Draft #${this.currentDraft.id}${ + this.currentDraft.name + ? ` – ${this.currentDraft.name}` + : "" + })` + : ""; + const subject = encodeURIComponent( + `Submission processing stuck${draftRef}` + ); + return `mailto:info.nmrxiv@uni-jena.de?subject=${subject}`; + }, + /** + * Studies that actually have datasets — used to drive the + * "Expand all / Collapse all" toggle in the sidebar. + */ + studiesWithDatasets() { + return (this.studies || []).filter( + (s) => s && s.datasets && s.datasets.length > 0 + ); + }, + allStudyDatasetsExpanded() { + const eligible = this.studiesWithDatasets; + if (eligible.length === 0) { + return false; + } + return eligible.every((s) => Boolean(this.expandedStudyIds[s.id])); + }, filteredDrafts() { if (!this.searchDraftQuery) { return this.drafts; @@ -2527,6 +3892,23 @@ export default { currentStep() { return this.steps.filter((s) => s.status == "current")[0]; }, + reservedDoiPreview() { + if (!this.currentDraft?.id) { + return "https://doi.org/10.5281/nmrxiv.preview.pending"; + } + + return `https://doi.org/10.5281/nmrxiv.preview.draft-${this.currentDraft.id}`; + }, + reservedDoiDisplayUrl() { + if (this.project?.provisional_doi_url) { + return this.project.provisional_doi_url; + } + if (this.project?.provisional_doi) { + const host = "https://doi.org".replace(/\/$/, ""); + return `${host}/${this.project.provisional_doi}`; + } + return this.reservedDoiPreview; + }, primed() { return this.$page.props.auth.user?.primed; }, @@ -2550,25 +3932,153 @@ export default { }); return i; }, + /** Molecules listed for the currently selected sample (composition header badge). */ + selectedStudyMoleculeCount() { + return this.selectedStudy?.sample?.molecules?.length ?? 0; + }, + /** Pure sample mode only applies before any compound is listed for this sample */ + compositionPureSampleDisabled() { + const n = this.selectedStudy?.sample?.molecules?.length ?? 0; + return n > 0; + }, getMax() { - if (this.selectedStudy) { - let totalCount = 0; - this.selectedStudy.sample.molecules.forEach((mol) => { - totalCount += parseInt( - mol.pivot.percentage_composition - ? mol.pivot.percentage_composition - : 0 - ); - }); - const remaining = 100 - totalCount; - // Ensure max is always greater than min (0) to prevent slider errors - return Math.max(remaining, 1); - } else { + if (!this.selectedStudy) { return 100; } + let total = 0; + this.selectedStudy.sample.molecules.forEach((mol) => { + const v = parseFloat(mol.pivot?.percentage_composition); + total += Number.isFinite(v) ? v : 0; + }); + const remaining = 100 - total; + const epsilon = 1e-5; + if (remaining <= epsilon) { + return 0; + } + + return remaining; + }, + compositionSliderMax() { + const m = this.getMax; + + return m < 0 ? 0 : m; + }, + spectraImportStepCurrent() { + const m = this.loader.importMeta; + if (!m || !m.total) { + return 0; + } + return Math.min(m.completedCount + 1, m.total); + }, + spectraImportProgressPercent() { + const m = this.loader.importMeta; + if (!m || !m.total) { + return 0; + } + return Math.min( + 100, + Math.round(((m.completedCount + 1) / m.total) * 100) + ); + }, + /** + * Group the selected sample's datasets by nucleus channel(s) the way + * NMRium organises its experiment tabs: + * + * 1) homonuclear 1D, sorted by nucleus (1H, 13C, 19F, 31P, …), + * 2) homonuclear 2D (1H-1H, 13C-13C, …), + * 3) heteronuclear 2D (1H-13C, 1H-15N, …), + * 4) anything we couldn't classify (legacy "1D NMR" / null types). + * + * Within a group, datasets keep their natural order (numeric expno + * first, then alphabetical for jdx-style names). + */ + groupedAssignmentDatasets() { + const datasets = + (this.selectedStudy && this.selectedStudy.datasets) || []; + if (!datasets.length) { + return []; + } + + const groups = new Map(); + datasets.forEach((ds) => { + const type = (ds && ds.type) || ""; + const head = type.split(" - ")[0].trim(); + const key = head || "Other"; + if (!groups.has(key)) { + groups.set(key, { key, label: key, datasets: [] }); + } + groups.get(key).datasets.push(ds); + }); + + const nucleusRank = (nuc) => { + const order = ["1H", "13C", "19F", "31P", "15N", "29Si", "11B"]; + const idx = order.indexOf(nuc); + return idx === -1 ? order.length + nuc.charCodeAt(0) : idx; + }; + + const tier = (key) => { + if (key === "Other") { + return [9, 0, 0]; + } + const m = key.match(/^(.+?)\s*NMR$/); + if (!m) { + return [8, 0, 0]; + } + const channels = m[1].split("-"); + if (channels.length === 1) { + return [1, nucleusRank(channels[0]), 0]; + } + const a = nucleusRank(channels[0]); + const b = nucleusRank(channels[1]); + return [channels[0] === channels[1] ? 2 : 3, a, b]; + }; + + return Array.from(groups.values()).sort((x, y) => { + const tx = tier(x.key); + const ty = tier(y.key); + for (let i = 0; i < tx.length; i++) { + if (tx[i] !== ty[i]) { + return tx[i] - ty[i]; + } + } + return x.key.localeCompare(y.key); + }); }, }, watch: { + showProcessingOverlay: { + immediate: true, + handler(active) { + if (active) { + this.startProcessingStuckTimer(); + } else { + this.clearProcessingStuckTimer(); + this.isProcessingStuck = false; + } + }, + }, + processedStudiesCount(newCount, oldCount) { + if (this.showProcessingOverlay && newCount > (oldCount || 0)) { + this.startProcessingStuckTimer(); + } + }, + groupedAssignmentDatasets: { + immediate: true, + handler(groups) { + if (!Array.isArray(groups) || groups.length === 0) { + this.activeAssignmentGroup = null; + this.groupAssignmentDraft = {}; + return; + } + const stillExists = groups.some( + (g) => g.key === this.activeAssignmentGroup + ); + if (!stillExists) { + this.activeAssignmentGroup = groups[0].key; + } + this.seedGroupAssignmentDraft(groups); + }, + }, searchDraftQuery() { // Debounce the search query to avoid excessive pagination resets if (this.searchDebounceTimer) { @@ -2579,18 +4089,50 @@ export default { }, 300); // 300ms debounce delay }, getMax(newMax) { - // Ensure percentage doesn't exceed the new maximum + if (this.compositionSampleType === "pure") { + const capped = Math.min(99.99, newMax); + if (this.percentage !== capped) { + this.percentage = capped; + } + return; + } + if (this.compositionSampleType === "unknown") { + return; + } if (this.percentage > newMax) { this.percentage = newMax; } }, + compositionSampleType(mode) { + if (mode === "pure") { + this.percentage = Math.min(99.99, this.compositionSliderMax); + } else if (mode === "mixture") { + const max = this.compositionSliderMax; + if (this.percentage > max) { + this.percentage = max; + } + } + }, + compositionPureSampleDisabled(disabled) { + if (disabled && this.compositionSampleType === "pure") { + this.compositionSampleType = "mixture"; + } + }, + chemicalCompositionExpanded(isOpen) { + if (isOpen) { + this.ensureStructureSearchEditor(); + } + }, activeInputTab(newTab, oldTab) { - // Clear errors when switching tabs - if (newTab === "structure" && oldTab === "cas") { + if (oldTab === "cas") { this.casError = ""; - } else if (newTab === "cas" && oldTab === "structure") { + } + if (oldTab === "structure") { this.errorMessage = ""; } + if (newTab === "editor") { + this.ensureStructureSearchEditor(); + } }, }, mounted() { @@ -2599,6 +4141,11 @@ export default { this.step = params["step"] ? params["step"] : "1"; this.querySample = params["sample"] ? params["sample"] : null; + this.uploadUrlPopstateHandler = () => { + this.handleUploadUrlChange(); + }; + window.addEventListener("popstate", this.uploadUrlPopstateHandler); + this.fetchDrafts().then((response) => { this.drafts = response.data.drafts; this.sharedDrafts = response.data.sharedDrafts; @@ -2618,19 +4165,83 @@ export default { ) { selectedDraft = response.data.default; } - if (selectedDraft) { - this.selectDraft(selectedDraft); + const bootstrapDraft = (draft) => { + this.selectDraft(draft); this.loading = false; + }; + if (selectedDraft) { + if ( + this.step === "2" && + String(this.draft_id) === String(selectedDraft.id) + ) { + Promise.all([ + axios + .get( + "/dashboard/drafts/" + + this.draft_id + + "/show" + ) + .catch(() => null), + axios + .get( + "/dashboard/drafts/" + + this.draft_id + + "/info" + ) + .catch(() => null), + ]) + .then(([showRes, infoRes]) => { + let draftToUse = selectedDraft; + if (showRes?.data?.draft) { + draftToUse = showRes.data.draft; + } + const p = infoRes?.data?.project; + const studiesList = infoRes?.data?.studies; + if ( + p && + studiesList && + studiesList.length > 0 + ) { + this.prefetchedStepTwoPayload = + infoRes.data; + } + bootstrapDraft(draftToUse); + }) + .catch(() => { + bootstrapDraft(selectedDraft); + }); + } else { + bootstrapDraft(selectedDraft); + } } else { - this.fetchDraftById(this.draft_id).then( - (draftResponse) => { - this.selectDraft(draftResponse.data.draft); - this.loading = false; - }, - () => { + const parallel = + this.step === "2" + ? Promise.all([ + this.fetchDraftById(this.draft_id), + axios.get( + "/dashboard/drafts/" + + this.draft_id + + "/info" + ), + ]) + : this.fetchDraftById(this.draft_id).then( + (r) => [r, null] + ); + + parallel + .then(([draftResponse, infoRes]) => { + if ( + infoRes?.data?.project && + infoRes.data.studies?.length > 0 + ) { + this.prefetchedStepTwoPayload = + infoRes.data; + } + bootstrapDraft(draftResponse.data.draft); + }) + .catch(() => { this.loading = false; - } - ); + }); } } else { alert( @@ -2660,8 +4271,60 @@ export default { if (this.searchDebounceTimer) { clearTimeout(this.searchDebounceTimer); } + if (this.doiCopyResetTimer) { + clearTimeout(this.doiCopyResetTimer); + } + if (this.checkStudyStatusTimerId != null) { + clearTimeout(this.checkStudyStatusTimerId); + this.checkStudyStatusTimerId = null; + } + if (this.uploadUrlPopstateHandler) { + window.removeEventListener( + "popstate", + this.uploadUrlPopstateHandler + ); + this.uploadUrlPopstateHandler = null; + } + this.clearProcessingStuckTimer(); }, methods: { + startProcessingStuckTimer() { + this.clearProcessingStuckTimer(); + this.isProcessingStuck = false; + this.processingStuckTimer = setTimeout(() => { + this.isProcessingStuck = true; + }, this.processingStuckThresholdMs); + }, + clearProcessingStuckTimer() { + if (this.processingStuckTimer) { + clearTimeout(this.processingStuckTimer); + this.processingStuckTimer = null; + } + }, + focusDraftName() { + this.$nextTick(() => { + const editor = this.$refs.draftNameEditor; + if (!editor || typeof editor.focus !== "function") { + return; + } + editor.focus(); + }); + }, + async copyReservedDoiToClipboard() { + try { + await navigator.clipboard.writeText(this.reservedDoiDisplayUrl); + this.doiCopySucceeded = true; + if (this.doiCopyResetTimer) { + clearTimeout(this.doiCopyResetTimer); + } + this.doiCopyResetTimer = setTimeout(() => { + this.doiCopySucceeded = false; + this.doiCopyResetTimer = null; + }, 2500); + } catch { + this.doiCopySucceeded = false; + } + }, onScroll() { this.hideDownArrow = true; }, @@ -2669,6 +4332,69 @@ export default { this.selectedDraftForLogs = draft; this.showLogsDialog = true; }, + + /** + * Visual metadata for a processing-log level (icon component + color tokens). + * + * @param {string|null|undefined} rawLevel + * @returns {{ key: string, label: string, iconComponent: string, iconWrapperClass: string, iconClass: string, badgeClass: string }} + */ + logLevelMeta(rawLevel) { + const key = String(rawLevel || "info").toLowerCase(); + + const presets = { + error: { + label: "Error", + iconComponent: "ExclamationCircleIcon", + iconWrapperClass: + "bg-red-50 ring-1 ring-inset ring-red-200", + iconClass: "text-red-600", + badgeClass: + "bg-red-50 text-red-700 ring-1 ring-inset ring-red-200", + }, + warning: { + label: "Warning", + iconComponent: "InformationCircleIcon", + iconWrapperClass: + "bg-amber-50 ring-1 ring-inset ring-amber-200", + iconClass: "text-amber-600", + badgeClass: + "bg-amber-50 text-amber-800 ring-1 ring-inset ring-amber-200", + }, + warn: { + label: "Warning", + iconComponent: "InformationCircleIcon", + iconWrapperClass: + "bg-amber-50 ring-1 ring-inset ring-amber-200", + iconClass: "text-amber-600", + badgeClass: + "bg-amber-50 text-amber-800 ring-1 ring-inset ring-amber-200", + }, + info: { + label: "Info", + iconComponent: "InformationCircleIcon", + iconWrapperClass: + "bg-sky-50 ring-1 ring-inset ring-sky-200", + iconClass: "text-sky-600", + badgeClass: + "bg-sky-50 text-sky-700 ring-1 ring-inset ring-sky-200", + }, + success: { + label: "Success", + iconComponent: "CheckIcon", + iconWrapperClass: + "bg-emerald-50 ring-1 ring-inset ring-emerald-200", + iconClass: "text-emerald-600", + badgeClass: + "bg-emerald-50 text-emerald-700 ring-1 ring-inset ring-emerald-200", + }, + }; + + return { + key, + ...(presets[key] ?? presets.info), + }; + }, toggleCompoundDetails() { this.showCompoundDetails = !this.showCompoundDetails; localStorage.setItem( @@ -2676,54 +4402,65 @@ export default { this.showCompoundDetails ); }, - startEditingStudyName() { - if (!this.selectedStudy || this.busy) { + isStudyDatasetsExpanded(study) { + if (!study) { + return false; + } + return Boolean(this.expandedStudyIds[study.id]); + }, + toggleStudyDatasets(study) { + if (!study) { return; } - - this.studyNameDraft = this.selectedStudy.name || ""; - this.isEditingStudyName = true; - - this.$nextTick(() => { - const editor = this.$refs.studyNameEditor; - if (!editor) { - return; + this.expandedStudyIds = { + ...this.expandedStudyIds, + [study.id]: !this.expandedStudyIds[study.id], + }; + }, + expandAllStudyDatasets() { + const next = {}; + (this.studies || []).forEach((study) => { + if (study && study.datasets && study.datasets.length > 0) { + next[study.id] = true; } - - editor.focus(); - - const range = document.createRange(); - range.selectNodeContents(editor); - range.collapse(false); - - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); }); + this.expandedStudyIds = next; + }, + collapseAllStudyDatasets() { + this.expandedStudyIds = {}; }, cancelStudyNameEdit() { - this.isEditingStudyName = false; this.studyNameDraft = this.selectedStudy?.name || ""; + this.$refs.studyNameInput?.blur?.(); + }, + focusStudyName() { + if (!this.selectedStudy || this.busy) { + return; + } + const input = this.$refs.studyNameInput; + if (input && typeof input.focus === "function") { + input.focus(); + input.select?.(); + } }, saveStudyNameEdit() { - if (!this.isEditingStudyName || !this.selectedStudy) { + if (!this.selectedStudy || this.busy) { return; } - const editor = this.$refs.studyNameEditor; - const nextName = (editor?.innerText || this.studyNameDraft || "") + const nextName = (this.studyNameDraft || "") .trim() .replace(/\n+/g, " "); - this.isEditingStudyName = false; - if (!nextName) { this.studyNameDraft = this.selectedStudy.name || ""; + return; } if (nextName === this.selectedStudy.name) { this.studyNameDraft = nextName; + return; } @@ -2733,7 +4470,7 @@ export default { this.saveStudyDetails(); }, showSamplesSummary() { - this.spectraLoadingStatus = false; + this.resetLoader(); this.displaySamplesSummaryInfo = true; this.selectedStudy = null; this.setQueryStringParameter("sample", null); @@ -2745,30 +4482,103 @@ export default { fetchDraftById(draftId) { return axios.get("/dashboard/drafts/" + draftId + "/show"); }, - formatStatus(status) { - if (!status) return ""; - - const statusMap = { - received: "Received", - zip_processed: "ZIP Processed", - validated: "Validated", - processed: "Processed", - successful: "Successful", - published: "Published", - failed: "Failed", - processing: "Processing", - pending: "Pending", - job_dispatched: "Job Dispatched", - }; - - return ( - statusMap[status.toLowerCase()] || - status - .replace(/_/g, " ") - .replace(/\b\w/g, (l) => l.toUpperCase()) + syncNeedsReservedFromProject() { + this.needsReservedDoi = !!( + this.project && this.project.provisional_doi ); }, + hydrateProvisionalDoiFromDraftInfo() { + if (!this.currentDraft?.id) { + return Promise.resolve(); + } + return axios + .get("/dashboard/drafts/" + this.currentDraft.id + "/info") + .then((response) => { + const p = response.data.project; + if (!p) { + this.needsReservedDoi = false; + return; + } + if (this.project && this.project.id === p.id) { + this.project = { + ...this.project, + provisional_doi: p.provisional_doi ?? null, + provisional_doi_url: p.provisional_doi_url ?? null, + }; + } else { + this.project = p; + } + this.syncNeedsReservedFromProject(); + }) + .catch(() => {}); + }, + applyProvisionalPayloadToProject(payload) { + if (!payload?.provisional_doi) { + return; + } + this.project = { + ...(this.project || {}), + provisional_doi: payload.provisional_doi, + provisional_doi_url: payload.url ?? null, + }; + this.syncNeedsReservedFromProject(); + }, + stripProvisionalFromProject() { + if (!this.project) { + return; + } + const next = { ...this.project }; + delete next.provisional_doi; + next.provisional_doi_url = null; + this.project = next; + this.syncNeedsReservedFromProject(); + }, + async onReservedDoiSwitch(wantsOn) { + if (this.provisionalDoiLoading || !this.currentDraft?.id) { + return; + } + this.provisionalDoiError = null; + this.provisionalDoiLoading = true; + const prev = this.needsReservedDoi; + this.needsReservedDoi = wantsOn; + try { + if (wantsOn) { + const { data } = await axios.post( + "/dashboard/drafts/" + + this.currentDraft.id + + "/provisional-doi" + ); + this.applyProvisionalPayloadToProject(data); + await this.hydrateProvisionalDoiFromDraftInfo(); + } else { + await axios.delete( + "/dashboard/drafts/" + + this.currentDraft.id + + "/provisional-doi" + ); + this.stripProvisionalFromProject(); + } + } catch (e) { + this.needsReservedDoi = prev; + const msg = + e.response?.data?.message || + (Array.isArray(e.response?.data?.errors?.name) + ? e.response.data.errors.name[0] + : null) || + "Could not update the provisional DOI. Please try again."; + this.provisionalDoiError = msg; + } finally { + this.provisionalDoiLoading = false; + } + }, selectDraft(draft) { + this.needsReservedDoi = false; + this.doiCopySucceeded = false; + this.provisionalDoiError = null; + if (this.doiCopyResetTimer) { + clearTimeout(this.doiCopyResetTimer); + this.doiCopyResetTimer = null; + } this.currentDraft = draft; this.draftForm.name = this.currentDraft.name; this.draftForm.description = this.currentDraft.description; @@ -2790,6 +4600,7 @@ export default { this.loadSamplesSummary(); } else { this.selectStep(1); + this.hydrateProvisionalDoiFromDraftInfo(); } }); }, @@ -2827,7 +4638,8 @@ export default { } this.currentDraft.current_step = stepId; this.draftForm.errors = []; - axios + + return axios .put( "/dashboard/drafts/" + this.currentDraft.id, this.currentDraft @@ -2873,6 +4685,17 @@ export default { }); }, selectStep(id) { + if ( + id == 2 && + Array.isArray(this.processingWarnings) && + this.processingWarnings.length > 0 + ) { + // Nested sample folders detected during processing — the user + // must reorganise the upload before we let them advance, so + // route any step-2 attempt (button click, direct ?step=2 URL, + // back/forward nav) back to step 1 where the warning lives. + id = 1; + } this.steps.forEach((step) => { if (parseInt(step.id) < id) { step.status = "complete"; @@ -2900,19 +4723,52 @@ export default { } }); } else if (id == 2) { - this.updateDraft(null, 2); - this.$nextTick(function () { - this.setQueryStringParameter( - "draft_id", - this.currentDraft.id - ); - this.setQueryStringParameter("step", 2); - this.step = "2"; - this.fetchValidations(); - this.updateAutoImportList(); + this.$nextTick(() => { + const putPromise = this.updateDraft(null, 2); + const validationPromise = + this.project && this.project.id + ? this.fetchValidations() + : Promise.resolve(); + Promise.all([putPromise, validationPromise]).then(() => { + this.setQueryStringParameter( + "draft_id", + this.currentDraft.id + ); + this.setQueryStringParameter("step", 2); + this.step = "2"; + this.updateAutoImportList(); + }); }); } }, + /** + * Re-sync local state with the current URL after a browser nav + * (back/forward) or a manual address-bar edit. When the URL no + * longer carries a `sample`, drop the open sample and return to + * the samples summary view instead of leaving stale state behind. + */ + handleUploadUrlChange() { + const params = new URLSearchParams(window.location.search); + let nextStep = params.get("step") || "1"; + const nextSample = params.get("sample"); + + if ( + nextStep === "2" && + Array.isArray(this.processingWarnings) && + this.processingWarnings.length > 0 + ) { + nextStep = "1"; + this.setQueryStringParameter("step", 1); + this.setQueryStringParameter("sample", null); + } + + this.step = nextStep; + this.querySample = nextSample || null; + + if (nextStep === "2" && !nextSample && this.selectedStudy) { + this.showSamplesSummary(); + } + }, setQueryStringParameter(name, value) { const params = new URLSearchParams(window.location.search); if (value) { @@ -2945,6 +4801,7 @@ export default { }, process() { this.errorMessage = null; + this.filesErrorMessage = null; let foldersExist = false; this.$refs.fsbRef.file.children.forEach((fso) => { if (fso.has_children) { @@ -2953,7 +4810,7 @@ export default { }); if (foldersExist) { this.hasStudies(this.$refs.fsbRef.file); - this.loadSamplesSummary(); + this.loadSamplesSummary({ forceProcess: true }); } if ( this.$refs.fsbRef.file && @@ -2985,90 +4842,206 @@ export default { } } }, - loadSamplesSummary() { - this.fetchProjectDetails().then( - (response) => { + loadSamplesSummary(options = {}) { + const { forceProcess = false } = options; + + const handleSuccess = (response) => { + this.loadingStep = false; + this.project = response.data.project; + this.studies = response.data.studies; + const nextWarnings = Array.isArray(response.data.warnings) + ? response.data.warnings + : []; + this.processingWarnings = nextWarnings; + this.syncNeedsReservedFromProject(); + if (this.project && this.studies && this.studies.length > 0) { this.loadingStep = false; - this.project = response.data.project; - this.studies = response.data.studies; - if ( - this.project && - this.studies && - this.studies.length > 0 - ) { - this.loadingStep = false; - this.selectStep(2); - this.$nextTick(() => { - if (this.querySample) { - let i = 0; - this.studies.forEach((s) => { - if (s.id == this.querySample) { - this.selectStudy(s, i); - } - i = i + 1; - }); - } else { - this.showSamplesSummary(); - } - }); - this.inprogressStudies = this.studies.filter( - (study) => study.internal_status != "complete" - ); - if (this.inprogressStudies.length > 0) { - this.checkStudyStatus(); - } - } else { - if (this.studies?.length == 0) { - this.loadingStep = false; - } + if (nextWarnings.length > 0) { + // Keep the user on step 1 until the nested sample + // folder issue is resolved. Step 2 cannot be entered + // because ArchiveStudy / NMRium import rely on a + // single sample folder per study. + this.selectStep(1); + return; } - }, - (error) => { - this.loadingStep = false; - Object.keys(error.response.data.errors).forEach((key) => { - error.response.data.errors[key] = - error.response.data.errors[key].join(", "); - }); - this.draftForm.errors = error.response.data.errors; - this.draftForm.error_message = error.response.data.message; - this.draftForm.hasErrors = true; - Object.keys(this.draftForm.errors).forEach((key) => { - if (!this.errorMessage) { - this.errorMessage = - "" + - key + - ": " + - this.draftForm.errors[key] + - "
"; + this.selectStep(2); + this.$nextTick(() => { + if (this.querySample) { + let i = 0; + this.studies.forEach((s) => { + if (s.id == this.querySample) { + this.selectStudy(s, i); + } + i = i + 1; + }); } else { - this.errorMessage += - "" + - key + - ": " + - this.draftForm.errors[key] + - "
"; + this.showSamplesSummary(); } }); - } - ); - }, - checkStudyStatus() { - setTimeout(() => { - this.fetchProjectDetails().then((response) => { - this.loadingStep = false; - this.project = response.data.project; - this.studies = response.data.studies; - this.fetchValidations(); - this.spectraLoadingStatus = false; this.inprogressStudies = this.studies.filter( (study) => study.internal_status != "complete" ); if (this.inprogressStudies.length > 0) { this.checkStudyStatus(); + } else if ( + this.studies.some((study) => !study.has_nmrium) + ) { + const missingDownloadUrl = this.studies.some( + (s) => !s.has_nmrium && !s.download_url + ); + if (missingDownloadUrl) { + this.fetchProjectDetails() + .then((res) => { + this.project = res.data.project; + this.studies = res.data.studies; + this.syncNeedsReservedFromProject(); + }) + .finally(() => { + this.autoImport(); + }); + } else { + this.autoImport(); + } + } + } else { + if (this.studies?.length == 0) { + this.loadingStep = false; + } + } + }; + + const handleError = (error) => { + this.loadingStep = false; + if (!error.response?.data?.errors) { + return; + } + Object.keys(error.response.data.errors).forEach((key) => { + error.response.data.errors[key] = + error.response.data.errors[key].join(", "); + }); + this.draftForm.errors = error.response.data.errors; + this.draftForm.error_message = error.response.data.message; + this.draftForm.hasErrors = true; + Object.keys(this.draftForm.errors).forEach((key) => { + if (!this.errorMessage) { + this.errorMessage = + "" + + key + + ": " + + this.draftForm.errors[key] + + "
"; } else { - this.autoImport(); + this.errorMessage += + "" + + key + + ": " + + this.draftForm.errors[key] + + "
"; } }); + }; + + if (!forceProcess && this.prefetchedStepTwoPayload) { + const payload = this.prefetchedStepTwoPayload; + this.prefetchedStepTwoPayload = null; + const p = payload.project; + const studiesList = payload.studies; + if (p && studiesList && studiesList.length > 0) { + handleSuccess({ + data: { + project: p, + studies: studiesList, + }, + }); + + return Promise.resolve(); + } + } + + if (forceProcess) { + return this.fetchProjectDetails() + .then(handleSuccess) + .catch(handleError); + } + + return axios + .get("/dashboard/drafts/" + this.currentDraft.id + "/info") + .then((infoRes) => { + const p = infoRes.data.project; + const studiesList = infoRes.data.studies; + + if (!p || !studiesList || studiesList.length === 0) { + return this.fetchProjectDetails().then(handleSuccess); + } + + return handleSuccess({ + data: { + project: p, + studies: studiesList, + }, + }); + }) + .catch(() => + this.fetchProjectDetails() + .then(handleSuccess) + .catch(handleError) + ); + }, + fetchDraftStudiesStatus() { + return axios.get( + "/dashboard/drafts/" + this.currentDraft.id + "/status" + ); + }, + checkStudyStatus() { + if (this.checkStudyStatusTimerId != null) { + clearTimeout(this.checkStudyStatusTimerId); + } + this.checkStudyStatusTimerId = window.setTimeout(() => { + this.checkStudyStatusTimerId = null; + if (!this.currentDraft?.id || !this.studies) { + return; + } + this.fetchDraftStudiesStatus() + .then((response) => { + this.loadingStep = false; + const rows = response.data.studies || []; + const byId = {}; + rows.forEach((s) => { + byId[s.id] = s; + }); + this.studies.forEach((study) => { + const st = byId[study.id]; + if (st) { + study.internal_status = st.internal_status; + study.has_nmrium = st.has_nmrium; + } + }); + this.syncNeedsReservedFromProject(); + if (this.project?.id) { + this.fetchValidations(); + } + this.resetLoader(); + this.inprogressStudies = this.studies.filter( + (study) => study.internal_status != "complete" + ); + if (this.inprogressStudies.length > 0) { + this.checkStudyStatus(); + } else { + this.fetchProjectDetails() + .then((res) => { + this.project = res.data.project; + this.studies = res.data.studies; + this.syncNeedsReservedFromProject(); + }) + .finally(() => { + this.autoImport(); + }); + } + }) + .catch(() => { + this.loadingStep = false; + this.resetLoader(); + }); }, 30000); }, editData(e) { @@ -3090,17 +5063,92 @@ export default { }); } }, + /** + * Create the OpenChemLib SVG editor only when the composition panel is + * expanded and the Draw tab is active, so the host element has layout size. + * + * @param {() => void} [onReady] + */ + ensureStructureSearchEditor(onReady) { + if ( + !this.chemicalCompositionExpanded || + this.activeInputTab !== "editor" + ) { + if (typeof onReady === "function") { + onReady(); + } + return; + } + const run = (retriesLeft) => { + this.$nextTick(() => { + requestAnimationFrame(() => { + const el = document.getElementById( + "structureSearchEditor" + ); + if (!el || !el.isConnected) { + if (retriesLeft > 0) { + run(retriesLeft - 1); + } else if (typeof onReady === "function") { + onReady(); + } + return; + } + const { width, height } = el.getBoundingClientRect(); + if (width < 4 || height < 4) { + if (retriesLeft > 0) { + run(retriesLeft - 1); + } else if (typeof onReady === "function") { + onReady(); + } + return; + } + if (!this.editor) { + this.editor = createStructureEditor( + "structureSearchEditor" + ); + if ( + this.chemicalInput && + this.chemicalInput.trim() + ) { + try { + const format = this.detectFormat( + this.chemicalInput + ); + if (format === "SMILES") { + this.editor.setSmiles( + this.chemicalInput.trim() + ); + } else if (format === "MOL/SDF") { + this.editor.setMolFile( + this.chemicalInput + ); + } + } catch { + // Input may be invalid; user can fix in Paste tab + } + } + } + if (typeof onReady === "function") { + onReady(); + } + }); + }); + }; + run(20); + }, selectStudy(study, index, datasetIndex = null) { if (!this.busy) { if (study.internal_status == "complete") { this.selectedStudyIndex = index; this.selectedStudy = study; + this.chemicalCompositionExpanded = false; + this.activeInputTab = "editor"; this.setQueryStringParameter("sample", study.id); - this.isEditingStudyName = false; this.studyNameDraft = this.selectedStudy.name; this.studyForm.name = this.selectedStudy.name; - this.studyForm.description = - this.selectedStudy.description.replace(/<\/br>/g, " "); + this.studyForm.description = ( + this.selectedStudy.description ?? "" + ).replace(/<\/br>/g, " "); this.studyForm.species = JSON.parse( this.selectedStudy.species ) @@ -3113,28 +5161,27 @@ export default { }); }); this.studyForm.tags = tags; - let editorState = JSON.parse( - JSON.stringify(this.displaySamplesSummaryInfo) - ); if (this.displaySamplesSummaryInfo) { this.displaySamplesSummaryInfo = false; } + this.editor = null; + this.compositionSampleType = + this.selectedStudy.sample.molecules.length > 0 + ? "mixture" + : "pure"; + this.seedAssignmentsDraft(this.selectedStudy); this.$nextTick(() => { - if (editorState) { - if (this.$refs.spectraEditorREF) { - this.$refs.spectraEditorREF.registerEvents(); - } + const el = document.getElementById( + "structureSearchEditor" + ); + if (el) { + el.innerHTML = ""; } - this.editor = OCL.StructureEditor.createSVGEditor( - "structureSearchEditor", - 1 + this.percentage = Math.min( + 99.99, + this.compositionSliderMax ); }); - if (this.studyForm.description == "") { - if (study.has_nmrium) { - this.autoGenerateDescription(); - } - } if ( this.selectedStudy && this.selectedStudy.sample.molecules.length == 0 @@ -3168,6 +5215,234 @@ export default { }); }); }, + /** + * Pre-fill the per-spectrum textareas from each dataset's saved + * `assignments.acs` (set by the dashboard.datasets.assignments.update + * endpoint). Called every time the user navigates between samples so + * the editor reflects what's persisted, never stale data from the + * previously selected study. + */ + seedAssignmentsDraft(study) { + const next = {}; + const datasets = (study && study.datasets) || []; + datasets.forEach((ds) => { + next[ds.id] = (ds.assignments && ds.assignments.acs) || ""; + }); + this.assignmentsDraft = next; + this.assignmentsErrors = {}; + this.assignmentsSavedAt = {}; + }, + /** + * Returns true when the dataset has any user-saved assignment + * content. Mirrors `Dataset::hasAssignments()` on the backend so + * the "saved" / "empty" pill in the UI matches what the validator + * sees. + */ + datasetHasAssignments(ds) { + const a = ds && ds.assignments; + if (!a || typeof a !== "object") { + return false; + } + if (typeof a.acs === "string" && a.acs.trim() !== "") { + return true; + } + if (Array.isArray(a.atom_peaks) && a.atom_peaks.length > 0) { + return true; + } + return false; + }, + /** + * Persist the textarea content for one spectrum. Empty content + * clears the field on the server (validator will then mark the + * dataset as missing assignments). Refreshes validations so the + * sample-level badge updates without a full page reload. + */ + /** + * Seed the per-nucleus-group textarea drafts from any existing + * `assignments.acs` saved on the contained datasets. NMR-wise, all + * datasets observing the same nucleus channel (e.g. a 13C and its + * DEPT, or a COSY and a NOESY both detecting 1H) share the same + * chemical-shift assignment list — so we collapse them to a single + * input and use the first non-empty value as the seed. Whichever + * dataset the user previously saved into wins; subsequent saves + * normalise the rest of the group to the same string. + */ + seedGroupAssignmentDraft(groups) { + const next = {}; + (groups || []).forEach((group) => { + let acs = ""; + for (const ds of group.datasets) { + const saved = + (ds && ds.assignments && ds.assignments.acs) || ""; + if (saved.trim() !== "") { + acs = saved; + break; + } + } + next[group.key] = acs; + }); + this.groupAssignmentDraft = next; + this.groupAssignmentErrors = {}; + this.groupAssignmentSavedAt = {}; + }, + /** + * True when any dataset in the nucleus-channel group has saved + * assignment content. Drives the green status dot in the tab strip + * and the per-card indicator. + */ + groupHasAssignments(group) { + if (!group || !Array.isArray(group.datasets)) { + return false; + } + return group.datasets.some((ds) => this.datasetHasAssignments(ds)); + }, + /** + * Autosave-on-blur for the shared group textarea. Skips the request + * when nothing changed from what every dataset already has saved. + */ + autosaveAssignmentsForGroup(group) { + if ( + !group || + !Array.isArray(group.datasets) || + !group.datasets.length + ) { + return; + } + const key = group.key; + const next = (this.groupAssignmentDraft[key] || "").trim(); + const allMatch = group.datasets.every((ds) => { + const saved = ( + (ds.assignments && ds.assignments.acs) || + "" + ).trim(); + return saved === next; + }); + if (allMatch) { + return; + } + return this.saveAssignmentsForGroup(group); + }, + /** + * Persist the shared assignment string to every dataset in a nucleus + * group via parallel PUTs. We copy the same payload to each row so + * the validator (which inspects per-dataset `assignments`) sees the + * group as fully assigned. + */ + saveAssignmentsForGroup(group) { + if ( + !group || + !Array.isArray(group.datasets) || + !group.datasets.length + ) { + return; + } + const key = group.key; + const acs = (this.groupAssignmentDraft[key] || "").trim(); + this.groupAssignmentSavingKey = key; + this.groupAssignmentErrors = { + ...this.groupAssignmentErrors, + [key]: null, + }; + + const requests = group.datasets.map((ds) => + axios + .put("/dashboard/datasets/" + ds.id + "/assignments", { + acs, + source: "manual", + }) + .then((response) => { + const saved = + response.data && response.data.assignments; + ds.assignments = saved || null; + }) + ); + + return Promise.all(requests) + .then(() => { + this.groupAssignmentSavedAt = { + ...this.groupAssignmentSavedAt, + [key]: new Date().toLocaleTimeString(), + }; + return this.fetchValidations(); + }) + .catch((err) => { + const msg = + (err.response && + (err.response.data?.message || + err.response.statusText)) || + err.message || + "Failed to save"; + this.groupAssignmentErrors = { + ...this.groupAssignmentErrors, + [key]: msg, + }; + }) + .finally(() => { + this.groupAssignmentSavingKey = null; + }); + }, + /** + * Autosave-on-blur wrapper around `saveAssignmentsForDataset`. Skips + * the network round-trip when the textarea content is unchanged from + * what is already persisted on the dataset, so tabbing through the + * cards does not generate a flood of identical writes. + */ + autosaveAssignmentsForDataset(dataset) { + if (!dataset || !dataset.id) { + return; + } + const id = dataset.id; + const next = (this.assignmentsDraft[id] || "").trim(); + const previous = ( + (dataset.assignments && dataset.assignments.acs) || + "" + ).trim(); + if (next === previous) { + return; + } + return this.saveAssignmentsForDataset(dataset); + }, + saveAssignmentsForDataset(dataset) { + if (!dataset || !dataset.id) { + return; + } + const id = dataset.id; + const acs = (this.assignmentsDraft[id] || "").trim(); + this.assignmentsSavingId = id; + this.assignmentsErrors = { + ...this.assignmentsErrors, + [id]: null, + }; + return axios + .put("/dashboard/datasets/" + id + "/assignments", { + acs, + source: "manual", + }) + .then((response) => { + const saved = response.data && response.data.assignments; + dataset.assignments = saved || null; + this.assignmentsSavedAt = { + ...this.assignmentsSavedAt, + [id]: new Date().toLocaleTimeString(), + }; + return this.fetchValidations(); + }) + .catch((err) => { + const msg = + (err.response && + (err.response.data?.message || + err.response.statusText)) || + err.message || + "Failed to save"; + this.assignmentsErrors = { + ...this.assignmentsErrors, + [id]: msg, + }; + }) + .finally(() => { + this.assignmentsSavingId = null; + }); + }, updateAutoImportList() { this.studiesToImport = []; this.studies.forEach((study) => { @@ -3180,9 +5455,52 @@ export default { } }); }, + resetLoader() { + if (this.loader && this.loader.kind === "idle") { + return; + } + this.loader = { + kind: "idle", + importMeta: null, + bannerMessage: null, + iframe: null, + }; + }, spectraLoading(e) { - this.spectraLoadingStatus = e.status; - this.spectraLoadingMessage = e.message; + if (!e || !e.status) { + this.resetLoader(); + + return; + } + if (e.importMeta) { + this.loader = { + kind: "import", + importMeta: e.importMeta, + bannerMessage: null, + iframe: null, + }; + } else if (e.viewerMeta) { + this.loader = { + kind: "iframe", + importMeta: null, + bannerMessage: null, + iframe: e.viewerMeta, + }; + } else if (e.preparingImport) { + this.loader = { + kind: "import", + importMeta: null, + bannerMessage: "Preparing import…", + iframe: null, + }; + } else if (e.message != null && e.message !== "") { + this.loader = { + kind: "import", + importMeta: null, + bannerMessage: e.message, + iframe: null, + }; + } }, updateTags(e) { this.busy = true; @@ -3194,22 +5512,23 @@ export default { }, saveStudyDetails() { this.busy = true; - this.spectraLoading({ - status: true, - message: "Saving updates", - }); + this.studySaving = true; this.loadingStep = true; axios .put( "/dashboard/studies/" + this.selectedStudy.id + "/update", this.studyForm ) + .then((response) => { + if (response) { + this.busy = false; + this.studies[this.selectedStudyIndex] = response.data; + this.selectedStudy = response.data; + this.studyNameDraft = response.data.name; + this.studyForm.hasErrors = false; + } + }) .catch((error) => { - this.loadingStep = false; - this.spectraLoading({ - status: false, - message: "Update save error", - }); this.busy = false; Object.keys(error.response.data.errors).forEach((key) => { error.response.data.errors[key] = @@ -3219,19 +5538,9 @@ export default { this.studyForm.error_message = error.response.data.message; this.studyForm.hasErrors = true; }) - .then((response) => { - if (response) { - this.busy = false; - this.spectraLoading({ - status: false, - message: "Updates saved", - }); - this.loadingStep = false; - this.studies[this.selectedStudyIndex] = response.data; - this.selectedStudy = response.data; - this.studyNameDraft = response.data.name; - this.studyForm.hasErrors = false; - } + .finally(() => { + this.studySaving = false; + this.loadingStep = false; }); }, deleteMolecule(mol) { @@ -3246,42 +5555,72 @@ export default { this.selectedStudy.sample.molecules = res.data; this.smiles = ""; this.percentage = 0; - this.editor.setSmiles(""); + this.compositionSampleType = + res.data.length > 0 ? "mixture" : "pure"; + this.$nextTick(() => { + this.percentage = Math.min( + 99.99, + this.compositionSliderMax + ); + }); + if (this.editor) { + this.editor.setSmiles(""); + } }); }, editMolecule(mol) { - this.editor.setSmiles(mol.canonical_smiles); - this.percentage = parseInt(mol.pivot.percentage_composition); - axios - .delete( - "/dashboard/studies/" + - this.selectedStudy.id + - "/molecule/" + - mol.id - ) - .then((res) => { - this.selectedStudy.sample.molecules = res.data; - }); + this.activeInputTab = "editor"; + const raw = mol.pivot?.percentage_composition; + if (this.isCompositionPercentUnknown(raw)) { + this.compositionSampleType = "unknown"; + } else { + this.compositionSampleType = "mixture"; + this.percentage = + parseFloat(mol.pivot.percentage_composition) || 0; + } + this.ensureStructureSearchEditor(() => { + if (this.editor) { + this.editor.setSmiles(mol.canonical_smiles); + } + axios + .delete( + "/dashboard/studies/" + + this.selectedStudy.id + + "/molecule/" + + mol.id + ) + .then((res) => { + this.selectedStudy.sample.molecules = res.data; + }); + }); }, saveMolecule(mol, study) { if (!study) { study = this.selectedStudy; } if (!mol) { - let mol = this.editor.getMolFile(); - this.standardizeMolecules(mol).then((res) => { - this.associateMoleculeToStudy(res.data, study); + this.ensureStructureSearchEditor(() => { + if (!this.editor) { + return; + } + const molfile = this.editor.getMolFile(); + this.standardizeMolecules(molfile).then((res) => { + this.associateMoleculeToStudy(res.data, study); + }); }); - } else { - this.associateMoleculeToStudy(mol, study); + return; } + this.associateMoleculeToStudy(mol, study); }, associateMoleculeToStudy(mol, study) { axios .post("/dashboard/studies/" + study.id + "/molecule", { InChI: mol.inchi, InChIKey: mol.inchikey, - percentage: this.percentage, + percentage: + this.compositionSampleType === "unknown" + ? null + : this.percentage, mol: mol.standardized_mol, canonical_smiles: mol.canonical_smiles, }) @@ -3289,26 +5628,93 @@ export default { study.sample.molecules = res.data; this.chemicalInput = ""; this.detectedFormat = ""; - this.percentage = this.getMax; - this.editor.setSmiles(""); + this.compositionSampleType = + res.data.length > 0 ? "mixture" : "pure"; + this.$nextTick(() => { + this.percentage = Math.min( + 99.99, + this.compositionSliderMax + ); + }); + if (this.editor) { + this.editor.setSmiles(""); + } }); }, standardizeMolecules(mol) { return axios.post(this.chemistryStandardizeUrl, mol); }, + /** + * Normalize the NMRKit `/latest/spectra/parse/url` payload into the + * legacy NMRium shape that our SpectraEditor + embedded NMRium iframe + * understand. The new endpoint returns `data.sources` (plural array) + * and `spectrum.selector`, while NMRium expects `data.source` + * (singular with merged baseURL/relativePath entries) and + * `spectrum.sourceSelector`. Transform in-place. + */ + normalizeNmriumPayload(parsedSpectra) { + if (!parsedSpectra || typeof parsedSpectra !== "object") { + return; + } + + if ( + !parsedSpectra.source && + Array.isArray(parsedSpectra.sources) && + parsedSpectra.sources.length > 0 + ) { + const mergedEntries = []; + parsedSpectra.sources.forEach((src) => { + const baseURL = src?.baseURL ?? ""; + const entries = Array.isArray(src?.entries) + ? src.entries + : []; + entries.forEach((entry) => { + mergedEntries.push({ + baseURL, + relativePath: entry?.relativePath ?? "", + }); + }); + }); + if (mergedEntries.length > 0) { + parsedSpectra.source = { entries: mergedEntries }; + } + } + + if (Array.isArray(parsedSpectra.spectra)) { + parsedSpectra.spectra.forEach((spec) => { + if (!spec || typeof spec !== "object") { + return; + } + if (!spec.sourceSelector && spec.selector) { + spec.sourceSelector = spec.selector; + } + }); + } + }, autoImportMolecularData(study) { + const baseUrl = String( + this.$page.props.url ?? this.url ?? "" + ).replace(/\/+$/, ""); + if (!baseUrl) { + console.warn( + "[autoImportMolecularData] skipping study " + + study.id + + " - no public base URL" + ); + + return; + } axios .get("/dashboard/studies/" + study.id + "/annotations") .then((response) => { let nmredataFiles = response.data; nmredataFiles.forEach((file) => { - // get file content let username = this.$page.props.team && this.$page.props.team.owner ? this.$page.props.team.owner.username : this.project.owner.username; let url = - this.url + + baseUrl + "/" + username + "/studies" + @@ -3395,7 +5801,10 @@ export default { }); }, autoImport() { - this.spectraLoadingStatus = true; + this.spectraLoading({ + status: true, + preparingImport: true, + }); this.updateAutoImportList(); if (this.studiesToImport.length > 0) { this.fetchNMRium(); @@ -3403,7 +5812,57 @@ export default { console.log( "Nothing to import: NMRium spectra JSON already exists" ); - this.spectraLoadingStatus = false; + this.resetLoader(); + } + }, + /** + * After a single study finishes auto-importing its NMRium JSON, + * propagate has_nmrium=true to local state so badges/buttons react, + * and trigger a SpectraEditor reload if this study is on screen. + */ + markStudyImported(study) { + if (!study) { + return; + } + study.has_nmrium = true; + const localIdx = this.studies.findIndex((s) => s.id === study.id); + if (localIdx >= 0 && this.studies[localIdx] !== study) { + this.studies[localIdx].has_nmrium = true; + } + if (this.selectedStudy && this.selectedStudy.id === study.id) { + this.selectedStudy.has_nmrium = true; + this.refreshSpectraEditor(); + } + }, + /** + * After fetchProjectDetails replaces this.studies with fresh objects, + * re-bind selectedStudy/selectedStudyIndex by id so the right pane, + * sidebar (compounds), and validation badges read off the new objects. + */ + rebindSelectedStudyAfterImport() { + if (!this.selectedStudy || !Array.isArray(this.studies)) { + return; + } + const idx = this.studies.findIndex( + (s) => s.id === this.selectedStudy.id + ); + if (idx === -1) { + return; + } + this.selectedStudy = this.studies[idx]; + this.selectedStudyIndex = idx; + this.refreshSpectraEditor(); + }, + /** + * Tell the inlined SpectraEditor to invalidate its NMRium cache and + * reload for the currently bound study (its watcher bails on same id). + */ + refreshSpectraEditor() { + const ref = this.$refs.spectraEditorREF; + if (ref && typeof ref.reload === "function") { + this.$nextTick(() => { + ref.reload(); + }); } }, fetchNMRium() { @@ -3412,17 +5871,37 @@ export default { ? this.importPendingSamples[0] : null; if (studyDetails) { - this.spectraLoadingStatus = true; + const completedCount = + this.studies.length - this.importPendingSamples.length; + const sampleLabel = + (studyDetails.study.name && + String(studyDetails.study.name).trim()) || + studyDetails.study.slug || + "Sample"; + + this.spectraLoading({ + status: true, + importMeta: { + completedCount, + total: this.studies.length, + sampleLabel, + }, + }); + + const baseUrl = String( + this.$page.props.url ?? this.url ?? "" + ).replace(/\/+$/, ""); + let url = null; if (studyDetails.study.download_url) { url = studyDetails.study.download_url; - } else { - let username = this.$page.props.team.owner + } else if (baseUrl) { + let username = this.$page.props.team?.owner ? this.$page.props.team.owner.username : this.project.owner.username; url = - this.url + + baseUrl + "/" + username + "/datasets/" + @@ -3430,33 +5909,61 @@ export default { "/" + studyDetails.study.slug; } - this.spectraLoadingMessage = - "
Pending: " + - (this.studies.length - this.importPendingSamples.length) + - "/" + - this.studies.length + - "
Processing Spectra from Sample: " + - studyDetails.study.slug + - "
Spectra URL: " + - url; - - url = encodeURIComponent(url); + + if (!url) { + console.warn( + "[autoImport] skipping study " + + studyDetails.study.id + + " - no download_url and no public base URL" + ); + let pending = this.studiesToImport.filter( + (f) => f.study.id == studyDetails.study.id + )[0]; + if (pending) { + pending.status = true; + } + this.loadingStep = false; + this.fetchNMRium(); + + return; + } + + let safeUrl = url; + try { + safeUrl = encodeURI(decodeURI(url)); + } catch (e) { + safeUrl = encodeURI(url); + } + + const spectraParserUrl = + this.$page.props.spectraParserUrl || + "https://dev.nmrkit.nmrxiv.org/latest/spectra/parse/url"; axios - .post("https://nodejs.nmrxiv.org/spectra-parser", { - urls: [url], - snapshot: false, + .post(spectraParserUrl, { + url: safeUrl, + capture_snapshot: false, }) .then((response) => { - let parsedSpectra = response.data.data; - parsedSpectra.spectra.forEach((spec) => { - delete spec["data"]; - delete spec["meta"]; - delete spec["originalData"]; - delete spec["originalInfo"]; - }); - let version = parsedSpectra.version; + const nmriumState = + response.data?.nmriumState ?? response.data ?? {}; + let parsedSpectra = nmriumState.data ?? {}; + this.normalizeNmriumPayload(parsedSpectra); + if (Array.isArray(parsedSpectra.spectra)) { + parsedSpectra.spectra.forEach((spec) => { + delete spec["data"]; + delete spec["meta"]; + delete spec["originalData"]; + delete spec["originalInfo"]; + }); + } + const version = + nmriumState.version ?? + parsedSpectra.version ?? + null; delete parsedSpectra["version"]; - let molecules = parsedSpectra.molecules; + const molecules = Array.isArray(parsedSpectra.molecules) + ? parsedSpectra.molecules + : []; if (molecules.length > 0) { molecules.forEach((mol) => { this.standardizeMolecules(mol.molfile).then( @@ -3469,7 +5976,7 @@ export default { ); }); } - axios + return axios .post( "/dashboard/studies/" + studyDetails.study.id + @@ -3480,25 +5987,41 @@ export default { } ) .then(() => { - this.loadingStep = false; this.studiesToImport.filter( (f) => f.study.id == studyDetails.study.id )[0].status = true; + this.markStudyImported(studyDetails.study); this.autoImportMolecularData( studyDetails.study ); this.fetchNMRium(); }) .catch(() => { - this.loadingStep = false; this.studiesToImport.filter( (f) => f.study.id == studyDetails.study.id )[0].status = true; this.fetchNMRium(); + }) + .finally(() => { + this.loadingStep = false; }); }) - .catch(() => { - this.loadingStep = false; + .catch((err) => { + const status = err?.response?.status; + const detail = + err?.response?.data?.detail ?? err?.response?.data; + console.warn( + "[autoImport] spectra-parser failed for study " + + studyDetails.study.id + + " (HTTP " + + status + + "): " + + (typeof detail === "string" + ? detail + : JSON.stringify(detail)) + + " | url=" + + safeUrl + ); let study = this.studiesToImport.filter( (f) => f.study.id == studyDetails.study.id )[0]; @@ -3506,15 +6029,21 @@ export default { study.status = true; this.fetchNMRium(); } + this.loadingStep = false; }); } else { - this.fetchProjectDetails().then((response) => { - this.loadingStep = false; - this.project = response.data.project; - this.studies = response.data.studies; - this.fetchValidations(); - this.spectraLoadingStatus = false; - }); + this.fetchProjectDetails() + .then((response) => { + this.project = response.data.project; + this.studies = response.data.studies; + this.syncNeedsReservedFromProject(); + this.rebindSelectedStudyAfterImport(); + return this.fetchValidations(); + }) + .finally(() => { + this.loadingStep = false; + this.resetLoader(); + }); } }, updateSpecies(species) { @@ -3542,16 +6071,29 @@ export default { try { if (format === "SMILES") { OCL.Molecule.fromSmiles(this.chemicalInput.trim()); - this.editor.setSmiles(this.chemicalInput.trim()); } else if (format === "MOL/SDF") { OCL.Molecule.fromMolfile(this.chemicalInput); - this.editor.setMolFile(this.chemicalInput); } else { this.errorMessage = "Unable to detect chemical format. Please check your input."; return; } this.detectedFormat = format; + } catch (e) { + this.errorMessage = `Invalid ${format} format. Please check your input.`; + return; + } + + if (!this.editor) { + return; + } + + try { + if (format === "SMILES") { + this.editor.setSmiles(this.chemicalInput.trim()); + } else if (format === "MOL/SDF") { + this.editor.setMolFile(this.chemicalInput); + } } catch (e) { this.errorMessage = `Invalid ${format} format. Please check your input.`; } @@ -3685,13 +6227,13 @@ export default { this.chemicalInput = smiles; this.detectedFormat = "SMILES (from CAS)"; - // Switch to structure tab to show the loaded molecule - this.switchToStructureTab(); + this.switchToEditorTab(); - // Load the structure using existing workflow - if (this.editor) { - this.editor.setSmiles(smiles); - } + this.ensureStructureSearchEditor(() => { + if (this.editor) { + this.editor.setSmiles(smiles); + } + }); // Use existing standardization workflow this.processCASMolecule(casData, smiles); @@ -3809,13 +6351,17 @@ export default { // Tab switching methods with error clearing switchToStructureTab() { this.activeInputTab = "structure"; - // Clear CAS-related errors when switching away from CAS tab this.casError = ""; }, switchToCasTab() { this.activeInputTab = "cas"; - // Clear structure-related errors when switching away from structure tab + this.errorMessage = ""; + }, + + switchToEditorTab() { + this.activeInputTab = "editor"; + this.casError = ""; this.errorMessage = ""; }, @@ -3826,6 +6372,42 @@ export default { toggleSummaryBar() { this.showSummary = !this.showSummary; }, + /** + * True when pivot stores no numeric composition (explicit unknown or empty). + * + * @param {string|number|null|undefined} value + */ + isCompositionPercentUnknown(value) { + if (value === undefined || value === null) { + return true; + } + const s = String(value).trim(); + if (s === "") { + return true; + } + if (s.toLowerCase() === "unknown") { + return true; + } + + return false; + }, + /** + * Format composition percentage for display (supports fractional %). + * + * @param {string|number|null|undefined} value + * @returns {string} + */ + formatCompositionPercent(value) { + const n = Number(value); + if (!Number.isFinite(n)) { + return value != null && value !== "" ? String(value) : "0"; + } + if (Math.abs(n - Math.round(n)) < 1e-9) { + return String(Math.round(n)); + } + + return n.toFixed(3).replace(/\.?0+$/, ""); + }, }, }; diff --git a/resources/js/Pages/Welcome.vue b/resources/js/Pages/Welcome.vue index 3450bddc1..48603cb85 100644 --- a/resources/js/Pages/Welcome.vue +++ b/resources/js/Pages/Welcome.vue @@ -49,12 +49,6 @@ > Projects - - Spectra -
diff --git a/resources/js/Shared/AuthorCard.vue b/resources/js/Shared/AuthorCard.vue index bc7e12c64..728e2ccfe 100644 --- a/resources/js/Shared/AuthorCard.vue +++ b/resources/js/Shared/AuthorCard.vue @@ -1,17 +1,13 @@ -> diff --git a/resources/js/Shared/CompoundCards.vue b/resources/js/Shared/CompoundCards.vue new file mode 100644 index 000000000..381ecef4a --- /dev/null +++ b/resources/js/Shared/CompoundCards.vue @@ -0,0 +1,182 @@ + + + diff --git a/resources/js/Shared/Depictor.vue b/resources/js/Shared/Depictor.vue index 6848de091..79400f3cc 100644 --- a/resources/js/Shared/Depictor.vue +++ b/resources/js/Shared/Depictor.vue @@ -75,7 +75,7 @@ + + diff --git a/resources/js/Shared/EmptySearchState.vue b/resources/js/Shared/EmptySearchState.vue index df272ee25..9502e306a 100644 --- a/resources/js/Shared/EmptySearchState.vue +++ b/resources/js/Shared/EmptySearchState.vue @@ -1,7 +1,11 @@