@morscherlab/mld-sdk 0.7.5 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
  3. package/dist/components/AutoGroupModal.vue.js +522 -0
  4. package/dist/components/AutoGroupModal.vue.js.map +1 -0
  5. package/dist/components/AutoGroupModal.vue3.js +6 -0
  6. package/dist/components/AutoGroupModal.vue3.js.map +1 -0
  7. package/dist/components/FormActions.vue.d.ts +1 -1
  8. package/dist/components/GroupingModal.vue.js.map +1 -1
  9. package/dist/components/SampleSelector.vue.d.ts +5 -9
  10. package/dist/components/SampleSelector.vue.js +127 -255
  11. package/dist/components/SampleSelector.vue.js.map +1 -1
  12. package/dist/components/index.d.ts +1 -0
  13. package/dist/components/index.js +53 -50
  14. package/dist/components/index.js.map +1 -1
  15. package/dist/composables/index.d.ts +1 -0
  16. package/dist/composables/index.js +3 -0
  17. package/dist/composables/index.js.map +1 -1
  18. package/dist/composables/useAutoGroup.d.ts +80 -0
  19. package/dist/composables/useAutoGroup.js +397 -0
  20. package/dist/composables/useAutoGroup.js.map +1 -0
  21. package/dist/index.d.ts +3 -3
  22. package/dist/index.js +48 -42
  23. package/dist/index.js.map +1 -1
  24. package/dist/styles.css +2652 -1788
  25. package/dist/types/auto-group.d.ts +31 -0
  26. package/dist/types/index.d.ts +1 -0
  27. package/package.json +1 -1
  28. package/src/__tests__/composables/useAutoGroup.test.ts +375 -0
  29. package/src/components/AutoGroupModal.story.vue +155 -0
  30. package/src/components/AutoGroupModal.vue +441 -0
  31. package/src/components/GroupingModal.vue +1 -0
  32. package/src/components/SampleSelector.story.vue +8 -31
  33. package/src/components/SampleSelector.vue +22 -137
  34. package/src/components/index.ts +1 -0
  35. package/src/composables/index.ts +1 -0
  36. package/src/composables/useAutoGroup.ts +495 -0
  37. package/src/index.ts +12 -0
  38. package/src/styles/components/auto-group-modal.css +501 -0
  39. package/src/styles/index.css +1 -0
  40. package/src/types/auto-group.ts +37 -0
  41. package/src/types/index.ts +11 -0
package/README.md CHANGED
@@ -11,7 +11,7 @@ Vue 3 SDK for MLD Platform plugin development. Provides reusable components, com
11
11
  ## Installation
12
12
 
13
13
  ```bash
14
- npm install @estrellaxd/mld-sdk
14
+ bun add @estrellaxd/mld-sdk
15
15
  ```
16
16
 
17
17
  ## Requirements
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,522 @@
1
+ import { defineComponent, ref, watch, computed, openBlock, createBlock, withCtx, createElementVNode, createVNode, createTextVNode, createCommentVNode, toDisplayString, unref, createElementBlock, Fragment, renderList, normalizeStyle, normalizeClass, withDirectives, vModelText, withModifiers } from "vue";
2
+ import _sfc_main$1 from "./BaseModal.vue.js";
3
+ /* empty css */
4
+ import _sfc_main$3 from "./BaseButton.vue.js";
5
+ /* empty css */
6
+ import _sfc_main$4 from "./BaseInput.vue.js";
7
+ /* empty css */
8
+ import _sfc_main$2 from "./StepWizard.vue.js";
9
+ /* empty css */
10
+ import { useAutoGroup, parseCSV } from "../composables/useAutoGroup.js";
11
+ const _hoisted_1 = { class: "mld-auto-group" };
12
+ const _hoisted_2 = { class: "mld-auto-group__input-step" };
13
+ const _hoisted_3 = { class: "mld-auto-group__mode-toggle" };
14
+ const _hoisted_4 = {
15
+ key: 0,
16
+ class: "mld-auto-group__paste"
17
+ };
18
+ const _hoisted_5 = {
19
+ key: 0,
20
+ class: "mld-auto-group__sample-count"
21
+ };
22
+ const _hoisted_6 = {
23
+ key: 1,
24
+ class: "mld-auto-group__csv"
25
+ };
26
+ const _hoisted_7 = {
27
+ key: 1,
28
+ class: "mld-auto-group__file-info"
29
+ };
30
+ const _hoisted_8 = { class: "mld-auto-group__file-name" };
31
+ const _hoisted_9 = { class: "mld-auto-group__file-rows" };
32
+ const _hoisted_10 = { class: "mld-auto-group__outlier-step" };
33
+ const _hoisted_11 = { class: "mld-auto-group__outlier-banner" };
34
+ const _hoisted_12 = { class: "mld-auto-group__outlier-batch" };
35
+ const _hoisted_13 = { class: "mld-auto-group__outlier-list" };
36
+ const _hoisted_14 = { class: "mld-auto-group__outlier-info" };
37
+ const _hoisted_15 = { class: "mld-auto-group__outlier-name" };
38
+ const _hoisted_16 = { class: "mld-auto-group__outlier-badge" };
39
+ const _hoisted_17 = { class: "mld-auto-group__outlier-actions" };
40
+ const _hoisted_18 = ["onClick"];
41
+ const _hoisted_19 = ["onClick"];
42
+ const _hoisted_20 = ["onClick"];
43
+ const _hoisted_21 = { class: "mld-auto-group__field-step" };
44
+ const _hoisted_22 = { class: "mld-auto-group__field-grid" };
45
+ const _hoisted_23 = { class: "mld-auto-group__field-header" };
46
+ const _hoisted_24 = { class: "mld-auto-group__field-toggle" };
47
+ const _hoisted_25 = ["checked", "onChange"];
48
+ const _hoisted_26 = { class: "mld-auto-group__field-cardinality" };
49
+ const _hoisted_27 = { class: "mld-auto-group__field-values" };
50
+ const _hoisted_28 = {
51
+ key: 0,
52
+ class: "mld-auto-group__field-more"
53
+ };
54
+ const _hoisted_29 = {
55
+ key: 0,
56
+ class: "mld-auto-group__field-summary"
57
+ };
58
+ const _hoisted_30 = {
59
+ key: 1,
60
+ class: "mld-auto-group__field-warning"
61
+ };
62
+ const _hoisted_31 = { class: "mld-auto-group__preview-step" };
63
+ const _hoisted_32 = { class: "mld-auto-group__preview-summary" };
64
+ const _hoisted_33 = { class: "mld-auto-group__preview-stat" };
65
+ const _hoisted_34 = { class: "mld-auto-group__preview-stat" };
66
+ const _hoisted_35 = {
67
+ key: 0,
68
+ class: "mld-auto-group__preview-stat mld-auto-group__preview-stat--excluded"
69
+ };
70
+ const _hoisted_36 = { class: "mld-auto-group__preview-groups" };
71
+ const _hoisted_37 = { class: "mld-auto-group__preview-group-header" };
72
+ const _hoisted_38 = { class: "mld-auto-group__preview-group-name" };
73
+ const _hoisted_39 = { class: "mld-auto-group__preview-samples" };
74
+ const _hoisted_40 = {
75
+ key: 0,
76
+ class: "mld-auto-group__preview-excluded"
77
+ };
78
+ const _hoisted_41 = { class: "mld-auto-group__preview-excluded-list" };
79
+ const _hoisted_42 = { class: "mld-auto-group__nav" };
80
+ const _sfc_main = /* @__PURE__ */ defineComponent({
81
+ __name: "AutoGroupModal",
82
+ props: {
83
+ modelValue: { type: Boolean },
84
+ samples: { default: () => [] }
85
+ },
86
+ emits: ["update:modelValue", "apply"],
87
+ setup(__props, { emit: __emit }) {
88
+ const props = __props;
89
+ const emit = __emit;
90
+ const autoGroup = useAutoGroup();
91
+ const wizardRef = ref(null);
92
+ const currentStep = ref(0);
93
+ const isDragOver = ref(false);
94
+ const csvFileName = ref("");
95
+ watch(() => props.modelValue, (open) => {
96
+ if (open) {
97
+ autoGroup.reset();
98
+ currentStep.value = 0;
99
+ csvFileName.value = "";
100
+ if (props.samples.length > 0) {
101
+ autoGroup.rawText.value = props.samples.join("\n");
102
+ }
103
+ }
104
+ });
105
+ const allSteps = [
106
+ { id: "input", label: "Input" },
107
+ { id: "outliers", label: "Outliers" },
108
+ { id: "fields", label: "Fields" },
109
+ { id: "preview", label: "Preview" }
110
+ ];
111
+ const dynamicSteps = computed(() => {
112
+ if (autoGroup.hasOutliers.value) {
113
+ return allSteps;
114
+ }
115
+ return allSteps.filter((s) => s.id !== "outliers");
116
+ });
117
+ const currentStepId = computed(() => {
118
+ const step = dynamicSteps.value[currentStep.value];
119
+ return (step == null ? void 0 : step.id) ?? "input";
120
+ });
121
+ watch(() => dynamicSteps.value.length, (newLen) => {
122
+ if (currentStep.value >= newLen) {
123
+ currentStep.value = newLen - 1;
124
+ }
125
+ });
126
+ const inputValid = computed(() => autoGroup.samples.value.length > 0);
127
+ const fieldsValid = computed(() => autoGroup.enabledFields.value.size > 0);
128
+ watch([inputValid, fieldsValid, dynamicSteps], () => {
129
+ if (!wizardRef.value) return;
130
+ const steps = dynamicSteps.value;
131
+ for (let i = 0; i < steps.length; i++) {
132
+ const id = steps[i].id;
133
+ if (id === "input") wizardRef.value.setStepValid(i, inputValid.value);
134
+ else if (id === "outliers") wizardRef.value.setStepValid(i, true);
135
+ else if (id === "fields") wizardRef.value.setStepValid(i, fieldsValid.value);
136
+ else if (id === "preview") wizardRef.value.setStepValid(i, true);
137
+ }
138
+ }, { immediate: true });
139
+ function handleNext() {
140
+ if (currentStepId.value === "input") {
141
+ autoGroup.parseInput();
142
+ }
143
+ }
144
+ function handleApply() {
145
+ emit("apply", autoGroup.result.value);
146
+ emit("update:modelValue", false);
147
+ }
148
+ function handleCancel() {
149
+ emit("update:modelValue", false);
150
+ }
151
+ function handleFileDrop(event) {
152
+ var _a;
153
+ event.preventDefault();
154
+ isDragOver.value = false;
155
+ const files = (_a = event.dataTransfer) == null ? void 0 : _a.files;
156
+ if (files && files.length > 0) {
157
+ processFile(files[0]);
158
+ }
159
+ }
160
+ function handleFileInput(event) {
161
+ const target = event.target;
162
+ if (target.files && target.files.length > 0) {
163
+ processFile(target.files[0]);
164
+ }
165
+ }
166
+ async function processFile(file) {
167
+ if (!file.name.endsWith(".csv") && !file.name.endsWith(".tsv")) return;
168
+ try {
169
+ const text = await file.text();
170
+ const parsed = parseCSV(text);
171
+ autoGroup.inputMode.value = "csv";
172
+ autoGroup.csvData.value = parsed;
173
+ csvFileName.value = file.name;
174
+ } catch {
175
+ }
176
+ }
177
+ function clearCsvFile() {
178
+ autoGroup.csvData.value = null;
179
+ autoGroup.inputMode.value = "paste";
180
+ csvFileName.value = "";
181
+ }
182
+ const isLastStep = computed(() => currentStep.value === dynamicSteps.value.length - 1);
183
+ const isFirstStep = computed(() => currentStep.value === 0);
184
+ return (_ctx, _cache) => {
185
+ return openBlock(), createBlock(_sfc_main$1, {
186
+ "model-value": __props.modelValue,
187
+ title: "Smart Group",
188
+ size: "lg",
189
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => emit("update:modelValue", $event)),
190
+ onClose: handleCancel
191
+ }, {
192
+ default: withCtx(() => [
193
+ createElementVNode("div", _hoisted_1, [
194
+ createVNode(_sfc_main$2, {
195
+ ref_key: "wizardRef",
196
+ ref: wizardRef,
197
+ modelValue: currentStep.value,
198
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => currentStep.value = $event),
199
+ steps: dynamicSteps.value,
200
+ linear: true,
201
+ size: "sm"
202
+ }, {
203
+ "step-input": withCtx(() => [
204
+ createElementVNode("div", _hoisted_2, [
205
+ createElementVNode("div", _hoisted_3, [
206
+ createVNode(_sfc_main$3, {
207
+ variant: unref(autoGroup).inputMode.value === "paste" ? "primary" : "secondary",
208
+ size: "sm",
209
+ onClick: _cache[0] || (_cache[0] = ($event) => unref(autoGroup).inputMode.value = "paste")
210
+ }, {
211
+ default: withCtx(() => [..._cache[9] || (_cache[9] = [
212
+ createTextVNode(" Paste ", -1)
213
+ ])]),
214
+ _: 1
215
+ }, 8, ["variant"]),
216
+ createVNode(_sfc_main$3, {
217
+ variant: unref(autoGroup).inputMode.value === "csv" ? "primary" : "secondary",
218
+ size: "sm",
219
+ onClick: _cache[1] || (_cache[1] = ($event) => unref(autoGroup).inputMode.value = "csv")
220
+ }, {
221
+ default: withCtx(() => [..._cache[10] || (_cache[10] = [
222
+ createTextVNode(" CSV ", -1)
223
+ ])]),
224
+ _: 1
225
+ }, 8, ["variant"])
226
+ ]),
227
+ unref(autoGroup).inputMode.value === "paste" ? (openBlock(), createElementBlock("div", _hoisted_4, [
228
+ withDirectives(createElementVNode("textarea", {
229
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => unref(autoGroup).rawText.value = $event),
230
+ class: "mld-auto-group__textarea",
231
+ rows: "12",
232
+ placeholder: "Paste sample names, one per line..."
233
+ }, null, 512), [
234
+ [vModelText, unref(autoGroup).rawText.value]
235
+ ]),
236
+ unref(autoGroup).samples.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5, toDisplayString(unref(autoGroup).samples.value.length) + " samples ", 1)) : createCommentVNode("", true)
237
+ ])) : createCommentVNode("", true),
238
+ unref(autoGroup).inputMode.value === "csv" ? (openBlock(), createElementBlock("div", _hoisted_6, [
239
+ !unref(autoGroup).csvData.value ? (openBlock(), createElementBlock("div", {
240
+ key: 0,
241
+ class: normalizeClass([
242
+ "mld-auto-group__dropzone",
243
+ isDragOver.value ? "mld-auto-group__dropzone--dragover" : ""
244
+ ]),
245
+ onDrop: handleFileDrop,
246
+ onDragover: _cache[3] || (_cache[3] = withModifiers(($event) => isDragOver.value = true, ["prevent"])),
247
+ onDragleave: _cache[4] || (_cache[4] = ($event) => isDragOver.value = false)
248
+ }, [
249
+ createElementVNode("input", {
250
+ type: "file",
251
+ accept: ".csv,.tsv",
252
+ class: "mld-auto-group__file-input",
253
+ onChange: handleFileInput
254
+ }, null, 32),
255
+ _cache[11] || (_cache[11] = createElementVNode("svg", {
256
+ class: "mld-auto-group__upload-icon",
257
+ fill: "none",
258
+ stroke: "currentColor",
259
+ viewBox: "0 0 24 24"
260
+ }, [
261
+ createElementVNode("path", {
262
+ "stroke-linecap": "round",
263
+ "stroke-linejoin": "round",
264
+ "stroke-width": "1.5",
265
+ 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"
266
+ })
267
+ ], -1)),
268
+ _cache[12] || (_cache[12] = createElementVNode("p", { class: "mld-auto-group__upload-text" }, [
269
+ createElementVNode("span", { class: "mld-auto-group__upload-highlight" }, "Click to upload"),
270
+ createTextVNode(" or drag and drop a CSV file ")
271
+ ], -1))
272
+ ], 34)) : (openBlock(), createElementBlock("div", _hoisted_7, [
273
+ _cache[13] || (_cache[13] = createElementVNode("svg", {
274
+ class: "mld-auto-group__file-icon",
275
+ fill: "none",
276
+ stroke: "currentColor",
277
+ viewBox: "0 0 24 24"
278
+ }, [
279
+ createElementVNode("path", {
280
+ "stroke-linecap": "round",
281
+ "stroke-linejoin": "round",
282
+ "stroke-width": "2",
283
+ 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"
284
+ })
285
+ ], -1)),
286
+ createElementVNode("span", _hoisted_8, toDisplayString(csvFileName.value), 1),
287
+ createElementVNode("span", _hoisted_9, toDisplayString(unref(autoGroup).csvData.value.rows.length) + " rows", 1),
288
+ createElementVNode("button", {
289
+ type: "button",
290
+ class: "mld-auto-group__file-clear",
291
+ onClick: clearCsvFile
292
+ }, " Change file ")
293
+ ]))
294
+ ])) : createCommentVNode("", true)
295
+ ])
296
+ ]),
297
+ "step-outliers": withCtx(() => [
298
+ createElementVNode("div", _hoisted_10, [
299
+ createElementVNode("div", _hoisted_11, [
300
+ createTextVNode(toDisplayString(unref(autoGroup).outliers.value.length) + " of " + toDisplayString(unref(autoGroup).samples.value.length) + " samples have irregular structure (fewer than " + toDisplayString(unref(autoGroup).minFieldCount.value) + " fields, delimiter ", 1),
301
+ createElementVNode("code", null, toDisplayString(unref(autoGroup).delimiter.value), 1),
302
+ _cache[14] || (_cache[14] = createTextVNode(") ", -1))
303
+ ]),
304
+ createElementVNode("div", _hoisted_12, [
305
+ createVNode(_sfc_main$3, {
306
+ size: "sm",
307
+ variant: "secondary",
308
+ onClick: _cache[5] || (_cache[5] = ($event) => unref(autoGroup).setAllOutlierActions("include"))
309
+ }, {
310
+ default: withCtx(() => [..._cache[15] || (_cache[15] = [
311
+ createTextVNode(" Include All ", -1)
312
+ ])]),
313
+ _: 1
314
+ }),
315
+ createVNode(_sfc_main$3, {
316
+ size: "sm",
317
+ variant: "secondary",
318
+ onClick: _cache[6] || (_cache[6] = ($event) => unref(autoGroup).setAllOutlierActions("exclude"))
319
+ }, {
320
+ default: withCtx(() => [..._cache[16] || (_cache[16] = [
321
+ createTextVNode(" Exclude All ", -1)
322
+ ])]),
323
+ _: 1
324
+ })
325
+ ]),
326
+ createElementVNode("div", _hoisted_13, [
327
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(autoGroup).outliers.value, (outlier) => {
328
+ return openBlock(), createElementBlock("div", {
329
+ key: outlier.index,
330
+ class: "mld-auto-group__outlier-item"
331
+ }, [
332
+ createElementVNode("div", _hoisted_14, [
333
+ createElementVNode("code", _hoisted_15, toDisplayString(outlier.sample), 1),
334
+ createElementVNode("span", _hoisted_16, toDisplayString(outlier.fieldCount) + " fields", 1)
335
+ ]),
336
+ createElementVNode("div", _hoisted_17, [
337
+ createElementVNode("button", {
338
+ type: "button",
339
+ class: normalizeClass(["mld-auto-group__action-btn", outlier.action === "include" ? "mld-auto-group__action-btn--active" : ""]),
340
+ onClick: ($event) => unref(autoGroup).setOutlierAction(outlier.index, "include")
341
+ }, "Include", 10, _hoisted_18),
342
+ createElementVNode("button", {
343
+ type: "button",
344
+ class: normalizeClass(["mld-auto-group__action-btn", outlier.action === "exclude" ? "mld-auto-group__action-btn--active mld-auto-group__action-btn--exclude" : ""]),
345
+ onClick: ($event) => unref(autoGroup).setOutlierAction(outlier.index, "exclude")
346
+ }, "Exclude", 10, _hoisted_19),
347
+ createElementVNode("button", {
348
+ type: "button",
349
+ class: normalizeClass(["mld-auto-group__action-btn", outlier.action === "qc" ? "mld-auto-group__action-btn--active mld-auto-group__action-btn--qc" : ""]),
350
+ onClick: ($event) => unref(autoGroup).setOutlierAction(outlier.index, "qc")
351
+ }, "QC", 10, _hoisted_20)
352
+ ])
353
+ ]);
354
+ }), 128))
355
+ ])
356
+ ])
357
+ ]),
358
+ "step-fields": withCtx(() => [
359
+ createElementVNode("div", _hoisted_21, [
360
+ createElementVNode("div", _hoisted_22, [
361
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(autoGroup).effectiveColumns.value, (col) => {
362
+ return openBlock(), createElementBlock("div", {
363
+ key: col.index,
364
+ class: normalizeClass([
365
+ "mld-auto-group__field-card",
366
+ unref(autoGroup).enabledFields.value.has(col.index) ? "mld-auto-group__field-card--enabled" : ""
367
+ ])
368
+ }, [
369
+ createElementVNode("div", _hoisted_23, [
370
+ createElementVNode("label", _hoisted_24, [
371
+ createElementVNode("input", {
372
+ type: "checkbox",
373
+ checked: unref(autoGroup).enabledFields.value.has(col.index),
374
+ onChange: ($event) => unref(autoGroup).toggleField(col.index)
375
+ }, null, 40, _hoisted_25),
376
+ _cache[17] || (_cache[17] = createElementVNode("span", { class: "mld-auto-group__field-toggle-label" }, "Group by", -1))
377
+ ]),
378
+ createElementVNode("span", _hoisted_26, toDisplayString(col.cardinality) + " unique", 1)
379
+ ]),
380
+ createVNode(_sfc_main$4, {
381
+ "model-value": col.name,
382
+ placeholder: "Field name...",
383
+ class: "mld-auto-group__field-name-input",
384
+ "onUpdate:modelValue": ($event) => unref(autoGroup).renameField(col.index, String($event ?? ""))
385
+ }, null, 8, ["model-value", "onUpdate:modelValue"]),
386
+ createElementVNode("div", _hoisted_27, [
387
+ (openBlock(true), createElementBlock(Fragment, null, renderList(col.uniqueValues.slice(0, 5), (val) => {
388
+ return openBlock(), createElementBlock("span", {
389
+ key: val,
390
+ class: "mld-auto-group__field-value"
391
+ }, toDisplayString(val), 1);
392
+ }), 128)),
393
+ col.uniqueValues.length > 5 ? (openBlock(), createElementBlock("span", _hoisted_28, "+" + toDisplayString(col.uniqueValues.length - 5) + " more", 1)) : createCommentVNode("", true)
394
+ ])
395
+ ], 2);
396
+ }), 128))
397
+ ]),
398
+ unref(autoGroup).enabledFields.value.size > 0 ? (openBlock(), createElementBlock("div", _hoisted_29, [
399
+ _cache[18] || (_cache[18] = createTextVNode(" Grouping by: ", -1)),
400
+ createElementVNode("strong", null, toDisplayString(unref(autoGroup).effectiveColumns.value.filter((c) => unref(autoGroup).enabledFields.value.has(c.index)).map((c) => c.name).join(" / ")), 1)
401
+ ])) : createCommentVNode("", true),
402
+ unref(autoGroup).enabledFields.value.size === 0 ? (openBlock(), createElementBlock("div", _hoisted_30, " Select at least one field for grouping ")) : createCommentVNode("", true)
403
+ ])
404
+ ]),
405
+ "step-preview": withCtx(() => [
406
+ createElementVNode("div", _hoisted_31, [
407
+ createElementVNode("div", _hoisted_32, [
408
+ createElementVNode("span", _hoisted_33, [
409
+ createElementVNode("strong", null, toDisplayString(unref(autoGroup).groups.value.length), 1),
410
+ _cache[19] || (_cache[19] = createTextVNode(" groups ", -1))
411
+ ]),
412
+ createElementVNode("span", _hoisted_34, [
413
+ createElementVNode("strong", null, toDisplayString(unref(autoGroup).groups.value.reduce((sum, g) => sum + g.samples.length, 0)), 1),
414
+ _cache[20] || (_cache[20] = createTextVNode(" samples ", -1))
415
+ ]),
416
+ unref(autoGroup).excludedSamples.value.length > 0 ? (openBlock(), createElementBlock("span", _hoisted_35, [
417
+ createElementVNode("strong", null, toDisplayString(unref(autoGroup).excludedSamples.value.length), 1),
418
+ _cache[21] || (_cache[21] = createTextVNode(" excluded ", -1))
419
+ ])) : createCommentVNode("", true)
420
+ ]),
421
+ createElementVNode("div", _hoisted_36, [
422
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(autoGroup).groups.value, (group) => {
423
+ return openBlock(), createElementBlock("details", {
424
+ key: group.name,
425
+ class: "mld-auto-group__preview-group"
426
+ }, [
427
+ createElementVNode("summary", _hoisted_37, [
428
+ createElementVNode("span", {
429
+ class: "mld-auto-group__preview-dot",
430
+ style: normalizeStyle({ backgroundColor: group.color })
431
+ }, null, 4),
432
+ createElementVNode("span", _hoisted_38, toDisplayString(group.name), 1),
433
+ createElementVNode("span", {
434
+ class: "mld-auto-group__preview-group-count",
435
+ style: normalizeStyle({ backgroundColor: group.color + "20", color: group.color })
436
+ }, toDisplayString(group.samples.length), 5)
437
+ ]),
438
+ createElementVNode("div", _hoisted_39, [
439
+ (openBlock(true), createElementBlock(Fragment, null, renderList(group.samples, (sample) => {
440
+ return openBlock(), createElementBlock("span", {
441
+ key: sample,
442
+ class: "mld-auto-group__preview-sample"
443
+ }, toDisplayString(sample), 1);
444
+ }), 128))
445
+ ])
446
+ ]);
447
+ }), 128))
448
+ ]),
449
+ unref(autoGroup).excludedSamples.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_40, [
450
+ _cache[22] || (_cache[22] = createElementVNode("div", { class: "mld-auto-group__preview-excluded-title" }, "Excluded Samples", -1)),
451
+ createElementVNode("div", _hoisted_41, [
452
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(autoGroup).excludedSamples.value, (sample) => {
453
+ return openBlock(), createElementBlock("span", {
454
+ key: sample,
455
+ class: "mld-auto-group__preview-sample mld-auto-group__preview-sample--excluded"
456
+ }, toDisplayString(sample), 1);
457
+ }), 128))
458
+ ])
459
+ ])) : createCommentVNode("", true)
460
+ ])
461
+ ]),
462
+ navigation: withCtx(({ goBack, goNext, canProceed }) => [
463
+ createElementVNode("div", _hoisted_42, [
464
+ createVNode(_sfc_main$3, {
465
+ variant: "secondary",
466
+ onClick: handleCancel
467
+ }, {
468
+ default: withCtx(() => [..._cache[23] || (_cache[23] = [
469
+ createTextVNode(" Cancel ", -1)
470
+ ])]),
471
+ _: 1
472
+ }),
473
+ _cache[27] || (_cache[27] = createElementVNode("div", { style: { "flex": "1" } }, null, -1)),
474
+ !isFirstStep.value ? (openBlock(), createBlock(_sfc_main$3, {
475
+ key: 0,
476
+ variant: "secondary",
477
+ onClick: goBack
478
+ }, {
479
+ default: withCtx(() => [..._cache[24] || (_cache[24] = [
480
+ createTextVNode(" Back ", -1)
481
+ ])]),
482
+ _: 1
483
+ }, 8, ["onClick"])) : createCommentVNode("", true),
484
+ !isLastStep.value ? (openBlock(), createBlock(_sfc_main$3, {
485
+ key: 1,
486
+ variant: "primary",
487
+ disabled: !canProceed,
488
+ onClick: () => {
489
+ handleNext();
490
+ goNext();
491
+ }
492
+ }, {
493
+ default: withCtx(() => [..._cache[25] || (_cache[25] = [
494
+ createTextVNode(" Next ", -1)
495
+ ])]),
496
+ _: 1
497
+ }, 8, ["disabled", "onClick"])) : createCommentVNode("", true),
498
+ isLastStep.value ? (openBlock(), createBlock(_sfc_main$3, {
499
+ key: 2,
500
+ variant: "primary",
501
+ onClick: handleApply
502
+ }, {
503
+ default: withCtx(() => [..._cache[26] || (_cache[26] = [
504
+ createTextVNode(" Apply ", -1)
505
+ ])]),
506
+ _: 1
507
+ })) : createCommentVNode("", true)
508
+ ])
509
+ ]),
510
+ _: 1
511
+ }, 8, ["modelValue", "steps"])
512
+ ])
513
+ ]),
514
+ _: 1
515
+ }, 8, ["model-value"]);
516
+ };
517
+ }
518
+ });
519
+ export {
520
+ _sfc_main as default
521
+ };
522
+ //# sourceMappingURL=AutoGroupModal.vue.js.map
@@ -0,0 +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})\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.minFieldCount.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,UAAM,QAAQ;AAId,UAAM,OAAO;AAKb,UAAM,YAAY,aAAA;AAClB,UAAM,YAAY,IAA4C,IAAI;AAClE,UAAM,cAAc,IAAI,CAAC;AACzB,UAAM,aAAa,IAAI,KAAK;AAC5B,UAAM,cAAc,IAAI,EAAE;AAG1B,UAAM,MAAM,MAAM,YAAY,CAAC,SAAS;AACtC,UAAI,MAAM;AACR,kBAAU,MAAA;AACV,oBAAY,QAAQ;AACpB,oBAAY,QAAQ;AACpB,YAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,oBAAU,QAAQ,QAAQ,MAAM,QAAQ,KAAK,IAAI;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,WAAyB;AAAA,MAC7B,EAAE,IAAI,SAAS,OAAO,QAAA;AAAA,MACtB,EAAE,IAAI,YAAY,OAAO,WAAA;AAAA,MACzB,EAAE,IAAI,UAAU,OAAO,SAAA;AAAA,MACvB,EAAE,IAAI,WAAW,OAAO,UAAA;AAAA,IAAU;AAGpC,UAAM,eAAe,SAAuB,MAAM;AAChD,UAAI,UAAU,YAAY,OAAO;AAC/B,eAAO;AAAA,MACT;AACA,aAAO,SAAS,OAAO,CAAA,MAAK,EAAE,OAAO,UAAU;AAAA,IACjD,CAAC;AAGD,UAAM,gBAAgB,SAAS,MAAM;AACnC,YAAM,OAAO,aAAa,MAAM,YAAY,KAAK;AACjD,cAAO,6BAAM,OAAM;AAAA,IACrB,CAAC;AAGD,UAAM,MAAM,aAAa,MAAM,QAAQ,CAAC,WAAW;AACjD,UAAI,YAAY,SAAS,QAAQ;AAC/B,oBAAY,QAAQ,SAAS;AAAA,MAC/B;AAAA,IACF,CAAC;AAGD,UAAM,aAAa,SAAS,MAAM,UAAU,QAAQ,MAAM,SAAS,CAAC;AACpE,UAAM,cAAc,SAAS,MAAM,UAAU,cAAc,MAAM,OAAO,CAAC;AAEzE,UAAM,CAAC,YAAY,aAAa,YAAY,GAAG,MAAM;AACnD,UAAI,CAAC,UAAU,MAAO;AACtB,YAAM,QAAQ,aAAa;AAC3B,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,KAAK,MAAM,CAAC,EAAE;AACpB,YAAI,OAAO,QAAS,WAAU,MAAM,aAAa,GAAG,WAAW,KAAK;AAAA,iBAC3D,OAAO,WAAY,WAAU,MAAM,aAAa,GAAG,IAAI;AAAA,iBACvD,OAAO,SAAU,WAAU,MAAM,aAAa,GAAG,YAAY,KAAK;AAAA,iBAClE,OAAO,UAAW,WAAU,MAAM,aAAa,GAAG,IAAI;AAAA,MACjE;AAAA,IACF,GAAG,EAAE,WAAW,MAAM;AAGtB,aAAS,aAAa;AACpB,UAAI,cAAc,UAAU,SAAS;AACnC,kBAAU,WAAA;AAAA,MACZ;AAAA,IAEF;AAEA,aAAS,cAAc;AACrB,WAAK,SAAS,UAAU,OAAO,KAAK;AACpC,WAAK,qBAAqB,KAAK;AAAA,IACjC;AAEA,aAAS,eAAe;AACtB,WAAK,qBAAqB,KAAK;AAAA,IACjC;AAGA,aAAS,eAAe,OAAkB;;AACxC,YAAM,eAAA;AACN,iBAAW,QAAQ;AACnB,YAAM,SAAQ,WAAM,iBAAN,mBAAoB;AAClC,UAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,oBAAY,MAAM,CAAC,CAAC;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,gBAAgB,OAAc;AACrC,YAAM,SAAS,MAAM;AACrB,UAAI,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAC3C,oBAAY,OAAO,MAAM,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,mBAAe,YAAY,MAAY;AACrC,UAAI,CAAC,KAAK,KAAK,SAAS,MAAM,KAAK,CAAC,KAAK,KAAK,SAAS,MAAM,EAAG;AAEhE,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,KAAA;AACxB,cAAM,SAAS,SAAS,IAAI;AAC5B,kBAAU,UAAU,QAAQ;AAC5B,kBAAU,QAAQ,QAAQ;AAC1B,oBAAY,QAAQ,KAAK;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,aAAS,eAAe;AACtB,gBAAU,QAAQ,QAAQ;AAC1B,gBAAU,UAAU,QAAQ;AAC5B,kBAAY,QAAQ;AAAA,IACtB;AAGA,UAAM,aAAa,SAAS,MAAM,YAAY,UAAU,aAAa,MAAM,SAAS,CAAC;AACrF,UAAM,cAAc,SAAS,MAAM,YAAY,UAAU,CAAC;;0BAIxDA,YAiSYC,aAAA;AAAA,QAhST,eAAa,QAAA;AAAA,QACd,OAAM;AAAA,QACN,MAAK;AAAA,QACJ,uBAAkB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,qBAAsB,MAAM;AAAA,QACpD,SAAO;AAAA,MAAA;yBAER,MAyRM;AAAA,UAzRNC,mBAyRM,OAzRN,YAyRM;AAAA,YAxRJC,YAuRaC,aAAA;AAAA,uBAtRP;AAAA,cAAJ,KAAI;AAAA,0BACK,YAAA;AAAA,2EAAA,YAAW,QAAA;AAAA,cACnB,OAAO,aAAA;AAAA,cACP,QAAQ;AAAA,cACT,MAAK;AAAA,YAAA;cAGM,sBACT,MAqEM;AAAA,gBArENF,mBAqEM,OArEN,YAqEM;AAAA,kBAnEJA,mBAeM,OAfN,YAeM;AAAA,oBAdJC,YAMaE,aAAA;AAAA,sBALV,SAASC,MAAA,SAAA,EAAU,UAAU,UAAK,UAAA,YAAA;AAAA,sBACnC,MAAK;AAAA,sBACJ,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,MAAA,SAAA,EAAU,UAAU,QAAK;AAAA,oBAAA;uCAClC,MAED,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,wCAFC,WAED,EAAA;AAAA,sBAAA;;;oBACAH,YAMaE,aAAA;AAAA,sBALV,SAASC,MAAA,SAAA,EAAU,UAAU,UAAK,QAAA,YAAA;AAAA,sBACnC,MAAK;AAAA,sBACJ,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEA,MAAA,SAAA,EAAU,UAAU,QAAK;AAAA,oBAAA;uCAClC,MAED,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,wCAFC,SAED,EAAA;AAAA,sBAAA;;;;kBAISA,MAAA,SAAA,EAAU,UAAU,UAAK,WAApCC,aAAAC,mBAUM,OAVN,YAUM;AAAA,mCATJN,mBAKE,YAAA;AAAA,mFAJSI,MAAA,SAAA,EAAU,QAAQ,QAAK;AAAA,sBAChC,OAAM;AAAA,sBACN,MAAK;AAAA,sBACL,aAAY;AAAA,oBAAA;mCAHHA,MAAA,SAAA,EAAU,QAAQ,KAAK;AAAA,oBAAA;oBAKvBA,MAAA,SAAA,EAAU,QAAQ,MAAM,SAAM,kBAAzCE,mBAEM,OAFN,YAEMC,gBADDH,MAAA,SAAA,EAAU,QAAQ,MAAM,MAAM,IAAG,aACtC,CAAA;;kBAISA,MAAA,SAAA,EAAU,UAAU,UAAK,SAApCC,aAAAC,mBAmCM,OAnCN,YAmCM;AAAA,qBAlCQF,MAAA,SAAA,EAAU,QAAQ,sBAA9BE,mBAsBM,OAAA;AAAA;sBArBH,OAAKE,eAAA;AAAA;wBAAoE,WAAA,QAAU,uCAAA;AAAA,sBAAA;sBAInF,QAAM;AAAA,sBACN,gEAAkB,WAAA,QAAU,MAAA,CAAA,SAAA,CAAA;AAAA,sBAC5B,mDAAW,WAAA,QAAU;AAAA,oBAAA;sBAEtBR,mBAKE,SAAA;AAAA,wBAJA,MAAK;AAAA,wBACL,QAAO;AAAA,wBACP,OAAM;AAAA,wBACL,UAAQ;AAAA,sBAAA;kDAEXA,mBAEM,OAAA;AAAA,wBAFD,OAAM;AAAA,wBAA8B,MAAK;AAAA,wBAAO,QAAO;AAAA,wBAAe,SAAQ;AAAA,sBAAA;wBACjFA,mBAA4M,QAAA;AAAA,0BAAtM,kBAAe;AAAA,0BAAQ,mBAAgB;AAAA,0BAAQ,gBAAa;AAAA,0BAAM,GAAE;AAAA,wBAAA;;kDAE5EA,mBAGI,KAAA,EAHD,OAAM,iCAA6B;AAAA,wBACpCA,mBAAqE,QAAA,EAA/D,OAAM,mCAAA,GAAmC,iBAAe;AAAA,wCAAO,+BAEvE;AAAA,sBAAA;+BAGFK,aAAAC,mBASM,OATN,YASM;AAAA,kDARJN,mBAEM,OAAA;AAAA,wBAFD,OAAM;AAAA,wBAA4B,MAAK;AAAA,wBAAO,QAAO;AAAA,wBAAe,SAAQ;AAAA,sBAAA;wBAC/EA,mBAAiM,QAAA;AAAA,0BAA3L,kBAAe;AAAA,0BAAQ,mBAAgB;AAAA,0BAAQ,gBAAa;AAAA,0BAAI,GAAE;AAAA,wBAAA;;sBAE1EA,mBAAgE,QAAhE,YAAgEO,gBAArB,YAAA,KAAW,GAAA,CAAA;AAAA,sBACtDP,mBAA6F,QAA7F,YAA6FO,gBAAlDH,MAAA,SAAA,EAAU,QAAQ,MAAM,KAAK,MAAM,IAAG,SAAK,CAAA;AAAA,sBACtFJ,mBAES,UAAA;AAAA,wBAFD,MAAK;AAAA,wBAAS,OAAM;AAAA,wBAA8B,SAAO;AAAA,sBAAA,GAAc,eAE/E;AAAA,oBAAA;;;;cAOG,yBACT,MA8CM;AAAA,gBA9CNA,mBA8CM,OA9CN,aA8CM;AAAA,kBA7CJA,mBAKM,OALN,aAKM;AAAA,oDAJDI,MAAA,SAAA,EAAU,SAAS,MAAM,MAAM,IAAG,SAAIG,gBAAGH,MAAA,SAAA,EAAU,QAAQ,MAAM,MAAM,IAAG,mDAEjEG,gBAAGH,MAAA,SAAA,EAAU,cAAc,KAAK,IAAG,uBAC/C,CAAA;AAAA,oBAAAJ,mBAA4C,QAAA,MAAAO,gBAAnCH,MAAA,SAAA,EAAU,UAAU,KAAK,GAAA,CAAA;AAAA,gEAAU,MAC9C,EAAA;AAAA,kBAAA;kBAEAJ,mBAOM,OAPN,aAOM;AAAA,oBANJC,YAEaE,aAAA;AAAA,sBAFD,MAAK;AAAA,sBAAK,SAAQ;AAAA,sBAAa,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEC,MAAA,SAAA,EAAU,qBAAoB,SAAA;AAAA,oBAAA;uCAAa,MAE7F,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,wCAF6F,iBAE7F,EAAA;AAAA,sBAAA;;;oBACAH,YAEaE,aAAA;AAAA,sBAFD,MAAK;AAAA,sBAAK,SAAQ;AAAA,sBAAa,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAEC,MAAA,SAAA,EAAU,qBAAoB,SAAA;AAAA,oBAAA;uCAAa,MAE7F,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,wCAF6F,iBAE7F,EAAA;AAAA,sBAAA;;;;kBAGFJ,mBA4BM,OA5BN,aA4BM;AAAA,qBA3BJK,UAAA,IAAA,GAAAC,mBA0BMG,2BAzBcL,MAAA,SAAA,EAAU,SAAS,QAA9B,YAAO;0CADhBE,mBA0BM,OAAA;AAAA,wBAxBH,KAAK,QAAQ;AAAA,wBACd,OAAM;AAAA,sBAAA;wBAENN,mBAGM,OAHN,aAGM;AAAA,0BAFJA,mBAAsE,QAAtE,aAAsEO,gBAAxB,QAAQ,MAAM,GAAA,CAAA;AAAA,0BAC5DP,mBAAkF,QAAlF,aAAkFO,gBAAnC,QAAQ,UAAU,IAAG,WAAO,CAAA;AAAA,wBAAA;wBAE7EP,mBAgBM,OAhBN,aAgBM;AAAA,0BAfJA,mBAIiB,UAAA;AAAA,4BAHf,MAAK;AAAA,4BACJ,OAAKQ,eAAA,CAAA,8BAAiC,QAAQ,WAAM,YAAA,uCAAA,EAAA,CAAA;AAAA,4BACpD,qBAAOJ,MAAA,SAAA,EAAU,iBAAiB,QAAQ,OAAK,SAAA;AAAA,0BAAA,GACjD,WAAO,IAAA,WAAA;AAAA,0BACRJ,mBAIiB,UAAA;AAAA,4BAHf,MAAK;AAAA,4BACJ,OAAKQ,eAAA,CAAA,8BAAiC,QAAQ,WAAM,YAAA,2EAAA,EAAA,CAAA;AAAA,4BACpD,qBAAOJ,MAAA,SAAA,EAAU,iBAAiB,QAAQ,OAAK,SAAA;AAAA,0BAAA,GACjD,WAAO,IAAA,WAAA;AAAA,0BACRJ,mBAIY,UAAA;AAAA,4BAHV,MAAK;AAAA,4BACJ,OAAKQ,eAAA,CAAA,8BAAiC,QAAQ,WAAM,OAAA,sEAAA,EAAA,CAAA;AAAA,4BACpD,qBAAOJ,MAAA,SAAA,EAAU,iBAAiB,QAAQ,OAAK,IAAA;AAAA,0BAAA,GACjD,MAAE,IAAA,WAAA;AAAA,wBAAA;;;;;;cAQF,uBACT,MAwDM;AAAA,gBAxDNJ,mBAwDM,OAxDN,aAwDM;AAAA,kBAvDJA,mBAwCM,OAxCN,aAwCM;AAAA,qBAvCJK,UAAA,IAAA,GAAAC,mBAsCMG,2BArCUL,MAAA,SAAA,EAAU,iBAAiB,QAAlC,QAAG;0CADZE,mBAsCM,OAAA;AAAA,wBApCH,KAAK,IAAI;AAAA,wBACT,OAAKE,eAAA;AAAA;0BAAsEJ,MAAA,SAAA,EAAU,cAAc,MAAM,IAAI,IAAI,KAAK,IAAA,wCAAA;AAAA,wBAAA;;wBAKvHJ,mBAUM,OAVN,aAUM;AAAA,0BATJA,mBAOQ,SAPR,aAOQ;AAAA,4BANNA,mBAIE,SAAA;AAAA,8BAHA,MAAK;AAAA,8BACJ,SAASI,MAAA,SAAA,EAAU,cAAc,MAAM,IAAI,IAAI,KAAK;AAAA,8BACpD,sBAAQA,MAAA,SAAA,EAAU,YAAY,IAAI,KAAK;AAAA,4BAAA;4BAE1C,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAJ,mBAAgE,QAAA,EAA1D,OAAM,wCAAqC,YAAQ,EAAA;AAAA,0BAAA;0BAE3DA,mBAAmF,QAAnF,aAAmFO,gBAAhC,IAAI,WAAW,IAAG,WAAO,CAAA;AAAA,wBAAA;wBAG9EN,YAKES,aAAA;AAAA,0BAJC,eAAa,IAAI;AAAA,0BAClB,aAAY;AAAA,0BACZ,OAAM;AAAA,0BACL,uBAAkB,CAAA,WAAEN,MAAA,SAAA,EAAU,YAAY,IAAI,OAAO,OAAO,UAAM,EAAA,CAAA;AAAA,wBAAA;wBAGrEJ,mBAUM,OAVN,aAUM;AAAA,2BATJK,UAAA,IAAA,GAAAC,mBAIiBG,2BAHD,IAAI,aAAa,cAAxB,QAAG;gDADZH,mBAIiB,QAAA;AAAA,8BAFd,KAAK;AAAA,8BACN,OAAM;AAAA,4BAAA,mBACJ,GAAG,GAAA,CAAA;AAAA;0BAEC,IAAI,aAAa,SAAM,kBAD/BA,mBAG+C,QAH/C,aAGC,MAACC,gBAAG,IAAI,aAAa,SAAM,CAAA,IAAO,SAAK,CAAA;;;;;kBAKnCH,MAAA,SAAA,EAAU,cAAc,MAAM,OAAI,KAA7CC,UAAA,GAAAC,mBAQM,OARN,aAQM;AAAA,gEARmF,kBAEvF,EAAA;AAAA,oBAAAN,mBAKW,UAAA,MAAAO,gBAJTH,MAAA,SAAA,EAAU,iBAAiB,MAAyB,OAAO,CAAA,MAAKA,MAAA,SAAA,EAAU,cAAc,MAAM,IAAI,EAAE,KAAK,CAAA,EAAsB,IAAI,CAAA,MAAK,EAAE,IAAI,EAAqB,KAAI,KAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;kBAOhKA,MAAA,SAAA,EAAU,cAAc,MAAM,SAAI,kBAA7CE,mBAEM,OAFN,aAA2F,0CAE3F;;;cAKO,wBACT,MAkDM;AAAA,gBAlDNN,mBAkDM,OAlDN,aAkDM;AAAA,kBAjDJA,mBAUM,OAVN,aAUM;AAAA,oBATJA,mBAEO,QAFP,aAEO;AAAA,sBADLA,mBAAoD,gCAAzCI,MAAA,SAAA,EAAU,OAAO,MAAM,MAAM,GAAA,CAAA;AAAA,kEAAY,YACtD,EAAA;AAAA,oBAAA;oBACAJ,mBAEO,QAFP,aAEO;AAAA,sBADLA,mBAA2F,gCAAhFI,MAAA,SAAA,EAAU,OAAO,MAAM,OAAM,CAAE,KAAK,MAAM,MAAM,EAAE,QAAQ,QAAM,CAAA,CAAA,GAAA,CAAA;AAAA,kEAAgB,aAC7F,EAAA;AAAA,oBAAA;oBACYA,MAAA,SAAA,EAAU,gBAAgB,MAAM,SAAM,KAAlDC,UAAA,GAAAC,mBAEO,QAFP,aAEO;AAAA,sBADLN,mBAA6D,gCAAlDI,MAAA,SAAA,EAAU,gBAAgB,MAAM,MAAM,GAAA,CAAA;AAAA,kEAAY,cAC/D,EAAA;AAAA,oBAAA;;kBAGFJ,mBAyBM,OAzBN,aAyBM;AAAA,qBAxBJK,UAAA,IAAA,GAAAC,mBAuBUG,2BAtBQL,MAAA,SAAA,EAAU,OAAO,QAA1B,UAAK;0CADdE,mBAuBU,WAAA;AAAA,wBArBP,KAAK,MAAM;AAAA,wBACZ,OAAM;AAAA,sBAAA;wBAENN,mBAUU,WAVV,aAUU;AAAA,0BATRA,mBAGE,QAAA;AAAA,4BAFA,OAAM;AAAA,4BACL,OAAKW,eAAA,EAAA,iBAAqB,MAAM,OAAK;AAAA,0BAAA;0BAExCX,mBAAwE,QAAxE,aAAwEO,gBAApB,MAAM,IAAI,GAAA,CAAA;AAAA,0BAC9DP,mBAGkC,QAAA;AAAA,4BAFhC,OAAM;AAAA,4BACL,yCAA0B,MAAM,QAAK,MAAA,OAAgB,MAAM,MAAA,CAAK;AAAA,0BAAA,mBAC/D,MAAM,QAAQ,MAAM,GAAA,CAAA;AAAA,wBAAA;wBAE1BA,mBAMM,OANN,aAMM;AAAA,2BALJK,UAAA,IAAA,GAAAC,mBAIoBG,UAAA,MAAAG,WAHD,MAAM,UAAhB,WAAM;gDADfN,mBAIoB,QAAA;AAAA,8BAFjB,KAAK;AAAA,8BACN,OAAM;AAAA,4BAAA,mBACJ,MAAM,GAAA,CAAA;AAAA;;;;;kBAKLF,MAAA,SAAA,EAAU,gBAAgB,MAAM,SAAM,KAAjDC,UAAA,GAAAC,mBASM,OATN,aASM;AAAA,oBARJ,OAAA,EAAA,MAAA,OAAA,EAAA,IAAAN,mBAA0E,OAAA,EAArE,OAAM,yCAAA,GAAyC,oBAAgB,EAAA;AAAA,oBACpEA,mBAMM,OANN,aAMM;AAAA,uBALJK,UAAA,IAAA,GAAAC,mBAIoBG,2BAHDL,MAAA,SAAA,EAAU,gBAAgB,QAApC,WAAM;4CADfE,mBAIoB,QAAA;AAAA,0BAFjB,KAAK;AAAA,0BACN,OAAM;AAAA,wBAAA,mBACJ,MAAM,GAAA,CAAA;AAAA;;;;;cAOP,oBACT,CA2BM,EA5BiB,QAAQ,QAAQ,iBAAU;AAAA,gBACjDN,mBA2BM,OA3BN,aA2BM;AAAA,kBA1BJC,YAEaE,aAAA;AAAA,oBAFD,SAAQ;AAAA,oBAAa,SAAO;AAAA,kBAAA;qCAAc,MAEtD,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,sCAFsD,YAEtD,EAAA;AAAA,oBAAA;;;8CACAH,mBAAuB,OAAA,EAAlB,OAAA,EAAA,QAAA,IAAA,EAAA,GAAe,MAAA,EAAA;AAAA,mBAEX,YAAA,sBADTF,YAMaK,aAAA;AAAA;oBAJX,SAAQ;AAAA,oBACP,SAAO;AAAA,kBAAA;qCACT,MAED,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,sCAFC,UAED,EAAA;AAAA,oBAAA;;;mBAES,WAAA,sBADTL,YAOaK,aAAA;AAAA;oBALX,SAAQ;AAAA,oBACP,WAAW;AAAA,oBACX,SAAK,MAAA;AAAU,iCAAA;AAAc,6BAAA;AAAA,oBAAM;AAAA,kBAAA;qCACrC,MAED,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,sCAFC,UAED,EAAA;AAAA,oBAAA;;;kBAEQ,WAAA,sBADRL,YAMaK,aAAA;AAAA;oBAJX,SAAQ;AAAA,oBACP,SAAO;AAAA,kBAAA;qCACT,MAED,CAAA,GAAA,OAAA,EAAA,MAAA,OAAA,EAAA,IAAA;AAAA,sCAFC,WAED,EAAA;AAAA,oBAAA;;;;;;;;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ import _sfc_main from "./AutoGroupModal.vue.js";
2
+ /* empty css */
3
+ export {
4
+ _sfc_main as default
5
+ };
6
+ //# sourceMappingURL=AutoGroupModal.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoGroupModal.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -23,10 +23,10 @@ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, imp
23
23
  disabled: boolean;
24
24
  loading: boolean;
25
25
  cancelLabel: string;
26
+ canProceed: boolean;
26
27
  isWizard: boolean;
27
28
  isFirst: boolean;
28
29
  isLast: boolean;
29
- canProceed: boolean;
30
30
  submitLabel: string;
31
31
  showCancel: boolean;
32
32
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;