@morscherlab/mld-sdk 0.7.4 → 0.7.6

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.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
  3. package/dist/components/AutoGroupModal.vue.js +522 -0
  4. package/dist/components/AutoGroupModal.vue.js.map +1 -0
  5. package/dist/components/AutoGroupModal.vue3.js +6 -0
  6. package/dist/components/AutoGroupModal.vue3.js.map +1 -0
  7. package/dist/components/DatePicker.vue.d.ts +2 -0
  8. package/dist/components/DatePicker.vue.js +151 -118
  9. package/dist/components/DatePicker.vue.js.map +1 -1
  10. package/dist/components/FormActions.vue.d.ts +1 -1
  11. package/dist/components/GroupingModal.vue.js.map +1 -1
  12. package/dist/components/SampleSelector.vue.d.ts +5 -9
  13. package/dist/components/SampleSelector.vue.js +127 -255
  14. package/dist/components/SampleSelector.vue.js.map +1 -1
  15. package/dist/components/index.d.ts +1 -0
  16. package/dist/components/index.js +53 -50
  17. package/dist/components/index.js.map +1 -1
  18. package/dist/composables/index.d.ts +1 -0
  19. package/dist/composables/index.js +3 -0
  20. package/dist/composables/index.js.map +1 -1
  21. package/dist/composables/useAutoGroup.d.ts +80 -0
  22. package/dist/composables/useAutoGroup.js +397 -0
  23. package/dist/composables/useAutoGroup.js.map +1 -0
  24. package/dist/index.d.ts +3 -3
  25. package/dist/index.js +48 -42
  26. package/dist/index.js.map +1 -1
  27. package/dist/styles.css +2654 -1805
  28. package/dist/types/auto-group.d.ts +31 -0
  29. package/dist/types/index.d.ts +1 -0
  30. package/package.json +1 -1
  31. package/src/__tests__/composables/useAutoGroup.test.ts +375 -0
  32. package/src/components/AutoGroupModal.story.vue +155 -0
  33. package/src/components/AutoGroupModal.vue +441 -0
  34. package/src/components/DatePicker.vue +57 -26
  35. package/src/components/GroupingModal.vue +1 -0
  36. package/src/components/SampleSelector.story.vue +8 -31
  37. package/src/components/SampleSelector.vue +22 -137
  38. package/src/components/index.ts +1 -0
  39. package/src/composables/index.ts +1 -0
  40. package/src/composables/useAutoGroup.ts +495 -0
  41. package/src/index.ts +12 -0
  42. package/src/styles/components/auto-group-modal.css +501 -0
  43. package/src/styles/components/collapsible-card.css +0 -6
  44. package/src/styles/components/date-picker.css +3 -4
  45. package/src/styles/index.css +1 -0
  46. package/src/types/auto-group.ts +37 -0
  47. package/src/types/index.ts +11 -0
@@ -1 +1 @@
1
- {"version":3,"file":"SampleSelector.vue.js","sources":["../../src/components/SampleSelector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport BaseButton from './BaseButton.vue'\nimport BaseInput from './BaseInput.vue'\nimport GroupingModal from './GroupingModal.vue'\nimport type { SampleGroup } from '../types'\n\ninterface Props {\n samples: string[]\n modelValue: string[]\n groups?: SampleGroup[]\n enableGrouping?: boolean\n enableAutoGroup?: boolean\n enableMetadataGroup?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n groups: () => [],\n enableGrouping: true,\n enableAutoGroup: true,\n enableMetadataGroup: true,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [samples: string[]]\n 'update:groups': [groups: SampleGroup[]]\n autoGroup: [level: number]\n metadataGroup: [mapping: Record<string, string[]>]\n}>()\n\nconst DEFAULT_COLORS = [\n '#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6',\n '#EC4899', '#06B6D4', '#84CC16', '#F97316', '#6366F1',\n]\n\n// UI State\nconst showLevelPopover = ref(false)\nconst popoverRef = ref<HTMLDivElement | null>(null)\nconst showMetadataModal = ref(false)\nconst newGroupName = ref('')\nconst editingGroupColor = ref<string | null>(null)\nconst colorPickerInput = ref<HTMLInputElement | null>(null)\nconst expandedGroups = ref<Record<string, boolean>>({})\nconst searchQuery = ref('')\n\n// Drag and Drop State\nconst draggingSample = ref<string | null>(null)\nconst dragSourceGroup = ref<string | null>(null)\nconst dragOverGroup = ref<string | null>(null)\n\n// Computed: groups from props\nconst internalGroups = computed({\n get: () => props.groups,\n set: (value) => emit('update:groups', value),\n})\n\n// Computed: hierarchical structure (Major Group > Sub Groups > Samples)\ninterface MajorGroup {\n name: string\n color: string\n subGroups: SampleGroup[]\n allSamples: string[]\n}\n\nconst hierarchicalGroups = computed<MajorGroup[]>(() => {\n const groups = internalGroups.value\n if (groups.length === 0) return []\n\n // Detect separator: use '/' if any group name contains it, otherwise '_'\n const separator = groups.some(g => g.name.includes('/')) ? '/' : '_'\n const majorGroupMap: Record<string, SampleGroup[]> = {}\n\n for (const group of groups) {\n const parts = group.name.split(separator)\n // Use first part as major group, or full name if no separator\n const majorPrefix = parts.length > 1 ? parts[0] : group.name\n\n if (!majorGroupMap[majorPrefix]) {\n majorGroupMap[majorPrefix] = []\n }\n majorGroupMap[majorPrefix].push(group)\n }\n\n const result: MajorGroup[] = []\n\n for (const [majorName, subGroups] of Object.entries(majorGroupMap).sort(([a], [b]) => a.localeCompare(b))) {\n const allSamples = subGroups.flatMap(g => g.samples)\n const color = subGroups[0]?.color || '#3B82F6'\n\n result.push({\n name: majorName,\n color,\n subGroups: subGroups.sort((a, b) => a.name.localeCompare(b.name)),\n allSamples\n })\n }\n\n return result\n})\n\n// Check if hierarchy is meaningful (major groups have multiple sub-groups)\n// If each major group only has 1 sub-group with same name, show flat view instead\nconst showHierarchy = computed(() => {\n const groups = hierarchicalGroups.value\n if (groups.length === 0) return false\n\n // Show hierarchy if any major group has multiple sub-groups\n // OR if major group name differs from its sub-group name\n return groups.some(major =>\n major.subGroups.length > 1 ||\n (major.subGroups.length === 1 && major.name !== major.subGroups[0].name)\n )\n})\n\nconst groupingEnabled = computed(() => internalGroups.value.length > 0)\n\nconst ungroupedSamples = computed(() => {\n const groupedSamples = new Set(\n internalGroups.value.flatMap(g => g.samples)\n )\n return props.samples.filter(s => !groupedSamples.has(s))\n})\n\nconst filteredSamples = computed(() => {\n if (!searchQuery.value.trim()) return props.samples\n const query = searchQuery.value.toLowerCase()\n return props.samples.filter(s => s.toLowerCase().includes(query))\n})\n\n// Compute available grouping levels with preview\nconst groupingLevels = computed(() => {\n if (props.samples.length === 0) return []\n\n const maxLevel = detectGroupingLevels()\n const levels: Array<{ level: number; groupCount: number; example: string; description: string }> = []\n\n for (let level = 1; level <= maxLevel; level++) {\n const prefixGroups: Record<string, string[]> = {}\n\n for (const sample of props.samples) {\n const parts = sample.split(/[_\\-.]/)\n const prefix = parts.slice(0, level).join('_')\n if (prefix) {\n if (!prefixGroups[prefix]) {\n prefixGroups[prefix] = []\n }\n prefixGroups[prefix].push(sample)\n }\n }\n\n const groupNames = Object.keys(prefixGroups).sort()\n const example = groupNames[0] || ''\n const descriptions = ['main groups', 'sub-groups']\n const description = descriptions[level - 1] || `level ${level} groups`\n\n levels.push({\n level,\n groupCount: groupNames.length,\n example,\n description\n })\n }\n\n return levels\n})\n\nfunction detectGroupingLevels(): number {\n if (props.samples.length === 0) return 1\n const maxParts = Math.max(...props.samples.map(s => s.split(/[_\\-.]/).length))\n return Math.min(maxParts, 3)\n}\n\n// Selection state\nconst isAllSelected = computed(() =>\n props.samples.length > 0 && props.modelValue.length === props.samples.length\n)\n\n// Toggle functions\nfunction toggleSelectAll() {\n if (isAllSelected.value) {\n emit('update:modelValue', [])\n } else {\n emit('update:modelValue', [...props.samples])\n }\n}\n\nfunction toggleSample(sample: string) {\n const newSelection = props.modelValue.includes(sample)\n ? props.modelValue.filter(s => s !== sample)\n : [...props.modelValue, sample]\n emit('update:modelValue', newSelection)\n}\n\nfunction toggleSamplesSelection(samples: string[]) {\n const allSelected = samples.every(s => props.modelValue.includes(s))\n const newSelection = allSelected\n ? props.modelValue.filter(s => !samples.includes(s))\n : [...props.modelValue, ...samples.filter(s => !props.modelValue.includes(s))]\n\n emit('update:modelValue', newSelection)\n}\n\nfunction toggleGroupSamples(groupName: string) {\n const group = internalGroups.value.find(g => g.name === groupName)\n if (!group) return\n toggleSamplesSelection(group.samples)\n}\n\nfunction toggleMajorGroupSamples(majorGroup: MajorGroup) {\n toggleSamplesSelection(majorGroup.allSamples)\n}\n\n// Selection state checks\nfunction isFullySelected(samples: string[]): boolean {\n return samples.length > 0 && samples.every(s => props.modelValue.includes(s))\n}\n\nfunction isPartiallySelected(samples: string[]): boolean {\n if (samples.length === 0) return false\n const selectedCount = samples.filter(s => props.modelValue.includes(s)).length\n return selectedCount > 0 && selectedCount < samples.length\n}\n\nfunction isGroupFullySelected(groupName: string): boolean {\n const group = internalGroups.value.find(g => g.name === groupName)\n return group ? isFullySelected(group.samples) : false\n}\n\nfunction isGroupPartiallySelected(groupName: string): boolean {\n const group = internalGroups.value.find(g => g.name === groupName)\n return group ? isPartiallySelected(group.samples) : false\n}\n\nfunction isMajorGroupFullySelected(majorGroup: MajorGroup): boolean {\n return isFullySelected(majorGroup.allSamples)\n}\n\nfunction isMajorGroupPartiallySelected(majorGroup: MajorGroup): boolean {\n return isPartiallySelected(majorGroup.allSamples)\n}\n\n// Expand/collapse\nfunction toggleGroupExpanded(groupName: string) {\n expandedGroups.value[groupName] = !expandedGroups.value[groupName]\n}\n\nfunction isGroupExpanded(groupName: string): boolean {\n return !!expandedGroups.value[groupName]\n}\n\nfunction expandAllGroups() {\n const expanded: Record<string, boolean> = {}\n for (const major of hierarchicalGroups.value) {\n expanded[`major:${major.name}`] = true\n for (const sub of major.subGroups) {\n expanded[sub.name] = true\n }\n }\n expanded['__ungrouped__'] = true\n expandedGroups.value = expanded\n}\n\nfunction collapseAllGroups() {\n expandedGroups.value = {}\n}\n\n// Auto-group\nfunction toggleLevelPopover() {\n showLevelPopover.value = !showLevelPopover.value\n}\n\nfunction selectLevel(level: number) {\n emit('autoGroup', level)\n showLevelPopover.value = false\n}\n\n// Group management\nfunction clearGroups() {\n internalGroups.value = []\n}\n\nfunction deleteMajorGroup(majorGroup: MajorGroup) {\n internalGroups.value = internalGroups.value.filter(\n g => !majorGroup.subGroups.some(sg => sg.name === g.name)\n )\n}\n\nfunction deleteGroup(groupName: string) {\n internalGroups.value = internalGroups.value.filter(g => g.name !== groupName)\n}\n\nfunction removeSampleFromGroup(sample: string, groupName: string) {\n internalGroups.value = internalGroups.value.map(g =>\n g.name === groupName\n ? { ...g, samples: g.samples.filter((s: string) => s !== sample) }\n : g\n )\n}\n\n// Drag and Drop handlers\nfunction handleDragStart(sample: string, sourceGroup: string | null, event: DragEvent) {\n draggingSample.value = sample\n dragSourceGroup.value = sourceGroup\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', sample)\n }\n}\n\nfunction resetDragState() {\n draggingSample.value = null\n dragSourceGroup.value = null\n dragOverGroup.value = null\n}\n\nfunction handleDragEnd() {\n resetDragState()\n}\n\nfunction handleDragOver(groupName: string, event: DragEvent) {\n event.preventDefault()\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move'\n }\n dragOverGroup.value = groupName\n}\n\nfunction handleDragLeave() {\n dragOverGroup.value = null\n}\n\nfunction handleDrop(targetGroupName: string, event: DragEvent) {\n event.preventDefault()\n\n const sample = draggingSample.value\n const sourceGroup = dragSourceGroup.value\n if (!sample) return\n\n if (sourceGroup === targetGroupName) {\n resetDragState()\n return\n }\n\n internalGroups.value = internalGroups.value.map(g => {\n if (sourceGroup && g.name === sourceGroup) {\n return { ...g, samples: g.samples.filter((s: string) => s !== sample) }\n }\n if (g.name === targetGroupName && !g.samples.includes(sample)) {\n return { ...g, samples: [...g.samples, sample] }\n }\n return g\n })\n\n resetDragState()\n}\n\n// Color picker\nfunction openColorPicker(groupName: string, event: Event) {\n event.stopPropagation()\n editingGroupColor.value = groupName\n colorPickerInput.value?.click()\n}\n\nfunction handleColorChange(event: Event) {\n const target = event.target as HTMLInputElement\n if (editingGroupColor.value) {\n internalGroups.value = internalGroups.value.map(g =>\n g.name === editingGroupColor.value ? { ...g, color: target.value } : g\n )\n }\n editingGroupColor.value = null\n}\n\nfunction getGroupColor(groupName: string): string {\n const group = internalGroups.value.find(g => g.name === groupName)\n return group?.color || '#3B82F6'\n}\n\n// New group\nfunction addNewGroup() {\n if (!newGroupName.value.trim()) return\n\n const usedColors = new Set(internalGroups.value.map(g => g.color))\n const availableColor = DEFAULT_COLORS.find(c => !usedColors.has(c)) || DEFAULT_COLORS[0]\n\n const newGroup: SampleGroup = {\n name: newGroupName.value.trim(),\n color: availableColor,\n samples: [],\n }\n\n internalGroups.value = [...internalGroups.value, newGroup]\n newGroupName.value = ''\n}\n\n// Metadata modal\nfunction handleMetadataApply(mapping: Record<string, string[]>) {\n emit('metadataGroup', mapping)\n showMetadataModal.value = false\n}\n\n// Click outside handler\nfunction handleClickOutside(event: MouseEvent) {\n if (popoverRef.value && !popoverRef.value.contains(event.target as Node)) {\n showLevelPopover.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n</script>\n\n<template>\n <div class=\"mld-sample-selector\">\n <!-- Select All Row -->\n <label class=\"mld-sample-selector__select-all\">\n <input\n type=\"checkbox\"\n :checked=\"isAllSelected\"\n @change=\"toggleSelectAll\"\n class=\"mld-sample-selector__checkbox\"\n />\n <span class=\"mld-sample-selector__select-all-label\">Select All</span>\n <span class=\"mld-sample-selector__select-all-count\">{{ samples.length }} samples</span>\n </label>\n\n <!-- Action Buttons Row -->\n <div v-if=\"enableGrouping\" class=\"mld-sample-selector__actions\" ref=\"popoverRef\">\n <div class=\"mld-sample-selector__actions-row\">\n <!-- Auto Group Button -->\n <BaseButton\n v-if=\"enableAutoGroup\"\n :variant=\"(showLevelPopover || groupingEnabled) ? 'primary' : 'secondary'\"\n size=\"sm\"\n :disabled=\"samples.length === 0\"\n class=\"mld-sample-selector__action-btn\"\n @click.stop=\"toggleLevelPopover\"\n >\n <svg class=\"mld-sample-selector__action-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n <span>Auto</span>\n </BaseButton>\n\n <!-- Metadata Button -->\n <BaseButton\n v-if=\"enableMetadataGroup\"\n variant=\"secondary\"\n size=\"sm\"\n :disabled=\"samples.length === 0\"\n class=\"mld-sample-selector__action-btn\"\n @click=\"showMetadataModal = true\"\n >\n <svg class=\"mld-sample-selector__action-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n <span>Metadata</span>\n </BaseButton>\n\n <!-- Reset Button -->\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"internalGroups.length === 0\"\n class=\"mld-sample-selector__action-btn mld-sample-selector__action-btn--reset\"\n @click=\"clearGroups\"\n title=\"Clear all groups\"\n >\n <svg class=\"mld-sample-selector__action-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </BaseButton>\n </div>\n\n <!-- Level Selection Popover -->\n <Transition name=\"mld-popover\">\n <div v-if=\"showLevelPopover\" class=\"mld-sample-selector__popover\">\n <div class=\"mld-sample-selector__popover-header\">Auto-Group by Level</div>\n <div class=\"mld-sample-selector__popover-body\">\n <button\n v-for=\"levelInfo in groupingLevels\"\n :key=\"levelInfo.level\"\n type=\"button\"\n class=\"mld-sample-selector__level-btn\"\n @click=\"selectLevel(levelInfo.level)\"\n >\n <div class=\"mld-sample-selector__level-info\">\n <div class=\"mld-sample-selector__level-title\">\n <span>Level {{ levelInfo.level }}</span>\n <span class=\"mld-sample-selector__level-badge\">{{ levelInfo.groupCount }} groups</span>\n </div>\n <div class=\"mld-sample-selector__level-desc\">\n {{ levelInfo.description }}\n <span v-if=\"levelInfo.example\" class=\"mld-sample-selector__level-example\">\n e.g. <code>{{ levelInfo.example }}</code>\n </span>\n </div>\n </div>\n </button>\n </div>\n </div>\n </Transition>\n </div>\n\n <!-- Grouped View -->\n <div v-if=\"groupingEnabled\" class=\"mld-sample-selector__grouped\">\n <!-- Groups Header -->\n <div class=\"mld-sample-selector__groups-header\">\n <span class=\"mld-sample-selector__groups-title\">Groups ({{ internalGroups.length }})</span>\n <div class=\"mld-sample-selector__groups-controls\">\n <button type=\"button\" class=\"mld-sample-selector__expand-btn\" @click=\"expandAllGroups\" title=\"Expand all\">\n <svg class=\"mld-sample-selector__expand-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <button type=\"button\" class=\"mld-sample-selector__expand-btn\" @click=\"collapseAllGroups\" title=\"Collapse all\">\n <svg class=\"mld-sample-selector__expand-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Hierarchical Tree -->\n <div class=\"mld-sample-selector__tree\">\n <!-- Major Groups (when hierarchy is meaningful) -->\n <template v-if=\"showHierarchy\">\n <div\n v-for=\"majorGroup in hierarchicalGroups\"\n :key=\"majorGroup.name\"\n class=\"mld-sample-selector__major-group\"\n >\n <!-- Major Group Header -->\n <div\n class=\"mld-sample-selector__major-header\"\n @click=\"toggleGroupExpanded(`major:${majorGroup.name}`)\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron',\n isGroupExpanded(`major:${majorGroup.name}`) ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n\n <input\n type=\"checkbox\"\n :checked=\"isMajorGroupFullySelected(majorGroup)\"\n :indeterminate=\"isMajorGroupPartiallySelected(majorGroup)\"\n class=\"mld-sample-selector__checkbox\"\n :style=\"{ accentColor: majorGroup.color }\"\n @click.stop\n @change=\"toggleMajorGroupSamples(majorGroup)\"\n />\n\n <div\n class=\"mld-sample-selector__color-dot mld-sample-selector__color-dot--large\"\n :style=\"{ backgroundColor: majorGroup.color }\"\n />\n\n <span class=\"mld-sample-selector__major-name\">{{ majorGroup.name }}</span>\n\n <span\n class=\"mld-sample-selector__count-badge\"\n :style=\"{ backgroundColor: majorGroup.color + '20', color: majorGroup.color }\"\n >\n {{ majorGroup.allSamples.length }}\n </span>\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__delete-btn mld-sample-selector__delete-btn--hidden\"\n @click.stop=\"deleteMajorGroup(majorGroup)\"\n title=\"Remove major group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Sub Groups (collapsible) -->\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded(`major:${majorGroup.name}`)\"\n class=\"mld-sample-selector__sub-groups\"\n :style=\"{ borderColor: majorGroup.color + '30' }\"\n >\n <div\n v-for=\"subGroup in majorGroup.subGroups\"\n :key=\"subGroup.name\"\n :class=\"[\n 'mld-sample-selector__sub-group',\n dragOverGroup === subGroup.name ? 'mld-sample-selector__sub-group--drag-over' : '',\n ]\"\n @dragover=\"handleDragOver(subGroup.name, $event)\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop(subGroup.name, $event)\"\n >\n <!-- Sub Group Header -->\n <div\n class=\"mld-sample-selector__sub-header\"\n @click=\"toggleGroupExpanded(subGroup.name)\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron mld-sample-selector__chevron--small',\n isGroupExpanded(subGroup.name) ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n\n <input\n type=\"checkbox\"\n :checked=\"isGroupFullySelected(subGroup.name)\"\n :indeterminate=\"isGroupPartiallySelected(subGroup.name)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--small\"\n :style=\"{ accentColor: subGroup.color }\"\n @click.stop\n @change=\"toggleGroupSamples(subGroup.name)\"\n />\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__color-dot mld-sample-selector__color-dot--clickable\"\n :style=\"{ backgroundColor: subGroup.color }\"\n @click.stop=\"openColorPicker(subGroup.name, $event)\"\n title=\"Click to change color\"\n />\n\n <span class=\"mld-sample-selector__sub-name\">{{ subGroup.name }}</span>\n\n <span\n class=\"mld-sample-selector__count-badge mld-sample-selector__count-badge--small\"\n :style=\"{ backgroundColor: subGroup.color + '20', color: subGroup.color }\"\n >\n {{ subGroup.samples.length }}\n </span>\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__delete-btn mld-sample-selector__delete-btn--hidden\"\n @click.stop=\"deleteGroup(subGroup.name)\"\n title=\"Remove sub group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Samples (collapsible) -->\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded(subGroup.name)\"\n class=\"mld-sample-selector__samples\"\n :style=\"{ borderColor: subGroup.color + '40' }\"\n >\n <div\n v-for=\"sample in subGroup.samples\"\n :key=\"sample\"\n :class=\"[\n 'mld-sample-selector__sample',\n draggingSample === sample ? 'mld-sample-selector__sample--dragging' : '',\n ]\"\n draggable=\"true\"\n @dragstart=\"handleDragStart(sample, subGroup.name, $event)\"\n @dragend=\"handleDragEnd\"\n >\n <svg class=\"mld-sample-selector__drag-handle\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8h16M4 16h16\" />\n </svg>\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--tiny\"\n :style=\"{ accentColor: subGroup.color }\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__sample-name\">{{ sample }}</span>\n <button\n type=\"button\"\n class=\"mld-sample-selector__remove-btn\"\n @click=\"removeSampleFromGroup(sample, subGroup.name)\"\n title=\"Remove from group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 12H4\" />\n </svg>\n </button>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n </Transition>\n </div>\n </template>\n\n <!-- Flat Groups (when no meaningful hierarchy - e.g., level 1) -->\n <template v-else>\n <div\n v-for=\"group in internalGroups\"\n :key=\"group.name\"\n :class=\"[\n 'mld-sample-selector__sub-group',\n dragOverGroup === group.name ? 'mld-sample-selector__sub-group--drag-over' : '',\n ]\"\n @dragover=\"handleDragOver(group.name, $event)\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop(group.name, $event)\"\n >\n <!-- Group Header -->\n <div\n class=\"mld-sample-selector__major-header\"\n @click=\"toggleGroupExpanded(group.name)\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron',\n isGroupExpanded(group.name) ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n\n <input\n type=\"checkbox\"\n :checked=\"isGroupFullySelected(group.name)\"\n :indeterminate=\"isGroupPartiallySelected(group.name)\"\n class=\"mld-sample-selector__checkbox\"\n :style=\"{ accentColor: group.color }\"\n @click.stop\n @change=\"toggleGroupSamples(group.name)\"\n />\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__color-dot mld-sample-selector__color-dot--large mld-sample-selector__color-dot--clickable\"\n :style=\"{ backgroundColor: group.color }\"\n @click.stop=\"openColorPicker(group.name, $event)\"\n title=\"Click to change color\"\n />\n\n <span class=\"mld-sample-selector__major-name\">{{ group.name }}</span>\n\n <span\n class=\"mld-sample-selector__count-badge\"\n :style=\"{ backgroundColor: group.color + '20', color: group.color }\"\n >\n {{ group.samples.length }}\n </span>\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__delete-btn mld-sample-selector__delete-btn--hidden\"\n @click.stop=\"deleteGroup(group.name)\"\n title=\"Remove group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Samples (collapsible) -->\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded(group.name)\"\n class=\"mld-sample-selector__samples\"\n :style=\"{ borderColor: group.color + '40' }\"\n >\n <div\n v-for=\"sample in group.samples\"\n :key=\"sample\"\n :class=\"[\n 'mld-sample-selector__sample',\n draggingSample === sample ? 'mld-sample-selector__sample--dragging' : '',\n ]\"\n draggable=\"true\"\n @dragstart=\"handleDragStart(sample, group.name, $event)\"\n @dragend=\"handleDragEnd\"\n >\n <svg class=\"mld-sample-selector__drag-handle\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8h16M4 16h16\" />\n </svg>\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--tiny\"\n :style=\"{ accentColor: group.color }\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__sample-name\">{{ sample }}</span>\n <button\n type=\"button\"\n class=\"mld-sample-selector__remove-btn\"\n @click=\"removeSampleFromGroup(sample, group.name)\"\n title=\"Remove from group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 12H4\" />\n </svg>\n </button>\n </div>\n </div>\n </Transition>\n </div>\n </template>\n\n <!-- Empty state -->\n <div v-if=\"internalGroups.length === 0\" class=\"mld-sample-selector__empty\">\n Click the lightning bolt to auto-group samples\n </div>\n </div>\n\n <!-- Ungrouped Samples Section -->\n <div v-if=\"ungroupedSamples.length > 0\" class=\"mld-sample-selector__ungrouped\">\n <div\n class=\"mld-sample-selector__ungrouped-header\"\n @click=\"toggleGroupExpanded('__ungrouped__')\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron',\n isGroupExpanded('__ungrouped__') ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <span class=\"mld-sample-selector__ungrouped-label\">Ungrouped</span>\n <span class=\"mld-sample-selector__ungrouped-count\">{{ ungroupedSamples.length }}</span>\n </div>\n\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded('__ungrouped__')\"\n class=\"mld-sample-selector__ungrouped-list\"\n >\n <div\n v-for=\"sample in ungroupedSamples\"\n :key=\"sample\"\n :class=\"[\n 'mld-sample-selector__sample',\n draggingSample === sample ? 'mld-sample-selector__sample--dragging' : '',\n ]\"\n draggable=\"true\"\n @dragstart=\"handleDragStart(sample, null, $event)\"\n @dragend=\"handleDragEnd\"\n >\n <svg class=\"mld-sample-selector__drag-handle\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8h16M4 16h16\" />\n </svg>\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--small\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__sample-name\">{{ sample }}</span>\n </div>\n </div>\n </Transition>\n </div>\n\n <!-- New Group Input -->\n <div class=\"mld-sample-selector__new-group\">\n <BaseInput\n v-model=\"newGroupName\"\n placeholder=\"New group name...\"\n class=\"mld-sample-selector__new-group-input\"\n @keyup.enter=\"addNewGroup\"\n />\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"!newGroupName.trim()\"\n class=\"mld-sample-selector__new-group-btn\"\n @click=\"addNewGroup\"\n >\n Add\n </BaseButton>\n </div>\n\n <!-- Hidden color picker input -->\n <input\n ref=\"colorPickerInput\"\n type=\"color\"\n class=\"mld-sample-selector__color-input\"\n :value=\"editingGroupColor ? getGroupColor(editingGroupColor) : '#3B82F6'\"\n @change=\"handleColorChange\"\n />\n </div>\n\n <!-- Flat View (when no groups) -->\n <div v-if=\"!groupingEnabled\" class=\"mld-sample-selector__flat\">\n <!-- Search -->\n <div class=\"mld-sample-selector__search\">\n <svg class=\"mld-sample-selector__search-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <input\n v-model=\"searchQuery\"\n type=\"text\"\n placeholder=\"Search samples...\"\n class=\"mld-sample-selector__search-input\"\n />\n </div>\n\n <!-- Flat samples list -->\n <div class=\"mld-sample-selector__flat-list\">\n <div\n v-for=\"sample in filteredSamples\"\n :key=\"sample\"\n class=\"mld-sample-selector__flat-item\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__flat-name\">{{ sample }}</span>\n </div>\n\n <div v-if=\"filteredSamples.length === 0 && searchQuery.trim()\" class=\"mld-sample-selector__empty\">\n No samples match \"{{ searchQuery }}\"\n </div>\n </div>\n </div>\n\n <!-- Metadata Grouping Modal -->\n <GroupingModal\n :open=\"showMetadataModal\"\n :samples=\"samples\"\n @close=\"showMetadataModal = false\"\n @apply=\"handleMetadataApply\"\n />\n </div>\n</template>\n\n<style>\n@import '../styles/components/sample-selector.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createBlock","BaseButton","_createVNode","_Transition","_Fragment","_renderList","_normalizeClass","_normalizeStyle","_withModifiers","BaseInput","GroupingModal"],"mappings":"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"}
1
+ {"version":3,"file":"SampleSelector.vue.js","sources":["../../src/components/SampleSelector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport BaseButton from './BaseButton.vue'\nimport BaseInput from './BaseInput.vue'\nimport AutoGroupModal from './AutoGroupModal.vue'\nimport type { SampleGroup } from '../types'\nimport type { AutoGroupResult } from '../types/auto-group'\n\ninterface Props {\n samples: string[]\n modelValue: string[]\n groups?: SampleGroup[]\n enableGrouping?: boolean\n enableSmartGroup?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n groups: () => [],\n enableGrouping: true,\n enableSmartGroup: true,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [samples: string[]]\n 'update:groups': [groups: SampleGroup[]]\n smartGroup: [result: AutoGroupResult]\n}>()\n\nconst DEFAULT_COLORS = [\n '#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6',\n '#EC4899', '#06B6D4', '#84CC16', '#F97316', '#6366F1',\n]\n\n// UI State\nconst showSmartGroupModal = ref(false)\nconst newGroupName = ref('')\nconst editingGroupColor = ref<string | null>(null)\nconst colorPickerInput = ref<HTMLInputElement | null>(null)\nconst expandedGroups = ref<Record<string, boolean>>({})\nconst searchQuery = ref('')\n\n// Drag and Drop State\nconst draggingSample = ref<string | null>(null)\nconst dragSourceGroup = ref<string | null>(null)\nconst dragOverGroup = ref<string | null>(null)\n\n// Computed: groups from props\nconst internalGroups = computed({\n get: () => props.groups,\n set: (value) => emit('update:groups', value),\n})\n\n// Computed: hierarchical structure (Major Group > Sub Groups > Samples)\ninterface MajorGroup {\n name: string\n color: string\n subGroups: SampleGroup[]\n allSamples: string[]\n}\n\nconst hierarchicalGroups = computed<MajorGroup[]>(() => {\n const groups = internalGroups.value\n if (groups.length === 0) return []\n\n // Detect separator: use '/' if any group name contains it, otherwise '_'\n const separator = groups.some(g => g.name.includes('/')) ? '/' : '_'\n const majorGroupMap: Record<string, SampleGroup[]> = {}\n\n for (const group of groups) {\n const parts = group.name.split(separator)\n // Use first part as major group, or full name if no separator\n const majorPrefix = parts.length > 1 ? parts[0] : group.name\n\n if (!majorGroupMap[majorPrefix]) {\n majorGroupMap[majorPrefix] = []\n }\n majorGroupMap[majorPrefix].push(group)\n }\n\n const result: MajorGroup[] = []\n\n for (const [majorName, subGroups] of Object.entries(majorGroupMap).sort(([a], [b]) => a.localeCompare(b))) {\n const allSamples = subGroups.flatMap(g => g.samples)\n const color = subGroups[0]?.color || '#3B82F6'\n\n result.push({\n name: majorName,\n color,\n subGroups: subGroups.sort((a, b) => a.name.localeCompare(b.name)),\n allSamples\n })\n }\n\n return result\n})\n\n// Check if hierarchy is meaningful (major groups have multiple sub-groups)\n// If each major group only has 1 sub-group with same name, show flat view instead\nconst showHierarchy = computed(() => {\n const groups = hierarchicalGroups.value\n if (groups.length === 0) return false\n\n // Show hierarchy if any major group has multiple sub-groups\n // OR if major group name differs from its sub-group name\n return groups.some(major =>\n major.subGroups.length > 1 ||\n (major.subGroups.length === 1 && major.name !== major.subGroups[0].name)\n )\n})\n\nconst groupingEnabled = computed(() => internalGroups.value.length > 0)\n\nconst ungroupedSamples = computed(() => {\n const groupedSamples = new Set(\n internalGroups.value.flatMap(g => g.samples)\n )\n return props.samples.filter(s => !groupedSamples.has(s))\n})\n\nconst filteredSamples = computed(() => {\n if (!searchQuery.value.trim()) return props.samples\n const query = searchQuery.value.toLowerCase()\n return props.samples.filter(s => s.toLowerCase().includes(query))\n})\n\n\n// Selection state\nconst isAllSelected = computed(() =>\n props.samples.length > 0 && props.modelValue.length === props.samples.length\n)\n\n// Toggle functions\nfunction toggleSelectAll() {\n if (isAllSelected.value) {\n emit('update:modelValue', [])\n } else {\n emit('update:modelValue', [...props.samples])\n }\n}\n\nfunction toggleSample(sample: string) {\n const newSelection = props.modelValue.includes(sample)\n ? props.modelValue.filter(s => s !== sample)\n : [...props.modelValue, sample]\n emit('update:modelValue', newSelection)\n}\n\nfunction toggleSamplesSelection(samples: string[]) {\n const allSelected = samples.every(s => props.modelValue.includes(s))\n const newSelection = allSelected\n ? props.modelValue.filter(s => !samples.includes(s))\n : [...props.modelValue, ...samples.filter(s => !props.modelValue.includes(s))]\n\n emit('update:modelValue', newSelection)\n}\n\nfunction toggleGroupSamples(groupName: string) {\n const group = internalGroups.value.find(g => g.name === groupName)\n if (!group) return\n toggleSamplesSelection(group.samples)\n}\n\nfunction toggleMajorGroupSamples(majorGroup: MajorGroup) {\n toggleSamplesSelection(majorGroup.allSamples)\n}\n\n// Selection state checks\nfunction isFullySelected(samples: string[]): boolean {\n return samples.length > 0 && samples.every(s => props.modelValue.includes(s))\n}\n\nfunction isPartiallySelected(samples: string[]): boolean {\n if (samples.length === 0) return false\n const selectedCount = samples.filter(s => props.modelValue.includes(s)).length\n return selectedCount > 0 && selectedCount < samples.length\n}\n\nfunction isGroupFullySelected(groupName: string): boolean {\n const group = internalGroups.value.find(g => g.name === groupName)\n return group ? isFullySelected(group.samples) : false\n}\n\nfunction isGroupPartiallySelected(groupName: string): boolean {\n const group = internalGroups.value.find(g => g.name === groupName)\n return group ? isPartiallySelected(group.samples) : false\n}\n\nfunction isMajorGroupFullySelected(majorGroup: MajorGroup): boolean {\n return isFullySelected(majorGroup.allSamples)\n}\n\nfunction isMajorGroupPartiallySelected(majorGroup: MajorGroup): boolean {\n return isPartiallySelected(majorGroup.allSamples)\n}\n\n// Expand/collapse\nfunction toggleGroupExpanded(groupName: string) {\n expandedGroups.value[groupName] = !expandedGroups.value[groupName]\n}\n\nfunction isGroupExpanded(groupName: string): boolean {\n return !!expandedGroups.value[groupName]\n}\n\nfunction expandAllGroups() {\n const expanded: Record<string, boolean> = {}\n for (const major of hierarchicalGroups.value) {\n expanded[`major:${major.name}`] = true\n for (const sub of major.subGroups) {\n expanded[sub.name] = true\n }\n }\n expanded['__ungrouped__'] = true\n expandedGroups.value = expanded\n}\n\nfunction collapseAllGroups() {\n expandedGroups.value = {}\n}\n\n// Smart group\nfunction handleSmartGroupApply(result: AutoGroupResult) {\n emit('smartGroup', result)\n emit('update:groups', result.groups)\n}\n\n// Group management\nfunction clearGroups() {\n internalGroups.value = []\n}\n\nfunction deleteMajorGroup(majorGroup: MajorGroup) {\n internalGroups.value = internalGroups.value.filter(\n g => !majorGroup.subGroups.some(sg => sg.name === g.name)\n )\n}\n\nfunction deleteGroup(groupName: string) {\n internalGroups.value = internalGroups.value.filter(g => g.name !== groupName)\n}\n\nfunction removeSampleFromGroup(sample: string, groupName: string) {\n internalGroups.value = internalGroups.value.map(g =>\n g.name === groupName\n ? { ...g, samples: g.samples.filter((s: string) => s !== sample) }\n : g\n )\n}\n\n// Drag and Drop handlers\nfunction handleDragStart(sample: string, sourceGroup: string | null, event: DragEvent) {\n draggingSample.value = sample\n dragSourceGroup.value = sourceGroup\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', sample)\n }\n}\n\nfunction resetDragState() {\n draggingSample.value = null\n dragSourceGroup.value = null\n dragOverGroup.value = null\n}\n\nfunction handleDragEnd() {\n resetDragState()\n}\n\nfunction handleDragOver(groupName: string, event: DragEvent) {\n event.preventDefault()\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move'\n }\n dragOverGroup.value = groupName\n}\n\nfunction handleDragLeave() {\n dragOverGroup.value = null\n}\n\nfunction handleDrop(targetGroupName: string, event: DragEvent) {\n event.preventDefault()\n\n const sample = draggingSample.value\n const sourceGroup = dragSourceGroup.value\n if (!sample) return\n\n if (sourceGroup === targetGroupName) {\n resetDragState()\n return\n }\n\n internalGroups.value = internalGroups.value.map(g => {\n if (sourceGroup && g.name === sourceGroup) {\n return { ...g, samples: g.samples.filter((s: string) => s !== sample) }\n }\n if (g.name === targetGroupName && !g.samples.includes(sample)) {\n return { ...g, samples: [...g.samples, sample] }\n }\n return g\n })\n\n resetDragState()\n}\n\n// Color picker\nfunction openColorPicker(groupName: string, event: Event) {\n event.stopPropagation()\n editingGroupColor.value = groupName\n colorPickerInput.value?.click()\n}\n\nfunction handleColorChange(event: Event) {\n const target = event.target as HTMLInputElement\n if (editingGroupColor.value) {\n internalGroups.value = internalGroups.value.map(g =>\n g.name === editingGroupColor.value ? { ...g, color: target.value } : g\n )\n }\n editingGroupColor.value = null\n}\n\nfunction getGroupColor(groupName: string): string {\n const group = internalGroups.value.find(g => g.name === groupName)\n return group?.color || '#3B82F6'\n}\n\n// New group\nfunction addNewGroup() {\n if (!newGroupName.value.trim()) return\n\n const usedColors = new Set(internalGroups.value.map(g => g.color))\n const availableColor = DEFAULT_COLORS.find(c => !usedColors.has(c)) || DEFAULT_COLORS[0]\n\n const newGroup: SampleGroup = {\n name: newGroupName.value.trim(),\n color: availableColor,\n samples: [],\n }\n\n internalGroups.value = [...internalGroups.value, newGroup]\n newGroupName.value = ''\n}\n\n</script>\n\n<template>\n <div class=\"mld-sample-selector\">\n <!-- Select All Row -->\n <label class=\"mld-sample-selector__select-all\">\n <input\n type=\"checkbox\"\n :checked=\"isAllSelected\"\n @change=\"toggleSelectAll\"\n class=\"mld-sample-selector__checkbox\"\n />\n <span class=\"mld-sample-selector__select-all-label\">Select All</span>\n <span class=\"mld-sample-selector__select-all-count\">{{ samples.length }} samples</span>\n </label>\n\n <!-- Action Buttons Row -->\n <div v-if=\"enableGrouping\" class=\"mld-sample-selector__actions\">\n <div class=\"mld-sample-selector__actions-row\">\n <!-- Smart Group Button -->\n <BaseButton\n v-if=\"enableSmartGroup\"\n :variant=\"groupingEnabled ? 'primary' : 'secondary'\"\n size=\"sm\"\n :disabled=\"samples.length === 0\"\n class=\"mld-sample-selector__action-btn\"\n @click=\"showSmartGroupModal = true\"\n >\n <svg class=\"mld-sample-selector__action-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n <span>Smart Group</span>\n </BaseButton>\n\n <!-- Reset Button -->\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"internalGroups.length === 0\"\n class=\"mld-sample-selector__action-btn mld-sample-selector__action-btn--reset\"\n @click=\"clearGroups\"\n title=\"Clear all groups\"\n >\n <svg class=\"mld-sample-selector__action-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </BaseButton>\n </div>\n </div>\n\n <!-- Grouped View -->\n <div v-if=\"groupingEnabled\" class=\"mld-sample-selector__grouped\">\n <!-- Groups Header -->\n <div class=\"mld-sample-selector__groups-header\">\n <span class=\"mld-sample-selector__groups-title\">Groups ({{ internalGroups.length }})</span>\n <div class=\"mld-sample-selector__groups-controls\">\n <button type=\"button\" class=\"mld-sample-selector__expand-btn\" @click=\"expandAllGroups\" title=\"Expand all\">\n <svg class=\"mld-sample-selector__expand-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <button type=\"button\" class=\"mld-sample-selector__expand-btn\" @click=\"collapseAllGroups\" title=\"Collapse all\">\n <svg class=\"mld-sample-selector__expand-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Hierarchical Tree -->\n <div class=\"mld-sample-selector__tree\">\n <!-- Major Groups (when hierarchy is meaningful) -->\n <template v-if=\"showHierarchy\">\n <div\n v-for=\"majorGroup in hierarchicalGroups\"\n :key=\"majorGroup.name\"\n class=\"mld-sample-selector__major-group\"\n >\n <!-- Major Group Header -->\n <div\n class=\"mld-sample-selector__major-header\"\n @click=\"toggleGroupExpanded(`major:${majorGroup.name}`)\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron',\n isGroupExpanded(`major:${majorGroup.name}`) ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n\n <input\n type=\"checkbox\"\n :checked=\"isMajorGroupFullySelected(majorGroup)\"\n :indeterminate=\"isMajorGroupPartiallySelected(majorGroup)\"\n class=\"mld-sample-selector__checkbox\"\n :style=\"{ accentColor: majorGroup.color }\"\n @click.stop\n @change=\"toggleMajorGroupSamples(majorGroup)\"\n />\n\n <div\n class=\"mld-sample-selector__color-dot mld-sample-selector__color-dot--large\"\n :style=\"{ backgroundColor: majorGroup.color }\"\n />\n\n <span class=\"mld-sample-selector__major-name\">{{ majorGroup.name }}</span>\n\n <span\n class=\"mld-sample-selector__count-badge\"\n :style=\"{ backgroundColor: majorGroup.color + '20', color: majorGroup.color }\"\n >\n {{ majorGroup.allSamples.length }}\n </span>\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__delete-btn mld-sample-selector__delete-btn--hidden\"\n @click.stop=\"deleteMajorGroup(majorGroup)\"\n title=\"Remove major group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Sub Groups (collapsible) -->\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded(`major:${majorGroup.name}`)\"\n class=\"mld-sample-selector__sub-groups\"\n :style=\"{ borderColor: majorGroup.color + '30' }\"\n >\n <div\n v-for=\"subGroup in majorGroup.subGroups\"\n :key=\"subGroup.name\"\n :class=\"[\n 'mld-sample-selector__sub-group',\n dragOverGroup === subGroup.name ? 'mld-sample-selector__sub-group--drag-over' : '',\n ]\"\n @dragover=\"handleDragOver(subGroup.name, $event)\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop(subGroup.name, $event)\"\n >\n <!-- Sub Group Header -->\n <div\n class=\"mld-sample-selector__sub-header\"\n @click=\"toggleGroupExpanded(subGroup.name)\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron mld-sample-selector__chevron--small',\n isGroupExpanded(subGroup.name) ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n\n <input\n type=\"checkbox\"\n :checked=\"isGroupFullySelected(subGroup.name)\"\n :indeterminate=\"isGroupPartiallySelected(subGroup.name)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--small\"\n :style=\"{ accentColor: subGroup.color }\"\n @click.stop\n @change=\"toggleGroupSamples(subGroup.name)\"\n />\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__color-dot mld-sample-selector__color-dot--clickable\"\n :style=\"{ backgroundColor: subGroup.color }\"\n @click.stop=\"openColorPicker(subGroup.name, $event)\"\n title=\"Click to change color\"\n />\n\n <span class=\"mld-sample-selector__sub-name\">{{ subGroup.name }}</span>\n\n <span\n class=\"mld-sample-selector__count-badge mld-sample-selector__count-badge--small\"\n :style=\"{ backgroundColor: subGroup.color + '20', color: subGroup.color }\"\n >\n {{ subGroup.samples.length }}\n </span>\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__delete-btn mld-sample-selector__delete-btn--hidden\"\n @click.stop=\"deleteGroup(subGroup.name)\"\n title=\"Remove sub group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Samples (collapsible) -->\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded(subGroup.name)\"\n class=\"mld-sample-selector__samples\"\n :style=\"{ borderColor: subGroup.color + '40' }\"\n >\n <div\n v-for=\"sample in subGroup.samples\"\n :key=\"sample\"\n :class=\"[\n 'mld-sample-selector__sample',\n draggingSample === sample ? 'mld-sample-selector__sample--dragging' : '',\n ]\"\n draggable=\"true\"\n @dragstart=\"handleDragStart(sample, subGroup.name, $event)\"\n @dragend=\"handleDragEnd\"\n >\n <svg class=\"mld-sample-selector__drag-handle\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8h16M4 16h16\" />\n </svg>\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--tiny\"\n :style=\"{ accentColor: subGroup.color }\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__sample-name\">{{ sample }}</span>\n <button\n type=\"button\"\n class=\"mld-sample-selector__remove-btn\"\n @click=\"removeSampleFromGroup(sample, subGroup.name)\"\n title=\"Remove from group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 12H4\" />\n </svg>\n </button>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n </Transition>\n </div>\n </template>\n\n <!-- Flat Groups (when no meaningful hierarchy - e.g., level 1) -->\n <template v-else>\n <div\n v-for=\"group in internalGroups\"\n :key=\"group.name\"\n :class=\"[\n 'mld-sample-selector__sub-group',\n dragOverGroup === group.name ? 'mld-sample-selector__sub-group--drag-over' : '',\n ]\"\n @dragover=\"handleDragOver(group.name, $event)\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop(group.name, $event)\"\n >\n <!-- Group Header -->\n <div\n class=\"mld-sample-selector__major-header\"\n @click=\"toggleGroupExpanded(group.name)\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron',\n isGroupExpanded(group.name) ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n\n <input\n type=\"checkbox\"\n :checked=\"isGroupFullySelected(group.name)\"\n :indeterminate=\"isGroupPartiallySelected(group.name)\"\n class=\"mld-sample-selector__checkbox\"\n :style=\"{ accentColor: group.color }\"\n @click.stop\n @change=\"toggleGroupSamples(group.name)\"\n />\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__color-dot mld-sample-selector__color-dot--large mld-sample-selector__color-dot--clickable\"\n :style=\"{ backgroundColor: group.color }\"\n @click.stop=\"openColorPicker(group.name, $event)\"\n title=\"Click to change color\"\n />\n\n <span class=\"mld-sample-selector__major-name\">{{ group.name }}</span>\n\n <span\n class=\"mld-sample-selector__count-badge\"\n :style=\"{ backgroundColor: group.color + '20', color: group.color }\"\n >\n {{ group.samples.length }}\n </span>\n\n <button\n type=\"button\"\n class=\"mld-sample-selector__delete-btn mld-sample-selector__delete-btn--hidden\"\n @click.stop=\"deleteGroup(group.name)\"\n title=\"Remove group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Samples (collapsible) -->\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded(group.name)\"\n class=\"mld-sample-selector__samples\"\n :style=\"{ borderColor: group.color + '40' }\"\n >\n <div\n v-for=\"sample in group.samples\"\n :key=\"sample\"\n :class=\"[\n 'mld-sample-selector__sample',\n draggingSample === sample ? 'mld-sample-selector__sample--dragging' : '',\n ]\"\n draggable=\"true\"\n @dragstart=\"handleDragStart(sample, group.name, $event)\"\n @dragend=\"handleDragEnd\"\n >\n <svg class=\"mld-sample-selector__drag-handle\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8h16M4 16h16\" />\n </svg>\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--tiny\"\n :style=\"{ accentColor: group.color }\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__sample-name\">{{ sample }}</span>\n <button\n type=\"button\"\n class=\"mld-sample-selector__remove-btn\"\n @click=\"removeSampleFromGroup(sample, group.name)\"\n title=\"Remove from group\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 12H4\" />\n </svg>\n </button>\n </div>\n </div>\n </Transition>\n </div>\n </template>\n\n <!-- Empty state -->\n <div v-if=\"internalGroups.length === 0\" class=\"mld-sample-selector__empty\">\n Click Smart Group to auto-group samples\n </div>\n </div>\n\n <!-- Ungrouped Samples Section -->\n <div v-if=\"ungroupedSamples.length > 0\" class=\"mld-sample-selector__ungrouped\">\n <div\n class=\"mld-sample-selector__ungrouped-header\"\n @click=\"toggleGroupExpanded('__ungrouped__')\"\n >\n <svg\n :class=\"[\n 'mld-sample-selector__chevron',\n isGroupExpanded('__ungrouped__') ? 'mld-sample-selector__chevron--open' : '',\n ]\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <span class=\"mld-sample-selector__ungrouped-label\">Ungrouped</span>\n <span class=\"mld-sample-selector__ungrouped-count\">{{ ungroupedSamples.length }}</span>\n </div>\n\n <Transition name=\"mld-collapse\">\n <div\n v-if=\"isGroupExpanded('__ungrouped__')\"\n class=\"mld-sample-selector__ungrouped-list\"\n >\n <div\n v-for=\"sample in ungroupedSamples\"\n :key=\"sample\"\n :class=\"[\n 'mld-sample-selector__sample',\n draggingSample === sample ? 'mld-sample-selector__sample--dragging' : '',\n ]\"\n draggable=\"true\"\n @dragstart=\"handleDragStart(sample, null, $event)\"\n @dragend=\"handleDragEnd\"\n >\n <svg class=\"mld-sample-selector__drag-handle\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8h16M4 16h16\" />\n </svg>\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox mld-sample-selector__checkbox--small\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__sample-name\">{{ sample }}</span>\n </div>\n </div>\n </Transition>\n </div>\n\n <!-- New Group Input -->\n <div class=\"mld-sample-selector__new-group\">\n <BaseInput\n v-model=\"newGroupName\"\n placeholder=\"New group name...\"\n class=\"mld-sample-selector__new-group-input\"\n @keyup.enter=\"addNewGroup\"\n />\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"!newGroupName.trim()\"\n class=\"mld-sample-selector__new-group-btn\"\n @click=\"addNewGroup\"\n >\n Add\n </BaseButton>\n </div>\n\n <!-- Hidden color picker input -->\n <input\n ref=\"colorPickerInput\"\n type=\"color\"\n class=\"mld-sample-selector__color-input\"\n :value=\"editingGroupColor ? getGroupColor(editingGroupColor) : '#3B82F6'\"\n @change=\"handleColorChange\"\n />\n </div>\n\n <!-- Flat View (when no groups) -->\n <div v-if=\"!groupingEnabled\" class=\"mld-sample-selector__flat\">\n <!-- Search -->\n <div class=\"mld-sample-selector__search\">\n <svg class=\"mld-sample-selector__search-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <input\n v-model=\"searchQuery\"\n type=\"text\"\n placeholder=\"Search samples...\"\n class=\"mld-sample-selector__search-input\"\n />\n </div>\n\n <!-- Flat samples list -->\n <div class=\"mld-sample-selector__flat-list\">\n <div\n v-for=\"sample in filteredSamples\"\n :key=\"sample\"\n class=\"mld-sample-selector__flat-item\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue.includes(sample)\"\n class=\"mld-sample-selector__checkbox\"\n @change=\"toggleSample(sample)\"\n />\n <span class=\"mld-sample-selector__flat-name\">{{ sample }}</span>\n </div>\n\n <div v-if=\"filteredSamples.length === 0 && searchQuery.trim()\" class=\"mld-sample-selector__empty\">\n No samples match \"{{ searchQuery }}\"\n </div>\n </div>\n </div>\n\n <!-- Smart Grouping Modal -->\n <AutoGroupModal\n v-model=\"showSmartGroupModal\"\n :samples=\"samples\"\n @apply=\"handleSmartGroupApply\"\n />\n </div>\n</template>\n\n<style>\n@import '../styles/components/sample-selector.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createBlock","BaseButton","_createVNode","_Fragment","_renderList","_normalizeClass","_normalizeStyle","_withModifiers","_Transition","BaseInput","AutoGroupModal"],"mappings":"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"}
@@ -50,6 +50,7 @@ export { default as PlateMapEditor } from './PlateMapEditor.vue';
50
50
  export { default as ExperimentTimeline } from './ExperimentTimeline.vue';
51
51
  export { default as SampleSelector } from './SampleSelector.vue';
52
52
  export { default as GroupingModal } from './GroupingModal.vue';
53
+ export { default as AutoGroupModal } from './AutoGroupModal.vue';
53
54
  export { default as GroupAssigner } from './GroupAssigner.vue';
54
55
  export { default as MoleculeInput } from './MoleculeInput.vue';
55
56
  export { default as ConcentrationInput } from './ConcentrationInput.vue';
@@ -101,54 +101,56 @@ import { default as default52 } from "./SampleSelector.vue.js";
101
101
  /* empty css */
102
102
  import { default as default53 } from "./GroupingModal.vue.js";
103
103
  /* empty css */
104
- import { default as default54 } from "./GroupAssigner.vue.js";
104
+ import { default as default54 } from "./AutoGroupModal.vue.js";
105
+ /* empty css */
106
+ import { default as default55 } from "./GroupAssigner.vue.js";
105
107
  /* empty css */
106
- import { default as default55 } from "./MoleculeInput.vue.js";
108
+ import { default as default56 } from "./MoleculeInput.vue.js";
107
109
  /* empty css */
108
- import { default as default56 } from "./ConcentrationInput.vue.js";
110
+ import { default as default57 } from "./ConcentrationInput.vue.js";
109
111
  /* empty css */
110
- import { default as default57 } from "./DoseCalculator.vue.js";
112
+ import { default as default58 } from "./DoseCalculator.vue.js";
111
113
  /* empty css */
112
- import { default as default58 } from "./ReagentList.vue.js";
114
+ import { default as default59 } from "./ReagentList.vue.js";
113
115
  /* empty css */
114
- import { default as default59 } from "./SampleHierarchyTree.vue.js";
116
+ import { default as default60 } from "./SampleHierarchyTree.vue.js";
115
117
  /* empty css */
116
- import { default as default60 } from "./ProtocolStepEditor.vue.js";
118
+ import { default as default61 } from "./ProtocolStepEditor.vue.js";
117
119
  /* empty css */
118
- import { default as default61 } from "./ScientificNumber.vue.js";
120
+ import { default as default62 } from "./ScientificNumber.vue.js";
119
121
  /* empty css */
120
- import { default as default62 } from "./ChemicalFormula.vue.js";
122
+ import { default as default63 } from "./ChemicalFormula.vue.js";
121
123
  /* empty css */
122
- import { default as default63 } from "./FormulaInput.vue.js";
124
+ import { default as default64 } from "./FormulaInput.vue.js";
123
125
  /* empty css */
124
- import { default as default64 } from "./SequenceInput.vue.js";
126
+ import { default as default65 } from "./SequenceInput.vue.js";
125
127
  /* empty css */
126
- import { default as default65 } from "./UnitInput.vue.js";
128
+ import { default as default66 } from "./UnitInput.vue.js";
127
129
  /* empty css */
128
- import { default as default66 } from "./StepWizard.vue.js";
130
+ import { default as default67 } from "./StepWizard.vue.js";
129
131
  /* empty css */
130
- import { default as default67 } from "./AuditTrail.vue.js";
132
+ import { default as default68 } from "./AuditTrail.vue.js";
131
133
  /* empty css */
132
- import { default as default68 } from "./BatchProgressList.vue.js";
134
+ import { default as default69 } from "./BatchProgressList.vue.js";
133
135
  /* empty css */
134
- import { default as default69 } from "./FormBuilder.vue.js";
136
+ import { default as default70 } from "./FormBuilder.vue.js";
135
137
  /* empty css */
136
- import { default as default70 } from "./FormSection.vue.js";
138
+ import { default as default71 } from "./FormSection.vue.js";
137
139
  /* empty css */
138
- import { default as default71 } from "./FormActions.vue.js";
140
+ import { default as default72 } from "./FormActions.vue.js";
139
141
  /* empty css */
140
- import { default as default72 } from "./FormFieldRenderer.vue.js";
141
- import { default as default73 } from "./ExperimentDataViewer.vue.js";
142
+ import { default as default73 } from "./FormFieldRenderer.vue.js";
143
+ import { default as default74 } from "./ExperimentDataViewer.vue.js";
142
144
  /* empty css */
143
- import { default as default74 } from "./ExperimentCodeBadge.vue.js";
145
+ import { default as default75 } from "./ExperimentCodeBadge.vue.js";
144
146
  /* empty css */
145
- import { default as default75 } from "./DateTimePicker.vue.js";
147
+ import { default as default76 } from "./DateTimePicker.vue.js";
146
148
  /* empty css */
147
- import { default as default76 } from "./TimeRangeInput.vue.js";
149
+ import { default as default77 } from "./TimeRangeInput.vue.js";
148
150
  /* empty css */
149
- import { default as default77 } from "./ScheduleCalendar.vue.js";
151
+ import { default as default78 } from "./ScheduleCalendar.vue.js";
150
152
  /* empty css */
151
- import { default as default78 } from "./ResourceCard.vue.js";
153
+ import { default as default79 } from "./ResourceCard.vue.js";
152
154
  /* empty css */
153
155
  export {
154
156
  default25 as AlertBox,
@@ -156,7 +158,8 @@ export {
156
158
  default33 as AppLayout,
157
159
  default32 as AppSidebar,
158
160
  default31 as AppTopBar,
159
- default67 as AuditTrail,
161
+ default68 as AuditTrail,
162
+ default54 as AutoGroupModal,
160
163
  default40 as Avatar,
161
164
  default2 as BaseButton,
162
165
  default6 as BaseCheckbox,
@@ -169,64 +172,64 @@ export {
169
172
  default11 as BaseTabs,
170
173
  default4 as BaseTextarea,
171
174
  default7 as BaseToggle,
172
- default68 as BatchProgressList,
175
+ default69 as BatchProgressList,
173
176
  default42 as Breadcrumb,
174
177
  default17 as Calendar,
175
178
  default45 as ChartContainer,
176
- default62 as ChemicalFormula,
179
+ default63 as ChemicalFormula,
177
180
  default30 as CollapsibleCard,
178
181
  default10 as ColorSlider,
179
- default56 as ConcentrationInput,
182
+ default57 as ConcentrationInput,
180
183
  default44 as ConfirmDialog,
181
184
  default18 as DataFrame,
182
185
  default20 as DatePicker,
183
- default75 as DateTimePicker,
186
+ default76 as DateTimePicker,
184
187
  default37 as Divider,
185
- default57 as DoseCalculator,
188
+ default58 as DoseCalculator,
186
189
  default16 as DropdownButton,
187
190
  default41 as EmptyState,
188
- default74 as ExperimentCodeBadge,
189
- default73 as ExperimentDataViewer,
191
+ default75 as ExperimentCodeBadge,
192
+ default74 as ExperimentDataViewer,
190
193
  default51 as ExperimentTimeline,
191
194
  default24 as FileUploader,
192
- default71 as FormActions,
193
- default69 as FormBuilder,
195
+ default72 as FormActions,
196
+ default70 as FormBuilder,
194
197
  default19 as FormField,
195
- default72 as FormFieldRenderer,
196
- default70 as FormSection,
197
- default63 as FormulaInput,
198
- default54 as GroupAssigner,
198
+ default73 as FormFieldRenderer,
199
+ default71 as FormSection,
200
+ default64 as FormulaInput,
201
+ default55 as GroupAssigner,
199
202
  default53 as GroupingModal,
200
203
  default27 as IconButton,
201
204
  default36 as LoadingSpinner,
202
- default55 as MoleculeInput,
205
+ default56 as MoleculeInput,
203
206
  default14 as MultiSelect,
204
207
  default23 as NumberInput,
205
208
  default50 as PlateMapEditor,
206
209
  default39 as ProgressBar,
207
- default60 as ProtocolStepEditor,
210
+ default61 as ProtocolStepEditor,
208
211
  default48 as RackEditor,
209
- default58 as ReagentList,
210
- default78 as ResourceCard,
211
- default59 as SampleHierarchyTree,
212
+ default59 as ReagentList,
213
+ default79 as ResourceCard,
214
+ default60 as SampleHierarchyTree,
212
215
  default49 as SampleLegend,
213
216
  default52 as SampleSelector,
214
- default77 as ScheduleCalendar,
215
- default61 as ScientificNumber,
217
+ default78 as ScheduleCalendar,
218
+ default62 as ScientificNumber,
216
219
  default13 as SegmentedControl,
217
- default64 as SequenceInput,
220
+ default65 as SequenceInput,
218
221
  default29 as SettingsButton,
219
222
  default46 as SettingsModal,
220
223
  default35 as Skeleton,
221
224
  default38 as StatusIndicator,
222
- default66 as StepWizard,
225
+ default67 as StepWizard,
223
226
  default22 as TagsInput,
224
227
  default28 as ThemeToggle,
225
228
  default21 as TimePicker,
226
- default76 as TimeRangeInput,
229
+ default77 as TimeRangeInput,
227
230
  default26 as ToastNotification,
228
231
  default43 as Tooltip,
229
- default65 as UnitInput,
232
+ default66 as UnitInput,
230
233
  default47 as WellPlate
231
234
  };
232
235
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -16,5 +16,6 @@ export { useSequenceUtils, type SequenceType, type SequenceStats, } from './useS
16
16
  export { parseTime, formatTime, generateTimeSlots, rangesOverlap, durationMinutes, formatDuration, isTimeInRange, findAvailableSlots, snapToSlot, addMinutes, compareTime, } from './useTimeUtils';
17
17
  export { useScheduleDrag } from './useScheduleDrag';
18
18
  export { useFormBuilder, evaluateCondition } from './useFormBuilder';
19
+ export { useAutoGroup, DEFAULT_COLORS } from './useAutoGroup';
19
20
  export { usePluginConfig, type UsePluginConfigReturn } from './usePluginConfig';
20
21
  export { getFieldRegistryEntry, getTypeDefault, type RegistryEntry, } from './formBuilderRegistry';
@@ -16,10 +16,12 @@ import { useSequenceUtils } from "./useSequenceUtils.js";
16
16
  import { addMinutes, compareTime, durationMinutes, findAvailableSlots, formatDuration, formatTime, generateTimeSlots, isTimeInRange, parseTime, rangesOverlap, snapToSlot } from "./useTimeUtils.js";
17
17
  import { useScheduleDrag } from "./useScheduleDrag.js";
18
18
  import { evaluateCondition, useFormBuilder } from "./useFormBuilder.js";
19
+ import { DEFAULT_COLORS, useAutoGroup } from "./useAutoGroup.js";
19
20
  import { usePluginConfig } from "./usePluginConfig.js";
20
21
  import { getFieldRegistryEntry, getTypeDefault } from "./formBuilderRegistry.js";
21
22
  export {
22
23
  ATOMIC_WEIGHTS,
24
+ DEFAULT_COLORS,
23
25
  addMinutes,
24
26
  compareTime,
25
27
  durationMinutes,
@@ -38,6 +40,7 @@ export {
38
40
  useAsync,
39
41
  useAsyncBatch,
40
42
  useAuth,
43
+ useAutoGroup,
41
44
  useChemicalFormula,
42
45
  useConcentrationUnits,
43
46
  useDoseCalculator,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,80 @@
1
+ import { InputMode, OutlierAction, OutlierInfo, ColumnInfo, MetadataRow, AutoGroupResult, ParsedCsvData } from '../types/auto-group';
2
+ import { SampleGroup } from '../types/components';
3
+ export declare const DEFAULT_COLORS: string[];
4
+ export declare function analyzeDelimiter(lines: string[]): {
5
+ delimiter: string;
6
+ dominantFieldCount: number;
7
+ minFieldCount: number;
8
+ consistency: number;
9
+ };
10
+ export declare function detectOutliers(lines: string[], delimiter: string, minFieldCount: number): OutlierInfo[];
11
+ export declare function extractColumns(samples: string[], delimiter: string, minFieldCount: number): ColumnInfo[];
12
+ export declare function parseCSVLine(line: string): string[];
13
+ export declare function parseCSV(text: string): ParsedCsvData;
14
+ export declare function computeGroups(allSamples: string[], columns: ColumnInfo[], enabledFields: Set<number>, outlierActions: Map<number, OutlierAction>, delimiter: string, minFieldCount: number): {
15
+ groups: SampleGroup[];
16
+ metadata: MetadataRow[];
17
+ excludedSamples: string[];
18
+ };
19
+ export declare function useAutoGroup(): {
20
+ inputMode: import('vue').Ref<InputMode, InputMode>;
21
+ rawText: import('vue').Ref<string, string>;
22
+ csvData: import('vue').Ref<{
23
+ columns: string[];
24
+ rows: Record<string, string>[];
25
+ sampleColumn: string;
26
+ } | null, ParsedCsvData | {
27
+ columns: string[];
28
+ rows: Record<string, string>[];
29
+ sampleColumn: string;
30
+ } | null>;
31
+ delimiter: import('vue').Ref<string, string>;
32
+ dominantFieldCount: import('vue').Ref<number, number>;
33
+ minFieldCount: import('vue').Ref<number, number>;
34
+ outliers: import('vue').Ref<{
35
+ sample: string;
36
+ index: number;
37
+ fieldCount: number;
38
+ action: OutlierAction;
39
+ }[], OutlierInfo[] | {
40
+ sample: string;
41
+ index: number;
42
+ fieldCount: number;
43
+ action: OutlierAction;
44
+ }[]>;
45
+ fields: import('vue').Ref<{
46
+ index: number;
47
+ name: string;
48
+ uniqueValues: string[];
49
+ cardinality: number;
50
+ type?: "prefix" | "suffix" | undefined;
51
+ }[], ColumnInfo[] | {
52
+ index: number;
53
+ name: string;
54
+ uniqueValues: string[];
55
+ cardinality: number;
56
+ type?: "prefix" | "suffix" | undefined;
57
+ }[]>;
58
+ fieldNames: import('vue').Ref<Record<number, string>, Record<number, string>>;
59
+ enabledFields: import('vue').Ref<Set<number> & Omit<Set<number>, keyof Set<any>>, Set<number> | (Set<number> & Omit<Set<number>, keyof Set<any>>)>;
60
+ samples: import('vue').ComputedRef<string[]>;
61
+ hasOutliers: import('vue').ComputedRef<boolean>;
62
+ conformingSamples: import('vue').ComputedRef<string[]>;
63
+ groups: import('vue').ComputedRef<SampleGroup[]>;
64
+ metadata: import('vue').ComputedRef<MetadataRow[]>;
65
+ excludedSamples: import('vue').ComputedRef<string[]>;
66
+ result: import('vue').ComputedRef<AutoGroupResult>;
67
+ effectiveColumns: import('vue').ComputedRef<{
68
+ name: string;
69
+ index: number;
70
+ uniqueValues: string[];
71
+ cardinality: number;
72
+ type?: "prefix" | "suffix" | undefined;
73
+ }[]>;
74
+ parseInput: () => void;
75
+ setOutlierAction: (index: number, action: OutlierAction) => void;
76
+ setAllOutlierActions: (action: OutlierAction) => void;
77
+ toggleField: (index: number) => void;
78
+ renameField: (index: number, name: string) => void;
79
+ reset: () => void;
80
+ };