@morscherlab/mint-sdk 1.0.0-alpha.8 → 1.0.0-alpha.9
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 +15 -15
- package/dist/{auth-BYmxZdJl.js → auth-DsI0rQ7_.js} +6 -6
- package/dist/auth-DsI0rQ7_.js.map +1 -0
- package/dist/components/index.js +2 -2
- package/dist/{components-CKf-UpGi.js → components-CzbQQPCb.js} +1429 -1429
- package/dist/components-CzbQQPCb.js.map +1 -0
- package/dist/composables/index.js +2 -2
- package/dist/composables/usePlatformContext.d.ts +3 -3
- package/dist/{composables-D0QfFzq1.js → composables-BXklV5ii.js} +3 -3
- package/dist/{composables-D0QfFzq1.js.map → composables-BXklV5ii.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/install.d.ts +3 -3
- package/dist/install.js +5 -5
- package/dist/install.js.map +1 -1
- package/dist/stores/auth.d.ts +1 -1
- package/dist/stores/index.js +1 -1
- package/dist/stores/settings.d.ts +1 -1
- package/dist/styles.css +5388 -5388
- package/dist/types/platform.d.ts +1 -1
- package/dist/{useScheduleDrag-DAJueTbK.js → useScheduleDrag-CxBeqYcu.js} +331 -331
- package/dist/useScheduleDrag-CxBeqYcu.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/components/AppLayout.test.ts +23 -23
- package/src/__tests__/components/AppSidebar.test.ts +29 -29
- package/src/__tests__/components/AppTopBar.test.ts +45 -45
- package/src/__tests__/components/BaseInput.test.ts +2 -2
- package/src/__tests__/components/BasePill.test.ts +37 -37
- package/src/__tests__/components/Calendar.test.ts +52 -52
- package/src/__tests__/components/CollapsibleCard.test.ts +81 -81
- package/src/__tests__/components/DataFrame.test.ts +80 -80
- package/src/__tests__/components/DropdownButton.test.ts +80 -80
- package/src/__tests__/composables/usePlatformContext.test.ts +1 -1
- package/src/components/AlertBox.story.vue +1 -1
- package/src/components/AlertBox.vue +14 -14
- package/src/components/AppAvatarMenu.vue +26 -26
- package/src/components/AppContainer.vue +3 -3
- package/src/components/AppLayout.vue +7 -7
- package/src/components/AppPageSelector.vue +30 -30
- package/src/components/AppPillNav.vue +10 -10
- package/src/components/AppPluginSwitcher.vue +31 -31
- package/src/components/AppSidebar.vue +8 -8
- package/src/components/AppTopBar.story.vue +7 -7
- package/src/components/AppTopBar.vue +102 -102
- package/src/components/AuditTrail.vue +19 -19
- package/src/components/AutoGroupModal.vue +76 -76
- package/src/components/Avatar.vue +6 -6
- package/src/components/BaseButton.vue +6 -6
- package/src/components/BaseCheckbox.vue +9 -9
- package/src/components/BaseInput.vue +4 -4
- package/src/components/BaseModal.story.vue +1 -1
- package/src/components/BaseModal.vue +14 -14
- package/src/components/BasePill.vue +9 -9
- package/src/components/BaseRadioGroup.vue +21 -21
- package/src/components/BaseSelect.vue +6 -6
- package/src/components/BaseSlider.vue +8 -8
- package/src/components/BaseTabs.vue +7 -7
- package/src/components/BaseTextarea.vue +5 -5
- package/src/components/BaseToggle.vue +10 -10
- package/src/components/BatchProgressList.vue +25 -25
- package/src/components/Breadcrumb.vue +8 -8
- package/src/components/Calendar.vue +19 -19
- package/src/components/ChartContainer.vue +9 -9
- package/src/components/ChemicalFormula.vue +7 -7
- package/src/components/CollapsibleCard.vue +20 -20
- package/src/components/ColorSlider.vue +6 -6
- package/src/components/ConcentrationInput.vue +12 -12
- package/src/components/ConfirmDialog.story.vue +1 -1
- package/src/components/ConfirmDialog.vue +7 -7
- package/src/components/DataFrame.vue +40 -40
- package/src/components/DatePicker.vue +29 -29
- package/src/components/DateTimePicker.vue +41 -41
- package/src/components/Divider.vue +9 -9
- package/src/components/DoseCalculator.vue +66 -66
- package/src/components/DropdownButton.vue +19 -19
- package/src/components/EmptyState.vue +9 -9
- package/src/components/ExperimentCodeBadge.vue +3 -3
- package/src/components/ExperimentDataViewer.vue +25 -25
- package/src/components/ExperimentPopover.vue +35 -35
- package/src/components/ExperimentSelectorModal.vue +40 -40
- package/src/components/ExperimentTimeline.vue +48 -48
- package/src/components/FileUploader.vue +31 -31
- package/src/components/FitPanel.vue +9 -9
- package/src/components/FormActions.vue +1 -1
- package/src/components/FormBuilder.vue +2 -2
- package/src/components/FormField.vue +7 -7
- package/src/components/FormSection.vue +7 -7
- package/src/components/FormulaInput.vue +10 -10
- package/src/components/GroupAssigner.vue +40 -40
- package/src/components/GroupingModal.vue +45 -45
- package/src/components/IconButton.vue +6 -6
- package/src/components/LoadingSpinner.vue +5 -5
- package/src/components/MoleculeInput.vue +21 -21
- package/src/components/MultiSelect.vue +13 -13
- package/src/components/NumberInput.vue +13 -13
- package/src/components/PlateMapEditor.vue +63 -63
- package/src/components/ProgressBar.vue +18 -18
- package/src/components/ProtocolStepEditor.vue +57 -57
- package/src/components/RackEditor.vue +28 -28
- package/src/components/ReagentEditor.vue +61 -61
- package/src/components/ReagentList.vue +49 -49
- package/src/components/ResourceCard.vue +28 -28
- package/src/components/SampleHierarchyTree.vue +13 -13
- package/src/components/SampleLegend.vue +12 -12
- package/src/components/SampleSelector.vue +104 -104
- package/src/components/ScheduleCalendar.vue +42 -42
- package/src/components/ScientificNumber.vue +11 -11
- package/src/components/SegmentedControl.vue +12 -12
- package/src/components/SequenceInput.vue +32 -32
- package/src/components/SettingsButton.vue +5 -5
- package/src/components/SettingsModal.vue +17 -17
- package/src/components/StatusIndicator.vue +5 -5
- package/src/components/StepWizard.vue +16 -16
- package/src/components/TagsInput.vue +20 -20
- package/src/components/ThemeToggle.vue +3 -3
- package/src/components/TimePicker.vue +21 -21
- package/src/components/TimeRangeInput.vue +5 -5
- package/src/components/ToastNotification.vue +8 -8
- package/src/components/Tooltip.vue +7 -7
- package/src/components/UnitInput.vue +12 -12
- package/src/components/WellEditPopup.vue +28 -28
- package/src/components/WellPlate.vue +37 -37
- package/src/composables/useAppExperiment.ts +1 -1
- package/src/composables/usePlatformContext.ts +16 -16
- package/src/composables/useProtocolTemplates.ts +1 -1
- package/src/install.ts +3 -3
- package/src/stores/auth.ts +3 -3
- package/src/stores/settings.ts +2 -2
- package/src/styles/components/alert-box.css +30 -30
- package/src/styles/components/app-avatar-menu.css +23 -23
- package/src/styles/components/app-container.css +6 -6
- package/src/styles/components/app-layout.css +15 -15
- package/src/styles/components/app-page-selector.css +26 -26
- package/src/styles/components/app-pill-nav.css +7 -7
- package/src/styles/components/app-plugin-switcher.css +27 -27
- package/src/styles/components/app-sidebar.css +24 -24
- package/src/styles/components/app-top-bar.css +65 -65
- package/src/styles/components/audit-trail.css +29 -29
- package/src/styles/components/auto-group-modal.css +91 -91
- package/src/styles/components/avatar.css +15 -15
- package/src/styles/components/batch-progress-list.css +40 -40
- package/src/styles/components/breadcrumb.css +8 -8
- package/src/styles/components/button.css +31 -31
- package/src/styles/components/calendar.css +27 -27
- package/src/styles/components/chart-container.css +9 -9
- package/src/styles/components/checkbox.css +20 -20
- package/src/styles/components/chemical-formula.css +8 -8
- package/src/styles/components/collapsible-card.css +35 -35
- package/src/styles/components/color-slider.css +8 -8
- package/src/styles/components/concentration-input.css +27 -27
- package/src/styles/components/confirm-dialog.css +32 -32
- package/src/styles/components/dataframe.css +66 -66
- package/src/styles/components/date-picker.css +40 -40
- package/src/styles/components/datetime-picker.css +37 -37
- package/src/styles/components/divider.css +13 -13
- package/src/styles/components/dose-calculator.css +43 -43
- package/src/styles/components/dropdown-button.css +46 -46
- package/src/styles/components/empty-state.css +44 -44
- package/src/styles/components/experiment-code-badge.css +8 -8
- package/src/styles/components/experiment-data-viewer.css +23 -23
- package/src/styles/components/experiment-popover.css +97 -97
- package/src/styles/components/experiment-selector-modal.css +39 -39
- package/src/styles/components/experiment-timeline.css +98 -98
- package/src/styles/components/file-uploader.css +44 -44
- package/src/styles/components/fit-panel.css +12 -12
- package/src/styles/components/form-builder.css +11 -11
- package/src/styles/components/form-field.css +7 -7
- package/src/styles/components/formula-input.css +17 -17
- package/src/styles/components/group-assigner.css +26 -26
- package/src/styles/components/grouping-modal.css +51 -51
- package/src/styles/components/icon-button.css +41 -41
- package/src/styles/components/input.css +13 -13
- package/src/styles/components/loading-spinner.css +12 -12
- package/src/styles/components/modal.css +69 -69
- package/src/styles/components/molecule-input.css +27 -27
- package/src/styles/components/multi-select.css +23 -23
- package/src/styles/components/number-input.css +32 -32
- package/src/styles/components/pill.css +37 -37
- package/src/styles/components/plate-map-editor.css +67 -67
- package/src/styles/components/progress-bar.css +41 -41
- package/src/styles/components/protocol-step-editor.css +63 -63
- package/src/styles/components/rack-editor.css +34 -34
- package/src/styles/components/radio-group.css +41 -41
- package/src/styles/components/reagent-editor.css +70 -70
- package/src/styles/components/reagent-list.css +65 -65
- package/src/styles/components/resource-card.css +52 -52
- package/src/styles/components/sample-hierarchy-tree.css +56 -56
- package/src/styles/components/sample-legend.css +37 -37
- package/src/styles/components/sample-selector.css +121 -121
- package/src/styles/components/schedule-calendar.css +67 -67
- package/src/styles/components/scientific-number.css +11 -11
- package/src/styles/components/segmented-control.css +33 -33
- package/src/styles/components/select.css +11 -11
- package/src/styles/components/sequence-input.css +29 -29
- package/src/styles/components/settings-button.css +16 -16
- package/src/styles/components/settings-modal.css +14 -14
- package/src/styles/components/skeleton.css +2 -2
- package/src/styles/components/slider.css +10 -10
- package/src/styles/components/status-indicator.css +12 -12
- package/src/styles/components/step-wizard.css +32 -32
- package/src/styles/components/tabs.css +16 -16
- package/src/styles/components/tags-input.css +46 -46
- package/src/styles/components/textarea.css +17 -17
- package/src/styles/components/theme-toggle.css +13 -13
- package/src/styles/components/time-picker.css +28 -28
- package/src/styles/components/time-range-input.css +8 -8
- package/src/styles/components/toast.css +18 -18
- package/src/styles/components/toggle.css +27 -27
- package/src/styles/components/tooltip.css +18 -18
- package/src/styles/components/unit-input.css +25 -25
- package/src/styles/components/well-edit-popup.css +32 -32
- package/src/styles/components/well-plate.css +49 -49
- package/src/styles/index.css +1 -1
- package/src/styles/variables.css +3 -3
- package/src/types/platform.ts +6 -6
- package/dist/auth-BYmxZdJl.js.map +0 -1
- package/dist/components-CKf-UpGi.js.map +0 -1
- package/dist/useScheduleDrag-DAJueTbK.js.map +0 -1
|
@@ -128,44 +128,44 @@ function clearAll() {
|
|
|
128
128
|
</script>
|
|
129
129
|
|
|
130
130
|
<template>
|
|
131
|
-
<div class="
|
|
131
|
+
<div class="mint-group-assigner">
|
|
132
132
|
<!-- Drop zones -->
|
|
133
|
-
<div class="
|
|
133
|
+
<div class="mint-group-assigner__zones">
|
|
134
134
|
<!-- Zone 1 (Control) -->
|
|
135
135
|
<div
|
|
136
136
|
:class="[
|
|
137
|
-
'
|
|
138
|
-
'
|
|
139
|
-
dragOverZone === 'zone1' ? '
|
|
137
|
+
'mint-group-assigner__zone',
|
|
138
|
+
'mint-group-assigner__zone--1',
|
|
139
|
+
dragOverZone === 'zone1' ? 'mint-group-assigner__zone--dragover' : '',
|
|
140
140
|
]"
|
|
141
141
|
:style="{ '--zone-color': color1 }"
|
|
142
142
|
@dragover="handleDragOver($event, 'zone1')"
|
|
143
143
|
@dragleave="handleDragLeave"
|
|
144
144
|
@drop="handleDrop($event, 'zone1')"
|
|
145
145
|
>
|
|
146
|
-
<div class="
|
|
147
|
-
<span class="
|
|
148
|
-
<span class="
|
|
146
|
+
<div class="mint-group-assigner__zone-header">
|
|
147
|
+
<span class="mint-group-assigner__zone-label">{{ label1 }}</span>
|
|
148
|
+
<span class="mint-group-assigner__zone-count">{{ zone1Count }} samples</span>
|
|
149
149
|
</div>
|
|
150
150
|
|
|
151
|
-
<div class="
|
|
151
|
+
<div class="mint-group-assigner__zone-content">
|
|
152
152
|
<div
|
|
153
153
|
v-for="group in zone1Groups"
|
|
154
154
|
:key="group.name"
|
|
155
|
-
class="
|
|
155
|
+
class="mint-group-assigner__pill"
|
|
156
156
|
draggable="true"
|
|
157
157
|
@dragstart="handleDragStart($event, group.name)"
|
|
158
158
|
@dragend="handleDragEnd"
|
|
159
159
|
>
|
|
160
160
|
<span
|
|
161
|
-
class="
|
|
161
|
+
class="mint-group-assigner__pill-color"
|
|
162
162
|
:style="{ backgroundColor: group.color }"
|
|
163
163
|
/>
|
|
164
|
-
<span class="
|
|
165
|
-
<span class="
|
|
164
|
+
<span class="mint-group-assigner__pill-name">{{ group.name }}</span>
|
|
165
|
+
<span class="mint-group-assigner__pill-count">{{ group.count }}</span>
|
|
166
166
|
<button
|
|
167
167
|
type="button"
|
|
168
|
-
class="
|
|
168
|
+
class="mint-group-assigner__pill-remove"
|
|
169
169
|
@click="removeFromZone(group.name, 'zone1')"
|
|
170
170
|
>
|
|
171
171
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -174,7 +174,7 @@ function clearAll() {
|
|
|
174
174
|
</button>
|
|
175
175
|
</div>
|
|
176
176
|
|
|
177
|
-
<div v-if="zone1Groups.length === 0" class="
|
|
177
|
+
<div v-if="zone1Groups.length === 0" class="mint-group-assigner__zone-empty">
|
|
178
178
|
Drag groups here
|
|
179
179
|
</div>
|
|
180
180
|
</div>
|
|
@@ -183,38 +183,38 @@ function clearAll() {
|
|
|
183
183
|
<!-- Zone 2 (Treatment) -->
|
|
184
184
|
<div
|
|
185
185
|
:class="[
|
|
186
|
-
'
|
|
187
|
-
'
|
|
188
|
-
dragOverZone === 'zone2' ? '
|
|
186
|
+
'mint-group-assigner__zone',
|
|
187
|
+
'mint-group-assigner__zone--2',
|
|
188
|
+
dragOverZone === 'zone2' ? 'mint-group-assigner__zone--dragover' : '',
|
|
189
189
|
]"
|
|
190
190
|
:style="{ '--zone-color': color2 }"
|
|
191
191
|
@dragover="handleDragOver($event, 'zone2')"
|
|
192
192
|
@dragleave="handleDragLeave"
|
|
193
193
|
@drop="handleDrop($event, 'zone2')"
|
|
194
194
|
>
|
|
195
|
-
<div class="
|
|
196
|
-
<span class="
|
|
197
|
-
<span class="
|
|
195
|
+
<div class="mint-group-assigner__zone-header">
|
|
196
|
+
<span class="mint-group-assigner__zone-label">{{ label2 }}</span>
|
|
197
|
+
<span class="mint-group-assigner__zone-count">{{ zone2Count }} samples</span>
|
|
198
198
|
</div>
|
|
199
199
|
|
|
200
|
-
<div class="
|
|
200
|
+
<div class="mint-group-assigner__zone-content">
|
|
201
201
|
<div
|
|
202
202
|
v-for="group in zone2Groups"
|
|
203
203
|
:key="group.name"
|
|
204
|
-
class="
|
|
204
|
+
class="mint-group-assigner__pill"
|
|
205
205
|
draggable="true"
|
|
206
206
|
@dragstart="handleDragStart($event, group.name)"
|
|
207
207
|
@dragend="handleDragEnd"
|
|
208
208
|
>
|
|
209
209
|
<span
|
|
210
|
-
class="
|
|
210
|
+
class="mint-group-assigner__pill-color"
|
|
211
211
|
:style="{ backgroundColor: group.color }"
|
|
212
212
|
/>
|
|
213
|
-
<span class="
|
|
214
|
-
<span class="
|
|
213
|
+
<span class="mint-group-assigner__pill-name">{{ group.name }}</span>
|
|
214
|
+
<span class="mint-group-assigner__pill-count">{{ group.count }}</span>
|
|
215
215
|
<button
|
|
216
216
|
type="button"
|
|
217
|
-
class="
|
|
217
|
+
class="mint-group-assigner__pill-remove"
|
|
218
218
|
@click="removeFromZone(group.name, 'zone2')"
|
|
219
219
|
>
|
|
220
220
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -223,7 +223,7 @@ function clearAll() {
|
|
|
223
223
|
</button>
|
|
224
224
|
</div>
|
|
225
225
|
|
|
226
|
-
<div v-if="zone2Groups.length === 0" class="
|
|
226
|
+
<div v-if="zone2Groups.length === 0" class="mint-group-assigner__zone-empty">
|
|
227
227
|
Drag groups here
|
|
228
228
|
</div>
|
|
229
229
|
</div>
|
|
@@ -231,44 +231,44 @@ function clearAll() {
|
|
|
231
231
|
</div>
|
|
232
232
|
|
|
233
233
|
<!-- Unassigned groups -->
|
|
234
|
-
<div v-if="unassignedGroups.length > 0" class="
|
|
235
|
-
<div class="
|
|
236
|
-
<span class="
|
|
234
|
+
<div v-if="unassignedGroups.length > 0" class="mint-group-assigner__unassigned">
|
|
235
|
+
<div class="mint-group-assigner__unassigned-header">
|
|
236
|
+
<span class="mint-group-assigner__unassigned-title">Available Groups</span>
|
|
237
237
|
<button
|
|
238
238
|
v-if="group1.length > 0 || group2.length > 0"
|
|
239
239
|
type="button"
|
|
240
|
-
class="
|
|
240
|
+
class="mint-group-assigner__clear-btn"
|
|
241
241
|
@click="clearAll"
|
|
242
242
|
>
|
|
243
243
|
Clear all
|
|
244
244
|
</button>
|
|
245
245
|
</div>
|
|
246
246
|
|
|
247
|
-
<div class="
|
|
247
|
+
<div class="mint-group-assigner__unassigned-list">
|
|
248
248
|
<div
|
|
249
249
|
v-for="group in unassignedGroups"
|
|
250
250
|
:key="group.name"
|
|
251
251
|
:class="[
|
|
252
|
-
'
|
|
253
|
-
'
|
|
254
|
-
draggingGroup === group.name ? '
|
|
252
|
+
'mint-group-assigner__pill',
|
|
253
|
+
'mint-group-assigner__pill--unassigned',
|
|
254
|
+
draggingGroup === group.name ? 'mint-group-assigner__pill--dragging' : '',
|
|
255
255
|
]"
|
|
256
256
|
draggable="true"
|
|
257
257
|
@dragstart="handleDragStart($event, group.name)"
|
|
258
258
|
@dragend="handleDragEnd"
|
|
259
259
|
>
|
|
260
260
|
<span
|
|
261
|
-
class="
|
|
261
|
+
class="mint-group-assigner__pill-color"
|
|
262
262
|
:style="{ backgroundColor: group.color }"
|
|
263
263
|
/>
|
|
264
|
-
<span class="
|
|
265
|
-
<span class="
|
|
264
|
+
<span class="mint-group-assigner__pill-name">{{ group.name }}</span>
|
|
265
|
+
<span class="mint-group-assigner__pill-count">{{ group.count }}</span>
|
|
266
266
|
</div>
|
|
267
267
|
</div>
|
|
268
268
|
</div>
|
|
269
269
|
|
|
270
270
|
<!-- Validation message -->
|
|
271
|
-
<div v-if="validationMessage" class="
|
|
271
|
+
<div v-if="validationMessage" class="mint-group-assigner__validation">
|
|
272
272
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
273
273
|
<circle cx="12" cy="12" r="10" />
|
|
274
274
|
<line x1="12" y1="8" x2="12" y2="12" />
|
|
@@ -224,13 +224,13 @@ function close() {
|
|
|
224
224
|
@update:model-value="!$event && close()"
|
|
225
225
|
@close="close"
|
|
226
226
|
>
|
|
227
|
-
<div class="
|
|
227
|
+
<div class="mint-grouping-modal">
|
|
228
228
|
<!-- File upload area -->
|
|
229
229
|
<div
|
|
230
230
|
v-if="!csvFile"
|
|
231
231
|
:class="[
|
|
232
|
-
'
|
|
233
|
-
isDragOver ? '
|
|
232
|
+
'mint-grouping-modal__dropzone',
|
|
233
|
+
isDragOver ? 'mint-grouping-modal__dropzone--dragover' : '',
|
|
234
234
|
]"
|
|
235
235
|
@drop="handleDrop"
|
|
236
236
|
@dragover.prevent="isDragOver = true"
|
|
@@ -239,36 +239,36 @@ function close() {
|
|
|
239
239
|
<input
|
|
240
240
|
type="file"
|
|
241
241
|
accept=".csv"
|
|
242
|
-
class="
|
|
242
|
+
class="mint-grouping-modal__file-input"
|
|
243
243
|
@change="handleFileInput"
|
|
244
244
|
/>
|
|
245
|
-
<svg class="
|
|
245
|
+
<svg class="mint-grouping-modal__upload-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
246
246
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
|
247
247
|
</svg>
|
|
248
|
-
<p class="
|
|
249
|
-
<span class="
|
|
248
|
+
<p class="mint-grouping-modal__upload-text">
|
|
249
|
+
<span class="mint-grouping-modal__upload-highlight">Click to upload</span>
|
|
250
250
|
or drag and drop a CSV file
|
|
251
251
|
</p>
|
|
252
|
-
<p class="
|
|
252
|
+
<p class="mint-grouping-modal__upload-hint">
|
|
253
253
|
CSV should contain sample names and grouping columns
|
|
254
254
|
</p>
|
|
255
255
|
</div>
|
|
256
256
|
|
|
257
257
|
<!-- Error message -->
|
|
258
|
-
<div v-if="parseError" class="
|
|
258
|
+
<div v-if="parseError" class="mint-grouping-modal__error">
|
|
259
259
|
{{ parseError }}
|
|
260
260
|
</div>
|
|
261
261
|
|
|
262
262
|
<!-- Configuration section -->
|
|
263
263
|
<template v-if="csvFile && csvData.length > 0">
|
|
264
|
-
<div class="
|
|
265
|
-
<svg class="
|
|
264
|
+
<div class="mint-grouping-modal__file-info">
|
|
265
|
+
<svg class="mint-grouping-modal__file-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
266
266
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
|
267
267
|
</svg>
|
|
268
|
-
<span class="
|
|
268
|
+
<span class="mint-grouping-modal__file-name">{{ csvFile.name }}</span>
|
|
269
269
|
<button
|
|
270
270
|
type="button"
|
|
271
|
-
class="
|
|
271
|
+
class="mint-grouping-modal__file-clear"
|
|
272
272
|
@click="resetState"
|
|
273
273
|
>
|
|
274
274
|
Change file
|
|
@@ -276,9 +276,9 @@ function close() {
|
|
|
276
276
|
</div>
|
|
277
277
|
|
|
278
278
|
<!-- Column selection -->
|
|
279
|
-
<div class="
|
|
280
|
-
<div class="
|
|
281
|
-
<label class="
|
|
279
|
+
<div class="mint-grouping-modal__config">
|
|
280
|
+
<div class="mint-grouping-modal__config-row">
|
|
281
|
+
<label class="mint-grouping-modal__label">Sample Column</label>
|
|
282
282
|
<BaseSelect
|
|
283
283
|
v-model="sampleColumn"
|
|
284
284
|
:options="columnOptions"
|
|
@@ -286,22 +286,22 @@ function close() {
|
|
|
286
286
|
/>
|
|
287
287
|
</div>
|
|
288
288
|
|
|
289
|
-
<div class="
|
|
290
|
-
<label class="
|
|
291
|
-
<div class="
|
|
289
|
+
<div class="mint-grouping-modal__config-row">
|
|
290
|
+
<label class="mint-grouping-modal__label">Group Columns</label>
|
|
291
|
+
<div class="mint-grouping-modal__group-columns">
|
|
292
292
|
<!-- Selected group columns with reordering -->
|
|
293
|
-
<div v-if="groupColumns.length > 0" class="
|
|
293
|
+
<div v-if="groupColumns.length > 0" class="mint-grouping-modal__selected-columns">
|
|
294
294
|
<div
|
|
295
295
|
v-for="(col, index) in groupColumns"
|
|
296
296
|
:key="col"
|
|
297
|
-
class="
|
|
297
|
+
class="mint-grouping-modal__selected-column"
|
|
298
298
|
>
|
|
299
|
-
<span class="
|
|
300
|
-
<div class="
|
|
299
|
+
<span class="mint-grouping-modal__column-name">{{ col }}</span>
|
|
300
|
+
<div class="mint-grouping-modal__column-actions">
|
|
301
301
|
<button
|
|
302
302
|
type="button"
|
|
303
303
|
:disabled="index === 0"
|
|
304
|
-
class="
|
|
304
|
+
class="mint-grouping-modal__column-btn"
|
|
305
305
|
@click="moveGroupColumn(index, 'up')"
|
|
306
306
|
>
|
|
307
307
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -311,7 +311,7 @@ function close() {
|
|
|
311
311
|
<button
|
|
312
312
|
type="button"
|
|
313
313
|
:disabled="index === groupColumns.length - 1"
|
|
314
|
-
class="
|
|
314
|
+
class="mint-grouping-modal__column-btn"
|
|
315
315
|
@click="moveGroupColumn(index, 'down')"
|
|
316
316
|
>
|
|
317
317
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -320,7 +320,7 @@ function close() {
|
|
|
320
320
|
</button>
|
|
321
321
|
<button
|
|
322
322
|
type="button"
|
|
323
|
-
class="
|
|
323
|
+
class="mint-grouping-modal__column-btn mint-grouping-modal__column-btn--remove"
|
|
324
324
|
@click="removeGroupColumn(col)"
|
|
325
325
|
>
|
|
326
326
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -344,34 +344,34 @@ function close() {
|
|
|
344
344
|
</div>
|
|
345
345
|
|
|
346
346
|
<!-- Match status -->
|
|
347
|
-
<div v-if="sampleColumn" class="
|
|
348
|
-
<div class="
|
|
349
|
-
<span class="
|
|
350
|
-
<span class="
|
|
347
|
+
<div v-if="sampleColumn" class="mint-grouping-modal__match-status">
|
|
348
|
+
<div class="mint-grouping-modal__match-stat mint-grouping-modal__match-stat--matched">
|
|
349
|
+
<span class="mint-grouping-modal__match-count">{{ matchedSamples.length }}</span>
|
|
350
|
+
<span class="mint-grouping-modal__match-label">samples matched</span>
|
|
351
351
|
</div>
|
|
352
352
|
<div
|
|
353
353
|
v-if="unmatchedSamples.length > 0"
|
|
354
|
-
class="
|
|
354
|
+
class="mint-grouping-modal__match-stat mint-grouping-modal__match-stat--unmatched"
|
|
355
355
|
>
|
|
356
|
-
<span class="
|
|
357
|
-
<span class="
|
|
356
|
+
<span class="mint-grouping-modal__match-count">{{ unmatchedSamples.length }}</span>
|
|
357
|
+
<span class="mint-grouping-modal__match-label">samples not found in CSV</span>
|
|
358
358
|
</div>
|
|
359
359
|
</div>
|
|
360
360
|
|
|
361
361
|
<!-- Preview table -->
|
|
362
|
-
<div v-if="previewData.length > 0" class="
|
|
363
|
-
<h4 class="
|
|
364
|
-
<div class="
|
|
365
|
-
<table class="
|
|
362
|
+
<div v-if="previewData.length > 0" class="mint-grouping-modal__preview">
|
|
363
|
+
<h4 class="mint-grouping-modal__preview-title">Data Preview</h4>
|
|
364
|
+
<div class="mint-grouping-modal__table-wrapper">
|
|
365
|
+
<table class="mint-grouping-modal__table">
|
|
366
366
|
<thead>
|
|
367
367
|
<tr>
|
|
368
368
|
<th
|
|
369
369
|
v-for="col in csvColumns"
|
|
370
370
|
:key="col"
|
|
371
371
|
:class="[
|
|
372
|
-
'
|
|
373
|
-
col === sampleColumn ? '
|
|
374
|
-
groupColumns.includes(col) ? '
|
|
372
|
+
'mint-grouping-modal__th',
|
|
373
|
+
col === sampleColumn ? 'mint-grouping-modal__th--sample' : '',
|
|
374
|
+
groupColumns.includes(col) ? 'mint-grouping-modal__th--group' : '',
|
|
375
375
|
]"
|
|
376
376
|
>
|
|
377
377
|
{{ col }}
|
|
@@ -384,9 +384,9 @@ function close() {
|
|
|
384
384
|
v-for="col in csvColumns"
|
|
385
385
|
:key="col"
|
|
386
386
|
:class="[
|
|
387
|
-
'
|
|
388
|
-
col === sampleColumn ? '
|
|
389
|
-
groupColumns.includes(col) ? '
|
|
387
|
+
'mint-grouping-modal__td',
|
|
388
|
+
col === sampleColumn ? 'mint-grouping-modal__td--sample' : '',
|
|
389
|
+
groupColumns.includes(col) ? 'mint-grouping-modal__td--group' : '',
|
|
390
390
|
]"
|
|
391
391
|
>
|
|
392
392
|
{{ row[col] }}
|
|
@@ -395,7 +395,7 @@ function close() {
|
|
|
395
395
|
</tbody>
|
|
396
396
|
</table>
|
|
397
397
|
</div>
|
|
398
|
-
<p v-if="csvData.length > 5" class="
|
|
398
|
+
<p v-if="csvData.length > 5" class="mint-grouping-modal__preview-note">
|
|
399
399
|
Showing 5 of {{ csvData.length }} rows
|
|
400
400
|
</p>
|
|
401
401
|
</div>
|
|
@@ -403,7 +403,7 @@ function close() {
|
|
|
403
403
|
</div>
|
|
404
404
|
|
|
405
405
|
<template #footer>
|
|
406
|
-
<div class="
|
|
406
|
+
<div class="mint-grouping-modal__footer">
|
|
407
407
|
<BaseButton variant="secondary" @click="close">Cancel</BaseButton>
|
|
408
408
|
<BaseButton
|
|
409
409
|
variant="primary"
|
|
@@ -35,16 +35,16 @@ function handleClick(event: MouseEvent) {
|
|
|
35
35
|
:aria-label="label"
|
|
36
36
|
:title="label"
|
|
37
37
|
:class="[
|
|
38
|
-
'
|
|
39
|
-
`
|
|
40
|
-
`
|
|
41
|
-
(disabled || loading) ? '
|
|
38
|
+
'mint-icon-button',
|
|
39
|
+
`mint-icon-button--${variant}`,
|
|
40
|
+
`mint-icon-button--${size}`,
|
|
41
|
+
(disabled || loading) ? 'mint-icon-button--disabled' : '',
|
|
42
42
|
]"
|
|
43
43
|
@click="handleClick"
|
|
44
44
|
>
|
|
45
45
|
<svg
|
|
46
46
|
v-if="loading"
|
|
47
|
-
:class="['
|
|
47
|
+
:class="['mint-icon-button__spinner', `mint-icon-button__icon--${size}`]"
|
|
48
48
|
fill="none"
|
|
49
49
|
viewBox="0 0 24 24"
|
|
50
50
|
>
|
|
@@ -62,7 +62,7 @@ function handleClick(event: MouseEvent) {
|
|
|
62
62
|
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
63
63
|
/>
|
|
64
64
|
</svg>
|
|
65
|
-
<span v-else :class="`
|
|
65
|
+
<span v-else :class="`mint-icon-button__icon--${size}`">
|
|
66
66
|
<slot />
|
|
67
67
|
</span>
|
|
68
68
|
</button>
|
|
@@ -16,14 +16,14 @@ withDefaults(defineProps<Props>(), {
|
|
|
16
16
|
<template>
|
|
17
17
|
<div
|
|
18
18
|
:class="[
|
|
19
|
-
'
|
|
20
|
-
`
|
|
21
|
-
`
|
|
19
|
+
'mint-spinner',
|
|
20
|
+
`mint-spinner--${size}`,
|
|
21
|
+
`mint-spinner--${variant}`,
|
|
22
22
|
]"
|
|
23
23
|
role="status"
|
|
24
24
|
>
|
|
25
25
|
<svg
|
|
26
|
-
class="
|
|
26
|
+
class="mint-spinner__svg"
|
|
27
27
|
fill="none"
|
|
28
28
|
viewBox="0 0 24 24"
|
|
29
29
|
>
|
|
@@ -41,7 +41,7 @@ withDefaults(defineProps<Props>(), {
|
|
|
41
41
|
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
42
42
|
/>
|
|
43
43
|
</svg>
|
|
44
|
-
<span class="
|
|
44
|
+
<span class="mint-spinner__label">{{ label }}</span>
|
|
45
45
|
</div>
|
|
46
46
|
</template>
|
|
47
47
|
|
|
@@ -284,20 +284,20 @@ onUnmounted(() => {
|
|
|
284
284
|
<template>
|
|
285
285
|
<div
|
|
286
286
|
:class="[
|
|
287
|
-
'
|
|
288
|
-
disabled ? '
|
|
289
|
-
readonly ? '
|
|
290
|
-
error ? '
|
|
287
|
+
'mint-molecule-input',
|
|
288
|
+
disabled ? 'mint-molecule-input--disabled' : '',
|
|
289
|
+
readonly ? 'mint-molecule-input--readonly' : '',
|
|
290
|
+
error ? 'mint-molecule-input--error' : '',
|
|
291
291
|
]"
|
|
292
292
|
>
|
|
293
293
|
<!-- Loading state -->
|
|
294
294
|
<div
|
|
295
295
|
v-if="isLoading && !readonly"
|
|
296
|
-
class="
|
|
296
|
+
class="mint-molecule-input__skeleton"
|
|
297
297
|
:style="{ height: `${height}px` }"
|
|
298
298
|
>
|
|
299
299
|
<svg
|
|
300
|
-
class="
|
|
300
|
+
class="mint-molecule-input__skeleton-icon"
|
|
301
301
|
fill="none"
|
|
302
302
|
stroke="currentColor"
|
|
303
303
|
viewBox="0 0 24 24"
|
|
@@ -310,16 +310,16 @@ onUnmounted(() => {
|
|
|
310
310
|
d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
|
|
311
311
|
/>
|
|
312
312
|
</svg>
|
|
313
|
-
<span class="
|
|
313
|
+
<span class="mint-molecule-input__skeleton-text">Loading molecule editor...</span>
|
|
314
314
|
</div>
|
|
315
315
|
|
|
316
316
|
<!-- Error state -->
|
|
317
317
|
<div
|
|
318
318
|
v-else-if="loadError"
|
|
319
|
-
class="
|
|
319
|
+
class="mint-molecule-input__error"
|
|
320
320
|
>
|
|
321
321
|
<svg
|
|
322
|
-
class="
|
|
322
|
+
class="mint-molecule-input__error-icon"
|
|
323
323
|
fill="none"
|
|
324
324
|
stroke="currentColor"
|
|
325
325
|
viewBox="0 0 24 24"
|
|
@@ -339,13 +339,13 @@ onUnmounted(() => {
|
|
|
339
339
|
<template v-else-if="readonly">
|
|
340
340
|
<div
|
|
341
341
|
v-if="hasStructure"
|
|
342
|
-
class="
|
|
342
|
+
class="mint-molecule-input__readonly"
|
|
343
343
|
:style="{ height: `${height}px` }"
|
|
344
344
|
>
|
|
345
345
|
<!-- In readonly mode, we just display a placeholder since we don't have SVG rendering -->
|
|
346
|
-
<div class="
|
|
346
|
+
<div class="mint-molecule-input__empty">
|
|
347
347
|
<svg
|
|
348
|
-
class="
|
|
348
|
+
class="mint-molecule-input__empty-icon"
|
|
349
349
|
fill="none"
|
|
350
350
|
stroke="currentColor"
|
|
351
351
|
viewBox="0 0 24 24"
|
|
@@ -358,16 +358,16 @@ onUnmounted(() => {
|
|
|
358
358
|
d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
|
|
359
359
|
/>
|
|
360
360
|
</svg>
|
|
361
|
-
<span class="
|
|
361
|
+
<span class="mint-molecule-input__empty-text">Structure defined (readonly)</span>
|
|
362
362
|
</div>
|
|
363
363
|
</div>
|
|
364
364
|
<div
|
|
365
365
|
v-else
|
|
366
|
-
class="
|
|
366
|
+
class="mint-molecule-input__empty"
|
|
367
367
|
:style="{ height: `${height}px` }"
|
|
368
368
|
>
|
|
369
369
|
<svg
|
|
370
|
-
class="
|
|
370
|
+
class="mint-molecule-input__empty-icon"
|
|
371
371
|
fill="none"
|
|
372
372
|
stroke="currentColor"
|
|
373
373
|
viewBox="0 0 24 24"
|
|
@@ -380,7 +380,7 @@ onUnmounted(() => {
|
|
|
380
380
|
d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
|
|
381
381
|
/>
|
|
382
382
|
</svg>
|
|
383
|
-
<span class="
|
|
383
|
+
<span class="mint-molecule-input__empty-text">No structure</span>
|
|
384
384
|
</div>
|
|
385
385
|
</template>
|
|
386
386
|
|
|
@@ -388,17 +388,17 @@ onUnmounted(() => {
|
|
|
388
388
|
<template v-else>
|
|
389
389
|
<div
|
|
390
390
|
ref="containerRef"
|
|
391
|
-
class="
|
|
391
|
+
class="mint-molecule-input__editor"
|
|
392
392
|
:style="{ height: `${height}px` }"
|
|
393
393
|
role="application"
|
|
394
394
|
aria-label="Molecule structure editor"
|
|
395
395
|
/>
|
|
396
396
|
|
|
397
397
|
<!-- Actions toolbar -->
|
|
398
|
-
<div class="
|
|
398
|
+
<div class="mint-molecule-input__actions">
|
|
399
399
|
<button
|
|
400
400
|
type="button"
|
|
401
|
-
class="
|
|
401
|
+
class="mint-molecule-input__action-btn"
|
|
402
402
|
:disabled="!hasStructure || disabled"
|
|
403
403
|
aria-label="Clear structure"
|
|
404
404
|
@click="clearStructure"
|
|
@@ -413,9 +413,9 @@ onUnmounted(() => {
|
|
|
413
413
|
<!-- SMILES display -->
|
|
414
414
|
<div
|
|
415
415
|
v-if="showSmiles && hasStructure && !loadError"
|
|
416
|
-
class="
|
|
416
|
+
class="mint-molecule-input__smiles"
|
|
417
417
|
>
|
|
418
|
-
<span class="
|
|
418
|
+
<span class="mint-molecule-input__smiles-label">SMILES:</span>
|
|
419
419
|
{{ modelValue?.smiles }}
|
|
420
420
|
</div>
|
|
421
421
|
</div>
|
|
@@ -58,19 +58,19 @@ const selectedLabels = computed(() => {
|
|
|
58
58
|
<template>
|
|
59
59
|
<div
|
|
60
60
|
:class="[
|
|
61
|
-
'
|
|
62
|
-
`
|
|
63
|
-
disabled ? '
|
|
61
|
+
'mint-multi-select',
|
|
62
|
+
`mint-multi-select--${size}`,
|
|
63
|
+
disabled ? 'mint-multi-select--disabled' : '',
|
|
64
64
|
]"
|
|
65
65
|
>
|
|
66
66
|
<div
|
|
67
67
|
v-if="modelValue.length === 0"
|
|
68
|
-
class="
|
|
68
|
+
class="mint-multi-select__placeholder"
|
|
69
69
|
>
|
|
70
70
|
{{ placeholder }}
|
|
71
71
|
</div>
|
|
72
72
|
|
|
73
|
-
<div class="
|
|
73
|
+
<div class="mint-multi-select__options" role="group">
|
|
74
74
|
<button
|
|
75
75
|
v-for="option in options"
|
|
76
76
|
:key="String(option.value)"
|
|
@@ -79,19 +79,19 @@ const selectedLabels = computed(() => {
|
|
|
79
79
|
:aria-checked="isSelected(option.value)"
|
|
80
80
|
:disabled="disabled || option.disabled || (!isSelected(option.value) && !canSelectMore)"
|
|
81
81
|
:class="[
|
|
82
|
-
'
|
|
83
|
-
`
|
|
84
|
-
isSelected(option.value) ? '
|
|
85
|
-
option.disabled ? '
|
|
86
|
-
!isSelected(option.value) && !canSelectMore ? '
|
|
82
|
+
'mint-multi-select__chip',
|
|
83
|
+
`mint-multi-select__chip--${size}`,
|
|
84
|
+
isSelected(option.value) ? 'mint-multi-select__chip--active' : '',
|
|
85
|
+
option.disabled ? 'mint-multi-select__chip--disabled' : '',
|
|
86
|
+
!isSelected(option.value) && !canSelectMore ? 'mint-multi-select__chip--disabled' : '',
|
|
87
87
|
]"
|
|
88
88
|
@click="toggleOption(option)"
|
|
89
89
|
@keydown="handleKeydown($event, option)"
|
|
90
90
|
>
|
|
91
|
-
<span class="
|
|
91
|
+
<span class="mint-multi-select__chip-label">{{ option.label }}</span>
|
|
92
92
|
<svg
|
|
93
93
|
v-if="isSelected(option.value)"
|
|
94
|
-
class="
|
|
94
|
+
class="mint-multi-select__chip-check"
|
|
95
95
|
viewBox="0 0 24 24"
|
|
96
96
|
fill="none"
|
|
97
97
|
stroke="currentColor"
|
|
@@ -106,7 +106,7 @@ const selectedLabels = computed(() => {
|
|
|
106
106
|
|
|
107
107
|
<div
|
|
108
108
|
v-if="modelValue.length > 0"
|
|
109
|
-
class="
|
|
109
|
+
class="mint-multi-select__summary"
|
|
110
110
|
>
|
|
111
111
|
{{ selectedLabels.join(', ') }}
|
|
112
112
|
</div>
|