@morscherlab/mint-sdk 1.0.41 → 1.0.42
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/dist/components/AppTopBar.navigation.d.ts +0 -1
- package/dist/components/index.js +1 -1
- package/dist/{components-CJ2--4Ex.js → components-BGVwavdd.js} +24 -35
- package/dist/components-BGVwavdd.js.map +1 -0
- package/dist/composables/index.d.ts +1 -1
- package/dist/composables/index.js +2 -2
- package/dist/composables/usePluginClient.d.ts +82 -5
- package/dist/{composables-DrE6OcZZ.js → composables-C_hPF0Gn.js} +255 -8
- package/dist/{composables-DrE6OcZZ.js.map → composables-C_hPF0Gn.js.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/install.js +1 -1
- package/dist/styles.css +17 -14
- package/package.json +1 -1
- package/src/__tests__/components/AppTopBar.navigation.test.ts +3 -5
- package/src/__tests__/components/AppTopBar.test.ts +2 -5
- package/src/__tests__/components/AppTopBarPageSelector.test.ts +22 -0
- package/src/__tests__/components/PluginWorkspaceView.test.ts +18 -0
- package/src/__tests__/composables/usePluginClient.test.ts +129 -3
- package/src/components/AppTopBar.navigation.ts +0 -2
- package/src/components/AppTopBar.story.vue +5 -5
- package/src/components/AppTopBar.vue +0 -1
- package/src/components/PluginWorkspaceView.vue +5 -1
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +0 -1
- package/src/composables/index.ts +6 -0
- package/src/composables/usePluginClient.ts +453 -8
- package/src/styles/components/app-page-selector.css +3 -5
- package/src/styles/components/button.css +8 -5
- package/dist/components-CJ2--4Ex.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as SampleLegend_default, A as GroupAssigner_default, B as StatusIndicator_default, C as formatSequenceRemaining, Ct as BaseTabs_default, D as ScientificNumber_default, E as ChemicalFormula_default, F as BioTemplateRenderer_default, G as ComponentBindingRenderer_default, H as AppContainer_default, I as ChartContainer_default, J as AutoGroupModal_default, K as ScheduleCalendar_default, L as Breadcrumb_default, M as BioTemplatePresetWorkspaceView_default, N as BioTemplatePackWorkspaceView_default, O as ProtocolStepEditor_default, P as BioTemplateExperimentWorkspaceView_default, Q as PlateMapEditor_default, R as Avatar_default, S as formatSequenceEta, St as SegmentedControl_default, T as sequenceSamplesRemaining, U as DoseDesignWorkspaceView_default, V as Divider_default, W as ControlWorkspaceView_default, X as LoadingSpinner_default, Y as SampleHierarchyTree_default, Z as ReagentList_default, _ as InstrumentStateBadge_default, _t as AppToastContainer_default, a as ExperimentDataViewer_default, at as AppLayout_default, b as estimateSequenceFinishDate, bt as Calendar_default, c as LcmsSequenceTable_default, ct as FormActions_default, d as extractLcmsCommonPrefix, dt as AppPluginSwitcher_default, et as WellPlate_default, f as extractLcmsSampleName, ft as AppAvatarMenu_default, g as InstrumentStatusCard_default, gt as IconButton_default, h as reconstructLcmsPlateCellsFromSequenceItems, ht as ThemeToggle_default, i as TimeRangeInput_default, it as MobileSupportGate_default, j as RackEditor_default, k as ReagentEditor_default, l as DEFAULT_LCMS_SEQUENCE_COLUMNS, lt as StepWizard_default, m as lcmsWellIdFromPosition, mt as CollapsibleCard_default, n as FitPanel_default, nt as DoseCalculator_default, o as BatchProgressList_default, ot as AppSidebar_default, p as inferLcmsPlateTypeFromWellIds, pt as PluginIcon_default, q as SampleSelector_default, r as ResourceCard_default, rt as PluginWorkspaceView_default, s as AuditTrail_default, st as FormBuilder_default, tt as ExperimentTimeline_default, u as basenameFromWindowsPath, ut as AppTopBar_default, v as InstrumentAlertLog_default, vt as AlertBox_default, w as sequenceProgressPercent, wt as ColorSlider_default, x as estimateSequenceRemainingSeconds, xt as DropdownButton_default, y as SequenceProgressBar_default, yt as DataFrame_default, z as ProgressBar_default } from "./components-
|
|
1
|
+
import { $ as SampleLegend_default, A as GroupAssigner_default, B as StatusIndicator_default, C as formatSequenceRemaining, Ct as BaseTabs_default, D as ScientificNumber_default, E as ChemicalFormula_default, F as BioTemplateRenderer_default, G as ComponentBindingRenderer_default, H as AppContainer_default, I as ChartContainer_default, J as AutoGroupModal_default, K as ScheduleCalendar_default, L as Breadcrumb_default, M as BioTemplatePresetWorkspaceView_default, N as BioTemplatePackWorkspaceView_default, O as ProtocolStepEditor_default, P as BioTemplateExperimentWorkspaceView_default, Q as PlateMapEditor_default, R as Avatar_default, S as formatSequenceEta, St as SegmentedControl_default, T as sequenceSamplesRemaining, U as DoseDesignWorkspaceView_default, V as Divider_default, W as ControlWorkspaceView_default, X as LoadingSpinner_default, Y as SampleHierarchyTree_default, Z as ReagentList_default, _ as InstrumentStateBadge_default, _t as AppToastContainer_default, a as ExperimentDataViewer_default, at as AppLayout_default, b as estimateSequenceFinishDate, bt as Calendar_default, c as LcmsSequenceTable_default, ct as FormActions_default, d as extractLcmsCommonPrefix, dt as AppPluginSwitcher_default, et as WellPlate_default, f as extractLcmsSampleName, ft as AppAvatarMenu_default, g as InstrumentStatusCard_default, gt as IconButton_default, h as reconstructLcmsPlateCellsFromSequenceItems, ht as ThemeToggle_default, i as TimeRangeInput_default, it as MobileSupportGate_default, j as RackEditor_default, k as ReagentEditor_default, l as DEFAULT_LCMS_SEQUENCE_COLUMNS, lt as StepWizard_default, m as lcmsWellIdFromPosition, mt as CollapsibleCard_default, n as FitPanel_default, nt as DoseCalculator_default, o as BatchProgressList_default, ot as AppSidebar_default, p as inferLcmsPlateTypeFromWellIds, pt as PluginIcon_default, q as SampleSelector_default, r as ResourceCard_default, rt as PluginWorkspaceView_default, s as AuditTrail_default, st as FormBuilder_default, tt as ExperimentTimeline_default, u as basenameFromWindowsPath, ut as AppTopBar_default, v as InstrumentAlertLog_default, vt as AlertBox_default, w as sequenceProgressPercent, wt as ColorSlider_default, x as estimateSequenceRemainingSeconds, xt as DropdownButton_default, y as SequenceProgressBar_default, yt as DataFrame_default, z as ProgressBar_default } from "./components-BGVwavdd.js";
|
|
2
2
|
import { t as BaseButton_default } from "./BaseButton-Dgqrze41.js";
|
|
3
3
|
import { r as BaseInput_default, t as BaseSelect_default } from "./BaseSelect-ekgr9fDo.js";
|
|
4
4
|
import { $ as parseTime, A as useConcentrationUnits, B as TagsInput_default, C as controlsToViewIds, D as getTypeDefault, E as getFieldRegistryEntry, F as ATOMIC_WEIGHTS, G as findAvailableSlots, H as addMinutes, I as useChemicalFormula, J as formatTime, K as findNearestTimeSlotIndex, L as DateTimePicker_default, M as SequenceInput_default, N as useSequenceUtils, O as ConcentrationInput_default, P as FormulaInput_default, Q as isTimeInRange, R as FileUploader_default, S as controlsToTopBarSettingsConfig, T as getDefaultControlView, U as compareTime, V as TimePicker_default, W as durationMinutes, X as fromMinutes, Y as formatTimeSlot, Z as generateTimeSlots, _ as controlsToFormSchema, a as defineDoseCalculatorControlProps, at as MultiSelect_default, b as controlsToSettingsSchema, c as defineWellPlateDoseComponentBindings, ct as BaseSlider_default, d as defineControlModel, dt as BaseCheckbox_default, et as rangesOverlap, ft as Tooltip_default, h as controlValuesToComponentProps, i as useControlSchema, it as DatePicker_default, j as MoleculeInput_default, k as UnitInput_default, l as defineWellPlateDoseControlProps, lt as BaseRadioGroup_default, m as controlValuesToComponentBindingsById, n as defineControls, nt as toMinutes, o as defineDoseDesignControlModel, ot as useListSelection, p as controlValuesToComponentBindings, pt as BaseTextarea_default, q as formatDuration, r as getControlDefaults, rt as useTimeUtils, s as defineWellPlateControlProps, st as useSelectionLimit, t as defineControlComponentBindings, tt as snapToSlot, u as useControlWorkspace, ut as BaseToggle_default, v as controlsToSectionFormSchema, w as controlsToViewItems, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas, z as NumberInput_default } from "./useControlSchema-BZNdalmL.js";
|
|
@@ -15,7 +15,7 @@ import { i as useApi, n as useDebouncedWatch, r as useRequestSyncState, t as use
|
|
|
15
15
|
import { n as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-BbPkIFsI.js";
|
|
16
16
|
import { $ as toTimeCourseRows, $t as listBioTemplatePacks, A as createSamplePrepTemplate, At as toCalibrationCurveRows, B as toBioTemplateComponentProps, Bt as validatePlateMapData, C as createFlowCytometryPanelTemplate, Ct as toInstrumentRunScheduleEvents, D as createTimeCourseTemplate, Dt as toFlowPanelRows, E as createProtocolStepsTemplate, Et as toFlowPanelDataFrame, Ft as validateAssayMatrixData, G as toTemplateDataFrame, Gt as validateSampleSheetData, H as toBioTemplateComponentPropsById, Ht as validateQpcrPlateData, I as listBioTemplateComponentBindings, It as validateCalibrationCurveData, J as toDoseLayoutState, Jt as getBioTemplatePresetInfo, K as toWellMapArray, Kt as validateTimeCourseData, L as toBioTemplateComponentBindings, Lt as validateDoseResponseData, M as createPlateMapTemplate, Mt as toAssayMatrixDataFrame, N as bioTemplatePresetControlValuesToOptions, Nt as toAssayMatrixRows, O as createCalibrationCurveTemplate, Ot as toCalibrationCurveColumns, P as getBioTemplateComponentBindings, Pt as toAssayMatrixSampleOptions, Q as toTimeCourseDataFrame, Qt as getBioTemplatePackInfo, R as toBioTemplateComponentBindingsById, Rt as validateFlowCytometryPanelData, S as createInstrumentRunTemplate, St as toInstrumentRunRows, T as createAssayMatrixTemplate, Tt as toFlowPanelColumns, U as toBioTemplateComponentSnippets, Ut as validateReagentListData, Vt as validateProtocolStepsData, W as toBioTemplateComponentUsage, Wt as validateSamplePrepData, X as toWellPlateWells, Xt as searchBioTemplatePresets, Y as toPlateMapEditorState, Yt as listBioTemplatePresets, Z as toTimeCourseColumns, Zt as bioTemplatePacks, _ as createElisaAssayCollection, _t as toProtocolDataFrame, a as getBioTemplateControlDefaults, an as TEMPLATE_COLLECTION_KEY, at as toSamplePrepColumns, b as createQpcrExpressionCollection, bt as toInstrumentRunColumns, c as listBioTemplatePresetControlSchemas, cn as createTemplateEnvelope, ct as toReagentColumns, d as createBioTemplatePresetCollectionFromControls, dn as extractTemplateCollection, dt as toReagentRows, en as searchBioTemplatePacks, et as toTimeCourseSteps, f as createWellPlateScreenCollection, fn as getTemplateData, ft as toQpcrColumns, g as createFlowCytometryAssayCollection, gt as toProtocolColumns, h as createWesternBlotAssayCollection, ht as toQpcrWellPlateWells, i as createBioTemplateControlToolkit, in as searchBioTemplateCatalog, it as toSampleRows, j as createSampleSheetTemplate, jt as toAssayMatrixColumns, k as createDoseResponseTemplate, kt as toCalibrationCurveDataFrame, l as requireBioTemplateControlSchema, ln as ensureTemplateEnvelope, lt as toReagentDataFrame, m as createDefaultBioTemplate, mt as toQpcrRows, n as bioTemplateControlsToSectionFormSchemas, nn as getBioTemplateInfo, nt as toSampleDataFrame, o as getBioTemplateControlSchema, on as assertTemplateEnvelope, ot as toSamplePrepDataFrame, p as createBioTemplatePackCollection, pt as toQpcrDataFrame, q as toDoseConditions, qt as bioTemplatePresets, r as bioTemplateControlsToSidebarPanels, rn as listBioTemplateCatalog, rt as toSampleOptions, s as listBioTemplateControlSchemas, sn as createTemplateCollection, st as toSamplePrepRows, t as bioTemplateControlsToFormSchema, tn as bioTemplateCatalog, tt as toSampleColumns, u as createBioTemplatePresetCollection, un as ensureTemplateFromCollection, ut as toReagentListItems, v as createTargetedMetabolomicsCollection, vt as toProtocolRows, w as createReagentListTemplate, wt as toInstrumentRunSteps, x as createQpcrPlateTemplate, xt as toInstrumentRunDataFrame, y as createLcmsBatchCollection, yt as toProtocolSteps, z as toBioTemplateComponentImports, zt as validateInstrumentRunData } from "./templates-CNbPQNID.js";
|
|
17
17
|
import { MINTSdk } from "./install.js";
|
|
18
|
-
import { A as
|
|
18
|
+
import { A as useOptimisticMutation, C as detectDelimiter, D as validateImportFile, E as useFileImport, F as usePasskey, I as useAuth, M as usePluginConfig, N as useAsync, O as createPluginResourceClient, P as useAsyncBatch, S as wellIdsInRectangle, T as readFileAsText, _ as createWellPlateWells, a as pluginFormDataFromPayload, b as useWellPainting, c as usePluginClient, d as buildPluginEndpointUrl, f as resolvePluginBaseUrl, g as createRowConditions, h as createColumnConditions, i as getPluginPageSelectorItems, j as useCommandHistory, k as useResourceCrud, l as usePluginEventStream, m as useWellPlateValidation, n as downloadBlob, o as uploadPluginEndpoint, p as runWellPlateValidation, r as downloadPluginEndpoint, s as useCurrentExperiment, t as createPluginClient, u as usePluginSettings, v as useWellPlateAdapter, w as parseDelimitedText, x as wellIdToCoordinate, y as coordinateToWellId } from "./composables-C_hPF0Gn.js";
|
|
19
19
|
import "./stores/index.js";
|
|
20
20
|
//#region src/utils/rack.ts
|
|
21
21
|
var LCMS_DEFAULT_CONTROL_POSITIONS = {
|
|
@@ -177,6 +177,6 @@ function comparePlateCells(a, b) {
|
|
|
177
177
|
return rowDiff === 0 ? a.column - b.column : rowDiff;
|
|
178
178
|
}
|
|
179
179
|
//#endregion
|
|
180
|
-
export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, LCMS_DEFAULT_CONTROL_POSITIONS, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, colorPalettes, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createColumnConditions, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createPluginResourceClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createRowConditions, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWellPlateWells, createWesternBlotAssayCollection, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isAdminRole, isAdminUser, isTimeInRange, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, normalizeAccessPolicy, normalizeSearchQuery, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, requireBioTemplateControlSchema, resolveExperimentCode, resolvePluginBaseUrl, runWellPlateValidation, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, snapToSlot, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, unwrapExperimentDesignData, uploadPluginEndpoint, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useFileImport, useForm, useFormBuilder, useGroupAssignment, useListSelection, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePluginClient, usePluginConfig, usePluginSettings, useProtocolTemplates, useRackEditor, useReagentSeries, useRequestSyncState, useResourceCrud, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData, wellIdToCoordinate, wellIdsInRectangle };
|
|
180
|
+
export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, LCMS_DEFAULT_CONTROL_POSITIONS, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, colorPalettes, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createColumnConditions, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createPluginResourceClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createRowConditions, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWellPlateWells, createWesternBlotAssayCollection, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isAdminRole, isAdminUser, isTimeInRange, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, normalizeAccessPolicy, normalizeSearchQuery, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, requireBioTemplateControlSchema, resolveExperimentCode, resolvePluginBaseUrl, runWellPlateValidation, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, snapToSlot, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, unwrapExperimentDesignData, uploadPluginEndpoint, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useFileImport, useForm, useFormBuilder, useGroupAssignment, useListSelection, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePluginClient, usePluginConfig, usePluginEventStream, usePluginSettings, useProtocolTemplates, useRackEditor, useReagentSeries, useRequestSyncState, useResourceCrud, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData, wellIdToCoordinate, wellIdsInRectangle };
|
|
181
181
|
|
|
182
182
|
//# sourceMappingURL=index.js.map
|
package/dist/install.js
CHANGED
package/dist/styles.css
CHANGED
|
@@ -2857,10 +2857,9 @@
|
|
|
2857
2857
|
background-color: var(--bg-secondary);
|
|
2858
2858
|
color: var(--text-secondary-strong);
|
|
2859
2859
|
border: 1px solid var(--border-color);
|
|
2860
|
-
/*
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
font-weight: 400;
|
|
2860
|
+
/* Secondary is lower-emphasis through surface, border, and shadow, but keeps
|
|
2861
|
+
medium label weight so it still reads as an actionable button. */
|
|
2862
|
+
font-weight: 500;
|
|
2864
2863
|
box-shadow: 0 1px 1px rgba(15, 23, 42, 0.03);
|
|
2865
2864
|
}
|
|
2866
2865
|
.mint-button--secondary:hover:not(.mint-button--disabled) {
|
|
@@ -2897,7 +2896,7 @@
|
|
|
2897
2896
|
.mint-button--ghost {
|
|
2898
2897
|
background-color: transparent;
|
|
2899
2898
|
color: var(--text-secondary-strong);
|
|
2900
|
-
/* Lowest-emphasis variant: regular (400) weight,
|
|
2899
|
+
/* Lowest-emphasis variant: regular (400) weight, below secondary. */
|
|
2901
2900
|
font-weight: 400;
|
|
2902
2901
|
}
|
|
2903
2902
|
.mint-button--ghost:hover:not(.mint-button--disabled) {
|
|
@@ -2913,6 +2912,9 @@
|
|
|
2913
2912
|
font-weight: 400;
|
|
2914
2913
|
min-height: var(--form-height-sm);
|
|
2915
2914
|
}
|
|
2915
|
+
.mint-button--secondary.mint-button--sm {
|
|
2916
|
+
font-weight: 500;
|
|
2917
|
+
}
|
|
2916
2918
|
.mint-button--md {
|
|
2917
2919
|
padding: 0.5rem 1rem;
|
|
2918
2920
|
font-size: 0.875rem;
|
|
@@ -7106,10 +7108,9 @@ to {
|
|
|
7106
7108
|
}
|
|
7107
7109
|
.mint-page-selector__item-label {
|
|
7108
7110
|
flex: 1;
|
|
7109
|
-
|
|
7110
|
-
|
|
7111
|
-
|
|
7112
|
-
color: var(--text-muted);
|
|
7111
|
+
min-width: 0;
|
|
7112
|
+
overflow: hidden;
|
|
7113
|
+
text-overflow: ellipsis;
|
|
7113
7114
|
white-space: nowrap;
|
|
7114
7115
|
}
|
|
7115
7116
|
/* AppTopBar pillNav — centered top-level navigation pills */
|
|
@@ -19902,10 +19903,9 @@ code, pre {
|
|
|
19902
19903
|
background-color: var(--bg-secondary);
|
|
19903
19904
|
color: var(--text-secondary-strong);
|
|
19904
19905
|
border: 1px solid var(--border-color);
|
|
19905
|
-
/*
|
|
19906
|
-
|
|
19907
|
-
|
|
19908
|
-
font-weight: 400;
|
|
19906
|
+
/* Secondary is lower-emphasis through surface, border, and shadow, but keeps
|
|
19907
|
+
medium label weight so it still reads as an actionable button. */
|
|
19908
|
+
font-weight: 500;
|
|
19909
19909
|
box-shadow: 0 1px 1px rgba(15, 23, 42, 0.03);
|
|
19910
19910
|
}
|
|
19911
19911
|
.mint-button--secondary:hover:not(.mint-button--disabled) {
|
|
@@ -19942,7 +19942,7 @@ code, pre {
|
|
|
19942
19942
|
.mint-button--ghost {
|
|
19943
19943
|
background-color: transparent;
|
|
19944
19944
|
color: var(--text-secondary-strong);
|
|
19945
|
-
/* Lowest-emphasis variant: regular (400) weight,
|
|
19945
|
+
/* Lowest-emphasis variant: regular (400) weight, below secondary. */
|
|
19946
19946
|
font-weight: 400;
|
|
19947
19947
|
}
|
|
19948
19948
|
.mint-button--ghost:hover:not(.mint-button--disabled) {
|
|
@@ -19957,6 +19957,9 @@ code, pre {
|
|
|
19957
19957
|
font-weight: 400;
|
|
19958
19958
|
min-height: var(--form-height-sm);
|
|
19959
19959
|
}
|
|
19960
|
+
.mint-button--secondary.mint-button--sm {
|
|
19961
|
+
font-weight: 500;
|
|
19962
|
+
}
|
|
19960
19963
|
.mint-button--md {
|
|
19961
19964
|
padding: 0.5rem 1rem;
|
|
19962
19965
|
font-size: 0.875rem;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@morscherlab/mint-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.42",
|
|
4
4
|
"description": "MINT Platform SDK — Vue 3 components, composables, and types for plugin development. MINT = Mass-spec INtegrated Toolkit.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -26,18 +26,17 @@ describe('AppTopBar navigation helpers', () => {
|
|
|
26
26
|
pluginNavItemToPageSelectorItem(
|
|
27
27
|
{ label: 'Results', path: 'results' },
|
|
28
28
|
1,
|
|
29
|
-
{ pluginIcon: 'flask'
|
|
29
|
+
{ pluginIcon: 'flask' },
|
|
30
30
|
),
|
|
31
31
|
).toEqual({
|
|
32
32
|
id: 'results',
|
|
33
33
|
label: 'Results',
|
|
34
34
|
to: '/results',
|
|
35
35
|
icon: 'flask',
|
|
36
|
-
hint: 'Assay Plugin',
|
|
37
36
|
})
|
|
38
37
|
})
|
|
39
38
|
|
|
40
|
-
it('prefers explicit nav item id
|
|
39
|
+
it('prefers explicit nav item id and icon without exposing descriptions as hints', () => {
|
|
41
40
|
expect(
|
|
42
41
|
pluginNavItemToPageSelectorItem(
|
|
43
42
|
{
|
|
@@ -48,12 +47,11 @@ describe('AppTopBar navigation helpers', () => {
|
|
|
48
47
|
description: 'Custom page',
|
|
49
48
|
},
|
|
50
49
|
0,
|
|
51
|
-
{ pluginIcon: 'flask'
|
|
50
|
+
{ pluginIcon: 'flask' },
|
|
52
51
|
),
|
|
53
52
|
).toMatchObject({
|
|
54
53
|
id: 'custom',
|
|
55
54
|
icon: 'sparkles',
|
|
56
|
-
hint: 'Custom page',
|
|
57
55
|
})
|
|
58
56
|
})
|
|
59
57
|
|
|
@@ -830,7 +830,7 @@ describe('AppTopBar', () => {
|
|
|
830
830
|
const imageIcons = wrapper.findAll('.mint-plugin-icon__img')
|
|
831
831
|
expect(imageIcons).toHaveLength(1)
|
|
832
832
|
expect(imageIcons[0].attributes('src')).toBe(pngIcon)
|
|
833
|
-
expect(wrapper.find('.mint-page-selector__item-hint').
|
|
833
|
+
expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
|
|
834
834
|
})
|
|
835
835
|
})
|
|
836
836
|
|
|
@@ -1068,10 +1068,7 @@ describe('AppTopBar', () => {
|
|
|
1068
1068
|
'Dashboard',
|
|
1069
1069
|
'Analysis',
|
|
1070
1070
|
])
|
|
1071
|
-
expect(wrapper.
|
|
1072
|
-
'Dose Designer',
|
|
1073
|
-
'Dose Designer',
|
|
1074
|
-
])
|
|
1071
|
+
expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
|
|
1075
1072
|
const dropdownIcons = wrapper
|
|
1076
1073
|
.findAllComponents({ name: 'PluginIcon' })
|
|
1077
1074
|
.filter(icon => icon.classes().includes('mint-page-selector__metadata-icon'))
|
|
@@ -24,6 +24,28 @@ describe('AppTopBarPageSelectorInternal', () => {
|
|
|
24
24
|
expect(wrapper.emitted('select')).toEqual([[{ id: 'Results', label: 'Results' }]])
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
+
it('omits page hints from the menu for compact scanning', async () => {
|
|
28
|
+
const wrapper = mount(AppTopBarPageSelectorInternal, {
|
|
29
|
+
props: {
|
|
30
|
+
currentPageId: 'downloads',
|
|
31
|
+
pages: [
|
|
32
|
+
{ id: 'downloads', label: 'Downloads', hint: 'Paste links and queue downloads' },
|
|
33
|
+
{ id: 'settings', label: 'Settings', hint: 'Credentials and destination' },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
await wrapper.get('.mint-page-selector__trigger').trigger('click')
|
|
39
|
+
|
|
40
|
+
expect(wrapper.findAll('.mint-page-selector__item-label').map(item => item.text())).toEqual([
|
|
41
|
+
'Downloads',
|
|
42
|
+
'Settings',
|
|
43
|
+
])
|
|
44
|
+
expect(wrapper.find('.mint-page-selector__item-hint').exists()).toBe(false)
|
|
45
|
+
expect(wrapper.text()).not.toContain('Paste links')
|
|
46
|
+
expect(wrapper.text()).not.toContain('Credentials')
|
|
47
|
+
})
|
|
48
|
+
|
|
27
49
|
it('closes linked page actions without emitting select', async () => {
|
|
28
50
|
const wrapper = mount(AppTopBarPageSelectorInternal, {
|
|
29
51
|
props: {
|
|
@@ -146,6 +146,24 @@ describe('PluginWorkspaceView', () => {
|
|
|
146
146
|
expect(wrapper.emitted('pill-select')).toEqual([[{ id: 'results', label: 'Results' }]])
|
|
147
147
|
})
|
|
148
148
|
|
|
149
|
+
it('hides topbar page selector until multiple pages are registered', () => {
|
|
150
|
+
const wrapper = mount(PluginWorkspaceView, {
|
|
151
|
+
props: {
|
|
152
|
+
title: 'Downloader',
|
|
153
|
+
subtitle: 'Downloads',
|
|
154
|
+
pageSelector: [
|
|
155
|
+
{ id: 'downloads', label: 'Downloads', to: '/' },
|
|
156
|
+
],
|
|
157
|
+
currentPageSelectorId: 'downloads',
|
|
158
|
+
},
|
|
159
|
+
global: globalOptions,
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
expect(wrapper.findComponent(AppTopBar).props('pageSelector')).toBeUndefined()
|
|
163
|
+
expect(wrapper.find('.mint-page-selector').exists()).toBe(false)
|
|
164
|
+
expect(wrapper.find('.mint-topbar-title-group').text()).toContain('Downloader')
|
|
165
|
+
})
|
|
166
|
+
|
|
149
167
|
it('passes compact control models to the sidebar for generated forms', () => {
|
|
150
168
|
const wrapper = mount(PluginWorkspaceView, {
|
|
151
169
|
props: {
|
|
@@ -12,9 +12,12 @@ import {
|
|
|
12
12
|
resolvePluginBaseUrl,
|
|
13
13
|
uploadPluginEndpoint,
|
|
14
14
|
useCurrentExperiment,
|
|
15
|
+
usePluginEventStream,
|
|
15
16
|
usePluginClient,
|
|
17
|
+
usePluginSettings,
|
|
16
18
|
type PluginContract,
|
|
17
19
|
} from '../../composables/usePluginClient'
|
|
20
|
+
import { useAuthStore } from '../../stores/auth'
|
|
18
21
|
|
|
19
22
|
const contract: PluginContract = {
|
|
20
23
|
schemaVersion: 1,
|
|
@@ -32,6 +35,8 @@ describe('usePluginClient', () => {
|
|
|
32
35
|
let requestBodies: unknown[] = []
|
|
33
36
|
let nextGetError: Error | null = null
|
|
34
37
|
let nextGetData: unknown
|
|
38
|
+
let nextPatchData: unknown
|
|
39
|
+
let nextPutData: unknown
|
|
35
40
|
|
|
36
41
|
beforeEach(() => {
|
|
37
42
|
setActivePinia(createPinia())
|
|
@@ -39,6 +44,8 @@ describe('usePluginClient', () => {
|
|
|
39
44
|
requestBodies = []
|
|
40
45
|
nextGetError = null
|
|
41
46
|
nextGetData = undefined
|
|
47
|
+
nextPatchData = undefined
|
|
48
|
+
nextPutData = undefined
|
|
42
49
|
vi.spyOn(axios.Axios.prototype, 'get').mockImplementation(async function (
|
|
43
50
|
this: unknown,
|
|
44
51
|
url: string,
|
|
@@ -58,6 +65,26 @@ describe('usePluginClient', () => {
|
|
|
58
65
|
requestBodies.push(data)
|
|
59
66
|
return { data: { called: url } }
|
|
60
67
|
})
|
|
68
|
+
vi.spyOn(axios.Axios.prototype, 'patch').mockImplementation(async function (
|
|
69
|
+
this: unknown,
|
|
70
|
+
url: string,
|
|
71
|
+
data?: unknown,
|
|
72
|
+
config?: AxiosRequestConfig,
|
|
73
|
+
) {
|
|
74
|
+
requestConfigs.push({ url, ...config })
|
|
75
|
+
requestBodies.push(data)
|
|
76
|
+
return { data: nextPatchData ?? { called: url } }
|
|
77
|
+
})
|
|
78
|
+
vi.spyOn(axios.Axios.prototype, 'put').mockImplementation(async function (
|
|
79
|
+
this: unknown,
|
|
80
|
+
url: string,
|
|
81
|
+
data?: unknown,
|
|
82
|
+
config?: AxiosRequestConfig,
|
|
83
|
+
) {
|
|
84
|
+
requestConfigs.push({ url, ...config })
|
|
85
|
+
requestBodies.push(data)
|
|
86
|
+
return { data: nextPutData ?? { called: url } }
|
|
87
|
+
})
|
|
61
88
|
vi.spyOn(axios.Axios.prototype, 'delete').mockImplementation(async function (
|
|
62
89
|
this: unknown,
|
|
63
90
|
url: string,
|
|
@@ -353,21 +380,18 @@ describe('usePluginClient', () => {
|
|
|
353
380
|
label: 'Dashboard',
|
|
354
381
|
to: '/',
|
|
355
382
|
icon: 'DASHBOARD_ICON',
|
|
356
|
-
hint: 'Overview',
|
|
357
383
|
},
|
|
358
384
|
{
|
|
359
385
|
id: 'dose-design',
|
|
360
386
|
label: 'Dose Design',
|
|
361
387
|
to: '/dose-design',
|
|
362
388
|
icon: 'PLUGIN_ICON',
|
|
363
|
-
hint: 'Dose Designer',
|
|
364
389
|
},
|
|
365
390
|
{
|
|
366
391
|
id: 'qc-review',
|
|
367
392
|
label: 'QC Review',
|
|
368
393
|
to: '/qc/review',
|
|
369
394
|
icon: 'QC_ICON',
|
|
370
|
-
hint: 'Dose Designer',
|
|
371
395
|
},
|
|
372
396
|
])
|
|
373
397
|
expect(requestConfigs).toHaveLength(0)
|
|
@@ -396,6 +420,108 @@ describe('usePluginClient', () => {
|
|
|
396
420
|
expect(requestConfigs).toHaveLength(0)
|
|
397
421
|
})
|
|
398
422
|
|
|
423
|
+
it('loads and saves plugin settings through the integrated platform config endpoint', async () => {
|
|
424
|
+
;(window as unknown as { __MINT_PLATFORM__?: unknown }).__MINT_PLATFORM__ = {
|
|
425
|
+
isIntegrated: true,
|
|
426
|
+
theme: 'light',
|
|
427
|
+
platformApiUrl: '/api',
|
|
428
|
+
plugin: {
|
|
429
|
+
id: 'drp',
|
|
430
|
+
name: 'drp',
|
|
431
|
+
version: '1.0.0',
|
|
432
|
+
route_prefix: '/drp',
|
|
433
|
+
api_prefix: '/api/drp',
|
|
434
|
+
},
|
|
435
|
+
}
|
|
436
|
+
nextGetData = { plugin_name: 'drp', config: { nasBasePath: '/data' } }
|
|
437
|
+
nextPatchData = { plugin_name: 'drp', config: { nasBasePath: '/mnt' } }
|
|
438
|
+
|
|
439
|
+
const settings = usePluginSettings<{ nasBasePath?: string }>({ pluginName: 'drp' })
|
|
440
|
+
await settings.load()
|
|
441
|
+
|
|
442
|
+
expect(requestConfigs[0]!.baseURL).toBe('/api')
|
|
443
|
+
expect(requestConfigs[0]!.url).toBe('/plugins/drp/config')
|
|
444
|
+
expect(settings.values.value).toEqual({ nasBasePath: '/data' })
|
|
445
|
+
expect(settings.settings.value).toEqual({ nasBasePath: '/data' })
|
|
446
|
+
expect(settings.isDirty.value).toBe(false)
|
|
447
|
+
|
|
448
|
+
settings.setValues({ nasBasePath: '/mnt' })
|
|
449
|
+
expect(settings.isDirty.value).toBe(true)
|
|
450
|
+
const ok = await settings.save()
|
|
451
|
+
|
|
452
|
+
expect(ok).toBe(true)
|
|
453
|
+
expect(requestConfigs[1]!.baseURL).toBe('/api')
|
|
454
|
+
expect(requestConfigs[1]!.url).toBe('/plugins/drp/config')
|
|
455
|
+
expect(requestBodies[0]).toEqual({ config: { nasBasePath: '/mnt' } })
|
|
456
|
+
expect(settings.values.value).toEqual({ nasBasePath: '/mnt' })
|
|
457
|
+
expect(settings.isDirty.value).toBe(false)
|
|
458
|
+
})
|
|
459
|
+
|
|
460
|
+
it('loads and saves plugin settings through the standalone settings router', async () => {
|
|
461
|
+
nextGetData = { settings: { nas_base_path: '/data' }, mode: 'standalone' }
|
|
462
|
+
nextPutData = { settings: { nas_base_path: '/mnt' }, mode: 'standalone' }
|
|
463
|
+
|
|
464
|
+
const settings = usePluginSettings<{ nas_base_path?: string }>({
|
|
465
|
+
apiBaseUrl: '/api/drp',
|
|
466
|
+
loadOnMount: false,
|
|
467
|
+
})
|
|
468
|
+
await settings.load()
|
|
469
|
+
const ok = await settings.save({ nas_base_path: '/mnt' })
|
|
470
|
+
|
|
471
|
+
expect(ok).toBe(true)
|
|
472
|
+
expect(requestConfigs[0]!.baseURL).toBe('/api/drp')
|
|
473
|
+
expect(requestConfigs[0]!.url).toBe('/settings')
|
|
474
|
+
expect(requestConfigs[1]!.baseURL).toBe('/api/drp')
|
|
475
|
+
expect(requestConfigs[1]!.url).toBe('/settings')
|
|
476
|
+
expect(requestBodies[0]).toEqual({ nas_base_path: '/mnt' })
|
|
477
|
+
expect(settings.settingsConfig.value.values).toEqual({ nas_base_path: '/mnt' })
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
it('streams plugin events with auth headers and SSE parsing', async () => {
|
|
481
|
+
const authStore = useAuthStore()
|
|
482
|
+
authStore.setToken('stream-token', 3600)
|
|
483
|
+
const onMessage = vi.fn()
|
|
484
|
+
const streamBody = new ReadableStream({
|
|
485
|
+
start(controller) {
|
|
486
|
+
controller.enqueue(new TextEncoder().encode('event: progress\nid: 7\ndata: {"pct":50}\n\n'))
|
|
487
|
+
controller.close()
|
|
488
|
+
},
|
|
489
|
+
})
|
|
490
|
+
const fetchMock = vi.fn(async (_url: RequestInfo | URL, _init?: RequestInit) =>
|
|
491
|
+
new Response(streamBody, { status: 200 }),
|
|
492
|
+
)
|
|
493
|
+
vi.stubGlobal('fetch', fetchMock)
|
|
494
|
+
|
|
495
|
+
const stream = usePluginEventStream<{ pct: number }>(
|
|
496
|
+
contract,
|
|
497
|
+
{ method: 'get', path: '/downloads/events' },
|
|
498
|
+
{
|
|
499
|
+
parseJson: true,
|
|
500
|
+
reconnect: false,
|
|
501
|
+
onMessage,
|
|
502
|
+
},
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
await vi.waitFor(() => {
|
|
506
|
+
expect(onMessage).toHaveBeenCalledOnce()
|
|
507
|
+
})
|
|
508
|
+
|
|
509
|
+
expect(fetchMock).toHaveBeenCalledOnce()
|
|
510
|
+
const [url, init] = fetchMock.mock.calls[0]!
|
|
511
|
+
expect(url).toBe('/api/drp/downloads/events')
|
|
512
|
+
expect((init?.headers as Headers).get('Authorization')).toBe('Bearer stream-token')
|
|
513
|
+
expect((init?.headers as Headers).get('Accept')).toBe('text/event-stream')
|
|
514
|
+
expect(onMessage).toHaveBeenCalledWith({
|
|
515
|
+
event: 'progress',
|
|
516
|
+
data: { pct: 50 },
|
|
517
|
+
id: '7',
|
|
518
|
+
retry: undefined,
|
|
519
|
+
raw: 'event: progress\nid: 7\ndata: {"pct":50}',
|
|
520
|
+
})
|
|
521
|
+
expect(stream.lastMessage.value?.data).toEqual({ pct: 50 })
|
|
522
|
+
expect(stream.lastEventId.value).toBe('7')
|
|
523
|
+
})
|
|
524
|
+
|
|
399
525
|
it('can build path-only endpoint URLs with inferred experiment ids', () => {
|
|
400
526
|
window.history.replaceState({}, '', '/experiments/42/plugins/drp')
|
|
401
527
|
|
|
@@ -3,7 +3,6 @@ import type { PluginNavItem } from '../types/platform'
|
|
|
3
3
|
|
|
4
4
|
export interface PluginNavPageSelectorOptions {
|
|
5
5
|
pluginIcon?: string
|
|
6
|
-
pluginName?: string
|
|
7
6
|
}
|
|
8
7
|
|
|
9
8
|
export function normalizeNavPath(path?: string): string {
|
|
@@ -29,7 +28,6 @@ export function pluginNavItemToPageSelectorItem(
|
|
|
29
28
|
label: item.label,
|
|
30
29
|
to: path,
|
|
31
30
|
icon: item.icon || options.pluginIcon,
|
|
32
|
-
hint: item.description || options.pluginName,
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
33
|
|
|
@@ -18,11 +18,11 @@ const samplePillNav: PillNavItem[] = [
|
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
const samplePageSelector: PageSelectorItem[] = [
|
|
21
|
-
{ id: 'workspace', label: 'Workspace'
|
|
22
|
-
{ id: 'experiments', label: 'Experiments'
|
|
23
|
-
{ id: 'projects', label: 'Projects'
|
|
24
|
-
{ id: 'plugins', label: 'Plugins'
|
|
25
|
-
{ id: 'admin', label: 'Admin'
|
|
21
|
+
{ id: 'workspace', label: 'Workspace' },
|
|
22
|
+
{ id: 'experiments', label: 'Experiments' },
|
|
23
|
+
{ id: 'projects', label: 'Projects' },
|
|
24
|
+
{ id: 'plugins', label: 'Plugins' },
|
|
25
|
+
{ id: 'admin', label: 'Admin' },
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
// Theme is now surfaced as a top-level icon button (show-theme-toggle),
|
|
@@ -160,7 +160,6 @@ const platformPageSelector = computed<PageSelectorItem[]>(() =>
|
|
|
160
160
|
? plugin.value?.nav_items?.map((item, index) =>
|
|
161
161
|
pluginNavItemToPageSelectorItem(item, index, {
|
|
162
162
|
pluginIcon: plugin.value?.icon,
|
|
163
|
-
pluginName: plugin.value?.name,
|
|
164
163
|
})
|
|
165
164
|
) ?? []
|
|
166
165
|
: [],
|
|
@@ -208,6 +208,10 @@ const {
|
|
|
208
208
|
emitPillSelect: (item) => emit('pill-select', item),
|
|
209
209
|
})
|
|
210
210
|
|
|
211
|
+
const visiblePageSelector = computed(() =>
|
|
212
|
+
(props.pageSelector?.length ?? 0) > 1 ? props.pageSelector : undefined,
|
|
213
|
+
)
|
|
214
|
+
|
|
211
215
|
const hasSidebarSurface = computed(() => {
|
|
212
216
|
return hasPluginWorkspaceSidebarSurface({
|
|
213
217
|
showSidebar: props.showSidebar,
|
|
@@ -270,7 +274,7 @@ function handleFormCancel(sectionId: string) {
|
|
|
270
274
|
:variant="topBarVariant"
|
|
271
275
|
:home-path="homePath"
|
|
272
276
|
:show-logo="showLogo"
|
|
273
|
-
:page-selector="
|
|
277
|
+
:page-selector="visiblePageSelector"
|
|
274
278
|
:current-page-selector-id="resolvedCurrentPageSelectorId"
|
|
275
279
|
:plugin-switcher="pluginSwitcher"
|
|
276
280
|
:pill-nav="resolvedPillNav"
|
|
@@ -117,7 +117,6 @@ function handleSelect(page: PageSelectorItem) {
|
|
|
117
117
|
</slot>
|
|
118
118
|
</span>
|
|
119
119
|
<span class="mint-page-selector__item-label">{{ page.label }}</span>
|
|
120
|
-
<span v-if="page.hint" class="mint-page-selector__item-hint">{{ page.hint }}</span>
|
|
121
120
|
</ActionItemInternal>
|
|
122
121
|
</div>
|
|
123
122
|
</div>
|
package/src/composables/index.ts
CHANGED
|
@@ -445,6 +445,7 @@ export {
|
|
|
445
445
|
resolvePluginBaseUrl,
|
|
446
446
|
uploadPluginEndpoint,
|
|
447
447
|
usePluginClient,
|
|
448
|
+
usePluginEventStream,
|
|
448
449
|
usePluginSettings,
|
|
449
450
|
useCurrentExperiment,
|
|
450
451
|
type BuildPluginEndpointUrlOptions,
|
|
@@ -456,9 +457,14 @@ export {
|
|
|
456
457
|
type PluginHttpMethod,
|
|
457
458
|
type PluginNavItemContract,
|
|
458
459
|
type PluginEndpointRequestOptions,
|
|
460
|
+
type PluginEventStreamMessage,
|
|
461
|
+
type PluginEventStreamOptions,
|
|
459
462
|
type PluginFormDataPayload,
|
|
460
463
|
type PluginFormDataValue,
|
|
461
464
|
type CreatePluginClientOptions,
|
|
462
465
|
type UseCurrentExperimentOptions,
|
|
463
466
|
type UseCurrentExperimentReturn,
|
|
467
|
+
type UsePluginEventStreamReturn,
|
|
468
|
+
type UsePluginSettingsOptions,
|
|
469
|
+
type UsePluginSettingsReturn,
|
|
464
470
|
} from './usePluginClient'
|