@morscherlab/mld-sdk 0.9.5 → 0.9.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 (38) hide show
  1. package/dist/components/AutoGroupModal.vue.d.ts +118 -0
  2. package/dist/components/AutoGroupModal.vue.js.map +1 -1
  3. package/dist/components/DataFrame.vue.js +1 -1
  4. package/dist/components/DataFrame.vue.js.map +1 -1
  5. package/dist/components/ExperimentPopover.vue.d.ts +1 -0
  6. package/dist/components/ExperimentPopover.vue.js +72 -46
  7. package/dist/components/ExperimentPopover.vue.js.map +1 -1
  8. package/dist/components/ExperimentSelectorModal.vue.js +1 -1
  9. package/dist/components/ExperimentSelectorModal.vue.js.map +1 -1
  10. package/dist/components/FileUploader.vue.js +13 -10
  11. package/dist/components/FileUploader.vue.js.map +1 -1
  12. package/dist/components/FormBuilder.vue.d.ts +287 -0
  13. package/dist/components/StepWizard.vue.d.ts +1 -1
  14. package/dist/components/StepWizard.vue.js.map +1 -1
  15. package/dist/composables/useApi.js +26 -12
  16. package/dist/composables/useApi.js.map +1 -1
  17. package/dist/composables/useAuth.js +7 -6
  18. package/dist/composables/useAuth.js.map +1 -1
  19. package/dist/composables/useExperimentSelector.js +14 -5
  20. package/dist/composables/useExperimentSelector.js.map +1 -1
  21. package/dist/composables/useForm.js +2 -2
  22. package/dist/composables/useForm.js.map +1 -1
  23. package/dist/composables/usePlatformContext.js +11 -0
  24. package/dist/composables/usePlatformContext.js.map +1 -1
  25. package/dist/styles.css +165 -98
  26. package/package.json +1 -1
  27. package/src/components/AutoGroupModal.vue +1 -1
  28. package/src/components/DataFrame.vue +1 -1
  29. package/src/components/ExperimentPopover.vue +32 -19
  30. package/src/components/ExperimentSelectorModal.vue +1 -1
  31. package/src/components/FileUploader.vue +14 -11
  32. package/src/components/StepWizard.vue +1 -1
  33. package/src/composables/useApi.ts +33 -17
  34. package/src/composables/useAuth.ts +11 -8
  35. package/src/composables/useExperimentSelector.ts +19 -7
  36. package/src/composables/useForm.ts +3 -3
  37. package/src/composables/usePlatformContext.ts +11 -1
  38. package/src/styles/components/experiment-popover.css +85 -49
@@ -0,0 +1,118 @@
1
+ import { WizardStep } from '../types/components';
2
+ import { AutoGroupResult } from '../types/auto-group';
3
+ export interface Props {
4
+ modelValue: boolean;
5
+ samples?: string[];
6
+ }
7
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ "update:modelValue": (value: boolean) => any;
9
+ apply: (result: AutoGroupResult) => any;
10
+ }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
11
+ "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
12
+ onApply?: ((result: AutoGroupResult) => any) | undefined;
13
+ }>, {
14
+ samples: string[];
15
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
16
+ wizardRef: ({
17
+ $: import('vue').ComponentInternalInstance;
18
+ $data: {};
19
+ $props: {
20
+ readonly steps: WizardStep[];
21
+ readonly modelValue?: number | undefined;
22
+ readonly linear?: boolean | undefined;
23
+ readonly showProgress?: boolean | undefined;
24
+ readonly showStepNumbers?: boolean | undefined;
25
+ readonly size?: "sm" | "md" | "lg" | undefined;
26
+ readonly "onUpdate:modelValue"?: ((index: number) => any) | undefined;
27
+ readonly onCancel?: (() => any) | undefined;
28
+ readonly onComplete?: (() => any) | undefined;
29
+ readonly "onStep-change"?: ((change: [from: number, to: number]) => any) | undefined;
30
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
31
+ $attrs: {
32
+ [x: string]: unknown;
33
+ };
34
+ $refs: {
35
+ [x: string]: unknown;
36
+ };
37
+ $slots: Readonly<{
38
+ [name: string]: import('vue').Slot<any> | undefined;
39
+ }>;
40
+ $root: import('vue').ComponentPublicInstance | null;
41
+ $parent: import('vue').ComponentPublicInstance | null;
42
+ $host: Element | null;
43
+ $emit: ((event: "update:modelValue", index: number) => void) & ((event: "cancel") => void) & ((event: "complete") => void) & ((event: "step-change", change: [from: number, to: number]) => void);
44
+ $el: HTMLDivElement;
45
+ $options: import('vue').ComponentOptionsBase<Readonly<import('./StepWizard.vue').Props> & Readonly<{
46
+ "onUpdate:modelValue"?: ((index: number) => any) | undefined;
47
+ onCancel?: (() => any) | undefined;
48
+ onComplete?: (() => any) | undefined;
49
+ "onStep-change"?: ((change: [from: number, to: number]) => any) | undefined;
50
+ }>, {
51
+ setStepValid: (index: number, valid: boolean) => void;
52
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
53
+ "update:modelValue": (index: number) => any;
54
+ cancel: () => any;
55
+ complete: () => any;
56
+ "step-change": (change: [from: number, to: number]) => any;
57
+ }, string, {
58
+ size: "sm" | "md" | "lg";
59
+ modelValue: number;
60
+ linear: boolean;
61
+ showProgress: boolean;
62
+ showStepNumbers: boolean;
63
+ }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
64
+ beforeCreate?: (() => void) | (() => void)[];
65
+ created?: (() => void) | (() => void)[];
66
+ beforeMount?: (() => void) | (() => void)[];
67
+ mounted?: (() => void) | (() => void)[];
68
+ beforeUpdate?: (() => void) | (() => void)[];
69
+ updated?: (() => void) | (() => void)[];
70
+ activated?: (() => void) | (() => void)[];
71
+ deactivated?: (() => void) | (() => void)[];
72
+ beforeDestroy?: (() => void) | (() => void)[];
73
+ beforeUnmount?: (() => void) | (() => void)[];
74
+ destroyed?: (() => void) | (() => void)[];
75
+ unmounted?: (() => void) | (() => void)[];
76
+ renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
77
+ renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
78
+ errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
79
+ };
80
+ $forceUpdate: () => void;
81
+ $nextTick: typeof import('vue').nextTick;
82
+ $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (...args: [R, R, import('@vue/reactivity').OnCleanup]) => any : (...args: [any, any, import('@vue/reactivity').OnCleanup]) => any, options?: import('vue').WatchOptions): import('vue').WatchStopHandle;
83
+ } & Readonly<{
84
+ size: "sm" | "md" | "lg";
85
+ modelValue: number;
86
+ linear: boolean;
87
+ showProgress: boolean;
88
+ showStepNumbers: boolean;
89
+ }> & Omit<Readonly<import('./StepWizard.vue').Props> & Readonly<{
90
+ "onUpdate:modelValue"?: ((index: number) => any) | undefined;
91
+ onCancel?: (() => any) | undefined;
92
+ onComplete?: (() => any) | undefined;
93
+ "onStep-change"?: ((change: [from: number, to: number]) => any) | undefined;
94
+ }>, "setStepValid" | ("size" | "modelValue" | "linear" | "showProgress" | "showStepNumbers")> & import('vue').ShallowUnwrapRef<{
95
+ setStepValid: (index: number, valid: boolean) => void;
96
+ }> & {} & import('vue').ComponentCustomProperties & {} & {
97
+ $slots: Partial<Record<`step-${string}`, (_: {
98
+ step: WizardStep;
99
+ index: number;
100
+ }) => any>> & {
101
+ progress?(_: {
102
+ steps: WizardStep[];
103
+ current: number;
104
+ states: import('..').WizardStepState[];
105
+ }): any;
106
+ navigation?(_: {
107
+ goBack: () => void;
108
+ goNext: () => void;
109
+ finish: () => void;
110
+ cancel: () => void;
111
+ isFirst: boolean;
112
+ isLast: boolean;
113
+ canProceed: boolean;
114
+ }): any;
115
+ };
116
+ }) | null;
117
+ }, any>;
118
+ export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"AutoGroupModal.vue.js","sources":["../../src/components/AutoGroupModal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport BaseModal from './BaseModal.vue'\nimport BaseButton from './BaseButton.vue'\nimport BaseInput from './BaseInput.vue'\nimport StepWizard from './StepWizard.vue'\nimport { useAutoGroup, parseCSV } from '../composables/useAutoGroup'\nimport type { WizardStep } from '../types/components'\nimport type { AutoGroupResult } from '../types/auto-group'\n\ninterface Props {\n modelValue: boolean\n samples?: string[]\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n samples: () => [],\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n 'apply': [result: AutoGroupResult]\n}>()\n\nconst autoGroup = useAutoGroup()\nconst wizardRef = ref<InstanceType<typeof StepWizard> | null>(null)\nconst currentStep = ref(0)\nconst isDragOver = ref(false)\nconst csvFileName = ref('')\n\n// Pre-fill from props\nwatch(() => props.modelValue, (open) => {\n if (open) {\n autoGroup.reset()\n currentStep.value = 0\n csvFileName.value = ''\n if (props.samples.length > 0) {\n autoGroup.rawText.value = props.samples.join('\\n')\n }\n }\n}, { immediate: true })\n\n// Dynamic steps: skip outlier step when no outliers\nconst allSteps: WizardStep[] = [\n { id: 'input', label: 'Input' },\n { id: 'outliers', label: 'Outliers' },\n { id: 'fields', label: 'Fields' },\n { id: 'preview', label: 'Preview' },\n]\n\nconst dynamicSteps = computed<WizardStep[]>(() => {\n if (autoGroup.hasOutliers.value) {\n return allSteps\n }\n return allSteps.filter(s => s.id !== 'outliers')\n})\n\n// Map current step index to step ID\nconst currentStepId = computed(() => {\n const step = dynamicSteps.value[currentStep.value]\n return step?.id ?? 'input'\n})\n\n// Clamp step when dynamic steps change\nwatch(() => dynamicSteps.value.length, (newLen) => {\n if (currentStep.value >= newLen) {\n currentStep.value = newLen - 1\n }\n})\n\n// Step validity\nconst inputValid = computed(() => autoGroup.samples.value.length > 0)\nconst fieldsValid = computed(() => autoGroup.enabledFields.value.size > 0)\n\nwatch([inputValid, fieldsValid, dynamicSteps], () => {\n if (!wizardRef.value) return\n const steps = dynamicSteps.value\n for (let i = 0; i < steps.length; i++) {\n const id = steps[i].id\n if (id === 'input') wizardRef.value.setStepValid(i, inputValid.value)\n else if (id === 'outliers') wizardRef.value.setStepValid(i, true)\n else if (id === 'fields') wizardRef.value.setStepValid(i, fieldsValid.value)\n else if (id === 'preview') wizardRef.value.setStepValid(i, true)\n }\n}, { immediate: true })\n\n// Navigation\nfunction handleNext() {\n if (currentStepId.value === 'input') {\n autoGroup.parseInput()\n }\n // StepWizard handles the actual navigation via v-model\n}\n\nfunction handleApply() {\n emit('apply', autoGroup.result.value)\n emit('update:modelValue', false)\n}\n\nfunction handleCancel() {\n emit('update:modelValue', false)\n}\n\n// CSV file handling\nfunction handleFileDrop(event: DragEvent) {\n event.preventDefault()\n isDragOver.value = false\n const files = event.dataTransfer?.files\n if (files && files.length > 0) {\n processFile(files[0])\n }\n}\n\nfunction handleFileInput(event: Event) {\n const target = event.target as HTMLInputElement\n if (target.files && target.files.length > 0) {\n processFile(target.files[0])\n }\n}\n\nasync function processFile(file: File) {\n if (!file.name.endsWith('.csv') && !file.name.endsWith('.tsv')) return\n\n try {\n const text = await file.text()\n const parsed = parseCSV(text)\n autoGroup.inputMode.value = 'csv'\n autoGroup.csvData.value = parsed\n csvFileName.value = file.name\n } catch {\n // CSV parse error — stay in current state\n }\n}\n\nfunction clearCsvFile() {\n autoGroup.csvData.value = null\n autoGroup.inputMode.value = 'paste'\n csvFileName.value = ''\n}\n\n// Last step check\nconst isLastStep = computed(() => currentStep.value === dynamicSteps.value.length - 1)\nconst isFirstStep = computed(() => currentStep.value === 0)\n</script>\n\n<template>\n <BaseModal\n :model-value=\"modelValue\"\n title=\"Smart Group\"\n size=\"lg\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @close=\"handleCancel\"\n >\n <div class=\"mld-auto-group\">\n <StepWizard\n ref=\"wizardRef\"\n v-model=\"currentStep\"\n :steps=\"dynamicSteps\"\n :linear=\"true\"\n size=\"sm\"\n >\n <!-- Step: Input -->\n <template #step-input>\n <div class=\"mld-auto-group__input-step\">\n <!-- Mode toggle -->\n <div class=\"mld-auto-group__mode-toggle\">\n <BaseButton\n :variant=\"autoGroup.inputMode.value === 'paste' ? 'primary' : 'secondary'\"\n size=\"sm\"\n @click=\"autoGroup.inputMode.value = 'paste'\"\n >\n Paste\n </BaseButton>\n <BaseButton\n :variant=\"autoGroup.inputMode.value === 'csv' ? 'primary' : 'secondary'\"\n size=\"sm\"\n @click=\"autoGroup.inputMode.value = 'csv'\"\n >\n CSV\n </BaseButton>\n </div>\n\n <!-- Paste mode -->\n <div v-if=\"autoGroup.inputMode.value === 'paste'\" class=\"mld-auto-group__paste\">\n <textarea\n v-model=\"autoGroup.rawText.value\"\n class=\"mld-auto-group__textarea\"\n rows=\"12\"\n placeholder=\"Paste sample names, one per line...\"\n />\n <div v-if=\"autoGroup.samples.value.length > 0\" class=\"mld-auto-group__sample-count\">\n {{ autoGroup.samples.value.length }} samples\n </div>\n </div>\n\n <!-- CSV mode -->\n <div v-if=\"autoGroup.inputMode.value === 'csv'\" class=\"mld-auto-group__csv\">\n <div v-if=\"!autoGroup.csvData.value\"\n :class=\"[\n 'mld-auto-group__dropzone',\n isDragOver ? 'mld-auto-group__dropzone--dragover' : '',\n ]\"\n @drop=\"handleFileDrop\"\n @dragover.prevent=\"isDragOver = true\"\n @dragleave=\"isDragOver = false\"\n >\n <input\n type=\"file\"\n accept=\".csv,.tsv\"\n class=\"mld-auto-group__file-input\"\n @change=\"handleFileInput\"\n />\n <svg class=\"mld-auto-group__upload-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n <p class=\"mld-auto-group__upload-text\">\n <span class=\"mld-auto-group__upload-highlight\">Click to upload</span>\n or drag and drop a CSV file\n </p>\n </div>\n\n <div v-else class=\"mld-auto-group__file-info\">\n <svg class=\"mld-auto-group__file-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 class=\"mld-auto-group__file-name\">{{ csvFileName }}</span>\n <span class=\"mld-auto-group__file-rows\">{{ autoGroup.csvData.value.rows.length }} rows</span>\n <button type=\"button\" class=\"mld-auto-group__file-clear\" @click=\"clearCsvFile\">\n Change file\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Step: Outliers -->\n <template #step-outliers>\n <div class=\"mld-auto-group__outlier-step\">\n <div class=\"mld-auto-group__outlier-banner\">\n {{ autoGroup.outliers.value.length }} of {{ autoGroup.samples.value.length }}\n samples have irregular structure\n (fewer than {{ autoGroup.dominantFieldCount.value }} fields, delimiter\n <code>{{ autoGroup.delimiter.value }}</code>)\n </div>\n\n <div class=\"mld-auto-group__outlier-batch\">\n <BaseButton size=\"sm\" variant=\"secondary\" @click=\"autoGroup.setAllOutlierActions('include')\">\n Include All\n </BaseButton>\n <BaseButton size=\"sm\" variant=\"secondary\" @click=\"autoGroup.setAllOutlierActions('exclude')\">\n Exclude All\n </BaseButton>\n </div>\n\n <div class=\"mld-auto-group__outlier-list\">\n <div\n v-for=\"outlier in autoGroup.outliers.value\"\n :key=\"outlier.index\"\n class=\"mld-auto-group__outlier-item\"\n >\n <div class=\"mld-auto-group__outlier-info\">\n <code class=\"mld-auto-group__outlier-name\">{{ outlier.sample }}</code>\n <span class=\"mld-auto-group__outlier-badge\">{{ outlier.fieldCount }} fields</span>\n </div>\n <div class=\"mld-auto-group__outlier-actions\">\n <button\n type=\"button\"\n :class=\"['mld-auto-group__action-btn', outlier.action === 'include' ? 'mld-auto-group__action-btn--active' : '']\"\n @click=\"autoGroup.setOutlierAction(outlier.index, 'include')\"\n >Include</button>\n <button\n type=\"button\"\n :class=\"['mld-auto-group__action-btn', outlier.action === 'exclude' ? 'mld-auto-group__action-btn--active mld-auto-group__action-btn--exclude' : '']\"\n @click=\"autoGroup.setOutlierAction(outlier.index, 'exclude')\"\n >Exclude</button>\n <button\n type=\"button\"\n :class=\"['mld-auto-group__action-btn', outlier.action === 'qc' ? 'mld-auto-group__action-btn--active mld-auto-group__action-btn--qc' : '']\"\n @click=\"autoGroup.setOutlierAction(outlier.index, 'qc')\"\n >QC</button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Step: Fields -->\n <template #step-fields>\n <div class=\"mld-auto-group__field-step\">\n <div class=\"mld-auto-group__field-grid\">\n <div\n v-for=\"col in autoGroup.effectiveColumns.value\"\n :key=\"col.index\"\n :class=\"[\n 'mld-auto-group__field-card',\n autoGroup.enabledFields.value.has(col.index) ? 'mld-auto-group__field-card--enabled' : '',\n ]\"\n >\n <div class=\"mld-auto-group__field-header\">\n <label class=\"mld-auto-group__field-toggle\">\n <input\n type=\"checkbox\"\n :checked=\"autoGroup.enabledFields.value.has(col.index)\"\n @change=\"autoGroup.toggleField(col.index)\"\n />\n <span class=\"mld-auto-group__field-toggle-label\">Group by</span>\n </label>\n <span class=\"mld-auto-group__field-cardinality\">{{ col.cardinality }} unique</span>\n </div>\n\n <BaseInput\n :model-value=\"col.name\"\n placeholder=\"Field name...\"\n class=\"mld-auto-group__field-name-input\"\n @update:model-value=\"autoGroup.renameField(col.index, String($event ?? ''))\"\n />\n\n <div class=\"mld-auto-group__field-values\">\n <span\n v-for=\"val in col.uniqueValues.slice(0, 5)\"\n :key=\"val\"\n class=\"mld-auto-group__field-value\"\n >{{ val }}</span>\n <span\n v-if=\"col.uniqueValues.length > 5\"\n class=\"mld-auto-group__field-more\"\n >+{{ col.uniqueValues.length - 5 }} more</span>\n </div>\n </div>\n </div>\n\n <div v-if=\"autoGroup.enabledFields.value.size > 0\" class=\"mld-auto-group__field-summary\">\n Grouping by:\n <strong>{{\n autoGroup.effectiveColumns.value\n .filter(c => autoGroup.enabledFields.value.has(c.index))\n .map(c => c.name)\n .join(' / ')\n }}</strong>\n </div>\n\n <div v-if=\"autoGroup.enabledFields.value.size === 0\" class=\"mld-auto-group__field-warning\">\n Select at least one field for grouping\n </div>\n </div>\n </template>\n\n <!-- Step: Preview -->\n <template #step-preview>\n <div class=\"mld-auto-group__preview-step\">\n <div class=\"mld-auto-group__preview-summary\">\n <span class=\"mld-auto-group__preview-stat\">\n <strong>{{ autoGroup.groups.value.length }}</strong> groups\n </span>\n <span class=\"mld-auto-group__preview-stat\">\n <strong>{{ autoGroup.groups.value.reduce((sum, g) => sum + g.samples.length, 0) }}</strong> samples\n </span>\n <span v-if=\"autoGroup.excludedSamples.value.length > 0\" class=\"mld-auto-group__preview-stat mld-auto-group__preview-stat--excluded\">\n <strong>{{ autoGroup.excludedSamples.value.length }}</strong> excluded\n </span>\n </div>\n\n <div class=\"mld-auto-group__preview-groups\">\n <details\n v-for=\"group in autoGroup.groups.value\"\n :key=\"group.name\"\n class=\"mld-auto-group__preview-group\"\n >\n <summary class=\"mld-auto-group__preview-group-header\">\n <span\n class=\"mld-auto-group__preview-dot\"\n :style=\"{ backgroundColor: group.color }\"\n />\n <span class=\"mld-auto-group__preview-group-name\">{{ group.name }}</span>\n <span\n class=\"mld-auto-group__preview-group-count\"\n :style=\"{ backgroundColor: group.color + '20', color: group.color }\"\n >{{ group.samples.length }}</span>\n </summary>\n <div class=\"mld-auto-group__preview-samples\">\n <span\n v-for=\"sample in group.samples\"\n :key=\"sample\"\n class=\"mld-auto-group__preview-sample\"\n >{{ sample }}</span>\n </div>\n </details>\n </div>\n\n <div v-if=\"autoGroup.excludedSamples.value.length > 0\" class=\"mld-auto-group__preview-excluded\">\n <div class=\"mld-auto-group__preview-excluded-title\">Excluded Samples</div>\n <div class=\"mld-auto-group__preview-excluded-list\">\n <span\n v-for=\"sample in autoGroup.excludedSamples.value\"\n :key=\"sample\"\n class=\"mld-auto-group__preview-sample mld-auto-group__preview-sample--excluded\"\n >{{ sample }}</span>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Custom navigation -->\n <template #navigation=\"{ goBack, goNext, canProceed }\">\n <div class=\"mld-auto-group__nav\">\n <BaseButton variant=\"secondary\" @click=\"handleCancel\">\n Cancel\n </BaseButton>\n <div style=\"flex: 1\" />\n <BaseButton\n v-if=\"!isFirstStep\"\n variant=\"secondary\"\n @click=\"goBack\"\n >\n Back\n </BaseButton>\n <BaseButton\n v-if=\"!isLastStep\"\n variant=\"primary\"\n :disabled=\"!canProceed\"\n @click=\"() => { handleNext(); goNext() }\"\n >\n Next\n </BaseButton>\n <BaseButton\n v-if=\"isLastStep\"\n variant=\"primary\"\n @click=\"handleApply\"\n >\n Apply\n </BaseButton>\n </div>\n </template>\n </StepWizard>\n </div>\n </BaseModal>\n</template>\n\n<style>\n@import '../styles/components/auto-group-modal.css';\n</style>\n"],"names":["_createBlock","BaseModal","_createElementVNode","_createVNode","StepWizard","BaseButton","_unref","_openBlock","_createElementBlock","_toDisplayString","_normalizeClass","_Fragment","BaseInput","_normalizeStyle","_renderList"],"mappings":"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"}
1
+ {"version":3,"file":"AutoGroupModal.vue.js","sources":["../../src/components/AutoGroupModal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport BaseModal from './BaseModal.vue'\nimport BaseButton from './BaseButton.vue'\nimport BaseInput from './BaseInput.vue'\nimport StepWizard from './StepWizard.vue'\nimport { useAutoGroup, parseCSV } from '../composables/useAutoGroup'\nimport type { WizardStep } from '../types/components'\nimport type { AutoGroupResult } from '../types/auto-group'\n\nexport interface Props {\n modelValue: boolean\n samples?: string[]\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n samples: () => [],\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n 'apply': [result: AutoGroupResult]\n}>()\n\nconst autoGroup = useAutoGroup()\nconst wizardRef = ref<InstanceType<typeof StepWizard> | null>(null)\nconst currentStep = ref(0)\nconst isDragOver = ref(false)\nconst csvFileName = ref('')\n\n// Pre-fill from props\nwatch(() => props.modelValue, (open) => {\n if (open) {\n autoGroup.reset()\n currentStep.value = 0\n csvFileName.value = ''\n if (props.samples.length > 0) {\n autoGroup.rawText.value = props.samples.join('\\n')\n }\n }\n}, { immediate: true })\n\n// Dynamic steps: skip outlier step when no outliers\nconst allSteps: WizardStep[] = [\n { id: 'input', label: 'Input' },\n { id: 'outliers', label: 'Outliers' },\n { id: 'fields', label: 'Fields' },\n { id: 'preview', label: 'Preview' },\n]\n\nconst dynamicSteps = computed<WizardStep[]>(() => {\n if (autoGroup.hasOutliers.value) {\n return allSteps\n }\n return allSteps.filter(s => s.id !== 'outliers')\n})\n\n// Map current step index to step ID\nconst currentStepId = computed(() => {\n const step = dynamicSteps.value[currentStep.value]\n return step?.id ?? 'input'\n})\n\n// Clamp step when dynamic steps change\nwatch(() => dynamicSteps.value.length, (newLen) => {\n if (currentStep.value >= newLen) {\n currentStep.value = newLen - 1\n }\n})\n\n// Step validity\nconst inputValid = computed(() => autoGroup.samples.value.length > 0)\nconst fieldsValid = computed(() => autoGroup.enabledFields.value.size > 0)\n\nwatch([inputValid, fieldsValid, dynamicSteps], () => {\n if (!wizardRef.value) return\n const steps = dynamicSteps.value\n for (let i = 0; i < steps.length; i++) {\n const id = steps[i].id\n if (id === 'input') wizardRef.value.setStepValid(i, inputValid.value)\n else if (id === 'outliers') wizardRef.value.setStepValid(i, true)\n else if (id === 'fields') wizardRef.value.setStepValid(i, fieldsValid.value)\n else if (id === 'preview') wizardRef.value.setStepValid(i, true)\n }\n}, { immediate: true })\n\n// Navigation\nfunction handleNext() {\n if (currentStepId.value === 'input') {\n autoGroup.parseInput()\n }\n // StepWizard handles the actual navigation via v-model\n}\n\nfunction handleApply() {\n emit('apply', autoGroup.result.value)\n emit('update:modelValue', false)\n}\n\nfunction handleCancel() {\n emit('update:modelValue', false)\n}\n\n// CSV file handling\nfunction handleFileDrop(event: DragEvent) {\n event.preventDefault()\n isDragOver.value = false\n const files = event.dataTransfer?.files\n if (files && files.length > 0) {\n processFile(files[0])\n }\n}\n\nfunction handleFileInput(event: Event) {\n const target = event.target as HTMLInputElement\n if (target.files && target.files.length > 0) {\n processFile(target.files[0])\n }\n}\n\nasync function processFile(file: File) {\n if (!file.name.endsWith('.csv') && !file.name.endsWith('.tsv')) return\n\n try {\n const text = await file.text()\n const parsed = parseCSV(text)\n autoGroup.inputMode.value = 'csv'\n autoGroup.csvData.value = parsed\n csvFileName.value = file.name\n } catch {\n // CSV parse error — stay in current state\n }\n}\n\nfunction clearCsvFile() {\n autoGroup.csvData.value = null\n autoGroup.inputMode.value = 'paste'\n csvFileName.value = ''\n}\n\n// Last step check\nconst isLastStep = computed(() => currentStep.value === dynamicSteps.value.length - 1)\nconst isFirstStep = computed(() => currentStep.value === 0)\n</script>\n\n<template>\n <BaseModal\n :model-value=\"modelValue\"\n title=\"Smart Group\"\n size=\"lg\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @close=\"handleCancel\"\n >\n <div class=\"mld-auto-group\">\n <StepWizard\n ref=\"wizardRef\"\n v-model=\"currentStep\"\n :steps=\"dynamicSteps\"\n :linear=\"true\"\n size=\"sm\"\n >\n <!-- Step: Input -->\n <template #step-input>\n <div class=\"mld-auto-group__input-step\">\n <!-- Mode toggle -->\n <div class=\"mld-auto-group__mode-toggle\">\n <BaseButton\n :variant=\"autoGroup.inputMode.value === 'paste' ? 'primary' : 'secondary'\"\n size=\"sm\"\n @click=\"autoGroup.inputMode.value = 'paste'\"\n >\n Paste\n </BaseButton>\n <BaseButton\n :variant=\"autoGroup.inputMode.value === 'csv' ? 'primary' : 'secondary'\"\n size=\"sm\"\n @click=\"autoGroup.inputMode.value = 'csv'\"\n >\n CSV\n </BaseButton>\n </div>\n\n <!-- Paste mode -->\n <div v-if=\"autoGroup.inputMode.value === 'paste'\" class=\"mld-auto-group__paste\">\n <textarea\n v-model=\"autoGroup.rawText.value\"\n class=\"mld-auto-group__textarea\"\n rows=\"12\"\n placeholder=\"Paste sample names, one per line...\"\n />\n <div v-if=\"autoGroup.samples.value.length > 0\" class=\"mld-auto-group__sample-count\">\n {{ autoGroup.samples.value.length }} samples\n </div>\n </div>\n\n <!-- CSV mode -->\n <div v-if=\"autoGroup.inputMode.value === 'csv'\" class=\"mld-auto-group__csv\">\n <div v-if=\"!autoGroup.csvData.value\"\n :class=\"[\n 'mld-auto-group__dropzone',\n isDragOver ? 'mld-auto-group__dropzone--dragover' : '',\n ]\"\n @drop=\"handleFileDrop\"\n @dragover.prevent=\"isDragOver = true\"\n @dragleave=\"isDragOver = false\"\n >\n <input\n type=\"file\"\n accept=\".csv,.tsv\"\n class=\"mld-auto-group__file-input\"\n @change=\"handleFileInput\"\n />\n <svg class=\"mld-auto-group__upload-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n <p class=\"mld-auto-group__upload-text\">\n <span class=\"mld-auto-group__upload-highlight\">Click to upload</span>\n or drag and drop a CSV file\n </p>\n </div>\n\n <div v-else class=\"mld-auto-group__file-info\">\n <svg class=\"mld-auto-group__file-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 class=\"mld-auto-group__file-name\">{{ csvFileName }}</span>\n <span class=\"mld-auto-group__file-rows\">{{ autoGroup.csvData.value.rows.length }} rows</span>\n <button type=\"button\" class=\"mld-auto-group__file-clear\" @click=\"clearCsvFile\">\n Change file\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Step: Outliers -->\n <template #step-outliers>\n <div class=\"mld-auto-group__outlier-step\">\n <div class=\"mld-auto-group__outlier-banner\">\n {{ autoGroup.outliers.value.length }} of {{ autoGroup.samples.value.length }}\n samples have irregular structure\n (fewer than {{ autoGroup.dominantFieldCount.value }} fields, delimiter\n <code>{{ autoGroup.delimiter.value }}</code>)\n </div>\n\n <div class=\"mld-auto-group__outlier-batch\">\n <BaseButton size=\"sm\" variant=\"secondary\" @click=\"autoGroup.setAllOutlierActions('include')\">\n Include All\n </BaseButton>\n <BaseButton size=\"sm\" variant=\"secondary\" @click=\"autoGroup.setAllOutlierActions('exclude')\">\n Exclude All\n </BaseButton>\n </div>\n\n <div class=\"mld-auto-group__outlier-list\">\n <div\n v-for=\"outlier in autoGroup.outliers.value\"\n :key=\"outlier.index\"\n class=\"mld-auto-group__outlier-item\"\n >\n <div class=\"mld-auto-group__outlier-info\">\n <code class=\"mld-auto-group__outlier-name\">{{ outlier.sample }}</code>\n <span class=\"mld-auto-group__outlier-badge\">{{ outlier.fieldCount }} fields</span>\n </div>\n <div class=\"mld-auto-group__outlier-actions\">\n <button\n type=\"button\"\n :class=\"['mld-auto-group__action-btn', outlier.action === 'include' ? 'mld-auto-group__action-btn--active' : '']\"\n @click=\"autoGroup.setOutlierAction(outlier.index, 'include')\"\n >Include</button>\n <button\n type=\"button\"\n :class=\"['mld-auto-group__action-btn', outlier.action === 'exclude' ? 'mld-auto-group__action-btn--active mld-auto-group__action-btn--exclude' : '']\"\n @click=\"autoGroup.setOutlierAction(outlier.index, 'exclude')\"\n >Exclude</button>\n <button\n type=\"button\"\n :class=\"['mld-auto-group__action-btn', outlier.action === 'qc' ? 'mld-auto-group__action-btn--active mld-auto-group__action-btn--qc' : '']\"\n @click=\"autoGroup.setOutlierAction(outlier.index, 'qc')\"\n >QC</button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Step: Fields -->\n <template #step-fields>\n <div class=\"mld-auto-group__field-step\">\n <div class=\"mld-auto-group__field-grid\">\n <div\n v-for=\"col in autoGroup.effectiveColumns.value\"\n :key=\"col.index\"\n :class=\"[\n 'mld-auto-group__field-card',\n autoGroup.enabledFields.value.has(col.index) ? 'mld-auto-group__field-card--enabled' : '',\n ]\"\n >\n <div class=\"mld-auto-group__field-header\">\n <label class=\"mld-auto-group__field-toggle\">\n <input\n type=\"checkbox\"\n :checked=\"autoGroup.enabledFields.value.has(col.index)\"\n @change=\"autoGroup.toggleField(col.index)\"\n />\n <span class=\"mld-auto-group__field-toggle-label\">Group by</span>\n </label>\n <span class=\"mld-auto-group__field-cardinality\">{{ col.cardinality }} unique</span>\n </div>\n\n <BaseInput\n :model-value=\"col.name\"\n placeholder=\"Field name...\"\n class=\"mld-auto-group__field-name-input\"\n @update:model-value=\"autoGroup.renameField(col.index, String($event ?? ''))\"\n />\n\n <div class=\"mld-auto-group__field-values\">\n <span\n v-for=\"val in col.uniqueValues.slice(0, 5)\"\n :key=\"val\"\n class=\"mld-auto-group__field-value\"\n >{{ val }}</span>\n <span\n v-if=\"col.uniqueValues.length > 5\"\n class=\"mld-auto-group__field-more\"\n >+{{ col.uniqueValues.length - 5 }} more</span>\n </div>\n </div>\n </div>\n\n <div v-if=\"autoGroup.enabledFields.value.size > 0\" class=\"mld-auto-group__field-summary\">\n Grouping by:\n <strong>{{\n autoGroup.effectiveColumns.value\n .filter(c => autoGroup.enabledFields.value.has(c.index))\n .map(c => c.name)\n .join(' / ')\n }}</strong>\n </div>\n\n <div v-if=\"autoGroup.enabledFields.value.size === 0\" class=\"mld-auto-group__field-warning\">\n Select at least one field for grouping\n </div>\n </div>\n </template>\n\n <!-- Step: Preview -->\n <template #step-preview>\n <div class=\"mld-auto-group__preview-step\">\n <div class=\"mld-auto-group__preview-summary\">\n <span class=\"mld-auto-group__preview-stat\">\n <strong>{{ autoGroup.groups.value.length }}</strong> groups\n </span>\n <span class=\"mld-auto-group__preview-stat\">\n <strong>{{ autoGroup.groups.value.reduce((sum, g) => sum + g.samples.length, 0) }}</strong> samples\n </span>\n <span v-if=\"autoGroup.excludedSamples.value.length > 0\" class=\"mld-auto-group__preview-stat mld-auto-group__preview-stat--excluded\">\n <strong>{{ autoGroup.excludedSamples.value.length }}</strong> excluded\n </span>\n </div>\n\n <div class=\"mld-auto-group__preview-groups\">\n <details\n v-for=\"group in autoGroup.groups.value\"\n :key=\"group.name\"\n class=\"mld-auto-group__preview-group\"\n >\n <summary class=\"mld-auto-group__preview-group-header\">\n <span\n class=\"mld-auto-group__preview-dot\"\n :style=\"{ backgroundColor: group.color }\"\n />\n <span class=\"mld-auto-group__preview-group-name\">{{ group.name }}</span>\n <span\n class=\"mld-auto-group__preview-group-count\"\n :style=\"{ backgroundColor: group.color + '20', color: group.color }\"\n >{{ group.samples.length }}</span>\n </summary>\n <div class=\"mld-auto-group__preview-samples\">\n <span\n v-for=\"sample in group.samples\"\n :key=\"sample\"\n class=\"mld-auto-group__preview-sample\"\n >{{ sample }}</span>\n </div>\n </details>\n </div>\n\n <div v-if=\"autoGroup.excludedSamples.value.length > 0\" class=\"mld-auto-group__preview-excluded\">\n <div class=\"mld-auto-group__preview-excluded-title\">Excluded Samples</div>\n <div class=\"mld-auto-group__preview-excluded-list\">\n <span\n v-for=\"sample in autoGroup.excludedSamples.value\"\n :key=\"sample\"\n class=\"mld-auto-group__preview-sample mld-auto-group__preview-sample--excluded\"\n >{{ sample }}</span>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Custom navigation -->\n <template #navigation=\"{ goBack, goNext, canProceed }\">\n <div class=\"mld-auto-group__nav\">\n <BaseButton variant=\"secondary\" @click=\"handleCancel\">\n Cancel\n </BaseButton>\n <div style=\"flex: 1\" />\n <BaseButton\n v-if=\"!isFirstStep\"\n variant=\"secondary\"\n @click=\"goBack\"\n >\n Back\n </BaseButton>\n <BaseButton\n v-if=\"!isLastStep\"\n variant=\"primary\"\n :disabled=\"!canProceed\"\n @click=\"() => { handleNext(); goNext() }\"\n >\n Next\n </BaseButton>\n <BaseButton\n v-if=\"isLastStep\"\n variant=\"primary\"\n @click=\"handleApply\"\n >\n Apply\n </BaseButton>\n </div>\n </template>\n </StepWizard>\n </div>\n </BaseModal>\n</template>\n\n<style>\n@import '../styles/components/auto-group-modal.css';\n</style>\n"],"names":["_createBlock","BaseModal","_createElementVNode","_createVNode","StepWizard","BaseButton","_unref","_openBlock","_createElementBlock","_toDisplayString","_normalizeClass","_Fragment","BaseInput","_normalizeStyle","_renderList"],"mappings":"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"}
@@ -146,7 +146,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
146
146
  }
147
147
  function handlePageChange(page) {
148
148
  if (!props.pagination) return;
149
- emit("update:pagination", { ...props.pagination, page, total: sortedData.value.length });
149
+ emit("update:pagination", { ...props.pagination, page });
150
150
  }
151
151
  function isColumnSortable(col) {
152
152
  return col.sortable === true || props.sortable && col.sortable !== false;
@@ -1 +1 @@
1
- {"version":3,"file":"DataFrame.vue.js","sources":["../../src/components/DataFrame.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport type { DataFrameColumn, SortState, PaginationState } from '../types'\n\n/**\n * DataFrame - Data table with sorting, searching, pagination, and row selection.\n *\n * @example\n * ```vue\n * <DataFrame\n * :data=\"rows\"\n * :columns=\"[\n * { key: 'name', label: 'Name', sortable: true },\n * { key: 'age', label: 'Age', align: 'right' }\n * ]\"\n * sortable\n * searchable\n * :pagination=\"{ page: 1, pageSize: 10, total: 100 }\"\n * />\n * ```\n */\ninterface Props {\n /** Array of data objects */\n data: Record<string, unknown>[]\n /** Column definitions */\n columns: DataFrameColumn[]\n /** Unique key for each row (property name or function) */\n rowKey?: string | ((row: Record<string, unknown>) => string | number)\n /** Alternate row background colors */\n striped?: boolean\n /** Show table borders */\n bordered?: boolean\n /** Table size */\n size?: 'sm' | 'md' | 'lg'\n /** Make header sticky on scroll */\n stickyHeader?: boolean\n /** Maximum table height (enables vertical scroll) */\n maxHeight?: string | number\n /** Show loading overlay */\n loading?: boolean\n /** Empty state message */\n emptyText?: string\n /** Enable column sorting */\n sortable?: boolean\n /** Current sort state (controlled mode) */\n sort?: SortState | null\n /** Pagination state or false to disable */\n pagination?: PaginationState | false\n /** Enable search input */\n searchable?: boolean\n /** Search input placeholder */\n searchPlaceholder?: string\n /** Column keys to search (defaults to all) */\n searchKeys?: string[]\n /** Enable row selection with checkboxes */\n selectable?: boolean\n /** Currently selected row keys */\n selectedKeys?: (string | number)[]\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n striped: true,\n bordered: true,\n size: 'md',\n stickyHeader: false,\n loading: false,\n emptyText: 'No data',\n sortable: false,\n pagination: false,\n searchable: false,\n searchPlaceholder: 'Search...',\n selectable: false,\n selectedKeys: () => [],\n})\n\n/**\n * @event update:sort - Emitted when sort state changes\n * @event update:pagination - Emitted when page changes\n * @event update:selectedKeys - Emitted when row selection changes\n * @event row-click - Emitted when a row is clicked\n * @event cell-click - Emitted when a cell is clicked\n */\nconst emit = defineEmits<{\n 'update:sort': [sort: SortState | null]\n 'update:pagination': [pagination: PaginationState]\n 'update:selectedKeys': [keys: (string | number)[]]\n 'row-click': [row: Record<string, unknown>, index: number]\n 'cell-click': [value: unknown, column: DataFrameColumn, row: Record<string, unknown>]\n}>()\n\nconst searchQuery = ref('')\nconst internalSort = ref<SortState | null>(null)\n\nconst activeSort = computed(() => props.sort !== undefined ? props.sort : internalSort.value)\n\nfunction getRowKey(row: Record<string, unknown>, index: number): string | number {\n if (!props.rowKey) return index\n if (typeof props.rowKey === 'function') return props.rowKey(row)\n return row[props.rowKey] as string | number\n}\n\nfunction getCellValue(row: Record<string, unknown>, key: string): unknown {\n return key.split('.').reduce((obj: unknown, k) => {\n if (obj && typeof obj === 'object') return (obj as Record<string, unknown>)[k]\n return undefined\n }, row)\n}\n\nfunction formatCell(col: DataFrameColumn, row: Record<string, unknown>, index: number): string {\n const value = getCellValue(row, col.key)\n if (col.formatter) return col.formatter(value, row, index)\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\n// Filtering\nconst filteredData = computed(() => {\n if (!props.searchable || !searchQuery.value.trim()) return props.data\n const query = searchQuery.value.toLowerCase()\n const keys = props.searchKeys ?? props.columns.map(c => c.key)\n return props.data.filter(row =>\n keys.some(key => {\n const val = getCellValue(row, key)\n return val !== null && val !== undefined && String(val).toLowerCase().includes(query)\n })\n )\n})\n\n// Sorting\nconst sortedData = computed(() => {\n const sort = activeSort.value\n if (!sort || !sort.direction) return filteredData.value\n\n const col = props.columns.find(c => c.key === sort.key)\n if (!col) return filteredData.value\n\n return [...filteredData.value].sort((a, b) => {\n const aVal = getCellValue(a, sort.key)\n const bVal = getCellValue(b, sort.key)\n\n if (aVal === null || aVal === undefined) return 1\n if (bVal === null || bVal === undefined) return -1\n\n let cmp = 0\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal\n } else {\n cmp = String(aVal).localeCompare(String(bVal))\n }\n return sort.direction === 'asc' ? cmp : -cmp\n })\n})\n\n// Pagination\nconst paginatedData = computed(() => {\n if (!props.pagination) return sortedData.value\n const { page, pageSize } = props.pagination\n const start = (page - 1) * pageSize\n return sortedData.value.slice(start, start + pageSize)\n})\n\nconst totalPages = computed(() => {\n if (!props.pagination) return 1\n return Math.max(1, Math.ceil(sortedData.value.length / props.pagination.pageSize))\n})\n\nfunction handleSort(col: DataFrameColumn) {\n if (!col.sortable && !props.sortable) return\n\n const current = activeSort.value\n let next: SortState | null\n\n if (current?.key === col.key) {\n if (current.direction === 'asc') {\n next = { key: col.key, direction: 'desc' }\n } else if (current.direction === 'desc') {\n next = null\n } else {\n next = { key: col.key, direction: 'asc' }\n }\n } else {\n next = { key: col.key, direction: 'asc' }\n }\n\n if (props.sort === undefined) {\n internalSort.value = next\n }\n emit('update:sort', next)\n}\n\nfunction handlePageChange(page: number) {\n if (!props.pagination) return\n emit('update:pagination', { ...props.pagination, page, total: sortedData.value.length })\n}\n\nfunction isColumnSortable(col: DataFrameColumn): boolean {\n return col.sortable === true || (props.sortable && col.sortable !== false)\n}\n\n// Selection\nconst allSelected = computed(() => {\n if (!props.selectable || paginatedData.value.length === 0) return false\n return paginatedData.value.every((row, i) =>\n props.selectedKeys.includes(getRowKey(row, i))\n )\n})\n\nconst selectIndeterminate = computed(() => {\n return props.selectedKeys.length > 0 && !allSelected.value\n})\n\nfunction toggleSelectAll() {\n if (allSelected.value) {\n emit('update:selectedKeys', [])\n } else {\n emit('update:selectedKeys', paginatedData.value.map((row, i) => getRowKey(row, i)))\n }\n}\n\nfunction toggleRowSelect(key: string | number) {\n const next = [...props.selectedKeys]\n const idx = next.indexOf(key)\n if (idx >= 0) {\n next.splice(idx, 1)\n } else {\n next.push(key)\n }\n emit('update:selectedKeys', next)\n}\n\nconst wrapperStyle = computed(() => {\n if (!props.maxHeight) return undefined\n const maxHeight = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight\n return { maxHeight, overflowY: 'auto' as const }\n})\n</script>\n\n<template>\n <div\n :class=\"[\n 'mld-dataframe',\n { 'mld-dataframe--bordered': bordered },\n ]\"\n >\n <!-- Search header -->\n <div v-if=\"searchable\" class=\"mld-dataframe__header\">\n <div class=\"mld-dataframe__search-wrapper\">\n <svg class=\"mld-dataframe__search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.34-4.34\" />\n </svg>\n <input\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"mld-dataframe__search\"\n :placeholder=\"searchPlaceholder\"\n />\n </div>\n </div>\n\n <!-- Table wrapper -->\n <div class=\"mld-dataframe__table-wrapper\" :style=\"wrapperStyle\">\n <table class=\"mld-dataframe__table\">\n <thead :class=\"['mld-dataframe__thead', { 'mld-dataframe__thead--sticky': stickyHeader }]\">\n <tr>\n <th v-if=\"selectable\" class=\"mld-dataframe__th mld-dataframe__th--checkbox\">\n <input\n type=\"checkbox\"\n :checked=\"allSelected\"\n :indeterminate=\"selectIndeterminate\"\n class=\"mld-dataframe__checkbox\"\n @change=\"toggleSelectAll\"\n />\n </th>\n <th\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"[\n 'mld-dataframe__th',\n `mld-dataframe__th--${size}`,\n `mld-dataframe__th--align-${col.align ?? 'left'}`,\n {\n 'mld-dataframe__th--sortable': isColumnSortable(col),\n 'mld-dataframe__th--sorted': activeSort?.key === col.key && activeSort?.direction,\n },\n ]\"\n :style=\"{\n width: col.width ? (typeof col.width === 'number' ? `${col.width}px` : col.width) : undefined,\n minWidth: col.minWidth ? (typeof col.minWidth === 'number' ? `${col.minWidth}px` : col.minWidth) : undefined,\n }\"\n @click=\"isColumnSortable(col) ? handleSort(col) : undefined\"\n >\n <slot :name=\"`header-${col.key}`\" :column=\"col\">\n <div class=\"mld-dataframe__th-content\">\n <span>{{ col.label }}</span>\n <svg\n v-if=\"isColumnSortable(col)\"\n :class=\"[\n 'mld-dataframe__sort-icon',\n {\n 'mld-dataframe__sort-icon--asc': activeSort?.key === col.key && activeSort?.direction === 'asc',\n 'mld-dataframe__sort-icon--desc': activeSort?.key === col.key && activeSort?.direction === 'desc',\n },\n ]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" /><path d=\"M17 20V4\" /><path d=\"m3 8 4-4 4 4\" /><path d=\"M7 4v16\" />\n </svg>\n </div>\n </slot>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr\n v-for=\"(row, rowIndex) in paginatedData\"\n :key=\"getRowKey(row, rowIndex)\"\n :class=\"[\n 'mld-dataframe__row',\n {\n 'mld-dataframe__row--striped': striped && rowIndex % 2 === 1,\n 'mld-dataframe__row--selected': selectedKeys.includes(getRowKey(row, rowIndex)),\n },\n ]\"\n @click=\"emit('row-click', row, rowIndex)\"\n >\n <td v-if=\"selectable\" class=\"mld-dataframe__td mld-dataframe__td--checkbox\">\n <input\n type=\"checkbox\"\n :checked=\"selectedKeys.includes(getRowKey(row, rowIndex))\"\n class=\"mld-dataframe__checkbox\"\n @click.stop\n @change=\"toggleRowSelect(getRowKey(row, rowIndex))\"\n />\n </td>\n <td\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"[\n 'mld-dataframe__td',\n `mld-dataframe__td--${size}`,\n `mld-dataframe__td--align-${col.align ?? 'left'}`,\n { 'mld-dataframe__td--ellipsis': col.ellipsis },\n ]\"\n @click.stop=\"emit('cell-click', getCellValue(row, col.key), col, row)\"\n >\n <slot :name=\"`cell-${col.key}`\" :value=\"getCellValue(row, col.key)\" :row=\"row\" :column=\"col\" :index=\"rowIndex\">\n {{ formatCell(col, row, rowIndex) }}\n </slot>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- Empty state -->\n <div v-if=\"paginatedData.length === 0 && !loading\" class=\"mld-dataframe__empty\">\n <slot name=\"empty\">\n <svg class=\"mld-dataframe__empty-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" /><path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n </svg>\n <p class=\"mld-dataframe__empty-text\">{{ emptyText }}</p>\n </slot>\n </div>\n\n <!-- Loading overlay -->\n <div v-if=\"loading\" class=\"mld-dataframe__loading\">\n <slot name=\"loading\">\n <svg class=\"mld-dataframe__loading-spinner\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" opacity=\"0.25\" />\n <path d=\"M12 2a10 10 0 0 1 10 10\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" />\n </svg>\n </slot>\n </div>\n </div>\n\n <!-- Footer / Pagination -->\n <div v-if=\"pagination\" class=\"mld-dataframe__footer\">\n <slot name=\"footer\">\n <span class=\"mld-dataframe__page-info\">\n {{ (pagination.page - 1) * pagination.pageSize + 1 }}&ndash;{{ Math.min(pagination.page * pagination.pageSize, sortedData.length) }}\n of {{ sortedData.length }}\n </span>\n <div class=\"mld-dataframe__page-controls\">\n <button\n type=\"button\"\n class=\"mld-dataframe__page-btn\"\n :disabled=\"pagination.page <= 1\"\n @click=\"handlePageChange(pagination.page - 1)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <span class=\"mld-dataframe__page-number\">{{ pagination.page }} / {{ totalPages }}</span>\n <button\n type=\"button\"\n class=\"mld-dataframe__page-btn\"\n :disabled=\"pagination.page >= totalPages\"\n @click=\"handlePageChange(pagination.page + 1)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n </slot>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/dataframe.css';\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_openBlock","_createElementVNode","_Fragment","_renderList","_normalizeStyle","_renderSlot","_toDisplayString","_a","_b","_withModifiers","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"DataFrame.vue.js","sources":["../../src/components/DataFrame.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport type { DataFrameColumn, SortState, PaginationState } from '../types'\n\n/**\n * DataFrame - Data table with sorting, searching, pagination, and row selection.\n *\n * @example\n * ```vue\n * <DataFrame\n * :data=\"rows\"\n * :columns=\"[\n * { key: 'name', label: 'Name', sortable: true },\n * { key: 'age', label: 'Age', align: 'right' }\n * ]\"\n * sortable\n * searchable\n * :pagination=\"{ page: 1, pageSize: 10, total: 100 }\"\n * />\n * ```\n */\ninterface Props {\n /** Array of data objects */\n data: Record<string, unknown>[]\n /** Column definitions */\n columns: DataFrameColumn[]\n /** Unique key for each row (property name or function) */\n rowKey?: string | ((row: Record<string, unknown>) => string | number)\n /** Alternate row background colors */\n striped?: boolean\n /** Show table borders */\n bordered?: boolean\n /** Table size */\n size?: 'sm' | 'md' | 'lg'\n /** Make header sticky on scroll */\n stickyHeader?: boolean\n /** Maximum table height (enables vertical scroll) */\n maxHeight?: string | number\n /** Show loading overlay */\n loading?: boolean\n /** Empty state message */\n emptyText?: string\n /** Enable column sorting */\n sortable?: boolean\n /** Current sort state (controlled mode) */\n sort?: SortState | null\n /** Pagination state or false to disable */\n pagination?: PaginationState | false\n /** Enable search input */\n searchable?: boolean\n /** Search input placeholder */\n searchPlaceholder?: string\n /** Column keys to search (defaults to all) */\n searchKeys?: string[]\n /** Enable row selection with checkboxes */\n selectable?: boolean\n /** Currently selected row keys */\n selectedKeys?: (string | number)[]\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n striped: true,\n bordered: true,\n size: 'md',\n stickyHeader: false,\n loading: false,\n emptyText: 'No data',\n sortable: false,\n pagination: false,\n searchable: false,\n searchPlaceholder: 'Search...',\n selectable: false,\n selectedKeys: () => [],\n})\n\n/**\n * @event update:sort - Emitted when sort state changes\n * @event update:pagination - Emitted when page changes\n * @event update:selectedKeys - Emitted when row selection changes\n * @event row-click - Emitted when a row is clicked\n * @event cell-click - Emitted when a cell is clicked\n */\nconst emit = defineEmits<{\n 'update:sort': [sort: SortState | null]\n 'update:pagination': [pagination: PaginationState]\n 'update:selectedKeys': [keys: (string | number)[]]\n 'row-click': [row: Record<string, unknown>, index: number]\n 'cell-click': [value: unknown, column: DataFrameColumn, row: Record<string, unknown>]\n}>()\n\nconst searchQuery = ref('')\nconst internalSort = ref<SortState | null>(null)\n\nconst activeSort = computed(() => props.sort !== undefined ? props.sort : internalSort.value)\n\nfunction getRowKey(row: Record<string, unknown>, index: number): string | number {\n if (!props.rowKey) return index\n if (typeof props.rowKey === 'function') return props.rowKey(row)\n return row[props.rowKey] as string | number\n}\n\nfunction getCellValue(row: Record<string, unknown>, key: string): unknown {\n return key.split('.').reduce((obj: unknown, k) => {\n if (obj && typeof obj === 'object') return (obj as Record<string, unknown>)[k]\n return undefined\n }, row)\n}\n\nfunction formatCell(col: DataFrameColumn, row: Record<string, unknown>, index: number): string {\n const value = getCellValue(row, col.key)\n if (col.formatter) return col.formatter(value, row, index)\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\n// Filtering\nconst filteredData = computed(() => {\n if (!props.searchable || !searchQuery.value.trim()) return props.data\n const query = searchQuery.value.toLowerCase()\n const keys = props.searchKeys ?? props.columns.map(c => c.key)\n return props.data.filter(row =>\n keys.some(key => {\n const val = getCellValue(row, key)\n return val !== null && val !== undefined && String(val).toLowerCase().includes(query)\n })\n )\n})\n\n// Sorting\nconst sortedData = computed(() => {\n const sort = activeSort.value\n if (!sort || !sort.direction) return filteredData.value\n\n const col = props.columns.find(c => c.key === sort.key)\n if (!col) return filteredData.value\n\n return [...filteredData.value].sort((a, b) => {\n const aVal = getCellValue(a, sort.key)\n const bVal = getCellValue(b, sort.key)\n\n if (aVal === null || aVal === undefined) return 1\n if (bVal === null || bVal === undefined) return -1\n\n let cmp = 0\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal\n } else {\n cmp = String(aVal).localeCompare(String(bVal))\n }\n return sort.direction === 'asc' ? cmp : -cmp\n })\n})\n\n// Pagination\nconst paginatedData = computed(() => {\n if (!props.pagination) return sortedData.value\n const { page, pageSize } = props.pagination\n const start = (page - 1) * pageSize\n return sortedData.value.slice(start, start + pageSize)\n})\n\nconst totalPages = computed(() => {\n if (!props.pagination) return 1\n return Math.max(1, Math.ceil(sortedData.value.length / props.pagination.pageSize))\n})\n\nfunction handleSort(col: DataFrameColumn) {\n if (!col.sortable && !props.sortable) return\n\n const current = activeSort.value\n let next: SortState | null\n\n if (current?.key === col.key) {\n if (current.direction === 'asc') {\n next = { key: col.key, direction: 'desc' }\n } else if (current.direction === 'desc') {\n next = null\n } else {\n next = { key: col.key, direction: 'asc' }\n }\n } else {\n next = { key: col.key, direction: 'asc' }\n }\n\n if (props.sort === undefined) {\n internalSort.value = next\n }\n emit('update:sort', next)\n}\n\nfunction handlePageChange(page: number) {\n if (!props.pagination) return\n emit('update:pagination', { ...props.pagination, page })\n}\n\nfunction isColumnSortable(col: DataFrameColumn): boolean {\n return col.sortable === true || (props.sortable && col.sortable !== false)\n}\n\n// Selection\nconst allSelected = computed(() => {\n if (!props.selectable || paginatedData.value.length === 0) return false\n return paginatedData.value.every((row, i) =>\n props.selectedKeys.includes(getRowKey(row, i))\n )\n})\n\nconst selectIndeterminate = computed(() => {\n return props.selectedKeys.length > 0 && !allSelected.value\n})\n\nfunction toggleSelectAll() {\n if (allSelected.value) {\n emit('update:selectedKeys', [])\n } else {\n emit('update:selectedKeys', paginatedData.value.map((row, i) => getRowKey(row, i)))\n }\n}\n\nfunction toggleRowSelect(key: string | number) {\n const next = [...props.selectedKeys]\n const idx = next.indexOf(key)\n if (idx >= 0) {\n next.splice(idx, 1)\n } else {\n next.push(key)\n }\n emit('update:selectedKeys', next)\n}\n\nconst wrapperStyle = computed(() => {\n if (!props.maxHeight) return undefined\n const maxHeight = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight\n return { maxHeight, overflowY: 'auto' as const }\n})\n</script>\n\n<template>\n <div\n :class=\"[\n 'mld-dataframe',\n { 'mld-dataframe--bordered': bordered },\n ]\"\n >\n <!-- Search header -->\n <div v-if=\"searchable\" class=\"mld-dataframe__header\">\n <div class=\"mld-dataframe__search-wrapper\">\n <svg class=\"mld-dataframe__search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"m21 21-4.34-4.34\" />\n </svg>\n <input\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"mld-dataframe__search\"\n :placeholder=\"searchPlaceholder\"\n />\n </div>\n </div>\n\n <!-- Table wrapper -->\n <div class=\"mld-dataframe__table-wrapper\" :style=\"wrapperStyle\">\n <table class=\"mld-dataframe__table\">\n <thead :class=\"['mld-dataframe__thead', { 'mld-dataframe__thead--sticky': stickyHeader }]\">\n <tr>\n <th v-if=\"selectable\" class=\"mld-dataframe__th mld-dataframe__th--checkbox\">\n <input\n type=\"checkbox\"\n :checked=\"allSelected\"\n :indeterminate=\"selectIndeterminate\"\n class=\"mld-dataframe__checkbox\"\n @change=\"toggleSelectAll\"\n />\n </th>\n <th\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"[\n 'mld-dataframe__th',\n `mld-dataframe__th--${size}`,\n `mld-dataframe__th--align-${col.align ?? 'left'}`,\n {\n 'mld-dataframe__th--sortable': isColumnSortable(col),\n 'mld-dataframe__th--sorted': activeSort?.key === col.key && activeSort?.direction,\n },\n ]\"\n :style=\"{\n width: col.width ? (typeof col.width === 'number' ? `${col.width}px` : col.width) : undefined,\n minWidth: col.minWidth ? (typeof col.minWidth === 'number' ? `${col.minWidth}px` : col.minWidth) : undefined,\n }\"\n @click=\"isColumnSortable(col) ? handleSort(col) : undefined\"\n >\n <slot :name=\"`header-${col.key}`\" :column=\"col\">\n <div class=\"mld-dataframe__th-content\">\n <span>{{ col.label }}</span>\n <svg\n v-if=\"isColumnSortable(col)\"\n :class=\"[\n 'mld-dataframe__sort-icon',\n {\n 'mld-dataframe__sort-icon--asc': activeSort?.key === col.key && activeSort?.direction === 'asc',\n 'mld-dataframe__sort-icon--desc': activeSort?.key === col.key && activeSort?.direction === 'desc',\n },\n ]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" /><path d=\"M17 20V4\" /><path d=\"m3 8 4-4 4 4\" /><path d=\"M7 4v16\" />\n </svg>\n </div>\n </slot>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr\n v-for=\"(row, rowIndex) in paginatedData\"\n :key=\"getRowKey(row, rowIndex)\"\n :class=\"[\n 'mld-dataframe__row',\n {\n 'mld-dataframe__row--striped': striped && rowIndex % 2 === 1,\n 'mld-dataframe__row--selected': selectedKeys.includes(getRowKey(row, rowIndex)),\n },\n ]\"\n @click=\"emit('row-click', row, rowIndex)\"\n >\n <td v-if=\"selectable\" class=\"mld-dataframe__td mld-dataframe__td--checkbox\">\n <input\n type=\"checkbox\"\n :checked=\"selectedKeys.includes(getRowKey(row, rowIndex))\"\n class=\"mld-dataframe__checkbox\"\n @click.stop\n @change=\"toggleRowSelect(getRowKey(row, rowIndex))\"\n />\n </td>\n <td\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"[\n 'mld-dataframe__td',\n `mld-dataframe__td--${size}`,\n `mld-dataframe__td--align-${col.align ?? 'left'}`,\n { 'mld-dataframe__td--ellipsis': col.ellipsis },\n ]\"\n @click.stop=\"emit('cell-click', getCellValue(row, col.key), col, row)\"\n >\n <slot :name=\"`cell-${col.key}`\" :value=\"getCellValue(row, col.key)\" :row=\"row\" :column=\"col\" :index=\"rowIndex\">\n {{ formatCell(col, row, rowIndex) }}\n </slot>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- Empty state -->\n <div v-if=\"paginatedData.length === 0 && !loading\" class=\"mld-dataframe__empty\">\n <slot name=\"empty\">\n <svg class=\"mld-dataframe__empty-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" /><path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n </svg>\n <p class=\"mld-dataframe__empty-text\">{{ emptyText }}</p>\n </slot>\n </div>\n\n <!-- Loading overlay -->\n <div v-if=\"loading\" class=\"mld-dataframe__loading\">\n <slot name=\"loading\">\n <svg class=\"mld-dataframe__loading-spinner\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" opacity=\"0.25\" />\n <path d=\"M12 2a10 10 0 0 1 10 10\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" />\n </svg>\n </slot>\n </div>\n </div>\n\n <!-- Footer / Pagination -->\n <div v-if=\"pagination\" class=\"mld-dataframe__footer\">\n <slot name=\"footer\">\n <span class=\"mld-dataframe__page-info\">\n {{ (pagination.page - 1) * pagination.pageSize + 1 }}&ndash;{{ Math.min(pagination.page * pagination.pageSize, sortedData.length) }}\n of {{ sortedData.length }}\n </span>\n <div class=\"mld-dataframe__page-controls\">\n <button\n type=\"button\"\n class=\"mld-dataframe__page-btn\"\n :disabled=\"pagination.page <= 1\"\n @click=\"handlePageChange(pagination.page - 1)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <span class=\"mld-dataframe__page-number\">{{ pagination.page }} / {{ totalPages }}</span>\n <button\n type=\"button\"\n class=\"mld-dataframe__page-btn\"\n :disabled=\"pagination.page >= totalPages\"\n @click=\"handlePageChange(pagination.page + 1)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n </slot>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/dataframe.css';\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_openBlock","_createElementVNode","_Fragment","_renderList","_normalizeStyle","_renderSlot","_toDisplayString","_a","_b","_withModifiers","_createTextVNode"],"mappings":"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"}
@@ -5,6 +5,7 @@ interface Props {
5
5
  saveDisabled?: boolean;
6
6
  saveLoading?: boolean;
7
7
  saveSuccessMessage?: string;
8
+ saveDisabledMessage?: string;
8
9
  }
9
10
  declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
10
11
  select: () => any;
@@ -4,33 +4,47 @@ const _hoisted_2 = {
4
4
  key: 0,
5
5
  class: "mld-experiment-popover__panel"
6
6
  };
7
- const _hoisted_3 = {
7
+ const _hoisted_3 = { class: "mld-experiment-popover__header" };
8
+ const _hoisted_4 = { class: "mld-experiment-popover__subtitle" };
9
+ const _hoisted_5 = {
8
10
  key: 0,
9
- class: "mld-experiment-popover__empty"
11
+ class: "mld-experiment-popover__body"
10
12
  };
11
- const _hoisted_4 = {
13
+ const _hoisted_6 = {
12
14
  key: 1,
13
- class: "mld-experiment-popover__card"
15
+ class: "mld-experiment-popover__body"
14
16
  };
15
- const _hoisted_5 = { class: "mld-experiment-popover__card-info" };
16
- const _hoisted_6 = { class: "mld-experiment-popover__card-name" };
17
- const _hoisted_7 = {
17
+ const _hoisted_7 = { class: "mld-experiment-popover__card" };
18
+ const _hoisted_8 = { class: "mld-experiment-popover__card-info" };
19
+ const _hoisted_9 = { class: "mld-experiment-popover__card-name" };
20
+ const _hoisted_10 = {
18
21
  key: 0,
19
22
  class: "mld-experiment-popover__card-status"
20
23
  };
21
- const _hoisted_8 = { class: "mld-experiment-popover__footer" };
22
- const _hoisted_9 = ["disabled"];
23
- const _hoisted_10 = {
24
+ const _hoisted_11 = { class: "mld-experiment-popover__footer" };
25
+ const _hoisted_12 = ["disabled"];
26
+ const _hoisted_13 = {
24
27
  key: 0,
25
28
  class: "mld-experiment-popover__spinner"
26
29
  };
27
- const _hoisted_11 = {
30
+ const _hoisted_14 = {
28
31
  key: 1,
29
32
  class: "mld-experiment-popover__check-icon",
30
33
  fill: "none",
31
34
  stroke: "currentColor",
32
35
  viewBox: "0 0 24 24"
33
36
  };
37
+ const _hoisted_15 = {
38
+ key: 2,
39
+ class: "mld-experiment-popover__save-icon",
40
+ fill: "none",
41
+ stroke: "currentColor",
42
+ viewBox: "0 0 24 24"
43
+ };
44
+ const _hoisted_16 = {
45
+ key: 0,
46
+ class: "mld-experiment-popover__save-hint"
47
+ };
34
48
  const _sfc_main = /* @__PURE__ */ defineComponent({
35
49
  __name: "ExperimentPopover",
36
50
  props: {
@@ -39,7 +53,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
39
53
  showSave: { type: Boolean, default: false },
40
54
  saveDisabled: { type: Boolean, default: false },
41
55
  saveLoading: { type: Boolean, default: false },
42
- saveSuccessMessage: {}
56
+ saveSuccessMessage: {},
57
+ saveDisabledMessage: {}
43
58
  },
44
59
  emits: ["select", "save"],
45
60
  setup(__props, { emit: __emit }) {
@@ -126,15 +141,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
126
141
  ], -1))
127
142
  ], 2),
128
143
  isOpen.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
129
- _cache[6] || (_cache[6] = createElementVNode("div", { class: "mld-experiment-popover__header" }, [
130
- createElementVNode("div", { class: "mld-experiment-popover__title" }, "Experiment")
131
- ], -1)),
132
- !__props.experimentName ? (openBlock(), createElementBlock("div", _hoisted_3, [
144
+ createElementVNode("div", _hoisted_3, [
145
+ _cache[2] || (_cache[2] = createElementVNode("div", { class: "mld-experiment-popover__title" }, "Experiment", -1)),
146
+ createElementVNode("div", _hoisted_4, toDisplayString(__props.experimentName ? "Linked experiment context" : "Link to an MLD experiment"), 1)
147
+ ]),
148
+ !__props.experimentName ? (openBlock(), createElementBlock("div", _hoisted_5, [
133
149
  createElementVNode("button", {
134
150
  type: "button",
135
151
  class: "mld-experiment-popover__select-btn",
136
152
  onClick: handleSelect
137
- }, [..._cache[2] || (_cache[2] = [
153
+ }, [..._cache[3] || (_cache[3] = [
138
154
  createElementVNode("svg", {
139
155
  width: "14",
140
156
  height: "14",
@@ -151,34 +167,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
151
167
  ], -1),
152
168
  createTextVNode(" Select Experiment ", -1)
153
169
  ])])
154
- ])) : (openBlock(), createElementBlock("div", _hoisted_4, [
155
- _cache[3] || (_cache[3] = createElementVNode("div", { class: "mld-experiment-popover__card-icon" }, [
156
- createElementVNode("svg", {
157
- fill: "none",
158
- stroke: "currentColor",
159
- viewBox: "0 0 24 24"
160
- }, [
161
- createElementVNode("path", {
162
- "stroke-linecap": "round",
163
- "stroke-linejoin": "round",
164
- "stroke-width": "1.75",
165
- 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"
166
- })
167
- ])
168
- ], -1)),
169
- createElementVNode("div", _hoisted_5, [
170
- createElementVNode("div", _hoisted_6, toDisplayString(__props.experimentName), 1),
171
- __props.experimentStatus ? (openBlock(), createElementBlock("div", _hoisted_7, toDisplayString(formatStatus(__props.experimentStatus)), 1)) : createCommentVNode("", true)
172
- ]),
173
- createElementVNode("button", {
174
- type: "button",
175
- class: "mld-experiment-popover__change-btn",
176
- onClick: handleSelect
177
- }, " Change ")
170
+ ])) : (openBlock(), createElementBlock("div", _hoisted_6, [
171
+ createElementVNode("div", _hoisted_7, [
172
+ _cache[4] || (_cache[4] = createElementVNode("div", { class: "mld-experiment-popover__card-icon" }, [
173
+ createElementVNode("svg", {
174
+ fill: "none",
175
+ stroke: "currentColor",
176
+ viewBox: "0 0 24 24"
177
+ }, [
178
+ createElementVNode("path", {
179
+ "stroke-linecap": "round",
180
+ "stroke-linejoin": "round",
181
+ "stroke-width": "1.75",
182
+ 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"
183
+ })
184
+ ])
185
+ ], -1)),
186
+ createElementVNode("div", _hoisted_8, [
187
+ createElementVNode("div", _hoisted_9, toDisplayString(__props.experimentName), 1),
188
+ __props.experimentStatus ? (openBlock(), createElementBlock("div", _hoisted_10, toDisplayString(formatStatus(__props.experimentStatus)), 1)) : createCommentVNode("", true)
189
+ ]),
190
+ createElementVNode("button", {
191
+ type: "button",
192
+ class: "mld-experiment-popover__change-btn",
193
+ onClick: handleSelect
194
+ }, " Change ")
195
+ ])
178
196
  ])),
179
197
  __props.showSave ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [
180
- _cache[5] || (_cache[5] = createElementVNode("div", { class: "mld-experiment-popover__divider" }, null, -1)),
181
- createElementVNode("div", _hoisted_8, [
198
+ _cache[7] || (_cache[7] = createElementVNode("div", { class: "mld-experiment-popover__divider" }, null, -1)),
199
+ createElementVNode("div", _hoisted_11, [
182
200
  createElementVNode("button", {
183
201
  type: "button",
184
202
  class: normalizeClass([
@@ -189,16 +207,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
189
207
  disabled: __props.saveDisabled && !showSuccess.value,
190
208
  onClick: handleSave
191
209
  }, [
192
- __props.saveLoading ? (openBlock(), createElementBlock("span", _hoisted_10)) : showSuccess.value ? (openBlock(), createElementBlock("svg", _hoisted_11, [..._cache[4] || (_cache[4] = [
210
+ __props.saveLoading ? (openBlock(), createElementBlock("span", _hoisted_13)) : showSuccess.value ? (openBlock(), createElementBlock("svg", _hoisted_14, [..._cache[5] || (_cache[5] = [
193
211
  createElementVNode("path", {
194
212
  "stroke-linecap": "round",
195
213
  "stroke-linejoin": "round",
196
214
  "stroke-width": "2",
197
215
  d: "M5 13l4 4L19 7"
198
216
  }, null, -1)
199
- ])])) : createCommentVNode("", true),
217
+ ])])) : (openBlock(), createElementBlock("svg", _hoisted_15, [..._cache[6] || (_cache[6] = [
218
+ createElementVNode("path", {
219
+ "stroke-linecap": "round",
220
+ "stroke-linejoin": "round",
221
+ "stroke-width": "2",
222
+ d: "M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"
223
+ }, null, -1)
224
+ ])])),
200
225
  createElementVNode("span", null, toDisplayString(showSuccess.value && __props.saveSuccessMessage ? __props.saveSuccessMessage : "Save to Experiment"), 1)
201
- ], 10, _hoisted_9)
226
+ ], 10, _hoisted_12),
227
+ __props.saveDisabled && __props.saveDisabledMessage && !showSuccess.value ? (openBlock(), createElementBlock("div", _hoisted_16, toDisplayString(__props.saveDisabledMessage), 1)) : createCommentVNode("", true)
202
228
  ])
203
229
  ], 64)) : createCommentVNode("", true)
204
230
  ])) : createCommentVNode("", true)