@morscherlab/mld-sdk 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +326 -0
- package/dist/__tests__/components/AppLayout.test.d.ts +1 -0
- package/dist/__tests__/components/AppSidebar.test.d.ts +1 -0
- package/dist/__tests__/components/AppTopBar.test.d.ts +1 -0
- package/dist/__tests__/components/BaseInput.test.d.ts +1 -0
- package/dist/__tests__/components/BasePill.test.d.ts +1 -0
- package/dist/__tests__/components/Calendar.test.d.ts +1 -0
- package/dist/__tests__/components/CollapsibleCard.test.d.ts +1 -0
- package/dist/__tests__/components/DataFrame.test.d.ts +1 -0
- package/dist/__tests__/components/DropdownButton.test.d.ts +1 -0
- package/dist/__tests__/composables/useAuth.test.d.ts +1 -0
- package/dist/__tests__/composables/useForm.test.d.ts +1 -0
- package/dist/components/AlertBox.vue.d.ts +30 -0
- package/dist/components/AlertBox.vue.js +125 -0
- package/dist/components/AlertBox.vue.js.map +1 -0
- package/dist/components/AlertBox.vue3.js +6 -0
- package/dist/components/AlertBox.vue3.js.map +1 -0
- package/dist/components/AppContainer.vue.d.ts +28 -0
- package/dist/components/AppContainer.vue.js +28 -0
- package/dist/components/AppContainer.vue.js.map +1 -0
- package/dist/components/AppContainer.vue2.js +5 -0
- package/dist/components/AppContainer.vue2.js.map +1 -0
- package/dist/components/AppLayout.vue.d.ts +31 -0
- package/dist/components/AppLayout.vue.js +51 -0
- package/dist/components/AppLayout.vue.js.map +1 -0
- package/dist/components/AppLayout.vue3.js +6 -0
- package/dist/components/AppLayout.vue3.js.map +1 -0
- package/dist/components/AppSidebar.vue.d.ts +44 -0
- package/dist/components/AppSidebar.vue.js +79 -0
- package/dist/components/AppSidebar.vue.js.map +1 -0
- package/dist/components/AppSidebar.vue3.js +6 -0
- package/dist/components/AppSidebar.vue3.js.map +1 -0
- package/dist/components/AppTopBar.vue.d.ts +77 -0
- package/dist/components/AppTopBar.vue.js +564 -0
- package/dist/components/AppTopBar.vue.js.map +1 -0
- package/dist/components/AppTopBar.vue3.js +6 -0
- package/dist/components/AppTopBar.vue3.js.map +1 -0
- package/dist/components/AuditTrail.vue.d.ts +47 -0
- package/dist/components/AuditTrail.vue.js +189 -0
- package/dist/components/AuditTrail.vue.js.map +1 -0
- package/dist/components/AuditTrail.vue3.js +6 -0
- package/dist/components/AuditTrail.vue3.js.map +1 -0
- package/dist/components/Avatar.vue.d.ts +13 -0
- package/dist/components/Avatar.vue.js +64 -0
- package/dist/components/Avatar.vue.js.map +1 -0
- package/dist/components/Avatar.vue3.js +6 -0
- package/dist/components/Avatar.vue3.js.map +1 -0
- package/dist/components/BaseButton.vue.d.ts +37 -0
- package/dist/components/BaseButton.vue.js +64 -0
- package/dist/components/BaseButton.vue.js.map +1 -0
- package/dist/components/BaseButton.vue3.js +6 -0
- package/dist/components/BaseButton.vue3.js.map +1 -0
- package/dist/components/BaseCheckbox.vue.d.ts +16 -0
- package/dist/components/BaseCheckbox.vue.js +71 -0
- package/dist/components/BaseCheckbox.vue.js.map +1 -0
- package/dist/components/BaseCheckbox.vue3.js +6 -0
- package/dist/components/BaseCheckbox.vue3.js.map +1 -0
- package/dist/components/BaseInput.vue.d.ts +33 -0
- package/dist/components/BaseInput.vue.js +57 -0
- package/dist/components/BaseInput.vue.js.map +1 -0
- package/dist/components/BaseInput.vue3.js +6 -0
- package/dist/components/BaseInput.vue3.js.map +1 -0
- package/dist/components/BaseModal.vue.d.ts +38 -0
- package/dist/components/BaseModal.vue.js +118 -0
- package/dist/components/BaseModal.vue.js.map +1 -0
- package/dist/components/BaseModal.vue3.js +6 -0
- package/dist/components/BaseModal.vue3.js.map +1 -0
- package/dist/components/BasePill.vue.d.ts +54 -0
- package/dist/components/BasePill.vue.js +68 -0
- package/dist/components/BasePill.vue.js.map +1 -0
- package/dist/components/BasePill.vue3.js +6 -0
- package/dist/components/BasePill.vue3.js.map +1 -0
- package/dist/components/BaseRadioGroup.vue.d.ts +19 -0
- package/dist/components/BaseRadioGroup.vue.js +80 -0
- package/dist/components/BaseRadioGroup.vue.js.map +1 -0
- package/dist/components/BaseRadioGroup.vue3.js +6 -0
- package/dist/components/BaseRadioGroup.vue3.js.map +1 -0
- package/dist/components/BaseSelect.vue.d.ts +19 -0
- package/dist/components/BaseSelect.vue.js +70 -0
- package/dist/components/BaseSelect.vue.js.map +1 -0
- package/dist/components/BaseSelect.vue3.js +6 -0
- package/dist/components/BaseSelect.vue3.js.map +1 -0
- package/dist/components/BaseSlider.vue.d.ts +22 -0
- package/dist/components/BaseSlider.vue.js +97 -0
- package/dist/components/BaseSlider.vue.js.map +1 -0
- package/dist/components/BaseSlider.vue3.js +6 -0
- package/dist/components/BaseSlider.vue3.js.map +1 -0
- package/dist/components/BaseTabs.vue.d.ts +14 -0
- package/dist/components/BaseTabs.vue.js +63 -0
- package/dist/components/BaseTabs.vue.js.map +1 -0
- package/dist/components/BaseTabs.vue3.js +6 -0
- package/dist/components/BaseTabs.vue3.js.map +1 -0
- package/dist/components/BaseTextarea.vue.d.ts +28 -0
- package/dist/components/BaseTextarea.vue.js +49 -0
- package/dist/components/BaseTextarea.vue.js.map +1 -0
- package/dist/components/BaseTextarea.vue3.js +6 -0
- package/dist/components/BaseTextarea.vue3.js.map +1 -0
- package/dist/components/BaseToggle.vue.d.ts +16 -0
- package/dist/components/BaseToggle.vue.js +65 -0
- package/dist/components/BaseToggle.vue.js.map +1 -0
- package/dist/components/BaseToggle.vue3.js +6 -0
- package/dist/components/BaseToggle.vue3.js.map +1 -0
- package/dist/components/BatchProgressList.vue.d.ts +59 -0
- package/dist/components/BatchProgressList.vue.js +250 -0
- package/dist/components/BatchProgressList.vue.js.map +1 -0
- package/dist/components/BatchProgressList.vue3.js +6 -0
- package/dist/components/BatchProgressList.vue3.js.map +1 -0
- package/dist/components/Breadcrumb.vue.d.ts +37 -0
- package/dist/components/Breadcrumb.vue.js +71 -0
- package/dist/components/Breadcrumb.vue.js.map +1 -0
- package/dist/components/Breadcrumb.vue3.js +6 -0
- package/dist/components/Breadcrumb.vue3.js.map +1 -0
- package/dist/components/Calendar.vue.d.ts +107 -0
- package/dist/components/Calendar.vue.js +328 -0
- package/dist/components/Calendar.vue.js.map +1 -0
- package/dist/components/Calendar.vue3.js +6 -0
- package/dist/components/Calendar.vue3.js.map +1 -0
- package/dist/components/ChartContainer.vue.d.ts +31 -0
- package/dist/components/ChartContainer.vue.js +78 -0
- package/dist/components/ChartContainer.vue.js.map +1 -0
- package/dist/components/ChartContainer.vue3.js +6 -0
- package/dist/components/ChartContainer.vue3.js.map +1 -0
- package/dist/components/ChemicalFormula.vue.d.ts +8 -0
- package/dist/components/ChemicalFormula.vue.js +57 -0
- package/dist/components/ChemicalFormula.vue.js.map +1 -0
- package/dist/components/ChemicalFormula.vue3.js +6 -0
- package/dist/components/ChemicalFormula.vue3.js.map +1 -0
- package/dist/components/CollapsibleCard.vue.d.ts +39 -0
- package/dist/components/CollapsibleCard.vue.js +175 -0
- package/dist/components/CollapsibleCard.vue.js.map +1 -0
- package/dist/components/CollapsibleCard.vue3.js +6 -0
- package/dist/components/CollapsibleCard.vue3.js.map +1 -0
- package/dist/components/ColorSlider.vue.d.ts +34 -0
- package/dist/components/ColorSlider.vue.js +131 -0
- package/dist/components/ColorSlider.vue.js.map +1 -0
- package/dist/components/ColorSlider.vue3.js +6 -0
- package/dist/components/ColorSlider.vue3.js.map +1 -0
- package/dist/components/ConcentrationInput.vue.d.ts +25 -0
- package/dist/components/ConcentrationInput.vue.js +161 -0
- package/dist/components/ConcentrationInput.vue.js.map +1 -0
- package/dist/components/ConcentrationInput.vue3.js +6 -0
- package/dist/components/ConcentrationInput.vue3.js.map +1 -0
- package/dist/components/ConfirmDialog.vue.d.ts +41 -0
- package/dist/components/ConfirmDialog.vue.js +140 -0
- package/dist/components/ConfirmDialog.vue.js.map +1 -0
- package/dist/components/ConfirmDialog.vue3.js +6 -0
- package/dist/components/ConfirmDialog.vue3.js.map +1 -0
- package/dist/components/DataFrame.vue.d.ts +107 -0
- package/dist/components/DataFrame.vue.js +430 -0
- package/dist/components/DataFrame.vue.js.map +1 -0
- package/dist/components/DataFrame.vue3.js +6 -0
- package/dist/components/DataFrame.vue3.js.map +1 -0
- package/dist/components/DatePicker.vue.d.ts +23 -0
- package/dist/components/DatePicker.vue.js +278 -0
- package/dist/components/DatePicker.vue.js.map +1 -0
- package/dist/components/DatePicker.vue3.js +6 -0
- package/dist/components/DatePicker.vue3.js.map +1 -0
- package/dist/components/DateTimePicker.vue.d.ts +30 -0
- package/dist/components/DateTimePicker.vue.js +413 -0
- package/dist/components/DateTimePicker.vue.js.map +1 -0
- package/dist/components/DateTimePicker.vue3.js +6 -0
- package/dist/components/DateTimePicker.vue3.js.map +1 -0
- package/dist/components/Divider.vue.d.ts +11 -0
- package/dist/components/Divider.vue.js +42 -0
- package/dist/components/Divider.vue.js.map +1 -0
- package/dist/components/Divider.vue3.js +6 -0
- package/dist/components/Divider.vue3.js.map +1 -0
- package/dist/components/DoseCalculator.vue.d.ts +19 -0
- package/dist/components/DoseCalculator.vue.js +470 -0
- package/dist/components/DoseCalculator.vue.js.map +1 -0
- package/dist/components/DoseCalculator.vue3.js +6 -0
- package/dist/components/DoseCalculator.vue3.js.map +1 -0
- package/dist/components/DropdownButton.vue.d.ts +47 -0
- package/dist/components/DropdownButton.vue.js +171 -0
- package/dist/components/DropdownButton.vue.js.map +1 -0
- package/dist/components/DropdownButton.vue3.js +6 -0
- package/dist/components/DropdownButton.vue3.js.map +1 -0
- package/dist/components/EmptyState.vue.d.ts +33 -0
- package/dist/components/EmptyState.vue.js +80 -0
- package/dist/components/EmptyState.vue.js.map +1 -0
- package/dist/components/EmptyState.vue3.js +6 -0
- package/dist/components/EmptyState.vue3.js.map +1 -0
- package/dist/components/ExperimentTimeline.vue.d.ts +44 -0
- package/dist/components/ExperimentTimeline.vue.js +395 -0
- package/dist/components/ExperimentTimeline.vue.js.map +1 -0
- package/dist/components/ExperimentTimeline.vue3.js +6 -0
- package/dist/components/ExperimentTimeline.vue3.js.map +1 -0
- package/dist/components/FileUploader.vue.d.ts +23 -0
- package/dist/components/FileUploader.vue.js +416 -0
- package/dist/components/FileUploader.vue.js.map +1 -0
- package/dist/components/FileUploader.vue3.js +6 -0
- package/dist/components/FileUploader.vue3.js.map +1 -0
- package/dist/components/FormField.vue.d.ts +24 -0
- package/dist/components/FormField.vue.js +45 -0
- package/dist/components/FormField.vue.js.map +1 -0
- package/dist/components/FormField.vue3.js +6 -0
- package/dist/components/FormField.vue3.js.map +1 -0
- package/dist/components/FormulaInput.vue.d.ts +25 -0
- package/dist/components/FormulaInput.vue.js +121 -0
- package/dist/components/FormulaInput.vue.js.map +1 -0
- package/dist/components/FormulaInput.vue3.js +6 -0
- package/dist/components/FormulaInput.vue3.js.map +1 -0
- package/dist/components/GroupAssigner.vue.d.ts +25 -0
- package/dist/components/GroupAssigner.vue.js +311 -0
- package/dist/components/GroupAssigner.vue.js.map +1 -0
- package/dist/components/GroupAssigner.vue3.js +6 -0
- package/dist/components/GroupAssigner.vue3.js.map +1 -0
- package/dist/components/GroupingModal.vue.d.ts +12 -0
- package/dist/components/GroupingModal.vue.js +446 -0
- package/dist/components/GroupingModal.vue.js.map +1 -0
- package/dist/components/GroupingModal.vue3.js +6 -0
- package/dist/components/GroupingModal.vue3.js.map +1 -0
- package/dist/components/IconButton.vue.d.ts +34 -0
- package/dist/components/IconButton.vue.js +67 -0
- package/dist/components/IconButton.vue.js.map +1 -0
- package/dist/components/IconButton.vue3.js +6 -0
- package/dist/components/IconButton.vue3.js.map +1 -0
- package/dist/components/LoadingSpinner.vue.d.ts +11 -0
- package/dist/components/LoadingSpinner.vue.js +47 -0
- package/dist/components/LoadingSpinner.vue.js.map +1 -0
- package/dist/components/LoadingSpinner.vue3.js +6 -0
- package/dist/components/LoadingSpinner.vue3.js.map +1 -0
- package/dist/components/MoleculeInput.vue.d.ts +30 -0
- package/dist/components/MoleculeInput.vue.js +327 -0
- package/dist/components/MoleculeInput.vue.js.map +1 -0
- package/dist/components/MoleculeInput.vue3.js +6 -0
- package/dist/components/MoleculeInput.vue3.js.map +1 -0
- package/dist/components/MultiSelect.vue.d.ts +19 -0
- package/dist/components/MultiSelect.vue.js +109 -0
- package/dist/components/MultiSelect.vue.js.map +1 -0
- package/dist/components/MultiSelect.vue3.js +6 -0
- package/dist/components/MultiSelect.vue3.js.map +1 -0
- package/dist/components/NumberInput.vue.d.ts +21 -0
- package/dist/components/NumberInput.vue.js +133 -0
- package/dist/components/NumberInput.vue.js.map +1 -0
- package/dist/components/NumberInput.vue3.js +6 -0
- package/dist/components/NumberInput.vue3.js.map +1 -0
- package/dist/components/PlateMapEditor.vue.d.ts +50 -0
- package/dist/components/PlateMapEditor.vue.js +480 -0
- package/dist/components/PlateMapEditor.vue.js.map +1 -0
- package/dist/components/PlateMapEditor.vue3.js +6 -0
- package/dist/components/PlateMapEditor.vue3.js.map +1 -0
- package/dist/components/ProgressBar.vue.d.ts +17 -0
- package/dist/components/ProgressBar.vue.js +65 -0
- package/dist/components/ProgressBar.vue.js.map +1 -0
- package/dist/components/ProgressBar.vue3.js +6 -0
- package/dist/components/ProgressBar.vue3.js.map +1 -0
- package/dist/components/ProtocolStepEditor.vue.d.ts +24 -0
- package/dist/components/ProtocolStepEditor.vue.js +491 -0
- package/dist/components/ProtocolStepEditor.vue.js.map +1 -0
- package/dist/components/ProtocolStepEditor.vue3.js +6 -0
- package/dist/components/ProtocolStepEditor.vue3.js.map +1 -0
- package/dist/components/RackEditor.vue.d.ts +40 -0
- package/dist/components/RackEditor.vue.js +325 -0
- package/dist/components/RackEditor.vue.js.map +1 -0
- package/dist/components/RackEditor.vue3.js +6 -0
- package/dist/components/RackEditor.vue3.js.map +1 -0
- package/dist/components/ReagentList.vue.d.ts +46 -0
- package/dist/components/ReagentList.vue.js +526 -0
- package/dist/components/ReagentList.vue.js.map +1 -0
- package/dist/components/ReagentList.vue3.js +6 -0
- package/dist/components/ReagentList.vue3.js.map +1 -0
- package/dist/components/ResourceCard.vue.d.ts +50 -0
- package/dist/components/ResourceCard.vue.js +212 -0
- package/dist/components/ResourceCard.vue.js.map +1 -0
- package/dist/components/ResourceCard.vue3.js +6 -0
- package/dist/components/ResourceCard.vue3.js.map +1 -0
- package/dist/components/SampleHierarchyTree.vue.d.ts +37 -0
- package/dist/components/SampleHierarchyTree.vue.js +217 -0
- package/dist/components/SampleHierarchyTree.vue.js.map +1 -0
- package/dist/components/SampleHierarchyTree.vue3.js +6 -0
- package/dist/components/SampleHierarchyTree.vue3.js.map +1 -0
- package/dist/components/SampleLegend.vue.d.ts +32 -0
- package/dist/components/SampleLegend.vue.js +129 -0
- package/dist/components/SampleLegend.vue.js.map +1 -0
- package/dist/components/SampleLegend.vue3.js +6 -0
- package/dist/components/SampleLegend.vue3.js.map +1 -0
- package/dist/components/SampleSelector.vue.d.ts +29 -0
- package/dist/components/SampleSelector.vue.js +1076 -0
- package/dist/components/SampleSelector.vue.js.map +1 -0
- package/dist/components/SampleSelector.vue3.js +6 -0
- package/dist/components/SampleSelector.vue3.js.map +1 -0
- package/dist/components/ScheduleCalendar.vue.d.ts +110 -0
- package/dist/components/ScheduleCalendar.vue.js +535 -0
- package/dist/components/ScheduleCalendar.vue.js.map +1 -0
- package/dist/components/ScheduleCalendar.vue3.js +6 -0
- package/dist/components/ScheduleCalendar.vue3.js.map +1 -0
- package/dist/components/ScientificNumber.vue.d.ts +14 -0
- package/dist/components/ScientificNumber.vue.js +190 -0
- package/dist/components/ScientificNumber.vue.js.map +1 -0
- package/dist/components/ScientificNumber.vue3.js +6 -0
- package/dist/components/ScientificNumber.vue3.js.map +1 -0
- package/dist/components/SegmentedControl.vue.d.ts +20 -0
- package/dist/components/SegmentedControl.vue.js +71 -0
- package/dist/components/SegmentedControl.vue.js.map +1 -0
- package/dist/components/SegmentedControl.vue3.js +6 -0
- package/dist/components/SegmentedControl.vue3.js.map +1 -0
- package/dist/components/SequenceInput.vue.d.ts +54 -0
- package/dist/components/SequenceInput.vue.js +204 -0
- package/dist/components/SequenceInput.vue.js.map +1 -0
- package/dist/components/SequenceInput.vue3.js +6 -0
- package/dist/components/SequenceInput.vue3.js.map +1 -0
- package/dist/components/SettingsButton.vue.d.ts +30 -0
- package/dist/components/SettingsButton.vue.js +72 -0
- package/dist/components/SettingsButton.vue.js.map +1 -0
- package/dist/components/SettingsButton.vue3.js +6 -0
- package/dist/components/SettingsButton.vue3.js.map +1 -0
- package/dist/components/SettingsModal.vue.d.ts +40 -0
- package/dist/components/SettingsModal.vue.js +141 -0
- package/dist/components/SettingsModal.vue.js.map +1 -0
- package/dist/components/SettingsModal.vue3.js +6 -0
- package/dist/components/SettingsModal.vue3.js.map +1 -0
- package/dist/components/Skeleton.vue.d.ts +11 -0
- package/dist/components/Skeleton.vue.js +65 -0
- package/dist/components/Skeleton.vue.js.map +1 -0
- package/dist/components/Skeleton.vue3.js +6 -0
- package/dist/components/Skeleton.vue3.js.map +1 -0
- package/dist/components/StatusIndicator.vue.d.ts +13 -0
- package/dist/components/StatusIndicator.vue.js +38 -0
- package/dist/components/StatusIndicator.vue.js.map +1 -0
- package/dist/components/StatusIndicator.vue3.js +6 -0
- package/dist/components/StatusIndicator.vue3.js.map +1 -0
- package/dist/components/StepWizard.vue.d.ts +72 -0
- package/dist/components/StepWizard.vue.js +213 -0
- package/dist/components/StepWizard.vue.js.map +1 -0
- package/dist/components/StepWizard.vue3.js +6 -0
- package/dist/components/StepWizard.vue3.js.map +1 -0
- package/dist/components/TagsInput.vue.d.ts +23 -0
- package/dist/components/TagsInput.vue.js +124 -0
- package/dist/components/TagsInput.vue.js.map +1 -0
- package/dist/components/TagsInput.vue3.js +6 -0
- package/dist/components/TagsInput.vue3.js.map +1 -0
- package/dist/components/ThemeToggle.vue.d.ts +7 -0
- package/dist/components/ThemeToggle.vue.js +49 -0
- package/dist/components/ThemeToggle.vue.js.map +1 -0
- package/dist/components/ThemeToggle.vue3.js +6 -0
- package/dist/components/ThemeToggle.vue3.js.map +1 -0
- package/dist/components/TimePicker.vue.d.ts +29 -0
- package/dist/components/TimePicker.vue.js +275 -0
- package/dist/components/TimePicker.vue.js.map +1 -0
- package/dist/components/TimePicker.vue3.js +6 -0
- package/dist/components/TimePicker.vue3.js.map +1 -0
- package/dist/components/TimeRangeInput.vue.d.ts +27 -0
- package/dist/components/TimeRangeInput.vue.js +115 -0
- package/dist/components/TimeRangeInput.vue.js.map +1 -0
- package/dist/components/TimeRangeInput.vue3.js +6 -0
- package/dist/components/TimeRangeInput.vue3.js.map +1 -0
- package/dist/components/ToastNotification.vue.d.ts +2 -0
- package/dist/components/ToastNotification.vue.js +113 -0
- package/dist/components/ToastNotification.vue.js.map +1 -0
- package/dist/components/ToastNotification.vue3.js +6 -0
- package/dist/components/ToastNotification.vue3.js.map +1 -0
- package/dist/components/Tooltip.vue.d.ts +25 -0
- package/dist/components/Tooltip.vue.js +52 -0
- package/dist/components/Tooltip.vue.js.map +1 -0
- package/dist/components/Tooltip.vue3.js +6 -0
- package/dist/components/Tooltip.vue3.js.map +1 -0
- package/dist/components/UnitInput.vue.d.ts +44 -0
- package/dist/components/UnitInput.vue.js +178 -0
- package/dist/components/UnitInput.vue.js.map +1 -0
- package/dist/components/UnitInput.vue3.js +6 -0
- package/dist/components/UnitInput.vue3.js.map +1 -0
- package/dist/components/WellEditPopup.vue.d.ts +25 -0
- package/dist/components/WellEditPopup.vue.js +250 -0
- package/dist/components/WellEditPopup.vue.js.map +1 -0
- package/dist/components/WellEditPopup.vue3.js +6 -0
- package/dist/components/WellEditPopup.vue3.js.map +1 -0
- package/dist/components/WellPlate.vue.d.ts +69 -0
- package/dist/components/WellPlate.vue.js +531 -0
- package/dist/components/WellPlate.vue.js.map +1 -0
- package/dist/components/WellPlate.vue3.js +6 -0
- package/dist/components/WellPlate.vue3.js.map +1 -0
- package/dist/components/index.d.ts +71 -0
- package/dist/components/index.js +215 -0
- package/dist/components/index.js.map +1 -0
- package/dist/composables/index.d.ts +17 -0
- package/dist/composables/index.js +49 -0
- package/dist/composables/index.js.map +1 -0
- package/dist/composables/useApi.d.ts +19 -0
- package/dist/composables/useApi.js +101 -0
- package/dist/composables/useApi.js.map +1 -0
- package/dist/composables/useAsync.d.ts +127 -0
- package/dist/composables/useAsync.js +141 -0
- package/dist/composables/useAsync.js.map +1 -0
- package/dist/composables/useAuth.d.ts +44 -0
- package/dist/composables/useAuth.js +286 -0
- package/dist/composables/useAuth.js.map +1 -0
- package/dist/composables/useChemicalFormula.d.ts +20 -0
- package/dist/composables/useChemicalFormula.js +228 -0
- package/dist/composables/useChemicalFormula.js.map +1 -0
- package/dist/composables/useConcentrationUnits.d.ts +28 -0
- package/dist/composables/useConcentrationUnits.js +154 -0
- package/dist/composables/useConcentrationUnits.js.map +1 -0
- package/dist/composables/useDoseCalculator.d.ts +57 -0
- package/dist/composables/useDoseCalculator.js +228 -0
- package/dist/composables/useDoseCalculator.js.map +1 -0
- package/dist/composables/useForm.d.ts +91 -0
- package/dist/composables/useForm.js +253 -0
- package/dist/composables/useForm.js.map +1 -0
- package/dist/composables/usePasskey.d.ts +9 -0
- package/dist/composables/usePasskey.js +171 -0
- package/dist/composables/usePasskey.js.map +1 -0
- package/dist/composables/usePlatformContext.d.ts +125 -0
- package/dist/composables/usePlatformContext.js +149 -0
- package/dist/composables/usePlatformContext.js.map +1 -0
- package/dist/composables/useProtocolTemplates.d.ts +43 -0
- package/dist/composables/useProtocolTemplates.js +437 -0
- package/dist/composables/useProtocolTemplates.js.map +1 -0
- package/dist/composables/useRackEditor.d.ts +30 -0
- package/dist/composables/useRackEditor.js +168 -0
- package/dist/composables/useRackEditor.js.map +1 -0
- package/dist/composables/useScheduleDrag.d.ts +77 -0
- package/dist/composables/useScheduleDrag.js +183 -0
- package/dist/composables/useScheduleDrag.js.map +1 -0
- package/dist/composables/useSequenceUtils.d.ts +13 -0
- package/dist/composables/useSequenceUtils.js +93 -0
- package/dist/composables/useSequenceUtils.js.map +1 -0
- package/dist/composables/useTheme.d.ts +7 -0
- package/dist/composables/useTheme.js +40 -0
- package/dist/composables/useTheme.js.map +1 -0
- package/dist/composables/useTimeUtils.d.ts +15 -0
- package/dist/composables/useTimeUtils.js +105 -0
- package/dist/composables/useTimeUtils.js.map +1 -0
- package/dist/composables/useToast.d.ts +19 -0
- package/dist/composables/useToast.js +33 -0
- package/dist/composables/useToast.js.map +1 -0
- package/dist/composables/useWellPlateEditor.d.ts +31 -0
- package/dist/composables/useWellPlateEditor.js +315 -0
- package/dist/composables/useWellPlateEditor.js.map +1 -0
- package/dist/histoire.setup.d.ts +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +265 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +16 -0
- package/dist/install.js +15 -0
- package/dist/install.js.map +1 -0
- package/dist/stores/auth.d.ts +146 -0
- package/dist/stores/auth.js +122 -0
- package/dist/stores/auth.js.map +1 -0
- package/dist/stores/index.d.ts +2 -0
- package/dist/stores/index.js +8 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/settings.d.ts +75 -0
- package/dist/stores/settings.js +180 -0
- package/dist/stores/settings.js.map +1 -0
- package/dist/styles.css +23264 -0
- package/dist/tailwind.preset.d.ts +56 -0
- package/dist/tailwind.preset.js +59 -0
- package/dist/tailwind.preset.js.map +1 -0
- package/dist/types/auth.d.ts +42 -0
- package/dist/types/components.d.ts +405 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/platform.d.ts +66 -0
- package/package.json +111 -0
- package/src/__tests__/components/AppLayout.test.ts +163 -0
- package/src/__tests__/components/AppSidebar.test.ts +292 -0
- package/src/__tests__/components/AppTopBar.test.ts +590 -0
- package/src/__tests__/components/BaseInput.test.ts +99 -0
- package/src/__tests__/components/BasePill.test.ts +291 -0
- package/src/__tests__/components/Calendar.test.ts +566 -0
- package/src/__tests__/components/CollapsibleCard.test.ts +524 -0
- package/src/__tests__/components/DataFrame.test.ts +767 -0
- package/src/__tests__/components/DropdownButton.test.ts +471 -0
- package/src/__tests__/composables/useAuth.test.ts +141 -0
- package/src/__tests__/composables/useForm.test.ts +205 -0
- package/src/components/AlertBox.story.vue +100 -0
- package/src/components/AlertBox.vue +68 -0
- package/src/components/AppContainer.story.vue +104 -0
- package/src/components/AppContainer.vue +33 -0
- package/src/components/AppLayout.story.vue +218 -0
- package/src/components/AppLayout.vue +75 -0
- package/src/components/AppSidebar.story.vue +300 -0
- package/src/components/AppSidebar.vue +114 -0
- package/src/components/AppTopBar.story.vue +112 -0
- package/src/components/AppTopBar.vue +471 -0
- package/src/components/AuditTrail.story.vue +163 -0
- package/src/components/AuditTrail.vue +161 -0
- package/src/components/Avatar.story.vue +92 -0
- package/src/components/Avatar.vue +65 -0
- package/src/components/BaseButton.story.vue +96 -0
- package/src/components/BaseButton.vue +72 -0
- package/src/components/BaseCheckbox.story.vue +73 -0
- package/src/components/BaseCheckbox.vue +68 -0
- package/src/components/BaseInput.story.vue +98 -0
- package/src/components/BaseInput.vue +70 -0
- package/src/components/BaseModal.story.vue +126 -0
- package/src/components/BaseModal.vue +118 -0
- package/src/components/BasePill.story.vue +131 -0
- package/src/components/BasePill.vue +84 -0
- package/src/components/BaseRadioGroup.story.vue +116 -0
- package/src/components/BaseRadioGroup.vue +83 -0
- package/src/components/BaseSelect.story.vue +110 -0
- package/src/components/BaseSelect.vue +67 -0
- package/src/components/BaseSlider.story.vue +82 -0
- package/src/components/BaseSlider.vue +112 -0
- package/src/components/BaseTabs.story.vue +106 -0
- package/src/components/BaseTabs.vue +58 -0
- package/src/components/BaseTextarea.story.vue +91 -0
- package/src/components/BaseTextarea.vue +58 -0
- package/src/components/BaseToggle.story.vue +81 -0
- package/src/components/BaseToggle.vue +72 -0
- package/src/components/BatchProgressList.story.vue +92 -0
- package/src/components/BatchProgressList.vue +202 -0
- package/src/components/Breadcrumb.story.vue +93 -0
- package/src/components/Breadcrumb.vue +73 -0
- package/src/components/Calendar.story.vue +106 -0
- package/src/components/Calendar.vue +362 -0
- package/src/components/ChartContainer.story.vue +113 -0
- package/src/components/ChartContainer.vue +63 -0
- package/src/components/ChemicalFormula.story.vue +102 -0
- package/src/components/ChemicalFormula.vue +38 -0
- package/src/components/CollapsibleCard.story.vue +124 -0
- package/src/components/CollapsibleCard.vue +164 -0
- package/src/components/ColorSlider.story.vue +120 -0
- package/src/components/ColorSlider.vue +163 -0
- package/src/components/ConcentrationInput.story.vue +77 -0
- package/src/components/ConcentrationInput.vue +184 -0
- package/src/components/ConfirmDialog.story.vue +145 -0
- package/src/components/ConfirmDialog.vue +96 -0
- package/src/components/DataFrame.story.vue +148 -0
- package/src/components/DataFrame.vue +418 -0
- package/src/components/DatePicker.story.vue +104 -0
- package/src/components/DatePicker.vue +298 -0
- package/src/components/DateTimePicker.story.vue +112 -0
- package/src/components/DateTimePicker.vue +391 -0
- package/src/components/Divider.story.vue +72 -0
- package/src/components/Divider.vue +45 -0
- package/src/components/DoseCalculator.story.vue +68 -0
- package/src/components/DoseCalculator.vue +475 -0
- package/src/components/DropdownButton.story.vue +102 -0
- package/src/components/DropdownButton.vue +180 -0
- package/src/components/EmptyState.story.vue +124 -0
- package/src/components/EmptyState.vue +64 -0
- package/src/components/ExperimentTimeline.story.vue +161 -0
- package/src/components/ExperimentTimeline.vue +381 -0
- package/src/components/FileUploader.story.vue +106 -0
- package/src/components/FileUploader.vue +397 -0
- package/src/components/FormField.story.vue +119 -0
- package/src/components/FormField.vue +37 -0
- package/src/components/FormulaInput.story.vue +96 -0
- package/src/components/FormulaInput.vue +123 -0
- package/src/components/GroupAssigner.story.vue +83 -0
- package/src/components/GroupAssigner.vue +283 -0
- package/src/components/GroupingModal.story.vue +52 -0
- package/src/components/GroupingModal.vue +420 -0
- package/src/components/IconButton.story.vue +135 -0
- package/src/components/IconButton.vue +72 -0
- package/src/components/LoadingSpinner.story.vue +70 -0
- package/src/components/LoadingSpinner.vue +49 -0
- package/src/components/MoleculeInput.story.vue +66 -0
- package/src/components/MoleculeInput.vue +414 -0
- package/src/components/MultiSelect.story.vue +121 -0
- package/src/components/MultiSelect.vue +117 -0
- package/src/components/NumberInput.story.vue +90 -0
- package/src/components/NumberInput.vue +128 -0
- package/src/components/PlateMapEditor.story.vue +92 -0
- package/src/components/PlateMapEditor.vue +512 -0
- package/src/components/ProgressBar.story.vue +117 -0
- package/src/components/ProgressBar.vue +63 -0
- package/src/components/ProtocolStepEditor.story.vue +69 -0
- package/src/components/ProtocolStepEditor.vue +521 -0
- package/src/components/RackEditor.story.vue +100 -0
- package/src/components/RackEditor.vue +370 -0
- package/src/components/ReagentList.story.vue +137 -0
- package/src/components/ReagentList.vue +487 -0
- package/src/components/ResourceCard.story.vue +150 -0
- package/src/components/ResourceCard.vue +160 -0
- package/src/components/SampleHierarchyTree.story.vue +161 -0
- package/src/components/SampleHierarchyTree.vue +279 -0
- package/src/components/SampleLegend.story.vue +91 -0
- package/src/components/SampleLegend.vue +118 -0
- package/src/components/SampleSelector.story.vue +100 -0
- package/src/components/SampleSelector.vue +955 -0
- package/src/components/ScheduleCalendar.story.vue +195 -0
- package/src/components/ScheduleCalendar.vue +568 -0
- package/src/components/ScientificNumber.story.vue +128 -0
- package/src/components/ScientificNumber.vue +197 -0
- package/src/components/SegmentedControl.story.vue +112 -0
- package/src/components/SegmentedControl.vue +78 -0
- package/src/components/SequenceInput.story.vue +119 -0
- package/src/components/SequenceInput.vue +208 -0
- package/src/components/SettingsButton.story.vue +58 -0
- package/src/components/SettingsButton.vue +75 -0
- package/src/components/SettingsModal.story.vue +145 -0
- package/src/components/SettingsModal.vue +151 -0
- package/src/components/Skeleton.story.vue +120 -0
- package/src/components/Skeleton.vue +73 -0
- package/src/components/StatusIndicator.story.vue +99 -0
- package/src/components/StatusIndicator.vue +39 -0
- package/src/components/StepWizard.story.vue +155 -0
- package/src/components/StepWizard.vue +231 -0
- package/src/components/TagsInput.story.vue +104 -0
- package/src/components/TagsInput.vue +127 -0
- package/src/components/ThemeToggle.story.vue +36 -0
- package/src/components/ThemeToggle.vue +53 -0
- package/src/components/TimePicker.story.vue +96 -0
- package/src/components/TimePicker.vue +272 -0
- package/src/components/TimeRangeInput.story.vue +104 -0
- package/src/components/TimeRangeInput.vue +121 -0
- package/src/components/ToastNotification.story.vue +130 -0
- package/src/components/ToastNotification.vue +54 -0
- package/src/components/Tooltip.story.vue +102 -0
- package/src/components/Tooltip.vue +61 -0
- package/src/components/UnitInput.story.vue +170 -0
- package/src/components/UnitInput.vue +218 -0
- package/src/components/WellEditPopup.vue +234 -0
- package/src/components/WellPlate.story.vue +198 -0
- package/src/components/WellPlate.vue +637 -0
- package/src/components/index.ts +96 -0
- package/src/composables/index.ts +87 -0
- package/src/composables/useApi.ts +145 -0
- package/src/composables/useAsync.ts +322 -0
- package/src/composables/useAuth.ts +427 -0
- package/src/composables/useChemicalFormula.ts +274 -0
- package/src/composables/useConcentrationUnits.ts +245 -0
- package/src/composables/useDoseCalculator.ts +369 -0
- package/src/composables/useForm.ts +415 -0
- package/src/composables/usePasskey.ts +209 -0
- package/src/composables/usePlatformContext.ts +232 -0
- package/src/composables/useProtocolTemplates.ts +517 -0
- package/src/composables/useRackEditor.ts +221 -0
- package/src/composables/useScheduleDrag.ts +244 -0
- package/src/composables/useSequenceUtils.ts +104 -0
- package/src/composables/useTheme.ts +49 -0
- package/src/composables/useTimeUtils.ts +114 -0
- package/src/composables/useToast.ts +39 -0
- package/src/composables/useWellPlateEditor.ts +408 -0
- package/src/histoire.setup.ts +17 -0
- package/src/index.ts +283 -0
- package/src/install.ts +32 -0
- package/src/stores/auth.ts +144 -0
- package/src/stores/index.ts +2 -0
- package/src/stores/settings.ts +229 -0
- package/src/styles/components/alert-box.css +94 -0
- package/src/styles/components/app-container.css +32 -0
- package/src/styles/components/app-layout.css +99 -0
- package/src/styles/components/app-sidebar.css +133 -0
- package/src/styles/components/app-top-bar.css +396 -0
- package/src/styles/components/audit-trail.css +143 -0
- package/src/styles/components/avatar.css +64 -0
- package/src/styles/components/batch-progress-list.css +196 -0
- package/src/styles/components/breadcrumb.css +45 -0
- package/src/styles/components/button.css +119 -0
- package/src/styles/components/calendar.css +192 -0
- package/src/styles/components/chart-container.css +69 -0
- package/src/styles/components/checkbox.css +112 -0
- package/src/styles/components/chemical-formula.css +46 -0
- package/src/styles/components/collapsible-card.css +184 -0
- package/src/styles/components/color-slider.css +110 -0
- package/src/styles/components/concentration-input.css +142 -0
- package/src/styles/components/confirm-dialog.css +137 -0
- package/src/styles/components/dataframe.css +382 -0
- package/src/styles/components/date-picker.css +239 -0
- package/src/styles/components/datetime-picker.css +225 -0
- package/src/styles/components/divider.css +62 -0
- package/src/styles/components/dose-calculator.css +301 -0
- package/src/styles/components/dropdown-button.css +236 -0
- package/src/styles/components/empty-state.css +148 -0
- package/src/styles/components/experiment-timeline.css +529 -0
- package/src/styles/components/file-uploader.css +517 -0
- package/src/styles/components/form-field.css +35 -0
- package/src/styles/components/formula-input.css +96 -0
- package/src/styles/components/group-assigner.css +200 -0
- package/src/styles/components/grouping-modal.css +323 -0
- package/src/styles/components/icon-button.css +128 -0
- package/src/styles/components/input.css +53 -0
- package/src/styles/components/loading-spinner.css +67 -0
- package/src/styles/components/modal.css +122 -0
- package/src/styles/components/molecule-input.css +186 -0
- package/src/styles/components/multi-select.css +131 -0
- package/src/styles/components/number-input.css +110 -0
- package/src/styles/components/pill.css +172 -0
- package/src/styles/components/plate-map-editor.css +464 -0
- package/src/styles/components/progress-bar.css +88 -0
- package/src/styles/components/protocol-step-editor.css +449 -0
- package/src/styles/components/rack-editor.css +259 -0
- package/src/styles/components/radio-group.css +158 -0
- package/src/styles/components/reagent-list.css +407 -0
- package/src/styles/components/resource-card.css +360 -0
- package/src/styles/components/sample-hierarchy-tree.css +314 -0
- package/src/styles/components/sample-legend.css +201 -0
- package/src/styles/components/sample-selector.css +701 -0
- package/src/styles/components/schedule-calendar.css +478 -0
- package/src/styles/components/scientific-number.css +63 -0
- package/src/styles/components/segmented-control.css +190 -0
- package/src/styles/components/select.css +72 -0
- package/src/styles/components/sequence-input.css +184 -0
- package/src/styles/components/settings-button.css +75 -0
- package/src/styles/components/settings-modal.css +95 -0
- package/src/styles/components/skeleton.css +36 -0
- package/src/styles/components/slider.css +78 -0
- package/src/styles/components/status-indicator.css +59 -0
- package/src/styles/components/step-wizard.css +187 -0
- package/src/styles/components/tabs.css +108 -0
- package/src/styles/components/tags-input.css +118 -0
- package/src/styles/components/textarea.css +65 -0
- package/src/styles/components/theme-toggle.css +50 -0
- package/src/styles/components/time-picker.css +171 -0
- package/src/styles/components/time-range-input.css +42 -0
- package/src/styles/components/toast.css +72 -0
- package/src/styles/components/toggle.css +115 -0
- package/src/styles/components/tooltip.css +98 -0
- package/src/styles/components/unit-input.css +138 -0
- package/src/styles/components/well-edit-popup.css +252 -0
- package/src/styles/components/well-plate.css +310 -0
- package/src/styles/index.css +80 -0
- package/src/styles/variables.css +1078 -0
- package/src/tailwind.preset.ts +59 -0
- package/src/types/auth.ts +55 -0
- package/src/types/components.ts +560 -0
- package/src/types/index.ts +146 -0
- package/src/types/platform.ts +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WellPlate.vue.js","sources":["../../src/components/WellPlate.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport type { WellPlateFormat, WellPlateSelectionMode, WellPlateSize, Well, HeatmapConfig, WellShape, WellEditField, WellEditData, WellLegendItem } from '../types'\nimport WellEditPopup from './WellEditPopup.vue'\n\ninterface Props {\n modelValue?: string[]\n format?: WellPlateFormat\n wells?: Record<string, Partial<Well>>\n selectionMode?: WellPlateSelectionMode\n showLabels?: boolean\n showWellIds?: boolean\n showSampleTypeIndicator?: boolean\n heatmap?: HeatmapConfig\n sampleColors?: Record<string, string>\n zoom?: number\n disabled?: boolean\n readonly?: boolean\n size?: WellPlateSize\n wellShape?: WellShape\n // New editing props\n showWellLabels?: boolean\n showBadges?: boolean\n editable?: boolean\n editFields?: WellEditField[]\n defaultInjectionVolume?: number\n showLegend?: boolean\n legendItems?: WellLegendItem[]\n}\n\n// Drag state for moving wells\nconst dragSourceWell = ref<string | null>(null)\nconst dragTargetWell = ref<string | null>(null)\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => [],\n format: 96,\n wells: () => ({}),\n selectionMode: 'multiple',\n showLabels: true,\n showWellIds: false,\n showSampleTypeIndicator: false,\n heatmap: () => ({ enabled: false }),\n sampleColors: () => ({}),\n zoom: 1,\n disabled: false,\n readonly: false,\n size: 'md',\n wellShape: 'rounded',\n // New props default to off for backward compatibility\n showWellLabels: false,\n showBadges: false,\n editable: false,\n editFields: () => ['label', 'sampleType', 'injectionVolume', 'injectionCount', 'customMethod'],\n defaultInjectionVolume: 5,\n showLegend: false,\n legendItems: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [wellIds: string[]]\n 'well-click': [wellId: string, event: MouseEvent]\n 'well-hover': [wellId: string | null, event?: MouseEvent]\n 'selection-change': [wellIds: string[]]\n 'context-menu': [wellId: string, event: MouseEvent]\n 'well-move': [sourceWellId: string, targetWellId: string]\n // New editing emits\n 'well-edit': [wellId: string, data: WellEditData]\n 'well-clear': [wellId: string]\n}>()\n\nconst plateRef = ref<HTMLElement | null>(null)\nconst tableRef = ref<HTMLElement | null>(null)\nconst isDragging = ref(false)\nconst dragStart = ref<{ row: number; col: number } | null>(null)\nconst dragEnd = ref<{ row: number; col: number } | null>(null)\nconst hoveredWell = ref<string | null>(null)\n\n// Edit popup state\nconst editingWellId = ref<string | null>(null)\nconst editPopupPosition = ref({ x: 0, y: 0 })\n\nconst PLATE_CONFIGS: Record<WellPlateFormat, { rows: number; cols: number }> = {\n 6: { rows: 2, cols: 3 },\n 12: { rows: 3, cols: 4 },\n 24: { rows: 4, cols: 6 },\n 48: { rows: 6, cols: 8 },\n 54: { rows: 6, cols: 9 },\n 96: { rows: 8, cols: 12 },\n 384: { rows: 16, cols: 24 },\n}\n\nconst plateConfig = computed(() => PLATE_CONFIGS[props.format])\n\nconst rowLabels = computed(() =>\n Array.from({ length: plateConfig.value.rows }, (_, i) => String.fromCharCode(65 + i))\n)\n\nconst colLabels = computed(() =>\n Array.from({ length: plateConfig.value.cols }, (_, i) => i + 1)\n)\n\nconst wellGrid = computed(() => {\n const grid: Well[][] = []\n for (let row = 0; row < plateConfig.value.rows; row++) {\n const rowWells: Well[] = []\n for (let col = 0; col < plateConfig.value.cols; col++) {\n const id = `${rowLabels.value[row]}${col + 1}`\n const wellData = props.wells[id] || {}\n rowWells.push({\n id,\n row,\n col,\n state: wellData.state || 'empty',\n sampleType: wellData.sampleType,\n value: wellData.value,\n metadata: wellData.metadata,\n })\n }\n grid.push(rowWells)\n }\n return grid\n})\n\nconst selectedWellSet = computed(() => new Set(props.modelValue))\n\nconst dragSelectedWells = computed(() => {\n if (!isDragging.value || !dragStart.value || !dragEnd.value) return new Set<string>()\n\n const minRow = Math.min(dragStart.value.row, dragEnd.value.row)\n const maxRow = Math.max(dragStart.value.row, dragEnd.value.row)\n const minCol = Math.min(dragStart.value.col, dragEnd.value.col)\n const maxCol = Math.max(dragStart.value.col, dragEnd.value.col)\n\n const wells = new Set<string>()\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const id = `${rowLabels.value[row]}${col + 1}`\n wells.add(id)\n }\n }\n return wells\n})\n\n// Size presets with pixel values for reliable sizing\nconst sizeConfig = computed(() => {\n const sizes = {\n sm: { cellWidth: '40px', cellHeight: '40px', headerWidth: '32px', headerHeight: '32px', fontSize: '0.625rem', gap: '2px' },\n md: { cellWidth: '56px', cellHeight: '32px', headerWidth: '32px', headerHeight: '24px', fontSize: '0.75rem', gap: '3px' },\n lg: { cellWidth: '80px', cellHeight: '40px', headerWidth: '40px', headerHeight: '32px', fontSize: '0.875rem', gap: '4px' },\n xl: { cellWidth: '96px', cellHeight: '48px', headerWidth: '48px', headerHeight: '40px', fontSize: '1rem', gap: '4px' },\n fill: { cellWidth: '100%', cellHeight: '32px', headerWidth: '32px', headerHeight: '24px', fontSize: '0.75rem', gap: '2px' },\n }\n return sizes[props.size]\n})\n\nconst isFillMode = computed(() => props.size === 'fill')\n\n// Default legend items\nconst defaultLegendItems: WellLegendItem[] = [\n { type: 'sample', label: 'Sample', color: '#10b981' },\n { type: 'blank', label: 'Blank', color: '#f97316' },\n { type: 'qc', label: 'QC', color: '#8b5cf6' },\n]\n\nconst activeLegendItems = computed(() => props.legendItems ?? defaultLegendItems)\n\n// Sample type colors (matching MSExpDesigner)\nconst defaultSampleTypeColors: Record<string, { bg: string; border: string }> = {\n sample: { bg: 'rgba(16, 185, 129, 0.15)', border: 'rgba(16, 185, 129, 0.4)' },\n control: { bg: 'rgba(59, 130, 246, 0.15)', border: 'rgba(59, 130, 246, 0.4)' },\n blank: { bg: 'rgba(249, 115, 22, 0.15)', border: 'rgba(249, 115, 22, 0.4)' },\n qc: { bg: 'rgba(139, 92, 246, 0.15)', border: 'rgba(139, 92, 246, 0.4)' },\n}\n\nconst heatmapColors: Record<string, string[]> = {\n viridis: ['#440154', '#482878', '#3e4989', '#31688e', '#26828e', '#1f9e89', '#35b779', '#6ece58', '#b5de2b', '#fde725'],\n plasma: ['#0d0887', '#46039f', '#7201a8', '#9c179e', '#bd3786', '#d8576b', '#ed7953', '#fb9f3a', '#fdca26', '#f0f921'],\n turbo: ['#30123b', '#4145ab', '#4675ed', '#39a2fc', '#1bcfd4', '#24e79e', '#71f05f', '#c1f034', '#f1c83c', '#f99538', '#e45a31', '#ba2512', '#7a0403'],\n}\n\nfunction getHeatmapColor(value: number | undefined): string | null {\n if (!props.heatmap?.enabled || value === undefined) return null\n\n const min = props.heatmap.min ?? 0\n const max = props.heatmap.max ?? 1\n const normalized = Math.max(0, Math.min(1, (value - min) / (max - min)))\n\n const colors = props.heatmap.colorScale === 'custom' && props.heatmap.customColors?.length\n ? props.heatmap.customColors\n : heatmapColors[props.heatmap.colorScale || 'viridis']\n\n const index = Math.min(Math.floor(normalized * (colors.length - 1)), colors.length - 1)\n return colors[index]\n}\n\nfunction getWellClasses(well: Well): string[] {\n const isWellSelected = isSelected(well.id)\n const isDragOver = dragSelectedWells.value.has(well.id)\n const isHovered = hoveredWell.value === well.id\n const isDisabled = props.disabled || well.state === 'disabled'\n const isDragSource = dragSourceWell.value === well.id\n const isDragTarget = dragTargetWell.value === well.id\n\n const classes = [\n 'mld-well-plate__well',\n props.wellShape === 'circle' ? 'mld-well-plate__well--circle' : 'mld-well-plate__well--rounded',\n ]\n\n if (props.selectionMode === 'drag' && well.sampleType) {\n classes.push('mld-well-plate__well--draggable')\n }\n\n if (isDragSource) classes.push('mld-well-plate__well--drag-source')\n else if (isDragTarget) classes.push('mld-well-plate__well--drag-target')\n else if (isWellSelected) classes.push('mld-well-plate__well--selected')\n else if (isDragOver) classes.push('mld-well-plate__well--drag-over')\n else if (isHovered && !props.readonly) classes.push('mld-well-plate__well--hovered')\n\n if (isDisabled) classes.push('mld-well-plate__well--disabled')\n if (well.state === 'filled') classes.push('mld-well-plate__well--filled')\n\n return classes\n}\n\nfunction getWellStyle(well: Well): Record<string, string> {\n const heatmapColor = getHeatmapColor(well.value)\n if (heatmapColor) {\n return { backgroundColor: heatmapColor, border: '1px solid transparent' }\n }\n\n if (well.sampleType && props.sampleColors[well.sampleType]) {\n const color = props.sampleColors[well.sampleType]\n return {\n backgroundColor: `${color}26`,\n border: `1px solid ${color}66`,\n }\n }\n\n if (well.sampleType && defaultSampleTypeColors[well.sampleType]) {\n const colors = defaultSampleTypeColors[well.sampleType]\n return {\n backgroundColor: colors.bg,\n border: `1px solid ${colors.border}`,\n }\n }\n\n const borderStyle = well.state === 'filled' ? 'solid' : 'dashed'\n return {\n backgroundColor: 'var(--bg-tertiary)',\n border: `1px ${borderStyle} var(--border-color)`,\n }\n}\n\nfunction getSampleTypeIndicator(well: Well): string | null {\n if (!props.showSampleTypeIndicator || !well.sampleType) return null\n const typeMap: Record<string, string> = {\n sample: 'S',\n control: 'C',\n blank: 'B',\n qc: 'Q',\n }\n return typeMap[well.sampleType] || well.sampleType.charAt(0).toUpperCase()\n}\n\nfunction getWellLabel(well: Well): string | undefined {\n if (!props.showWellLabels) return undefined\n return well.metadata?.label as string | undefined\n}\n\nfunction getWellBadge(well: Well): { text: string; color: string } | null {\n if (!props.showBadges || !well.metadata) return null\n const count = well.metadata.injectionCount as number | undefined\n if (count && count > 1) {\n return { text: String(count), color: '#6366f1' }\n }\n if (well.metadata.customMethod) {\n return { text: '+', color: '#ec4899' }\n }\n return null\n}\n\nfunction isSelected(wellId: string): boolean {\n return selectedWellSet.value.has(wellId) || dragSelectedWells.value.has(wellId)\n}\n\nfunction handleWellClick(well: Well, event: MouseEvent) {\n if (props.disabled || props.readonly) return\n\n emit('well-click', well.id, event)\n\n // When editable, open popup instead of modifying selection\n if (props.editable) {\n openEditPopup(well.id, event)\n return\n }\n\n if (props.selectionMode === 'none') return\n\n const isCurrentlySelected = selectedWellSet.value.has(well.id)\n const isMultiSelect = event.shiftKey || event.metaKey || event.ctrlKey\n\n let newSelection: string[]\n if (props.selectionMode === 'single') {\n newSelection = isCurrentlySelected ? [] : [well.id]\n } else if (isMultiSelect) {\n newSelection = isCurrentlySelected\n ? props.modelValue.filter(id => id !== well.id)\n : [...props.modelValue, well.id]\n } else {\n newSelection = isCurrentlySelected && props.modelValue.length === 1 ? [] : [well.id]\n }\n\n emit('update:modelValue', newSelection)\n emit('selection-change', newSelection)\n}\n\nfunction openEditPopup(wellId: string, event: MouseEvent) {\n const target = event.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n editPopupPosition.value = {\n x: rect.right + 8,\n y: rect.top,\n }\n editingWellId.value = wellId\n}\n\nfunction handleEditSave(data: WellEditData) {\n emit('well-edit', data.wellId, data)\n editingWellId.value = null\n}\n\nfunction handleEditClear() {\n if (editingWellId.value) {\n emit('well-clear', editingWellId.value)\n }\n editingWellId.value = null\n}\n\nfunction handleEditClose() {\n editingWellId.value = null\n}\n\nfunction handleWellMouseDown(well: Well, event: MouseEvent) {\n if (props.disabled || props.readonly || props.selectionMode !== 'rectangle') return\n if (props.editable) return\n if (event.button !== 0) return\n\n isDragging.value = true\n dragStart.value = { row: well.row, col: well.col }\n dragEnd.value = { row: well.row, col: well.col }\n}\n\nfunction handleWellMouseEnter(well: Well, event: MouseEvent) {\n hoveredWell.value = well.id\n emit('well-hover', well.id, event)\n\n if (isDragging.value && props.selectionMode === 'rectangle') {\n dragEnd.value = { row: well.row, col: well.col }\n }\n}\n\nfunction handleWellMouseLeave() {\n hoveredWell.value = null\n emit('well-hover', null)\n}\n\nfunction handleMouseUp() {\n if (!isDragging.value || props.selectionMode !== 'rectangle') return\n\n const newSelection = Array.from(dragSelectedWells.value)\n isDragging.value = false\n dragStart.value = null\n dragEnd.value = null\n\n if (newSelection.length > 0) {\n emit('update:modelValue', newSelection)\n emit('selection-change', newSelection)\n }\n}\n\nfunction handleContextMenu(well: Well, event: MouseEvent) {\n event.preventDefault()\n emit('context-menu', well.id, event)\n}\n\n// Drag handlers for moving well contents\nfunction handleDragStart(well: Well, event: DragEvent) {\n if (props.disabled || props.readonly || props.selectionMode !== 'drag') return\n if (!well.sampleType) return\n\n dragSourceWell.value = well.id\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', well.id)\n }\n}\n\nfunction handleDragOver(well: Well, event: DragEvent) {\n if (props.selectionMode !== 'drag' || !dragSourceWell.value) return\n event.preventDefault()\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move'\n }\n dragTargetWell.value = well.id\n}\n\nfunction handleDragLeave() {\n dragTargetWell.value = null\n}\n\nfunction handleDrop(well: Well, event: DragEvent) {\n event.preventDefault()\n if (props.selectionMode !== 'drag' || !dragSourceWell.value) return\n\n const sourceId = dragSourceWell.value\n const targetId = well.id\n\n if (sourceId !== targetId) {\n emit('well-move', sourceId, targetId)\n }\n\n dragSourceWell.value = null\n dragTargetWell.value = null\n}\n\nfunction handleDragEnd() {\n dragSourceWell.value = null\n dragTargetWell.value = null\n}\n\nfunction handleKeyDown(event: KeyboardEvent) {\n if (props.disabled || props.readonly) return\n\n if (event.key === 'Escape') {\n if (editingWellId.value) {\n editingWellId.value = null\n return\n }\n emit('update:modelValue', [])\n emit('selection-change', [])\n }\n\n if ((event.key === 'a' || event.key === 'A') && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n const allWells = wellGrid.value.flat().map(w => w.id)\n emit('update:modelValue', allWells)\n emit('selection-change', allWells)\n }\n}\n\nonMounted(() => {\n document.addEventListener('mouseup', handleMouseUp)\n document.addEventListener('keydown', handleKeyDown)\n})\n\nonUnmounted(() => {\n document.removeEventListener('mouseup', handleMouseUp)\n document.removeEventListener('keydown', handleKeyDown)\n})\n\nconst containerStyle = computed(() =>\n isFillMode.value ? {} : {\n transform: `scale(${props.zoom})`,\n transformOrigin: 'top left',\n }\n)\n\nconst tableStyle = computed(() => ({\n borderCollapse: 'separate' as const,\n borderSpacing: sizeConfig.value.gap,\n ...(isFillMode.value ? { width: '100%', tableLayout: 'fixed' as const } : {}),\n}))\n</script>\n\n<template>\n <div\n ref=\"plateRef\"\n :class=\"['mld-well-plate', isFillMode ? 'mld-well-plate--fill' : 'mld-well-plate--inline']\"\n :style=\"containerStyle\"\n >\n <div class=\"mld-well-plate__scroll\">\n <div class=\"mld-well-plate__content\">\n <table\n ref=\"tableRef\"\n class=\"mld-well-plate__table\"\n role=\"grid\"\n :aria-label=\"`${props.format}-well plate`\"\n :style=\"tableStyle\"\n >\n <!-- Column headers -->\n <thead v-if=\"props.showLabels\">\n <tr>\n <th :style=\"{ width: sizeConfig.headerWidth, height: sizeConfig.headerHeight }\"></th>\n <th\n v-for=\"col in colLabels\"\n :key=\"col\"\n class=\"mld-well-plate__col-header\"\n :style=\"{ height: sizeConfig.headerHeight, fontSize: sizeConfig.fontSize }\"\n >\n {{ col }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, rowIndex) in wellGrid\" :key=\"rowIndex\" role=\"row\">\n <!-- Row header -->\n <td\n v-if=\"props.showLabels\"\n class=\"mld-well-plate__row-header\"\n :style=\"{ width: sizeConfig.headerWidth, height: sizeConfig.cellHeight, minWidth: sizeConfig.headerWidth, minHeight: sizeConfig.cellHeight, fontSize: sizeConfig.fontSize }\"\n >\n {{ rowLabels[rowIndex] }}\n </td>\n\n <!-- Wells -->\n <td v-for=\"well in row\" :key=\"well.id\" class=\"mld-well-plate__cell\">\n <div\n role=\"gridcell\"\n tabindex=\"0\"\n :aria-label=\"`Well ${well.id}${well.sampleType ? `, Sample type: ${well.sampleType}` : ''}${well.value !== undefined ? `, Value: ${well.value}` : ''}`\"\n :aria-selected=\"isSelected(well.id)\"\n :aria-disabled=\"props.disabled || well.state === 'disabled'\"\n :draggable=\"props.selectionMode === 'drag' && !!well.sampleType\"\n :class=\"getWellClasses(well)\"\n :style=\"{\n width: isFillMode ? '100%' : sizeConfig.cellWidth,\n height: sizeConfig.cellHeight,\n minWidth: isFillMode ? '0' : sizeConfig.cellWidth,\n minHeight: sizeConfig.cellHeight,\n boxSizing: 'border-box',\n fontSize: sizeConfig.fontSize,\n ...getWellStyle(well),\n }\"\n :title=\"`${well.id}${well.sampleType ? `: ${well.sampleType}` : ''}${getWellLabel(well) ? ` - ${getWellLabel(well)}` : ''}`\"\n @click=\"handleWellClick(well, $event)\"\n @mousedown=\"handleWellMouseDown(well, $event)\"\n @mouseenter=\"handleWellMouseEnter(well, $event)\"\n @mouseleave=\"handleWellMouseLeave\"\n @contextmenu=\"handleContextMenu(well, $event)\"\n @dragstart=\"handleDragStart(well, $event)\"\n @dragover.prevent=\"handleDragOver(well, $event)\"\n @dragleave=\"handleDragLeave\"\n @drop.prevent=\"handleDrop(well, $event)\"\n @dragend=\"handleDragEnd\"\n @keydown.enter=\"handleWellClick(well, $event as unknown as MouseEvent)\"\n @keydown.space.prevent=\"handleWellClick(well, $event as unknown as MouseEvent)\"\n >\n <!-- Well label text (from metadata.label) -->\n <span\n v-if=\"getWellLabel(well)\"\n class=\"mld-well-plate__label\"\n >\n {{ getWellLabel(well) }}\n </span>\n <!-- Sample type indicator (S/B/Q/C) -->\n <span\n v-else-if=\"getSampleTypeIndicator(well)\"\n class=\"mld-well-plate__indicator\"\n >\n {{ getSampleTypeIndicator(well) }}\n </span>\n <!-- Well ID -->\n <span\n v-else-if=\"props.showWellIds\"\n class=\"mld-well-plate__well-id\"\n >\n {{ well.id }}\n </span>\n\n <!-- Badge (injection count or custom method) -->\n <span\n v-if=\"getWellBadge(well)\"\n class=\"mld-well-plate__badge\"\n :style=\"{ backgroundColor: getWellBadge(well)!.color }\"\n :title=\"getWellBadge(well)!.text === '+' ? 'Custom method' : `${getWellBadge(well)!.text}x injections`\"\n >\n {{ getWellBadge(well)!.text }}\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- Heatmap legend (inside content wrapper to match table width) -->\n <div\n v-if=\"props.heatmap?.enabled && props.heatmap.showLegend\"\n class=\"mld-well-plate__legend\"\n >\n <span class=\"mld-well-plate__legend-label\">{{ props.heatmap.min ?? 0 }}</span>\n <div class=\"mld-well-plate__legend-bar\">\n <div\n v-for=\"(color, index) in (props.heatmap.colorScale === 'custom' && props.heatmap.customColors?.length ? props.heatmap.customColors : heatmapColors[props.heatmap.colorScale || 'viridis'])\"\n :key=\"index\"\n class=\"mld-well-plate__legend-segment\"\n :style=\"{ backgroundColor: color }\"\n />\n </div>\n <span class=\"mld-well-plate__legend-label\">{{ props.heatmap.max ?? 1 }}</span>\n </div>\n\n <!-- Sample type legend bar -->\n <div v-if=\"props.showLegend\" class=\"mld-well-plate__sample-legend\">\n <div\n v-for=\"item in activeLegendItems\"\n :key=\"item.type\"\n class=\"mld-well-plate__sample-legend-item\"\n >\n <span\n class=\"mld-well-plate__sample-legend-dot\"\n :style=\"{ backgroundColor: `${item.color}26`, border: `1px solid ${item.color}66` }\"\n />\n <span class=\"mld-well-plate__sample-legend-text\">{{ item.label }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit popup -->\n <WellEditPopup\n v-if=\"editable && editingWellId\"\n :well-id=\"editingWellId\"\n :well-data=\"wells[editingWellId]\"\n :edit-fields=\"editFields\"\n :default-injection-volume=\"defaultInjectionVolume\"\n :position=\"editPopupPosition\"\n @save=\"handleEditSave\"\n @clear=\"handleEditClear\"\n @close=\"handleEditClose\"\n />\n </div>\n</template>\n\n<style>\n@import '../styles/components/well-plate.css';\n</style>\n"],"names":["_createElementBlock","_createElementVNode","_Fragment","_renderList","_openBlock","_toDisplayString","_normalizeClass","_normalizeStyle","_withModifiers","_createBlock","WellEditPopup"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WellPlate.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export { default as BaseButton } from './BaseButton.vue';
|
|
2
|
+
export { default as BaseInput } from './BaseInput.vue';
|
|
3
|
+
export { default as BaseTextarea } from './BaseTextarea.vue';
|
|
4
|
+
export { default as BaseSelect } from './BaseSelect.vue';
|
|
5
|
+
export { default as BaseCheckbox } from './BaseCheckbox.vue';
|
|
6
|
+
export { default as BaseToggle } from './BaseToggle.vue';
|
|
7
|
+
export { default as BaseRadioGroup } from './BaseRadioGroup.vue';
|
|
8
|
+
export { default as BaseSlider } from './BaseSlider.vue';
|
|
9
|
+
export { default as ColorSlider } from './ColorSlider.vue';
|
|
10
|
+
export { default as BaseTabs } from './BaseTabs.vue';
|
|
11
|
+
export { default as BaseModal } from './BaseModal.vue';
|
|
12
|
+
export { default as SegmentedControl } from './SegmentedControl.vue';
|
|
13
|
+
export { default as MultiSelect } from './MultiSelect.vue';
|
|
14
|
+
export { default as BasePill } from './BasePill.vue';
|
|
15
|
+
export { default as DropdownButton } from './DropdownButton.vue';
|
|
16
|
+
export { default as Calendar } from './Calendar.vue';
|
|
17
|
+
export { default as DataFrame } from './DataFrame.vue';
|
|
18
|
+
export { default as FormField } from './FormField.vue';
|
|
19
|
+
export { default as DatePicker } from './DatePicker.vue';
|
|
20
|
+
export { default as TimePicker } from './TimePicker.vue';
|
|
21
|
+
export { default as TagsInput } from './TagsInput.vue';
|
|
22
|
+
export { default as NumberInput } from './NumberInput.vue';
|
|
23
|
+
export { default as FileUploader } from './FileUploader.vue';
|
|
24
|
+
export { default as AlertBox } from './AlertBox.vue';
|
|
25
|
+
export { default as ToastNotification } from './ToastNotification.vue';
|
|
26
|
+
export { default as IconButton } from './IconButton.vue';
|
|
27
|
+
export { default as ThemeToggle } from './ThemeToggle.vue';
|
|
28
|
+
export { default as SettingsButton } from './SettingsButton.vue';
|
|
29
|
+
export { default as CollapsibleCard } from './CollapsibleCard.vue';
|
|
30
|
+
export { default as AppTopBar } from './AppTopBar.vue';
|
|
31
|
+
export { default as AppSidebar } from './AppSidebar.vue';
|
|
32
|
+
export { default as AppLayout } from './AppLayout.vue';
|
|
33
|
+
export { default as AppContainer } from './AppContainer.vue';
|
|
34
|
+
export { default as Skeleton } from './Skeleton.vue';
|
|
35
|
+
export { default as LoadingSpinner } from './LoadingSpinner.vue';
|
|
36
|
+
export { default as Divider } from './Divider.vue';
|
|
37
|
+
export { default as StatusIndicator } from './StatusIndicator.vue';
|
|
38
|
+
export { default as ProgressBar } from './ProgressBar.vue';
|
|
39
|
+
export { default as Avatar } from './Avatar.vue';
|
|
40
|
+
export { default as EmptyState } from './EmptyState.vue';
|
|
41
|
+
export { default as Breadcrumb } from './Breadcrumb.vue';
|
|
42
|
+
export { default as Tooltip } from './Tooltip.vue';
|
|
43
|
+
export { default as ConfirmDialog } from './ConfirmDialog.vue';
|
|
44
|
+
export { default as ChartContainer } from './ChartContainer.vue';
|
|
45
|
+
export { default as SettingsModal } from './SettingsModal.vue';
|
|
46
|
+
export { default as WellPlate } from './WellPlate.vue';
|
|
47
|
+
export { default as RackEditor } from './RackEditor.vue';
|
|
48
|
+
export { default as SampleLegend } from './SampleLegend.vue';
|
|
49
|
+
export { default as PlateMapEditor } from './PlateMapEditor.vue';
|
|
50
|
+
export { default as ExperimentTimeline } from './ExperimentTimeline.vue';
|
|
51
|
+
export { default as SampleSelector } from './SampleSelector.vue';
|
|
52
|
+
export { default as GroupingModal } from './GroupingModal.vue';
|
|
53
|
+
export { default as GroupAssigner } from './GroupAssigner.vue';
|
|
54
|
+
export { default as MoleculeInput } from './MoleculeInput.vue';
|
|
55
|
+
export { default as ConcentrationInput } from './ConcentrationInput.vue';
|
|
56
|
+
export { default as DoseCalculator } from './DoseCalculator.vue';
|
|
57
|
+
export { default as ReagentList } from './ReagentList.vue';
|
|
58
|
+
export { default as SampleHierarchyTree } from './SampleHierarchyTree.vue';
|
|
59
|
+
export { default as ProtocolStepEditor } from './ProtocolStepEditor.vue';
|
|
60
|
+
export { default as ScientificNumber } from './ScientificNumber.vue';
|
|
61
|
+
export { default as ChemicalFormula } from './ChemicalFormula.vue';
|
|
62
|
+
export { default as FormulaInput } from './FormulaInput.vue';
|
|
63
|
+
export { default as SequenceInput } from './SequenceInput.vue';
|
|
64
|
+
export { default as UnitInput } from './UnitInput.vue';
|
|
65
|
+
export { default as StepWizard } from './StepWizard.vue';
|
|
66
|
+
export { default as AuditTrail } from './AuditTrail.vue';
|
|
67
|
+
export { default as BatchProgressList } from './BatchProgressList.vue';
|
|
68
|
+
export { default as DateTimePicker } from './DateTimePicker.vue';
|
|
69
|
+
export { default as TimeRangeInput } from './TimeRangeInput.vue';
|
|
70
|
+
export { default as ScheduleCalendar } from './ScheduleCalendar.vue';
|
|
71
|
+
export { default as ResourceCard } from './ResourceCard.vue';
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { default as default2 } from "./BaseButton.vue.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import { default as default3 } from "./BaseInput.vue.js";
|
|
4
|
+
/* empty css */
|
|
5
|
+
import { default as default4 } from "./BaseTextarea.vue.js";
|
|
6
|
+
/* empty css */
|
|
7
|
+
import { default as default5 } from "./BaseSelect.vue.js";
|
|
8
|
+
/* empty css */
|
|
9
|
+
import { default as default6 } from "./BaseCheckbox.vue.js";
|
|
10
|
+
/* empty css */
|
|
11
|
+
import { default as default7 } from "./BaseToggle.vue.js";
|
|
12
|
+
/* empty css */
|
|
13
|
+
import { default as default8 } from "./BaseRadioGroup.vue.js";
|
|
14
|
+
/* empty css */
|
|
15
|
+
import { default as default9 } from "./BaseSlider.vue.js";
|
|
16
|
+
/* empty css */
|
|
17
|
+
import { default as default10 } from "./ColorSlider.vue.js";
|
|
18
|
+
/* empty css */
|
|
19
|
+
import { default as default11 } from "./BaseTabs.vue.js";
|
|
20
|
+
/* empty css */
|
|
21
|
+
import { default as default12 } from "./BaseModal.vue.js";
|
|
22
|
+
/* empty css */
|
|
23
|
+
import { default as default13 } from "./SegmentedControl.vue.js";
|
|
24
|
+
/* empty css */
|
|
25
|
+
import { default as default14 } from "./MultiSelect.vue.js";
|
|
26
|
+
/* empty css */
|
|
27
|
+
import { default as default15 } from "./BasePill.vue.js";
|
|
28
|
+
/* empty css */
|
|
29
|
+
import { default as default16 } from "./DropdownButton.vue.js";
|
|
30
|
+
/* empty css */
|
|
31
|
+
import { default as default17 } from "./Calendar.vue.js";
|
|
32
|
+
/* empty css */
|
|
33
|
+
import { default as default18 } from "./DataFrame.vue.js";
|
|
34
|
+
/* empty css */
|
|
35
|
+
import { default as default19 } from "./FormField.vue.js";
|
|
36
|
+
/* empty css */
|
|
37
|
+
import { default as default20 } from "./DatePicker.vue.js";
|
|
38
|
+
/* empty css */
|
|
39
|
+
import { default as default21 } from "./TimePicker.vue.js";
|
|
40
|
+
/* empty css */
|
|
41
|
+
import { default as default22 } from "./TagsInput.vue.js";
|
|
42
|
+
/* empty css */
|
|
43
|
+
import { default as default23 } from "./NumberInput.vue.js";
|
|
44
|
+
/* empty css */
|
|
45
|
+
import { default as default24 } from "./FileUploader.vue.js";
|
|
46
|
+
/* empty css */
|
|
47
|
+
import { default as default25 } from "./AlertBox.vue.js";
|
|
48
|
+
/* empty css */
|
|
49
|
+
import { default as default26 } from "./ToastNotification.vue.js";
|
|
50
|
+
/* empty css */
|
|
51
|
+
import { default as default27 } from "./IconButton.vue.js";
|
|
52
|
+
/* empty css */
|
|
53
|
+
import { default as default28 } from "./ThemeToggle.vue.js";
|
|
54
|
+
/* empty css */
|
|
55
|
+
import { default as default29 } from "./SettingsButton.vue.js";
|
|
56
|
+
/* empty css */
|
|
57
|
+
import { default as default30 } from "./CollapsibleCard.vue.js";
|
|
58
|
+
/* empty css */
|
|
59
|
+
import { default as default31 } from "./AppTopBar.vue.js";
|
|
60
|
+
/* empty css */
|
|
61
|
+
import { default as default32 } from "./AppSidebar.vue.js";
|
|
62
|
+
/* empty css */
|
|
63
|
+
import { default as default33 } from "./AppLayout.vue.js";
|
|
64
|
+
/* empty css */
|
|
65
|
+
import { default as default34 } from "./AppContainer.vue.js";
|
|
66
|
+
import { default as default35 } from "./Skeleton.vue.js";
|
|
67
|
+
/* empty css */
|
|
68
|
+
import { default as default36 } from "./LoadingSpinner.vue.js";
|
|
69
|
+
/* empty css */
|
|
70
|
+
import { default as default37 } from "./Divider.vue.js";
|
|
71
|
+
/* empty css */
|
|
72
|
+
import { default as default38 } from "./StatusIndicator.vue.js";
|
|
73
|
+
/* empty css */
|
|
74
|
+
import { default as default39 } from "./ProgressBar.vue.js";
|
|
75
|
+
/* empty css */
|
|
76
|
+
import { default as default40 } from "./Avatar.vue.js";
|
|
77
|
+
/* empty css */
|
|
78
|
+
import { default as default41 } from "./EmptyState.vue.js";
|
|
79
|
+
/* empty css */
|
|
80
|
+
import { default as default42 } from "./Breadcrumb.vue.js";
|
|
81
|
+
/* empty css */
|
|
82
|
+
import { default as default43 } from "./Tooltip.vue.js";
|
|
83
|
+
/* empty css */
|
|
84
|
+
import { default as default44 } from "./ConfirmDialog.vue.js";
|
|
85
|
+
/* empty css */
|
|
86
|
+
import { default as default45 } from "./ChartContainer.vue.js";
|
|
87
|
+
/* empty css */
|
|
88
|
+
import { default as default46 } from "./SettingsModal.vue.js";
|
|
89
|
+
/* empty css */
|
|
90
|
+
import { default as default47 } from "./WellPlate.vue.js";
|
|
91
|
+
/* empty css */
|
|
92
|
+
import { default as default48 } from "./RackEditor.vue.js";
|
|
93
|
+
/* empty css */
|
|
94
|
+
import { default as default49 } from "./SampleLegend.vue.js";
|
|
95
|
+
/* empty css */
|
|
96
|
+
import { default as default50 } from "./PlateMapEditor.vue.js";
|
|
97
|
+
/* empty css */
|
|
98
|
+
import { default as default51 } from "./ExperimentTimeline.vue.js";
|
|
99
|
+
/* empty css */
|
|
100
|
+
import { default as default52 } from "./SampleSelector.vue.js";
|
|
101
|
+
/* empty css */
|
|
102
|
+
import { default as default53 } from "./GroupingModal.vue.js";
|
|
103
|
+
/* empty css */
|
|
104
|
+
import { default as default54 } from "./GroupAssigner.vue.js";
|
|
105
|
+
/* empty css */
|
|
106
|
+
import { default as default55 } from "./MoleculeInput.vue.js";
|
|
107
|
+
/* empty css */
|
|
108
|
+
import { default as default56 } from "./ConcentrationInput.vue.js";
|
|
109
|
+
/* empty css */
|
|
110
|
+
import { default as default57 } from "./DoseCalculator.vue.js";
|
|
111
|
+
/* empty css */
|
|
112
|
+
import { default as default58 } from "./ReagentList.vue.js";
|
|
113
|
+
/* empty css */
|
|
114
|
+
import { default as default59 } from "./SampleHierarchyTree.vue.js";
|
|
115
|
+
/* empty css */
|
|
116
|
+
import { default as default60 } from "./ProtocolStepEditor.vue.js";
|
|
117
|
+
/* empty css */
|
|
118
|
+
import { default as default61 } from "./ScientificNumber.vue.js";
|
|
119
|
+
/* empty css */
|
|
120
|
+
import { default as default62 } from "./ChemicalFormula.vue.js";
|
|
121
|
+
/* empty css */
|
|
122
|
+
import { default as default63 } from "./FormulaInput.vue.js";
|
|
123
|
+
/* empty css */
|
|
124
|
+
import { default as default64 } from "./SequenceInput.vue.js";
|
|
125
|
+
/* empty css */
|
|
126
|
+
import { default as default65 } from "./UnitInput.vue.js";
|
|
127
|
+
/* empty css */
|
|
128
|
+
import { default as default66 } from "./StepWizard.vue.js";
|
|
129
|
+
/* empty css */
|
|
130
|
+
import { default as default67 } from "./AuditTrail.vue.js";
|
|
131
|
+
/* empty css */
|
|
132
|
+
import { default as default68 } from "./BatchProgressList.vue.js";
|
|
133
|
+
/* empty css */
|
|
134
|
+
import { default as default69 } from "./DateTimePicker.vue.js";
|
|
135
|
+
/* empty css */
|
|
136
|
+
import { default as default70 } from "./TimeRangeInput.vue.js";
|
|
137
|
+
/* empty css */
|
|
138
|
+
import { default as default71 } from "./ScheduleCalendar.vue.js";
|
|
139
|
+
/* empty css */
|
|
140
|
+
import { default as default72 } from "./ResourceCard.vue.js";
|
|
141
|
+
/* empty css */
|
|
142
|
+
export {
|
|
143
|
+
default25 as AlertBox,
|
|
144
|
+
default34 as AppContainer,
|
|
145
|
+
default33 as AppLayout,
|
|
146
|
+
default32 as AppSidebar,
|
|
147
|
+
default31 as AppTopBar,
|
|
148
|
+
default67 as AuditTrail,
|
|
149
|
+
default40 as Avatar,
|
|
150
|
+
default2 as BaseButton,
|
|
151
|
+
default6 as BaseCheckbox,
|
|
152
|
+
default3 as BaseInput,
|
|
153
|
+
default12 as BaseModal,
|
|
154
|
+
default15 as BasePill,
|
|
155
|
+
default8 as BaseRadioGroup,
|
|
156
|
+
default5 as BaseSelect,
|
|
157
|
+
default9 as BaseSlider,
|
|
158
|
+
default11 as BaseTabs,
|
|
159
|
+
default4 as BaseTextarea,
|
|
160
|
+
default7 as BaseToggle,
|
|
161
|
+
default68 as BatchProgressList,
|
|
162
|
+
default42 as Breadcrumb,
|
|
163
|
+
default17 as Calendar,
|
|
164
|
+
default45 as ChartContainer,
|
|
165
|
+
default62 as ChemicalFormula,
|
|
166
|
+
default30 as CollapsibleCard,
|
|
167
|
+
default10 as ColorSlider,
|
|
168
|
+
default56 as ConcentrationInput,
|
|
169
|
+
default44 as ConfirmDialog,
|
|
170
|
+
default18 as DataFrame,
|
|
171
|
+
default20 as DatePicker,
|
|
172
|
+
default69 as DateTimePicker,
|
|
173
|
+
default37 as Divider,
|
|
174
|
+
default57 as DoseCalculator,
|
|
175
|
+
default16 as DropdownButton,
|
|
176
|
+
default41 as EmptyState,
|
|
177
|
+
default51 as ExperimentTimeline,
|
|
178
|
+
default24 as FileUploader,
|
|
179
|
+
default19 as FormField,
|
|
180
|
+
default63 as FormulaInput,
|
|
181
|
+
default54 as GroupAssigner,
|
|
182
|
+
default53 as GroupingModal,
|
|
183
|
+
default27 as IconButton,
|
|
184
|
+
default36 as LoadingSpinner,
|
|
185
|
+
default55 as MoleculeInput,
|
|
186
|
+
default14 as MultiSelect,
|
|
187
|
+
default23 as NumberInput,
|
|
188
|
+
default50 as PlateMapEditor,
|
|
189
|
+
default39 as ProgressBar,
|
|
190
|
+
default60 as ProtocolStepEditor,
|
|
191
|
+
default48 as RackEditor,
|
|
192
|
+
default58 as ReagentList,
|
|
193
|
+
default72 as ResourceCard,
|
|
194
|
+
default59 as SampleHierarchyTree,
|
|
195
|
+
default49 as SampleLegend,
|
|
196
|
+
default52 as SampleSelector,
|
|
197
|
+
default71 as ScheduleCalendar,
|
|
198
|
+
default61 as ScientificNumber,
|
|
199
|
+
default13 as SegmentedControl,
|
|
200
|
+
default64 as SequenceInput,
|
|
201
|
+
default29 as SettingsButton,
|
|
202
|
+
default46 as SettingsModal,
|
|
203
|
+
default35 as Skeleton,
|
|
204
|
+
default38 as StatusIndicator,
|
|
205
|
+
default66 as StepWizard,
|
|
206
|
+
default22 as TagsInput,
|
|
207
|
+
default28 as ThemeToggle,
|
|
208
|
+
default21 as TimePicker,
|
|
209
|
+
default70 as TimeRangeInput,
|
|
210
|
+
default26 as ToastNotification,
|
|
211
|
+
default43 as Tooltip,
|
|
212
|
+
default65 as UnitInput,
|
|
213
|
+
default47 as WellPlate
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { useApi, type ApiClientOptions } from './useApi';
|
|
2
|
+
export { useAuth } from './useAuth';
|
|
3
|
+
export { usePasskey } from './usePasskey';
|
|
4
|
+
export { useTheme } from './useTheme';
|
|
5
|
+
export { useToast } from './useToast';
|
|
6
|
+
export { usePlatformContext } from './usePlatformContext';
|
|
7
|
+
export { useForm, type ValidationRule, type FieldRules, type FieldState, type UseFormReturn, } from './useForm';
|
|
8
|
+
export { useAsync, useAsyncBatch, type AsyncError, type AsyncState, type UseAsyncReturn, type UseAsyncOptions, } from './useAsync';
|
|
9
|
+
export { useWellPlateEditor, type UseWellPlateEditorOptions, type UseWellPlateEditorReturn, } from './useWellPlateEditor';
|
|
10
|
+
export { useConcentrationUnits, type ConcentrationValue, type ConcentrationUnit, type MolarityUnit, type MassVolumeUnit, type PercentageUnit, type UnitCategory, type UseConcentrationUnitsReturn, } from './useConcentrationUnits';
|
|
11
|
+
export { useDoseCalculator, type VolumeUnit, type VolumeValue, type DilutionParams, type DilutionResult, type SerialDilutionParams, type SerialDilutionStep, type SerialDilutionResult, type WellConcentration, type UseDoseCalculatorReturn, } from './useDoseCalculator';
|
|
12
|
+
export { useProtocolTemplates, type ParameterDefinition, type StepTemplate, type ValidationResult, type UseProtocolTemplatesReturn, } from './useProtocolTemplates';
|
|
13
|
+
export { useRackEditor, type UseRackEditorOptions, type UseRackEditorReturn, } from './useRackEditor';
|
|
14
|
+
export { useChemicalFormula, ATOMIC_WEIGHTS, type ParsedElement, type FormulaParseResult, type FormulaPart, type FormulaPartType, } from './useChemicalFormula';
|
|
15
|
+
export { useSequenceUtils, type SequenceType, type SequenceStats, } from './useSequenceUtils';
|
|
16
|
+
export { parseTime, formatTime, generateTimeSlots, rangesOverlap, durationMinutes, formatDuration, isTimeInRange, findAvailableSlots, snapToSlot, addMinutes, compareTime, } from './useTimeUtils';
|
|
17
|
+
export { useScheduleDrag } from './useScheduleDrag';
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useApi } from "./useApi.js";
|
|
2
|
+
import { useAuth } from "./useAuth.js";
|
|
3
|
+
import { usePasskey } from "./usePasskey.js";
|
|
4
|
+
import { useTheme } from "./useTheme.js";
|
|
5
|
+
import { useToast } from "./useToast.js";
|
|
6
|
+
import { usePlatformContext } from "./usePlatformContext.js";
|
|
7
|
+
import { useForm } from "./useForm.js";
|
|
8
|
+
import { useAsync, useAsyncBatch } from "./useAsync.js";
|
|
9
|
+
import { useWellPlateEditor } from "./useWellPlateEditor.js";
|
|
10
|
+
import { useConcentrationUnits } from "./useConcentrationUnits.js";
|
|
11
|
+
import { useDoseCalculator } from "./useDoseCalculator.js";
|
|
12
|
+
import { useProtocolTemplates } from "./useProtocolTemplates.js";
|
|
13
|
+
import { useRackEditor } from "./useRackEditor.js";
|
|
14
|
+
import { ATOMIC_WEIGHTS, useChemicalFormula } from "./useChemicalFormula.js";
|
|
15
|
+
import { useSequenceUtils } from "./useSequenceUtils.js";
|
|
16
|
+
import { addMinutes, compareTime, durationMinutes, findAvailableSlots, formatDuration, formatTime, generateTimeSlots, isTimeInRange, parseTime, rangesOverlap, snapToSlot } from "./useTimeUtils.js";
|
|
17
|
+
import { useScheduleDrag } from "./useScheduleDrag.js";
|
|
18
|
+
export {
|
|
19
|
+
ATOMIC_WEIGHTS,
|
|
20
|
+
addMinutes,
|
|
21
|
+
compareTime,
|
|
22
|
+
durationMinutes,
|
|
23
|
+
findAvailableSlots,
|
|
24
|
+
formatDuration,
|
|
25
|
+
formatTime,
|
|
26
|
+
generateTimeSlots,
|
|
27
|
+
isTimeInRange,
|
|
28
|
+
parseTime,
|
|
29
|
+
rangesOverlap,
|
|
30
|
+
snapToSlot,
|
|
31
|
+
useApi,
|
|
32
|
+
useAsync,
|
|
33
|
+
useAsyncBatch,
|
|
34
|
+
useAuth,
|
|
35
|
+
useChemicalFormula,
|
|
36
|
+
useConcentrationUnits,
|
|
37
|
+
useDoseCalculator,
|
|
38
|
+
useForm,
|
|
39
|
+
usePasskey,
|
|
40
|
+
usePlatformContext,
|
|
41
|
+
useProtocolTemplates,
|
|
42
|
+
useRackEditor,
|
|
43
|
+
useScheduleDrag,
|
|
44
|
+
useSequenceUtils,
|
|
45
|
+
useTheme,
|
|
46
|
+
useToast,
|
|
47
|
+
useWellPlateEditor
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AxiosInstance, AxiosRequestConfig } from 'axios';
|
|
2
|
+
export interface ApiClientOptions {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
withAuth?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface UseApiReturn {
|
|
8
|
+
client: AxiosInstance;
|
|
9
|
+
get: <T>(url: string, config?: AxiosRequestConfig) => Promise<T>;
|
|
10
|
+
post: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>;
|
|
11
|
+
put: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>;
|
|
12
|
+
patch: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>;
|
|
13
|
+
delete: <T>(url: string, config?: AxiosRequestConfig) => Promise<T>;
|
|
14
|
+
upload: <T>(url: string, file: File, fieldName?: string, additionalData?: Record<string, unknown>) => Promise<T>;
|
|
15
|
+
download: (url: string, filename?: string) => Promise<string>;
|
|
16
|
+
buildUrl: (path: string) => string;
|
|
17
|
+
buildWsUrl: (path: string) => string;
|
|
18
|
+
}
|
|
19
|
+
export declare function useApi(options?: ApiClientOptions): UseApiReturn;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { useSettingsStore } from "../stores/settings.js";
|
|
3
|
+
import { useAuthStore } from "../stores/auth.js";
|
|
4
|
+
let apiClientInstance = null;
|
|
5
|
+
let interceptorAttached = false;
|
|
6
|
+
function getApiClient() {
|
|
7
|
+
if (!apiClientInstance) {
|
|
8
|
+
apiClientInstance = axios.create({
|
|
9
|
+
headers: {
|
|
10
|
+
"Content-Type": "application/json"
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return apiClientInstance;
|
|
15
|
+
}
|
|
16
|
+
function useApi(options = {}) {
|
|
17
|
+
const settingsStore = useSettingsStore();
|
|
18
|
+
const authStore = useAuthStore();
|
|
19
|
+
const apiClient = getApiClient();
|
|
20
|
+
if (!interceptorAttached) {
|
|
21
|
+
apiClient.interceptors.request.use((config) => {
|
|
22
|
+
config.baseURL = options.baseUrl ?? settingsStore.getApiBaseUrl();
|
|
23
|
+
config.timeout = options.timeout ?? settingsStore.requestTimeout;
|
|
24
|
+
if (options.withAuth !== false && authStore.token) {
|
|
25
|
+
config.headers.Authorization = `Bearer ${authStore.token}`;
|
|
26
|
+
}
|
|
27
|
+
return config;
|
|
28
|
+
});
|
|
29
|
+
interceptorAttached = true;
|
|
30
|
+
}
|
|
31
|
+
async function get(url, config) {
|
|
32
|
+
const response = await apiClient.get(url, config);
|
|
33
|
+
return response.data;
|
|
34
|
+
}
|
|
35
|
+
async function post(url, data, config) {
|
|
36
|
+
const response = await apiClient.post(url, data, config);
|
|
37
|
+
return response.data;
|
|
38
|
+
}
|
|
39
|
+
async function put(url, data, config) {
|
|
40
|
+
const response = await apiClient.put(url, data, config);
|
|
41
|
+
return response.data;
|
|
42
|
+
}
|
|
43
|
+
async function patch(url, data, config) {
|
|
44
|
+
const response = await apiClient.patch(url, data, config);
|
|
45
|
+
return response.data;
|
|
46
|
+
}
|
|
47
|
+
async function del(url, config) {
|
|
48
|
+
const response = await apiClient.delete(url, config);
|
|
49
|
+
return response.data;
|
|
50
|
+
}
|
|
51
|
+
async function upload(url, file, fieldName = "file", additionalData) {
|
|
52
|
+
const formData = new FormData();
|
|
53
|
+
formData.append(fieldName, file);
|
|
54
|
+
if (additionalData) {
|
|
55
|
+
Object.entries(additionalData).forEach(([key, value]) => {
|
|
56
|
+
if (value !== void 0 && value !== null) {
|
|
57
|
+
formData.append(key, typeof value === "object" ? JSON.stringify(value) : String(value));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const response = await apiClient.post(url, formData, {
|
|
62
|
+
headers: { "Content-Type": "multipart/form-data" }
|
|
63
|
+
});
|
|
64
|
+
return response.data;
|
|
65
|
+
}
|
|
66
|
+
async function download(url, filename) {
|
|
67
|
+
const response = await apiClient.get(url, { responseType: "blob" });
|
|
68
|
+
const blob = new Blob([response.data]);
|
|
69
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
70
|
+
if (filename) {
|
|
71
|
+
const link = document.createElement("a");
|
|
72
|
+
link.href = blobUrl;
|
|
73
|
+
link.download = filename;
|
|
74
|
+
link.click();
|
|
75
|
+
}
|
|
76
|
+
return blobUrl;
|
|
77
|
+
}
|
|
78
|
+
function buildUrl(path) {
|
|
79
|
+
const baseUrl = options.baseUrl ?? settingsStore.getApiBaseUrl();
|
|
80
|
+
return `${baseUrl}${path}`;
|
|
81
|
+
}
|
|
82
|
+
function buildWsUrl(path) {
|
|
83
|
+
return `${settingsStore.getWsBaseUrl()}${path}`;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
client: apiClient,
|
|
87
|
+
get,
|
|
88
|
+
post,
|
|
89
|
+
put,
|
|
90
|
+
patch,
|
|
91
|
+
delete: del,
|
|
92
|
+
upload,
|
|
93
|
+
download,
|
|
94
|
+
buildUrl,
|
|
95
|
+
buildWsUrl
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
useApi
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=useApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApi.js","sources":["../../src/composables/useApi.ts"],"sourcesContent":["import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'\nimport { useSettingsStore } from '../stores/settings'\nimport { useAuthStore } from '../stores/auth'\n\nlet apiClientInstance: AxiosInstance | null = null\nlet interceptorAttached = false\n\nfunction getApiClient(): AxiosInstance {\n if (!apiClientInstance) {\n apiClientInstance = axios.create({\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n }\n return apiClientInstance\n}\n\nexport interface ApiClientOptions {\n baseUrl?: string\n timeout?: number\n withAuth?: boolean\n}\n\nexport interface UseApiReturn {\n client: AxiosInstance\n get: <T>(url: string, config?: AxiosRequestConfig) => Promise<T>\n post: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>\n put: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>\n patch: <T>(url: string, data?: unknown, config?: AxiosRequestConfig) => Promise<T>\n delete: <T>(url: string, config?: AxiosRequestConfig) => Promise<T>\n upload: <T>(url: string, file: File, fieldName?: string, additionalData?: Record<string, unknown>) => Promise<T>\n download: (url: string, filename?: string) => Promise<string>\n buildUrl: (path: string) => string\n buildWsUrl: (path: string) => string\n}\n\nexport function useApi(options: ApiClientOptions = {}): UseApiReturn {\n const settingsStore = useSettingsStore()\n const authStore = useAuthStore()\n const apiClient = getApiClient()\n\n // Attach interceptor only once\n if (!interceptorAttached) {\n apiClient.interceptors.request.use((config) => {\n // Set base URL from settings or options\n config.baseURL = options.baseUrl ?? settingsStore.getApiBaseUrl()\n config.timeout = options.timeout ?? settingsStore.requestTimeout\n\n // Add Authorization header if token exists and auth is not explicitly disabled\n if (options.withAuth !== false && authStore.token) {\n config.headers.Authorization = `Bearer ${authStore.token}`\n }\n\n return config\n })\n interceptorAttached = true\n }\n\n // Generic request methods\n async function get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n const response = await apiClient.get<T>(url, config)\n return response.data\n }\n\n async function post<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n const response = await apiClient.post<T>(url, data, config)\n return response.data\n }\n\n async function put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n const response = await apiClient.put<T>(url, data, config)\n return response.data\n }\n\n async function patch<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n const response = await apiClient.patch<T>(url, data, config)\n return response.data\n }\n\n async function del<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n const response = await apiClient.delete<T>(url, config)\n return response.data\n }\n\n // File upload helper\n async function upload<T>(url: string, file: File, fieldName = 'file', additionalData?: Record<string, unknown>): Promise<T> {\n const formData = new FormData()\n formData.append(fieldName, file)\n\n if (additionalData) {\n Object.entries(additionalData).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n formData.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value))\n }\n })\n }\n\n const response = await apiClient.post<T>(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n })\n return response.data\n }\n\n // Download helper - returns blob URL\n async function download(url: string, filename?: string): Promise<string> {\n const response = await apiClient.get(url, { responseType: 'blob' })\n const blob = new Blob([response.data])\n const blobUrl = URL.createObjectURL(blob)\n\n // Optionally trigger download\n if (filename) {\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = filename\n link.click()\n }\n\n return blobUrl\n }\n\n // Build full URL for external use (e.g., <a href=\"...\">)\n function buildUrl(path: string): string {\n const baseUrl = options.baseUrl ?? settingsStore.getApiBaseUrl()\n return `${baseUrl}${path}`\n }\n\n // WebSocket URL builder\n function buildWsUrl(path: string): string {\n return `${settingsStore.getWsBaseUrl()}${path}`\n }\n\n return {\n client: apiClient,\n get,\n post,\n put,\n patch,\n delete: del,\n upload,\n download,\n buildUrl,\n buildWsUrl,\n }\n}\n"],"names":[],"mappings":"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"}
|