@morscherlab/mint-sdk 1.0.63 → 1.1.0-beta.10
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 +119 -6
- package/dist/EmptyState-DgBRoYAy.js +647 -0
- package/dist/EmptyState-DgBRoYAy.js.map +1 -0
- package/dist/{ExperimentPopover-BbPkIFsI.js → ExperimentPopover-BFw3QX8L.js} +10 -9
- package/dist/{ExperimentPopover-BbPkIFsI.js.map → ExperimentPopover-BFw3QX8L.js.map} +1 -1
- package/dist/{ExperimentSelectorModal-DZeSd-yr.js → ExperimentSelectorModal-BBWXC7KW.js} +12 -216
- package/dist/ExperimentSelectorModal-BBWXC7KW.js.map +1 -0
- package/dist/{SettingsModal-CJgLadsN.js → SettingsModal-Dpg-X1OM.js} +12 -9
- package/dist/{SettingsModal-CJgLadsN.js.map → SettingsModal-Dpg-X1OM.js.map} +1 -1
- package/dist/__tests__/components/BaseToggle.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedPathInput.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedPlotlyResult.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedPluginView.test.d.ts +1 -0
- package/dist/__tests__/components/GeneratedResultRenderer.test.d.ts +1 -0
- package/dist/__tests__/components/InstrumentAlertLog.test.d.ts +1 -0
- package/dist/__tests__/components/SectionCard.test.d.ts +1 -0
- package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
- package/dist/__tests__/generatedUi.test.d.ts +1 -0
- package/dist/__tests__/types/GeneratedJsonSchema.test.d.ts +1 -0
- package/dist/{analysisArtifactTypes-Cu40dzSG.js → analysisArtifactTypes-ejqR8MX3.js} +1 -1
- package/dist/{analysisArtifactTypes-Cu40dzSG.js.map → analysisArtifactTypes-ejqR8MX3.js.map} +1 -1
- package/dist/{auth-DZAwEeis.js → auth-B87xM--s.js} +1 -1
- package/dist/{auth-DZAwEeis.js.map → auth-B87xM--s.js.map} +1 -1
- package/dist/chunk-BoAXSpZd.js +33 -0
- package/dist/components/AppSidebar.vue.d.ts +1 -1
- package/dist/components/AutoGroupModal.vue.d.ts +2 -2
- package/dist/components/BaseSelect.vue.d.ts +1 -1
- package/dist/components/BaseToggle.vue.d.ts +2 -0
- package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
- package/dist/components/CollapsibleCard.vue.d.ts +1 -1
- package/dist/components/ComponentBindingRenderer.vue.d.ts +1 -1
- package/dist/components/ConfirmDialog.vue.d.ts +1 -1
- package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
- package/dist/components/ExperimentTimeline.vue.d.ts +1 -1
- package/dist/components/FileUploader.vue.d.ts +4 -2
- package/dist/components/FitPanel.vue.d.ts +2 -2
- package/dist/components/FormActions.vue.d.ts +1 -1
- package/dist/components/FormBuilder.vue.d.ts +1 -1
- package/dist/components/GeneratedPathInput.vue.d.ts +12 -0
- package/dist/components/GeneratedPlotlyResult.vue.d.ts +11 -0
- package/dist/components/GeneratedPluginView.vue.d.ts +10 -0
- package/dist/components/GeneratedResultRenderer.vue.d.ts +6 -0
- package/dist/components/JobsStatusTray.vue.d.ts +5 -1
- package/dist/components/LcmsSequenceTable.vue.d.ts +1 -1
- package/dist/components/PluginWorkspaceView.props.d.ts +1 -1
- package/dist/components/SampleLegend.vue.d.ts +1 -1
- package/dist/components/SampleSelector.vue.d.ts +2 -2
- package/dist/components/SectionCard.vue.d.ts +47 -0
- package/dist/components/SettingsModal.vue.d.ts +1 -1
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -2
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.js +8 -9
- package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +2 -2
- package/dist/{components-DdzHh3a_.js → components-Ci_BTx00.js} +2322 -2292
- package/dist/components-Ci_BTx00.js.map +1 -0
- package/dist/composables/index.d.ts +3 -2
- package/dist/composables/index.js +10 -11
- package/dist/composables/useGeneratedAnalysis.d.ts +62 -0
- package/dist/composables/useJobsStatusTray.d.ts +48 -4
- package/dist/composables/usePlatformContext.d.ts +3 -0
- package/dist/composables/usePluginClient.d.ts +17 -8
- package/dist/{composables-BUUphBqg.js → composables-C0VEJ73O.js} +154 -38
- package/dist/composables-C0VEJ73O.js.map +1 -0
- package/dist/experiment-utils-CxkruZ3G.js +392 -0
- package/dist/experiment-utils-CxkruZ3G.js.map +1 -0
- package/dist/generated/schema.d.ts +7 -0
- package/dist/generated-ui/main.d.ts +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -18
- package/dist/index.js.map +1 -1
- package/dist/install.js +7 -8
- package/dist/install.js.map +1 -1
- package/dist/plotly.min-BR53hja4.js +180634 -0
- package/dist/plotly.min-BR53hja4.js.map +1 -0
- package/dist/stores/auth.d.ts +2 -2
- package/dist/stores/index.js +1 -1
- package/dist/styles.css +8657 -8217
- package/dist/tailwind.preset.d.ts +5 -0
- package/dist/tailwind.preset.js +7 -2
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/templates/index.js +4 -3
- package/dist/templates/packs.d.ts +0 -1
- package/dist/{templates-CNbPQNID.js → templates-Cdj93S9C.js} +2 -4
- package/dist/templates-Cdj93S9C.js.map +1 -0
- package/dist/types/components.d.ts +2 -0
- package/dist/types/form-builder.d.ts +1 -1
- package/dist/types/generated-ui.d.ts +183 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +1 -1
- package/dist/types/instrument.d.ts +1 -0
- package/dist/types/jobs.d.ts +7 -1
- package/dist/types/platform.d.ts +2 -0
- package/dist/{useControlSchema-BZNdalmL.js → useControlSchema-B_qgU4rW.js} +1882 -172
- package/dist/useControlSchema-B_qgU4rW.js.map +1 -0
- package/dist/{useDropdownState-Bb-c_PeE.js → useDropdownState-gVaMXtwW.js} +2 -2
- package/dist/{useDropdownState-Bb-c_PeE.js.map → useDropdownState-gVaMXtwW.js.map} +1 -1
- package/dist/{useExperimentSelector-DRbj6vse.js → useExperimentSelector-BuQZRgMt.js} +4 -255
- package/dist/useExperimentSelector-BuQZRgMt.js.map +1 -0
- package/dist/{useFormBuilder-DKekvXRs.js → useFormBuilder-D1G5J5Z5.js} +2 -2
- package/dist/{useFormBuilder-DKekvXRs.js.map → useFormBuilder-D1G5J5Z5.js.map} +1 -1
- package/dist/{useAnalysisArtifacts-C3l0a0vu.js → useProtocolTemplates-DeaOmMaw.js} +307 -475
- package/dist/useProtocolTemplates-DeaOmMaw.js.map +1 -0
- package/package.json +7 -3
- package/src/__tests__/components/BaseSelect.test.ts +52 -0
- package/src/__tests__/components/BaseToggle.test.ts +40 -0
- package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
- package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
- package/src/__tests__/components/GeneratedPluginView.test.ts +240 -0
- package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
- package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
- package/src/__tests__/components/PluginWorkspaceView.test.ts +68 -14
- package/src/__tests__/components/SectionCard.test.ts +181 -0
- package/src/__tests__/composables/formBuilderRegistry.test.ts +5 -1
- package/src/__tests__/composables/useApi.test.ts +8 -0
- package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1742 -0
- package/src/__tests__/composables/useJobsStatusTray.test.ts +179 -1
- package/src/__tests__/composables/usePlatformContext.test.ts +28 -0
- package/src/__tests__/composables/usePluginClient.test.ts +402 -21
- package/src/__tests__/composables/usePluginConfig.test.ts +323 -7
- package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -1
- package/src/__tests__/generatedUi.test.ts +119 -0
- package/src/__tests__/templates/templates.test.ts +1 -1
- package/src/__tests__/types/GeneratedJsonSchema.test.ts +62 -0
- package/src/components/BaseSelect.vue +16 -2
- package/src/components/BaseToggle.vue +3 -1
- package/src/components/FileUploader.vue +49 -11
- package/src/components/GeneratedPathInput.vue +218 -0
- package/src/components/GeneratedPlotlyResult.vue +87 -0
- package/src/components/GeneratedPluginView.vue +279 -0
- package/src/components/GeneratedResultRenderer.vue +137 -0
- package/src/components/InstrumentAlertLog.vue +2 -2
- package/src/components/JobsStatusTray.vue +14 -8
- package/src/components/PluginWorkspaceView.props.ts +1 -1
- package/src/components/PluginWorkspaceView.vue +1 -5
- package/src/components/SectionCard.story.vue +163 -0
- package/src/components/SectionCard.vue +98 -0
- package/src/components/index.ts +5 -0
- package/src/composables/formBuilderRegistry.ts +2 -0
- package/src/composables/index.ts +19 -0
- package/src/composables/useApi.ts +1 -0
- package/src/composables/useGeneratedAnalysis.ts +1270 -0
- package/src/composables/useJobsStatusTray.ts +234 -45
- package/src/composables/usePluginClient.ts +164 -30
- package/src/composables/usePluginConfig.ts +156 -20
- package/src/generated/schema.ts +130 -0
- package/src/generated-ui/main.ts +21 -0
- package/src/index.ts +3 -0
- package/src/jobs.ts +5 -0
- package/src/plotly-dist.d.ts +3 -0
- package/src/styles/components/section-card.css +161 -0
- package/src/styles/index.css +1 -0
- package/src/styles/variables.css +25 -0
- package/src/tailwind.preset.ts +5 -0
- package/src/templates/packs.ts +0 -3
- package/src/types/components.ts +12 -0
- package/src/types/form-builder.ts +1 -0
- package/src/types/generated-ui.ts +189 -0
- package/src/types/index.ts +4 -0
- package/src/types/instrument.ts +1 -0
- package/src/types/jobs.ts +10 -1
- package/src/types/platform.ts +2 -0
- package/dist/BaseButton-Dgqrze41.js +0 -74
- package/dist/BaseButton-Dgqrze41.js.map +0 -1
- package/dist/BaseModal-B9UA8Y_I.js +0 -165
- package/dist/BaseModal-B9UA8Y_I.js.map +0 -1
- package/dist/BaseSelect-ekgr9fDo.js +0 -179
- package/dist/BaseSelect-ekgr9fDo.js.map +0 -1
- package/dist/ExperimentPopover-Ryusjrhv.js +0 -4
- package/dist/ExperimentSelectorModal-Cg4-LXBD.js +0 -5
- package/dist/ExperimentSelectorModal-DZeSd-yr.js.map +0 -1
- package/dist/SettingsModal-Bl_9w2Y3.js +0 -5
- package/dist/components-DdzHh3a_.js.map +0 -1
- package/dist/composables-BUUphBqg.js.map +0 -1
- package/dist/experiment-utils-Bfa7CwPU.js +0 -108
- package/dist/experiment-utils-Bfa7CwPU.js.map +0 -1
- package/dist/templates-CNbPQNID.js.map +0 -1
- package/dist/useAnalysisArtifacts-C3l0a0vu.js.map +0 -1
- package/dist/useControlSchema-BZNdalmL.js.map +0 -1
- package/dist/useEventListener-CfVkP9Xz.js +0 -57
- package/dist/useEventListener-CfVkP9Xz.js.map +0 -1
- package/dist/useExperimentSelector-DRbj6vse.js.map +0 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import SectionCard from './SectionCard.vue'
|
|
3
|
+
import type { SectionCardAccent, SectionCardDivider } from '../types'
|
|
4
|
+
|
|
5
|
+
const flaskIcon =
|
|
6
|
+
'M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4'
|
|
7
|
+
const folderIcon = 'M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z'
|
|
8
|
+
|
|
9
|
+
const experiments = [
|
|
10
|
+
{ code: 'MM-2026-014', name: '13C glucose tracing — HeLa, 24h', updated: '2h ago' },
|
|
11
|
+
{ code: 'MM-2026-013', name: 'Hypoxia timecourse — passage 6', updated: '5h ago' },
|
|
12
|
+
{ code: 'MM-2026-011', name: 'Glutamine dropout, triplicate', updated: 'yesterday' },
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
function initPlayground() {
|
|
16
|
+
return {
|
|
17
|
+
title: 'Experiments',
|
|
18
|
+
count: '14 ongoing · 42 total',
|
|
19
|
+
accent: 'experiment' as SectionCardAccent,
|
|
20
|
+
uppercase: true,
|
|
21
|
+
divider: 'strong' as SectionCardDivider,
|
|
22
|
+
showIcon: true,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<template>
|
|
28
|
+
<Story title="Layout/SectionCard">
|
|
29
|
+
<Variant title="Playground" :init-state="initPlayground">
|
|
30
|
+
<template #default="{ state }">
|
|
31
|
+
<div style="padding: 2rem; max-width: 600px;">
|
|
32
|
+
<SectionCard
|
|
33
|
+
:title="state.title"
|
|
34
|
+
:count="state.count || undefined"
|
|
35
|
+
:icon="state.showIcon ? flaskIcon : undefined"
|
|
36
|
+
:accent="state.accent"
|
|
37
|
+
:uppercase="state.uppercase"
|
|
38
|
+
:divider="state.divider"
|
|
39
|
+
>
|
|
40
|
+
<div class="mint-section-card__rows">
|
|
41
|
+
<a
|
|
42
|
+
v-for="e in experiments"
|
|
43
|
+
:key="e.code"
|
|
44
|
+
href="#"
|
|
45
|
+
class="mint-section-card__row"
|
|
46
|
+
>
|
|
47
|
+
<span style="flex: 1; min-width: 0">
|
|
48
|
+
<span style="display: block; font-size: 0.8125rem; font-weight: 500; color: var(--text-primary)">{{ e.name }}</span>
|
|
49
|
+
<span style="display: block; font-family: 'Fira Code', monospace; font-size: 0.65625rem; color: var(--text-muted)">{{ e.code }}</span>
|
|
50
|
+
</span>
|
|
51
|
+
<span style="flex-shrink: 0; font-size: 0.71875rem; color: var(--text-muted)">{{ e.updated }}</span>
|
|
52
|
+
</a>
|
|
53
|
+
</div>
|
|
54
|
+
</SectionCard>
|
|
55
|
+
</div>
|
|
56
|
+
</template>
|
|
57
|
+
|
|
58
|
+
<template #controls="{ state }">
|
|
59
|
+
<HstText v-model="state.title" title="Title" />
|
|
60
|
+
<HstText v-model="state.count" title="Count" />
|
|
61
|
+
<HstCheckbox v-model="state.showIcon" title="Show icon chip" />
|
|
62
|
+
<HstCheckbox v-model="state.uppercase" title="Uppercase title" />
|
|
63
|
+
<HstSelect
|
|
64
|
+
v-model="state.accent"
|
|
65
|
+
title="Accent"
|
|
66
|
+
:options="{
|
|
67
|
+
primary: 'primary',
|
|
68
|
+
experiment: 'experiment',
|
|
69
|
+
project: 'project',
|
|
70
|
+
success: 'success',
|
|
71
|
+
error: 'error',
|
|
72
|
+
warning: 'warning',
|
|
73
|
+
info: 'info',
|
|
74
|
+
}"
|
|
75
|
+
/>
|
|
76
|
+
<HstSelect
|
|
77
|
+
v-model="state.divider"
|
|
78
|
+
title="Divider"
|
|
79
|
+
:options="{ strong: 'strong', light: 'light' }"
|
|
80
|
+
/>
|
|
81
|
+
</template>
|
|
82
|
+
</Variant>
|
|
83
|
+
|
|
84
|
+
<Variant title="Home category card">
|
|
85
|
+
<div style="padding: 2rem; max-width: 600px;">
|
|
86
|
+
<SectionCard
|
|
87
|
+
title="Projects"
|
|
88
|
+
count="6 active · 9 total"
|
|
89
|
+
:icon="folderIcon"
|
|
90
|
+
accent="project"
|
|
91
|
+
uppercase
|
|
92
|
+
>
|
|
93
|
+
<template #actions>
|
|
94
|
+
<a href="#" style="font-size: 0.75rem; font-weight: 500; color: var(--color-primary-hover)">All →</a>
|
|
95
|
+
</template>
|
|
96
|
+
<div class="mint-section-card__rows">
|
|
97
|
+
<a href="#" class="mint-section-card__row">
|
|
98
|
+
<span style="flex: 1; font-size: 0.8125rem; font-weight: 500; color: var(--text-primary)">Hypoxia metabolic rewiring</span>
|
|
99
|
+
<span style="font-size: 0.71875rem; color: var(--text-muted)">12 experiments</span>
|
|
100
|
+
</a>
|
|
101
|
+
<a href="#" class="mint-section-card__row">
|
|
102
|
+
<span style="flex: 1; font-size: 0.8125rem; font-weight: 500; color: var(--text-primary)">Serine one-carbon flux</span>
|
|
103
|
+
<span style="font-size: 0.71875rem; color: var(--text-muted)">7 experiments</span>
|
|
104
|
+
</a>
|
|
105
|
+
</div>
|
|
106
|
+
</SectionCard>
|
|
107
|
+
</div>
|
|
108
|
+
</Variant>
|
|
109
|
+
|
|
110
|
+
<Variant title="Detail card with footer">
|
|
111
|
+
<div style="padding: 2rem; max-width: 600px;">
|
|
112
|
+
<SectionCard title="Analysis artifacts" :count="4" divider="light">
|
|
113
|
+
<div class="mint-section-card__rows">
|
|
114
|
+
<div class="mint-section-card__row">
|
|
115
|
+
<span style="flex: 1; font-size: 0.8125rem; color: var(--text-primary)">isotopologue_matrix.csv</span>
|
|
116
|
+
<span style="font-size: 0.71875rem; color: var(--text-secondary)">DRP</span>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="mint-section-card__row">
|
|
119
|
+
<span style="flex: 1; font-size: 0.8125rem; color: var(--text-primary)">natural_abundance_corrected.parquet</span>
|
|
120
|
+
<span style="font-size: 0.71875rem; color: var(--text-secondary)">DRP</span>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
<template #footer>
|
|
124
|
+
<span style="font-size: 0.71875rem; color: var(--text-muted)">Showing 1–2 of 4</span>
|
|
125
|
+
<span style="font-size: 0.71875rem; color: var(--text-secondary)">1 / 2</span>
|
|
126
|
+
</template>
|
|
127
|
+
</SectionCard>
|
|
128
|
+
</div>
|
|
129
|
+
</Variant>
|
|
130
|
+
|
|
131
|
+
<Variant title="Fill with pinned toolbar">
|
|
132
|
+
<div style="padding: 2rem; height: 420px; display: flex;">
|
|
133
|
+
<SectionCard title="All experiments" :count="42" divider="light" fill>
|
|
134
|
+
<template #toolbar>
|
|
135
|
+
<div style="display: flex; gap: 0.5rem; padding: 0.6875rem 1rem; border-bottom: 1px solid var(--border-color)">
|
|
136
|
+
<span style="font-size: 0.78125rem; color: var(--text-secondary)">Toolbar stays put while the rows scroll</span>
|
|
137
|
+
</div>
|
|
138
|
+
</template>
|
|
139
|
+
<div class="mint-section-card__rows">
|
|
140
|
+
<div v-for="n in 20" :key="n" class="mint-section-card__row">
|
|
141
|
+
<span style="flex: 1; font-size: 0.8125rem; color: var(--text-primary)">Row {{ n }}</span>
|
|
142
|
+
<span style="font-family: 'Fira Code', monospace; font-size: 0.71875rem; color: var(--text-muted)">MM-2026-{{ String(n).padStart(3, '0') }}</span>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<template #footer>
|
|
146
|
+
<span style="font-size: 0.71875rem; color: var(--text-muted)">Showing 1–20 of 42</span>
|
|
147
|
+
<span style="font-size: 0.71875rem; color: var(--text-secondary)">1 / 3</span>
|
|
148
|
+
</template>
|
|
149
|
+
</SectionCard>
|
|
150
|
+
</div>
|
|
151
|
+
</Variant>
|
|
152
|
+
|
|
153
|
+
<Variant title="No icon, plain title">
|
|
154
|
+
<div style="padding: 2rem; max-width: 600px;">
|
|
155
|
+
<SectionCard title="Design data" count="96 samples · 4 timepoints" divider="light">
|
|
156
|
+
<div style="padding: 1rem; font-size: 0.8125rem; color: var(--text-secondary)">
|
|
157
|
+
Card body content sits directly on the card surface — no nested card.
|
|
158
|
+
</div>
|
|
159
|
+
</SectionCard>
|
|
160
|
+
</div>
|
|
161
|
+
</Variant>
|
|
162
|
+
</Story>
|
|
163
|
+
</template>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
/** One-card page region from the MINT 1.1 card system: 12px radius, the
|
|
3
|
+
* single --card-shadow token, a header strip (icon chip, title, mono count,
|
|
4
|
+
* actions), and hairline-separated content — no card-in-card. */
|
|
5
|
+
import { computed } from 'vue'
|
|
6
|
+
import type { SectionCardAccent, SectionCardDivider } from '../types'
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
title: string
|
|
10
|
+
/** Monospace meta shown next to the title, e.g. "14 ongoing · 42 total". */
|
|
11
|
+
count?: string | number
|
|
12
|
+
/** SVG path(s) for the 22px icon chip; omit to render no chip. */
|
|
13
|
+
icon?: string | string[]
|
|
14
|
+
/** Tint of the icon chip. */
|
|
15
|
+
accent?: SectionCardAccent
|
|
16
|
+
/** Uppercase category heading (home cards) vs plain heading (detail cards). */
|
|
17
|
+
uppercase?: boolean
|
|
18
|
+
/** Header hairline: 'strong' = --border-color, 'light' = --border-light. */
|
|
19
|
+
divider?: SectionCardDivider
|
|
20
|
+
/**
|
|
21
|
+
* Stretch to fill the height its parent offers, scrolling the body and
|
|
22
|
+
* pinning the header and footer. Requires a parent that gives the card a
|
|
23
|
+
* definite height (a flex or grid track).
|
|
24
|
+
*/
|
|
25
|
+
fill?: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
29
|
+
count: undefined,
|
|
30
|
+
icon: undefined,
|
|
31
|
+
accent: 'primary',
|
|
32
|
+
uppercase: false,
|
|
33
|
+
divider: 'strong',
|
|
34
|
+
fill: false,
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const iconPaths = computed(() =>
|
|
38
|
+
props.icon === undefined ? [] : Array.isArray(props.icon) ? props.icon : [props.icon],
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const headerClasses = computed(() => [
|
|
42
|
+
'mint-section-card__header',
|
|
43
|
+
props.divider === 'light' ? 'mint-section-card__header--divider-light' : '',
|
|
44
|
+
])
|
|
45
|
+
|
|
46
|
+
const titleClasses = computed(() => [
|
|
47
|
+
'mint-section-card__title',
|
|
48
|
+
props.uppercase ? 'mint-section-card__title--uppercase' : '',
|
|
49
|
+
])
|
|
50
|
+
|
|
51
|
+
const cardClasses = computed(() => [
|
|
52
|
+
'mint-section-card',
|
|
53
|
+
props.fill ? 'mint-section-card--fill' : '',
|
|
54
|
+
])
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<template>
|
|
58
|
+
<section :class="cardClasses">
|
|
59
|
+
<div :class="headerClasses">
|
|
60
|
+
<span
|
|
61
|
+
v-if="iconPaths.length"
|
|
62
|
+
:class="['mint-section-card__icon-chip', `mint-section-card__icon-chip--${accent}`]"
|
|
63
|
+
>
|
|
64
|
+
<svg
|
|
65
|
+
class="mint-section-card__icon"
|
|
66
|
+
viewBox="0 0 24 24"
|
|
67
|
+
fill="none"
|
|
68
|
+
stroke="currentColor"
|
|
69
|
+
stroke-width="2"
|
|
70
|
+
stroke-linecap="round"
|
|
71
|
+
stroke-linejoin="round"
|
|
72
|
+
aria-hidden="true"
|
|
73
|
+
>
|
|
74
|
+
<path v-for="(d, i) in iconPaths" :key="i" :d="d" />
|
|
75
|
+
</svg>
|
|
76
|
+
</span>
|
|
77
|
+
<h2 :class="titleClasses">{{ title }}</h2>
|
|
78
|
+
<span v-if="count !== undefined" class="mint-section-card__count">{{ count }}</span>
|
|
79
|
+
<div class="mint-section-card__spacer"></div>
|
|
80
|
+
<slot name="actions" />
|
|
81
|
+
</div>
|
|
82
|
+
<!-- Controls belong to the card's chrome, so they sit outside the body and
|
|
83
|
+
stay put while the body scrolls. -->
|
|
84
|
+
<div v-if="$slots.toolbar" class="mint-section-card__toolbar">
|
|
85
|
+
<slot name="toolbar" />
|
|
86
|
+
</div>
|
|
87
|
+
<div class="mint-section-card__body">
|
|
88
|
+
<slot />
|
|
89
|
+
</div>
|
|
90
|
+
<div v-if="$slots.footer" class="mint-section-card__footer">
|
|
91
|
+
<slot name="footer" />
|
|
92
|
+
</div>
|
|
93
|
+
</section>
|
|
94
|
+
</template>
|
|
95
|
+
|
|
96
|
+
<style>
|
|
97
|
+
@import '../styles/components/section-card.css';
|
|
98
|
+
</style>
|
package/src/components/index.ts
CHANGED
|
@@ -42,6 +42,9 @@ export { default as AppSidebar } from './AppSidebar.vue'
|
|
|
42
42
|
export { default as AppLayout } from './AppLayout.vue'
|
|
43
43
|
export { default as MobileSupportGate } from './MobileSupportGate.vue'
|
|
44
44
|
export { default as PluginWorkspaceView } from './PluginWorkspaceView.vue'
|
|
45
|
+
export { default as GeneratedPluginView } from './GeneratedPluginView.vue'
|
|
46
|
+
export { default as GeneratedResultRenderer } from './GeneratedResultRenderer.vue'
|
|
47
|
+
export { default as GeneratedPlotlyResult } from './GeneratedPlotlyResult.vue'
|
|
45
48
|
export { default as ComponentBindingRenderer } from './ComponentBindingRenderer.vue'
|
|
46
49
|
export { default as ControlWorkspaceView } from './ControlWorkspaceView.vue'
|
|
47
50
|
export { default as DoseDesignWorkspaceView } from './DoseDesignWorkspaceView.vue'
|
|
@@ -123,10 +126,12 @@ export { default as DateTimePicker } from './DateTimePicker.vue'
|
|
|
123
126
|
export { default as TimeRangeInput } from './TimeRangeInput.vue'
|
|
124
127
|
export { default as ScheduleCalendar } from './ScheduleCalendar.vue'
|
|
125
128
|
export { default as ResourceCard } from './ResourceCard.vue'
|
|
129
|
+
export { default as SectionCard } from './SectionCard.vue'
|
|
126
130
|
|
|
127
131
|
// Experiment / analysis components
|
|
128
132
|
export { default as ExperimentSelectorModal } from './ExperimentSelectorModal.vue'
|
|
129
133
|
export { default as ArtifactSelectorModal } from './ArtifactSelectorModal.vue'
|
|
134
|
+
export { default as GeneratedPathInput } from './GeneratedPathInput.vue'
|
|
130
135
|
export { default as ArtifactSaveDialog } from './ArtifactSaveDialog.vue'
|
|
131
136
|
export { default as ExperimentPopover } from './ExperimentPopover.vue'
|
|
132
137
|
export { default as FitPanel } from './FitPanel.vue'
|
|
@@ -15,6 +15,7 @@ import DatePicker from '../components/DatePicker.vue'
|
|
|
15
15
|
import TimePicker from '../components/TimePicker.vue'
|
|
16
16
|
import DateTimePicker from '../components/DateTimePicker.vue'
|
|
17
17
|
import FileUploader from '../components/FileUploader.vue'
|
|
18
|
+
import GeneratedPathInput from '../components/GeneratedPathInput.vue'
|
|
18
19
|
import FormulaInput from '../components/FormulaInput.vue'
|
|
19
20
|
import SequenceInput from '../components/SequenceInput.vue'
|
|
20
21
|
import MoleculeInput from '../components/MoleculeInput.vue'
|
|
@@ -49,6 +50,7 @@ const registry: Record<FormFieldType, RegistryEntry> = {
|
|
|
49
50
|
time: { component: TimePicker, defaults: {}, vModel: true },
|
|
50
51
|
datetime: { component: DateTimePicker, defaults: {}, vModel: true },
|
|
51
52
|
file: { component: FileUploader, defaults: {}, vModel: false },
|
|
53
|
+
path: { component: GeneratedPathInput, defaults: {}, vModel: true },
|
|
52
54
|
formula: { component: FormulaInput, defaults: {}, vModel: true },
|
|
53
55
|
sequence: { component: SequenceInput, defaults: {}, vModel: true },
|
|
54
56
|
molecule: { component: MoleculeInput, defaults: {}, vModel: true },
|
package/src/composables/index.ts
CHANGED
|
@@ -125,6 +125,18 @@ export {
|
|
|
125
125
|
type UseDebouncedWatchReturn,
|
|
126
126
|
} from './useDebouncedWatch'
|
|
127
127
|
export { useFormBuilder, evaluateCondition } from './useFormBuilder'
|
|
128
|
+
export {
|
|
129
|
+
createGeneratedAnalysisTransport,
|
|
130
|
+
useGeneratedAnalysis,
|
|
131
|
+
usePluginJobs,
|
|
132
|
+
type GeneratedAnalysisTransport,
|
|
133
|
+
type GeneratedAnalysisOptions,
|
|
134
|
+
type PluginJobRequestOptions,
|
|
135
|
+
type PluginJobWaitOptions,
|
|
136
|
+
type UsePluginJobsOptions,
|
|
137
|
+
type UsePluginJobsReturn,
|
|
138
|
+
type UseGeneratedAnalysisReturn,
|
|
139
|
+
} from './useGeneratedAnalysis'
|
|
128
140
|
export { useAutoGroup, DEFAULT_COLORS, extractSamplesFromDesignData } from './useAutoGroup'
|
|
129
141
|
export {
|
|
130
142
|
useReagentSeries,
|
|
@@ -469,6 +481,7 @@ export {
|
|
|
469
481
|
type DownloadBlobOptions,
|
|
470
482
|
type DownloadPluginEndpointOptions,
|
|
471
483
|
type PluginContract,
|
|
484
|
+
type PluginContractSettings,
|
|
472
485
|
type PluginClientRequestOptions,
|
|
473
486
|
type PluginEndpointContract,
|
|
474
487
|
type PluginEndpointDefinition,
|
|
@@ -487,10 +500,16 @@ export {
|
|
|
487
500
|
type UsePluginSettingsReturn,
|
|
488
501
|
} from './usePluginClient'
|
|
489
502
|
export {
|
|
503
|
+
combinePluginJobSources,
|
|
504
|
+
usePluginJobCenter,
|
|
490
505
|
useJobsStatusTray,
|
|
506
|
+
type CombinedPluginJobCenterSource,
|
|
507
|
+
type PluginJobCenterSource,
|
|
491
508
|
type JobsStatusTrayAdapter,
|
|
492
509
|
type JobsStatusTrayTab,
|
|
493
510
|
type JobStreamMessage,
|
|
511
|
+
type UsePluginJobCenterOptions,
|
|
512
|
+
type UsePluginJobCenterReturn,
|
|
494
513
|
type UseJobsStatusTrayOptions,
|
|
495
514
|
type UseJobsStatusTrayReturn,
|
|
496
515
|
} from './useJobsStatusTray'
|
|
@@ -22,6 +22,7 @@ type MutableHeaders = Record<string, unknown> & {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function joinUrlPath(baseUrl: string, path: string): string {
|
|
25
|
+
if (/^https?:\/\//i.test(path)) return path
|
|
25
26
|
if (!path) return baseUrl
|
|
26
27
|
if (path.startsWith('?') || path.startsWith('#')) return `${baseUrl.replace(/\/+$/, '')}${path}`
|
|
27
28
|
const normalizedBase = baseUrl.replace(/\/+$/, '')
|