@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.
- package/dist/components/AutoGroupModal.vue.d.ts +118 -0
- package/dist/components/AutoGroupModal.vue.js.map +1 -1
- package/dist/components/DataFrame.vue.js +1 -1
- package/dist/components/DataFrame.vue.js.map +1 -1
- package/dist/components/ExperimentPopover.vue.d.ts +1 -0
- package/dist/components/ExperimentPopover.vue.js +72 -46
- package/dist/components/ExperimentPopover.vue.js.map +1 -1
- package/dist/components/ExperimentSelectorModal.vue.js +1 -1
- package/dist/components/ExperimentSelectorModal.vue.js.map +1 -1
- package/dist/components/FileUploader.vue.js +13 -10
- package/dist/components/FileUploader.vue.js.map +1 -1
- package/dist/components/FormBuilder.vue.d.ts +287 -0
- package/dist/components/StepWizard.vue.d.ts +1 -1
- package/dist/components/StepWizard.vue.js.map +1 -1
- package/dist/composables/useApi.js +26 -12
- package/dist/composables/useApi.js.map +1 -1
- package/dist/composables/useAuth.js +7 -6
- package/dist/composables/useAuth.js.map +1 -1
- package/dist/composables/useExperimentSelector.js +14 -5
- package/dist/composables/useExperimentSelector.js.map +1 -1
- package/dist/composables/useForm.js +2 -2
- package/dist/composables/useForm.js.map +1 -1
- package/dist/composables/usePlatformContext.js +11 -0
- package/dist/composables/usePlatformContext.js.map +1 -1
- package/dist/styles.css +165 -98
- package/package.json +1 -1
- package/src/components/AutoGroupModal.vue +1 -1
- package/src/components/DataFrame.vue +1 -1
- package/src/components/ExperimentPopover.vue +32 -19
- package/src/components/ExperimentSelectorModal.vue +1 -1
- package/src/components/FileUploader.vue +14 -11
- package/src/components/StepWizard.vue +1 -1
- package/src/composables/useApi.ts +33 -17
- package/src/composables/useAuth.ts +11 -8
- package/src/composables/useExperimentSelector.ts +19 -7
- package/src/composables/useForm.ts +3 -3
- package/src/composables/usePlatformContext.ts +11 -1
- 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
|
|
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 }}–{{ 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 }}–{{ 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-
|
|
11
|
+
class: "mld-experiment-popover__body"
|
|
10
12
|
};
|
|
11
|
-
const
|
|
13
|
+
const _hoisted_6 = {
|
|
12
14
|
key: 1,
|
|
13
|
-
class: "mld-experiment-
|
|
15
|
+
class: "mld-experiment-popover__body"
|
|
14
16
|
};
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
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
|
|
22
|
-
const
|
|
23
|
-
const
|
|
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
|
|
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
|
-
|
|
130
|
-
createElementVNode("div", { class: "mld-experiment-popover__title" }, "Experiment")
|
|
131
|
-
|
|
132
|
-
|
|
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[
|
|
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",
|
|
155
|
-
|
|
156
|
-
createElementVNode("
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
"
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
createElementVNode("div",
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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[
|
|
181
|
-
createElementVNode("div",
|
|
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",
|
|
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
|
-
])])) :
|
|
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,
|
|
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)
|