@morscherlab/mint-sdk 1.0.44 → 1.0.45
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/__tests__/components/SmartGroupFieldRecipe.groups.test.d.ts +1 -0
- package/dist/__tests__/components/SmartGroupManual.cohorts.test.d.ts +1 -0
- package/dist/components/AutoGroupModal.adapter.d.ts +42 -0
- package/dist/components/AutoGroupModal.vue.d.ts +1 -105
- package/dist/components/SmartGroup.types.d.ts +71 -0
- package/dist/components/SmartGroupFieldRecipe.groups.d.ts +53 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +37 -0
- package/dist/components/SmartGroupManual.cohorts.d.ts +52 -0
- package/dist/components/SmartGroupManual.vue.d.ts +17 -0
- package/dist/components/SmartGroupModal.vue.d.ts +27 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.js +2 -2
- package/dist/{components-BGVwavdd.js → components-DjfatNJv.js} +2519 -2335
- package/dist/components-DjfatNJv.js.map +1 -0
- package/dist/composables/index.js +2 -2
- package/dist/{composables-C_hPF0Gn.js → composables-CpBhNKHf.js} +7 -147
- package/dist/composables-CpBhNKHf.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/install.js +1 -1
- package/dist/styles.css +12711 -12222
- package/dist/{useProtocolTemplates-BbvlHoPD.js → useProtocolTemplates-C8-YlHj1.js} +206 -66
- package/dist/useProtocolTemplates-C8-YlHj1.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/components/AutoGroupModal.adapter.test.ts +164 -0
- package/src/__tests__/components/SampleSelector.test.ts +176 -16
- package/src/__tests__/components/SmartGroupFieldRecipe.groups.test.ts +96 -0
- package/src/__tests__/components/SmartGroupManual.cohorts.test.ts +97 -0
- package/src/components/AutoGroupModal.adapter.ts +147 -0
- package/src/components/AutoGroupModal.vue +176 -1321
- package/src/components/SampleSelector.vue +8 -23
- package/src/components/SmartGroup.types.ts +93 -0
- package/src/components/SmartGroupFieldRecipe.groups.ts +105 -0
- package/src/components/SmartGroupFieldRecipe.story.vue +58 -0
- package/src/components/SmartGroupFieldRecipe.vue +427 -0
- package/src/components/SmartGroupManual.cohorts.ts +112 -0
- package/src/components/SmartGroupManual.story.vue +55 -0
- package/src/components/SmartGroupManual.vue +398 -0
- package/src/components/SmartGroupModal.story.vue +61 -0
- package/src/components/SmartGroupModal.vue +61 -0
- package/src/components/index.ts +3 -0
- package/src/styles/components/sample-selector.css +1 -5
- package/src/styles/components/smart-group.css +708 -0
- package/src/styles/index.css +1 -1
- package/dist/components-BGVwavdd.js.map +0 -1
- package/dist/composables-C_hPF0Gn.js.map +0 -1
- package/dist/useProtocolTemplates-BbvlHoPD.js.map +0 -1
- package/src/__tests__/components/AutoGroupModal.preview.test.ts +0 -46
- package/src/styles/components/auto-group-modal.css +0 -1336
- /package/dist/__tests__/components/{AutoGroupModal.preview.test.d.ts → AutoGroupModal.adapter.test.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AutoGroupResult, ColumnInfo, ColumnRole } from '../types/auto-group';
|
|
2
|
+
import { SampleGroup } from '../types';
|
|
3
|
+
import { FieldRecipeGroup, QcRoute, SmartGroupField } from './SmartGroupFieldRecipe.groups';
|
|
4
|
+
import { ManualSample } from './SmartGroupManual.cohorts';
|
|
5
|
+
import { SmartGroupSeed } from './SmartGroup.types';
|
|
6
|
+
/** Human label for a column role; defaults to `Factor` when unset. */
|
|
7
|
+
export declare function roleLabel(role?: ColumnRole): string;
|
|
8
|
+
/**
|
|
9
|
+
* Columns worth offering as grouping toggles: factors and replicates, plus any
|
|
10
|
+
* column already enabled in `groupBy` (so a manual group-by choice still shows).
|
|
11
|
+
* Preserves the engine's column order.
|
|
12
|
+
*/
|
|
13
|
+
export declare function candidateColumns(columns: ColumnInfo[], enabled: ReadonlySet<number>): ColumnInfo[];
|
|
14
|
+
/** The candidate column indices in display order, so card index → engine column. */
|
|
15
|
+
export declare function candidateColumnIndices(columns: ColumnInfo[], enabled: ReadonlySet<number>): number[];
|
|
16
|
+
/** Map engine columns to Field Recipe cards + their on/off state (same order). */
|
|
17
|
+
export declare function engineFieldsToCards(columns: ColumnInfo[], enabled: ReadonlySet<number>): {
|
|
18
|
+
fields: SmartGroupField[];
|
|
19
|
+
enabled: boolean[];
|
|
20
|
+
};
|
|
21
|
+
/** Map engine sample groups to the live preview rail shape. */
|
|
22
|
+
export declare function engineGroupsToRail(groups: SampleGroup[]): FieldRecipeGroup[];
|
|
23
|
+
/** Map the Field Recipe QC label to the engine's class disposition routing. */
|
|
24
|
+
export declare function qcRouteToEngine(route: QcRoute): 'overlay' | 'exclude' | 'mix';
|
|
25
|
+
/** Map the engine's QC routing back to the Field Recipe label. */
|
|
26
|
+
export declare function engineToQcRoute(routing: 'overlay' | 'exclude' | 'mix'): QcRoute;
|
|
27
|
+
/**
|
|
28
|
+
* Seed the manual cohort builder from existing groups. The hierarchical group
|
|
29
|
+
* name (`group/sub/sub2`) splits into the three cohort levels; colour carries
|
|
30
|
+
* over. One seed entry per sample. Names with more than three `/`-segments keep
|
|
31
|
+
* the remainder in `sub2` (rejoined with `/`) so the round-trip is lossless —
|
|
32
|
+
* `manualSamplesToResult` re-joins on `/`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function seedFromGroups(groups: SampleGroup[]): Record<string, SmartGroupSeed>;
|
|
35
|
+
/**
|
|
36
|
+
* Convert the manual cohort assignments back into an `AutoGroupResult`.
|
|
37
|
+
* `baseGroups` (the modal's incoming `groups` prop) are preserved in their
|
|
38
|
+
* original order and colour — including any that end up empty — so re-opening
|
|
39
|
+
* the modal and moving samples between cohorts is non-destructive. Newly created
|
|
40
|
+
* cohorts are appended in first-seen order.
|
|
41
|
+
*/
|
|
42
|
+
export declare function manualSamplesToResult(samples: ManualSample[], baseGroups?: SampleGroup[]): AutoGroupResult;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { nextTick } from 'vue';
|
|
2
|
-
import { WizardStep } from '../types/components';
|
|
3
1
|
import { AutoGroupResult } from '../types/auto-group';
|
|
4
2
|
import { SampleGroup } from '../types';
|
|
5
3
|
type GroupingWorkflow = 'auto' | 'manual';
|
|
@@ -24,107 +22,5 @@ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, imp
|
|
|
24
22
|
designData: Record<string, unknown>;
|
|
25
23
|
initialMode: GroupingWorkflow;
|
|
26
24
|
experimentId: number;
|
|
27
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
28
|
-
wizardRef: ({
|
|
29
|
-
$: import('vue').ComponentInternalInstance;
|
|
30
|
-
$data: {};
|
|
31
|
-
$props: {
|
|
32
|
-
readonly steps: WizardStep[];
|
|
33
|
-
readonly modelValue?: number | undefined;
|
|
34
|
-
readonly linear?: boolean | undefined;
|
|
35
|
-
readonly showProgress?: boolean | undefined;
|
|
36
|
-
readonly showStepNumbers?: boolean | undefined;
|
|
37
|
-
readonly size?: "sm" | "md" | "lg" | undefined;
|
|
38
|
-
readonly "onUpdate:modelValue"?: ((index: number) => any) | undefined;
|
|
39
|
-
readonly onCancel?: (() => any) | undefined;
|
|
40
|
-
readonly onComplete?: (() => any) | undefined;
|
|
41
|
-
readonly "onStep-change"?: ((change: [from: number, to: number]) => any) | undefined;
|
|
42
|
-
} & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps;
|
|
43
|
-
$attrs: {
|
|
44
|
-
[x: string]: unknown;
|
|
45
|
-
};
|
|
46
|
-
$refs: {
|
|
47
|
-
[x: string]: unknown;
|
|
48
|
-
};
|
|
49
|
-
$slots: Readonly<{
|
|
50
|
-
[name: string]: import('vue').Slot<any> | undefined;
|
|
51
|
-
}>;
|
|
52
|
-
$root: import('vue').ComponentPublicInstance | null;
|
|
53
|
-
$parent: import('vue').ComponentPublicInstance | null;
|
|
54
|
-
$host: Element | null;
|
|
55
|
-
$emit: ((event: "update:modelValue", index: number) => void) & ((event: "cancel") => void) & ((event: "complete") => void) & ((event: "step-change", change: [from: number, to: number]) => void);
|
|
56
|
-
$el: HTMLDivElement;
|
|
57
|
-
$options: import('vue').ComponentOptionsBase<Readonly<import('./StepWizard.vue').Props> & Readonly<{
|
|
58
|
-
"onUpdate:modelValue"?: ((index: number) => any) | undefined;
|
|
59
|
-
onCancel?: (() => any) | undefined;
|
|
60
|
-
onComplete?: (() => any) | undefined;
|
|
61
|
-
"onStep-change"?: ((change: [from: number, to: number]) => any) | undefined;
|
|
62
|
-
}>, {
|
|
63
|
-
setStepValid: (index: number, valid: boolean) => void;
|
|
64
|
-
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
65
|
-
"update:modelValue": (index: number) => any;
|
|
66
|
-
cancel: () => any;
|
|
67
|
-
complete: () => any;
|
|
68
|
-
"step-change": (change: [from: number, to: number]) => any;
|
|
69
|
-
}, string, {
|
|
70
|
-
size: "sm" | "md" | "lg";
|
|
71
|
-
modelValue: number;
|
|
72
|
-
linear: boolean;
|
|
73
|
-
showProgress: boolean;
|
|
74
|
-
showStepNumbers: boolean;
|
|
75
|
-
}, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
|
|
76
|
-
beforeCreate?: (() => void) | (() => void)[];
|
|
77
|
-
created?: (() => void) | (() => void)[];
|
|
78
|
-
beforeMount?: (() => void) | (() => void)[];
|
|
79
|
-
mounted?: (() => void) | (() => void)[];
|
|
80
|
-
beforeUpdate?: (() => void) | (() => void)[];
|
|
81
|
-
updated?: (() => void) | (() => void)[];
|
|
82
|
-
activated?: (() => void) | (() => void)[];
|
|
83
|
-
deactivated?: (() => void) | (() => void)[];
|
|
84
|
-
beforeDestroy?: (() => void) | (() => void)[];
|
|
85
|
-
beforeUnmount?: (() => void) | (() => void)[];
|
|
86
|
-
destroyed?: (() => void) | (() => void)[];
|
|
87
|
-
unmounted?: (() => void) | (() => void)[];
|
|
88
|
-
renderTracked?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
|
|
89
|
-
renderTriggered?: ((e: import('vue').DebuggerEvent) => void) | ((e: import('vue').DebuggerEvent) => void)[];
|
|
90
|
-
errorCaptured?: ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void) | ((err: unknown, instance: import('vue').ComponentPublicInstance | null, info: string) => boolean | void)[];
|
|
91
|
-
};
|
|
92
|
-
$forceUpdate: () => void;
|
|
93
|
-
$nextTick: typeof nextTick;
|
|
94
|
-
$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;
|
|
95
|
-
} & Readonly<{
|
|
96
|
-
size: "sm" | "md" | "lg";
|
|
97
|
-
modelValue: number;
|
|
98
|
-
linear: boolean;
|
|
99
|
-
showProgress: boolean;
|
|
100
|
-
showStepNumbers: boolean;
|
|
101
|
-
}> & Omit<Readonly<import('./StepWizard.vue').Props> & Readonly<{
|
|
102
|
-
"onUpdate:modelValue"?: ((index: number) => any) | undefined;
|
|
103
|
-
onCancel?: (() => any) | undefined;
|
|
104
|
-
onComplete?: (() => any) | undefined;
|
|
105
|
-
"onStep-change"?: ((change: [from: number, to: number]) => any) | undefined;
|
|
106
|
-
}>, "setStepValid" | ("size" | "modelValue" | "linear" | "showProgress" | "showStepNumbers")> & import('vue').ShallowUnwrapRef<{
|
|
107
|
-
setStepValid: (index: number, valid: boolean) => void;
|
|
108
|
-
}> & {} & import('vue').ComponentCustomProperties & {} & {
|
|
109
|
-
$slots: Partial<Record<`step-${string}`, (_: {
|
|
110
|
-
step: WizardStep;
|
|
111
|
-
index: number;
|
|
112
|
-
}) => any>> & {
|
|
113
|
-
progress?(_: {
|
|
114
|
-
steps: WizardStep[];
|
|
115
|
-
current: number;
|
|
116
|
-
states: import('..').WizardStepState[];
|
|
117
|
-
}): any;
|
|
118
|
-
navigation?(_: {
|
|
119
|
-
goBack: () => void;
|
|
120
|
-
goNext: () => void;
|
|
121
|
-
finish: () => void;
|
|
122
|
-
cancel: () => void;
|
|
123
|
-
isFirst: boolean;
|
|
124
|
-
isLast: boolean;
|
|
125
|
-
canProceed: boolean;
|
|
126
|
-
}): any;
|
|
127
|
-
};
|
|
128
|
-
}) | null;
|
|
129
|
-
}, any>;
|
|
25
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
130
26
|
export default _default;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { FieldRecipeGroup, QcRoute, SmartGroupField, SmartGroupSampleRecord } from './SmartGroupFieldRecipe.groups';
|
|
2
|
+
import { ManualSample } from './SmartGroupManual.cohorts';
|
|
3
|
+
export type SmartGroupMode = 'auto' | 'manual';
|
|
4
|
+
/** A colour swatch in the manual assignment bar. */
|
|
5
|
+
export interface ManualPaletteEntry {
|
|
6
|
+
/** CSS colour value (e.g. a `var(--grp-*)` reference). */
|
|
7
|
+
c: string;
|
|
8
|
+
/** Human-readable swatch key for the `aria-label`. */
|
|
9
|
+
k: string;
|
|
10
|
+
}
|
|
11
|
+
/** Initial cohort assignment for a sample, keyed by sample name. */
|
|
12
|
+
export interface SmartGroupSeed {
|
|
13
|
+
group?: string;
|
|
14
|
+
sub?: string;
|
|
15
|
+
sub2?: string;
|
|
16
|
+
color?: string;
|
|
17
|
+
}
|
|
18
|
+
/** The QC summary chip shown in the rail when QC is not mixed into groups. */
|
|
19
|
+
export interface FieldRecipeQcChip {
|
|
20
|
+
name: string;
|
|
21
|
+
count: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SmartGroupFieldRecipeProps {
|
|
24
|
+
/** Sample records behind the experiment (one row per real sample). */
|
|
25
|
+
samples?: SmartGroupSampleRecord[];
|
|
26
|
+
/** Candidate grouping fields with role + value preview. */
|
|
27
|
+
fields?: SmartGroupField[];
|
|
28
|
+
/** Experiment code shown in the header; omitted from the subtitle when empty. */
|
|
29
|
+
experimentLabel?: string;
|
|
30
|
+
/** Sample count shown in the header (real + QC). */
|
|
31
|
+
headerCount?: number;
|
|
32
|
+
/** Which fields start switched on; defaults to every non-replicate field. */
|
|
33
|
+
initialOn?: boolean[];
|
|
34
|
+
/** Initial QC routing. */
|
|
35
|
+
initialRoute?: QcRoute;
|
|
36
|
+
/** Group colours, cycled in group order. */
|
|
37
|
+
palette?: string[];
|
|
38
|
+
/** Colour used for the QC pool. */
|
|
39
|
+
qcColor?: string;
|
|
40
|
+
/** Controls the field toggles; when set, clicking a toggle emits `toggle`. */
|
|
41
|
+
enabled?: boolean[];
|
|
42
|
+
/** Pre-computed resulting groups; when set, the rail renders these directly. */
|
|
43
|
+
groups?: FieldRecipeGroup[];
|
|
44
|
+
/** QC summary chip to show in the rail; `null` hides it (e.g. when mixed). */
|
|
45
|
+
qcChip?: FieldRecipeQcChip | null;
|
|
46
|
+
/** Controlled QC routing; when set, changing the select emits `update:route`. */
|
|
47
|
+
route?: QcRoute;
|
|
48
|
+
/** QC sample count for the footer hint; defaults to `headerCount - samples`. */
|
|
49
|
+
qcCount?: number;
|
|
50
|
+
/** Whether the template-download menu items are enabled (default `true`). */
|
|
51
|
+
canDownloadTemplate?: boolean;
|
|
52
|
+
/** Show a loading state in the main body (e.g. while experiment data loads). */
|
|
53
|
+
loading?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface FieldRecipeApplyPayload {
|
|
56
|
+
groups: FieldRecipeGroup[];
|
|
57
|
+
route: QcRoute;
|
|
58
|
+
sampleTotal: number;
|
|
59
|
+
activeFactors: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface SmartGroupManualProps {
|
|
62
|
+
/** Flat list of sample names to group. */
|
|
63
|
+
sampleNames?: string[];
|
|
64
|
+
/** Initial assignments keyed by sample name. */
|
|
65
|
+
seed?: Record<string, SmartGroupSeed>;
|
|
66
|
+
/** Colour swatches offered in the assignment bar. */
|
|
67
|
+
palette?: ManualPaletteEntry[];
|
|
68
|
+
}
|
|
69
|
+
export interface ManualDonePayload {
|
|
70
|
+
samples: ManualSample[];
|
|
71
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure grouping logic for SmartGroupFieldRecipe (the "auto" / Field Recipe mode).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the design prototype's live grouping engine: groups are formed by
|
|
5
|
+
* joining the values of whichever fields are switched on, in field order.
|
|
6
|
+
* Kept framework-free so it is unit-testable in isolation from the component.
|
|
7
|
+
*/
|
|
8
|
+
/** A field/factor the user can group by. */
|
|
9
|
+
export interface SmartGroupField {
|
|
10
|
+
/** Column key as it appears in each sample record. */
|
|
11
|
+
key: string;
|
|
12
|
+
/** Display role, e.g. `Factor` or `Replicate`. */
|
|
13
|
+
role: string;
|
|
14
|
+
/** Comma-separated preview of the field's distinct values. */
|
|
15
|
+
vals: string;
|
|
16
|
+
/** Whether this field is a replicate dimension (grouping by it shatters groups). */
|
|
17
|
+
rep: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** A single sample as a flat key → value record. */
|
|
20
|
+
export type SmartGroupSampleRecord = Record<string, string>;
|
|
21
|
+
/** A resolved group in the live preview rail. */
|
|
22
|
+
export interface FieldRecipeGroup {
|
|
23
|
+
name: string;
|
|
24
|
+
count: number;
|
|
25
|
+
color: string;
|
|
26
|
+
}
|
|
27
|
+
/** How QC samples are routed relative to the biological groups. */
|
|
28
|
+
export type QcRoute = 'Overlay only' | 'Exclude' | 'Mix into groups';
|
|
29
|
+
/** Kind of inline summary callout to render. */
|
|
30
|
+
export type FieldRecipeSummaryKind = 'mute' | 'warn' | 'info';
|
|
31
|
+
export interface FieldRecipeSummary {
|
|
32
|
+
kind: FieldRecipeSummaryKind;
|
|
33
|
+
/** Number of base (non-QC) groups the current toggles produce. */
|
|
34
|
+
groupCount: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build the ordered group list from whichever fields are switched on.
|
|
38
|
+
* Returns an empty list when no field is active.
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeFieldGroups(samples: SmartGroupSampleRecord[], fields: SmartGroupField[], on: boolean[], palette: string[]): FieldRecipeGroup[];
|
|
41
|
+
/**
|
|
42
|
+
* Append the QC pool group when QC is mixed into the biological groups.
|
|
43
|
+
* `Overlay only` and `Exclude` leave the group list untouched.
|
|
44
|
+
*/
|
|
45
|
+
export declare function appendQcGroup(groups: FieldRecipeGroup[], route: QcRoute, qcColor: string, qcCount?: number): FieldRecipeGroup[];
|
|
46
|
+
/** Total samples the grouping applies to: QC is dropped only when excluded. */
|
|
47
|
+
export declare function sampleTotalFor(route: QcRoute, realCount?: number, qcCount?: number): number;
|
|
48
|
+
/** Decide which inline summary callout the Field Recipe should show. */
|
|
49
|
+
export declare function fieldRecipeSummary(input: {
|
|
50
|
+
activeFactors: string[];
|
|
51
|
+
repOn: boolean;
|
|
52
|
+
baseGroups: FieldRecipeGroup[];
|
|
53
|
+
}): FieldRecipeSummary;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { QcRoute, SmartGroupField, SmartGroupSampleRecord } from './SmartGroupFieldRecipe.groups';
|
|
2
|
+
import { FieldRecipeApplyPayload, SmartGroupFieldRecipeProps } from './SmartGroup.types';
|
|
3
|
+
declare const _default: import('vue').DefineComponent<SmartGroupFieldRecipeProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
4
|
+
toggle: (index: number) => any;
|
|
5
|
+
cancel: () => any;
|
|
6
|
+
close: () => any;
|
|
7
|
+
apply: (payload: FieldRecipeApplyPayload) => any;
|
|
8
|
+
manual: () => any;
|
|
9
|
+
"update:route": (route: QcRoute) => any;
|
|
10
|
+
"csv-file": (file: File) => any;
|
|
11
|
+
"download-template": () => any;
|
|
12
|
+
"download-prefilled": () => any;
|
|
13
|
+
}, string, import('vue').PublicProps, Readonly<SmartGroupFieldRecipeProps> & Readonly<{
|
|
14
|
+
onToggle?: ((index: number) => any) | undefined;
|
|
15
|
+
onCancel?: (() => any) | undefined;
|
|
16
|
+
onClose?: (() => any) | undefined;
|
|
17
|
+
onApply?: ((payload: FieldRecipeApplyPayload) => any) | undefined;
|
|
18
|
+
onManual?: (() => any) | undefined;
|
|
19
|
+
"onUpdate:route"?: ((route: QcRoute) => any) | undefined;
|
|
20
|
+
"onCsv-file"?: ((file: File) => any) | undefined;
|
|
21
|
+
"onDownload-template"?: (() => any) | undefined;
|
|
22
|
+
"onDownload-prefilled"?: (() => any) | undefined;
|
|
23
|
+
}>, {
|
|
24
|
+
fields: SmartGroupField[];
|
|
25
|
+
loading: boolean;
|
|
26
|
+
samples: SmartGroupSampleRecord[];
|
|
27
|
+
palette: string[];
|
|
28
|
+
experimentLabel: string;
|
|
29
|
+
headerCount: number;
|
|
30
|
+
initialRoute: QcRoute;
|
|
31
|
+
qcColor: string;
|
|
32
|
+
canDownloadTemplate: boolean;
|
|
33
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
34
|
+
csvMenuRoot: HTMLDivElement;
|
|
35
|
+
fileInput: HTMLInputElement;
|
|
36
|
+
}, HTMLDivElement>;
|
|
37
|
+
export default _default;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure cohort logic for SmartGroupManual (the "manual" grouping mode).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the design prototype's selection-first model: a flat list of samples,
|
|
5
|
+
* each optionally assigned to a group / subgroup / sub-subgroup, derived into a
|
|
6
|
+
* three-level cohort tree for the right rail. Framework-free for unit testing.
|
|
7
|
+
*/
|
|
8
|
+
/** A sample with its (optional) manual cohort assignment. */
|
|
9
|
+
export interface ManualSample {
|
|
10
|
+
name: string;
|
|
11
|
+
group: string | null;
|
|
12
|
+
sub: string | null;
|
|
13
|
+
sub2: string | null;
|
|
14
|
+
color: string | null;
|
|
15
|
+
}
|
|
16
|
+
/** Which slice of the sample list is shown. */
|
|
17
|
+
export type ManualFilter = 'all' | 'unassigned' | 'assigned';
|
|
18
|
+
/** A sample paired with its index in the source list (so the UI can toggle it). */
|
|
19
|
+
export interface ManualMatch {
|
|
20
|
+
sample: ManualSample;
|
|
21
|
+
index: number;
|
|
22
|
+
}
|
|
23
|
+
/** Second-level subgroup node: a sub-subgroup name → count map. */
|
|
24
|
+
export interface CohortSubNode {
|
|
25
|
+
total: number;
|
|
26
|
+
subs2: Map<string, number>;
|
|
27
|
+
}
|
|
28
|
+
/** Top-level cohort node: colour, total, and its subgroups. */
|
|
29
|
+
export interface CohortNode {
|
|
30
|
+
color: string | null;
|
|
31
|
+
total: number;
|
|
32
|
+
subs: Map<string, CohortSubNode>;
|
|
33
|
+
}
|
|
34
|
+
/** The assignment values applied to a selection. */
|
|
35
|
+
export interface CohortAssignment {
|
|
36
|
+
grp: string;
|
|
37
|
+
sub: string;
|
|
38
|
+
sub2: string;
|
|
39
|
+
color: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Build the group → subgroup → sub-subgroup tree from assigned samples.
|
|
43
|
+
* Unassigned samples are ignored. Missing sub/sub2 values collapse to `—`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildCohortTree(samples: ManualSample[]): Map<string, CohortNode>;
|
|
46
|
+
/** Filter the sample list by a case-insensitive name query and assignment state. */
|
|
47
|
+
export declare function filterSamples(samples: ManualSample[], query: string, filter: ManualFilter): ManualMatch[];
|
|
48
|
+
/**
|
|
49
|
+
* Apply a cohort assignment to the selected sample indices, returning a new list.
|
|
50
|
+
* Blank subgroup / sub-subgroup values become `null`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function assignSamples(samples: ManualSample[], selected: ReadonlySet<number>, assignment: CohortAssignment): ManualSample[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ManualDonePayload, SmartGroupManualProps, ManualPaletteEntry, SmartGroupSeed } from './SmartGroup.types';
|
|
2
|
+
declare const _default: import('vue').DefineComponent<SmartGroupManualProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
3
|
+
auto: () => any;
|
|
4
|
+
done: (payload: ManualDonePayload) => any;
|
|
5
|
+
cancel: () => any;
|
|
6
|
+
close: () => any;
|
|
7
|
+
}, string, import('vue').PublicProps, Readonly<SmartGroupManualProps> & Readonly<{
|
|
8
|
+
onAuto?: (() => any) | undefined;
|
|
9
|
+
onDone?: ((payload: ManualDonePayload) => any) | undefined;
|
|
10
|
+
onCancel?: (() => any) | undefined;
|
|
11
|
+
onClose?: (() => any) | undefined;
|
|
12
|
+
}>, {
|
|
13
|
+
palette: ManualPaletteEntry[];
|
|
14
|
+
sampleNames: string[];
|
|
15
|
+
seed: Record<string, SmartGroupSeed>;
|
|
16
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
17
|
+
export default _default;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { FieldRecipeApplyPayload, ManualDonePayload, SmartGroupFieldRecipeProps, SmartGroupManualProps } from './SmartGroup.types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
/** Props forwarded to the auto-mode Field Recipe. */
|
|
4
|
+
auto?: Partial<SmartGroupFieldRecipeProps>;
|
|
5
|
+
/** Props forwarded to the manual cohort builder. */
|
|
6
|
+
manual?: Partial<SmartGroupManualProps>;
|
|
7
|
+
};
|
|
8
|
+
type __VLS_PublicProps = {
|
|
9
|
+
'mode'?: 'auto' | 'manual';
|
|
10
|
+
} & __VLS_Props;
|
|
11
|
+
declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
12
|
+
done: (payload: ManualDonePayload) => any;
|
|
13
|
+
cancel: () => any;
|
|
14
|
+
close: () => any;
|
|
15
|
+
apply: (payload: FieldRecipeApplyPayload) => any;
|
|
16
|
+
"update:mode": (value: "auto" | "manual") => any;
|
|
17
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
18
|
+
onDone?: ((payload: ManualDonePayload) => any) | undefined;
|
|
19
|
+
onCancel?: (() => any) | undefined;
|
|
20
|
+
onClose?: (() => any) | undefined;
|
|
21
|
+
onApply?: ((payload: FieldRecipeApplyPayload) => any) | undefined;
|
|
22
|
+
"onUpdate:mode"?: ((value: "auto" | "manual") => any) | undefined;
|
|
23
|
+
}>, {
|
|
24
|
+
auto: Partial<SmartGroupFieldRecipeProps>;
|
|
25
|
+
manual: Partial<SmartGroupManualProps>;
|
|
26
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
27
|
+
export default _default;
|
|
@@ -62,6 +62,9 @@ export { default as ExperimentTimeline } from './ExperimentTimeline.vue';
|
|
|
62
62
|
export { default as SampleSelector } from './SampleSelector.vue';
|
|
63
63
|
export { default as AutoGroupModal } from './AutoGroupModal.vue';
|
|
64
64
|
export { default as GroupAssigner } from './GroupAssigner.vue';
|
|
65
|
+
export { default as SmartGroupModal } from './SmartGroupModal.vue';
|
|
66
|
+
export { default as SmartGroupFieldRecipe } from './SmartGroupFieldRecipe.vue';
|
|
67
|
+
export { default as SmartGroupManual } from './SmartGroupManual.vue';
|
|
65
68
|
export { default as MoleculeInput } from './MoleculeInput.vue';
|
|
66
69
|
export { default as ConcentrationInput } from './ConcentrationInput.vue';
|
|
67
70
|
export { default as DoseCalculator } from './DoseCalculator.vue';
|
package/dist/components/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as LoadingSpinner_default, A as ReagentEditor_default, B as Avatar_default, Ct as Calendar_default, D as ScientificNumber_default, Dt as ColorSlider_default, E as ChemicalFormula_default, Et as BaseTabs_default, F as BioTemplatePackWorkspaceView_default, G as DoseDesignWorkspaceView_default, H as StatusIndicator_default, I as BioTemplateExperimentWorkspaceView_default, J as ScheduleCalendar_default, K as ControlWorkspaceView_default, L as BioTemplateRenderer_default, M as GroupAssigner_default, N as RackEditor_default, O as ProtocolStepEditor_default, P as BioTemplatePresetWorkspaceView_default, Q as SmartGroupFieldRecipe_default, R as ChartContainer_default, St as DataFrame_default, Tt as SegmentedControl_default, U as Divider_default, V as ProgressBar_default, W as AppContainer_default, X as AutoGroupModal_default, Y as SampleSelector_default, Z as SmartGroupManual_default, _ as InstrumentStateBadge_default, _t as CollapsibleCard_default, a as ExperimentDataViewer_default, at as DoseCalculator_default, bt as AppToastContainer_default, c as LcmsSequenceTable_default, ct as AppLayout_default, dt as FormActions_default, et as ReagentList_default, ft as StepWizard_default, g as InstrumentStatusCard_default, gt as PluginIcon_default, ht as AppAvatarMenu_default, i as TimeRangeInput_default, it as ExperimentTimeline_default, j as SmartGroupModal_default, k as SampleHierarchyTree_default, lt as AppSidebar_default, mt as AppPluginSwitcher_default, n as FitPanel_default, nt as SampleLegend_default, o as BatchProgressList_default, ot as PluginWorkspaceView_default, pt as AppTopBar_default, q as ComponentBindingRenderer_default, r as ResourceCard_default, rt as WellPlate_default, s as AuditTrail_default, st as MobileSupportGate_default, tt as PlateMapEditor_default, ut as FormBuilder_default, v as InstrumentAlertLog_default, vt as ThemeToggle_default, wt as DropdownButton_default, xt as AlertBox_default, y as SequenceProgressBar_default, yt as IconButton_default, z as Breadcrumb_default } from "../components-DjfatNJv.js";
|
|
2
2
|
import { t as BaseButton_default } from "../BaseButton-Dgqrze41.js";
|
|
3
3
|
import { r as BaseInput_default, t as BaseSelect_default } from "../BaseSelect-ekgr9fDo.js";
|
|
4
4
|
import { B as TagsInput_default, L as DateTimePicker_default, M as SequenceInput_default, O as ConcentrationInput_default, P as FormulaInput_default, R as FileUploader_default, V as TimePicker_default, at as MultiSelect_default, ct as BaseSlider_default, dt as BaseCheckbox_default, ft as Tooltip_default, it as DatePicker_default, j as MoleculeInput_default, k as UnitInput_default, lt as BaseRadioGroup_default, pt as BaseTextarea_default, ut as BaseToggle_default, z as NumberInput_default } from "../useControlSchema-BZNdalmL.js";
|
|
@@ -6,4 +6,4 @@ import { o as FormField_default, t as SettingsModal_default } from "../SettingsM
|
|
|
6
6
|
import { t as BaseModal_default } from "../BaseModal-B9UA8Y_I.js";
|
|
7
7
|
import { a as BasePill_default, i as Skeleton_default, n as ExperimentCodeBadge_default, r as EmptyState_default, t as ExperimentSelectorModal_default } from "../ExperimentSelectorModal-B2qek_YG.js";
|
|
8
8
|
import { n as ConfirmDialog_default, t as ExperimentPopover_default } from "../ExperimentPopover-BbPkIFsI.js";
|
|
9
|
-
export { AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate };
|
|
9
|
+
export { AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppPluginSwitcher_default as AppPluginSwitcher, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, AuditTrail_default as AuditTrail, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ColorSlider_default as ColorSlider, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, DropdownButton_default as DropdownButton, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentAlertLog_default as InstrumentAlertLog, InstrumentStateBadge_default as InstrumentStateBadge, InstrumentStatusCard_default as InstrumentStatusCard, LcmsSequenceTable_default as LcmsSequenceTable, LoadingSpinner_default as LoadingSpinner, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PlateMapEditor_default as PlateMapEditor, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, RackEditor_default as RackEditor, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate };
|