@morscherlab/mld-sdk 0.7.2 → 0.7.3
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/BaseInput.vue.d.ts +1 -0
- package/dist/components/BaseInput.vue.js +5 -2
- package/dist/components/BaseInput.vue.js.map +1 -1
- package/dist/components/BaseModal.vue.d.ts +6 -2
- package/dist/components/BaseModal.vue.js +54 -10
- package/dist/components/BaseModal.vue.js.map +1 -1
- package/dist/components/BaseSelect.vue.d.ts +1 -0
- package/dist/components/BaseSelect.vue.js +5 -2
- package/dist/components/BaseSelect.vue.js.map +1 -1
- package/dist/components/BaseTextarea.vue.d.ts +1 -0
- package/dist/components/BaseTextarea.vue.js +5 -2
- package/dist/components/BaseTextarea.vue.js.map +1 -1
- package/dist/components/ExperimentCodeBadge.vue.d.ts +8 -0
- package/dist/components/ExperimentCodeBadge.vue.js +19 -0
- package/dist/components/ExperimentCodeBadge.vue.js.map +1 -0
- package/dist/components/ExperimentCodeBadge.vue3.js +6 -0
- package/dist/components/ExperimentCodeBadge.vue3.js.map +1 -0
- package/dist/components/ExperimentDataViewer.vue.d.ts +29 -0
- package/dist/components/ExperimentDataViewer.vue.js +258 -0
- package/dist/components/ExperimentDataViewer.vue.js.map +1 -0
- package/dist/components/ExperimentDataViewer.vue3.js +6 -0
- package/dist/components/ExperimentDataViewer.vue3.js.map +1 -0
- package/dist/components/FormField.vue.d.ts +4 -1
- package/dist/components/FormField.vue.js +24 -12
- package/dist/components/FormField.vue.js.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +14 -8
- package/dist/components/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +14 -8
- package/dist/index.js.map +1 -1
- package/dist/styles.css +298 -30
- package/dist/types/components.d.ts +23 -0
- package/dist/types/index.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/BaseInput.vue +3 -0
- package/src/components/BaseModal.vue +59 -10
- package/src/components/BaseSelect.vue +3 -0
- package/src/components/BaseTextarea.vue +3 -0
- package/src/components/ExperimentCodeBadge.vue +20 -0
- package/src/components/ExperimentDataViewer.vue +250 -0
- package/src/components/FormField.vue +17 -4
- package/src/components/index.ts +4 -0
- package/src/index.ts +10 -0
- package/src/styles/components/button.css +4 -4
- package/src/styles/components/experiment-code-badge.css +13 -0
- package/src/styles/components/experiment-data-viewer.css +131 -0
- package/src/styles/components/modal.css +1 -1
- package/src/styles/components/select.css +1 -1
- package/src/styles/components/slider.css +4 -8
- package/src/styles/components/textarea.css +5 -1
- package/src/styles/index.css +2 -0
- package/src/styles/variables.css +7 -2
- package/src/types/components.ts +27 -0
- package/src/types/index.ts +4 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { defineComponent, ref, watch, computed, openBlock, createElementBlock, createElementVNode, createVNode, createBlock, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList } from "vue";
|
|
2
|
+
import _sfc_main$4 from "./SampleHierarchyTree.vue.js";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import _sfc_main$3 from "./DataFrame.vue.js";
|
|
5
|
+
/* empty css */
|
|
6
|
+
import _sfc_main$1 from "./SegmentedControl.vue.js";
|
|
7
|
+
/* empty css */
|
|
8
|
+
import _sfc_main$2 from "./BaseButton.vue.js";
|
|
9
|
+
/* empty css */
|
|
10
|
+
const _hoisted_1 = { class: "mld-data-viewer" };
|
|
11
|
+
const _hoisted_2 = { class: "mld-data-viewer__header" };
|
|
12
|
+
const _hoisted_3 = { class: "mld-data-viewer__controls" };
|
|
13
|
+
const _hoisted_4 = { class: "mld-data-viewer__actions" };
|
|
14
|
+
const _hoisted_5 = { class: "mld-data-viewer__content" };
|
|
15
|
+
const _hoisted_6 = {
|
|
16
|
+
key: 0,
|
|
17
|
+
class: "mld-data-viewer__loading"
|
|
18
|
+
};
|
|
19
|
+
const _hoisted_7 = {
|
|
20
|
+
key: 0,
|
|
21
|
+
class: "mld-summary"
|
|
22
|
+
};
|
|
23
|
+
const _hoisted_8 = {
|
|
24
|
+
key: 0,
|
|
25
|
+
class: "mld-summary__metadata"
|
|
26
|
+
};
|
|
27
|
+
const _hoisted_9 = { class: "mld-summary__pill-key" };
|
|
28
|
+
const _hoisted_10 = { class: "mld-summary__pill-value" };
|
|
29
|
+
const _hoisted_11 = { class: "mld-summary__group-header" };
|
|
30
|
+
const _hoisted_12 = { class: "mld-summary__group-label" };
|
|
31
|
+
const _hoisted_13 = { class: "mld-summary__group-count" };
|
|
32
|
+
const _hoisted_14 = {
|
|
33
|
+
key: 0,
|
|
34
|
+
class: "mld-summary__group-meta"
|
|
35
|
+
};
|
|
36
|
+
const _hoisted_15 = { class: "mld-summary__pill-key" };
|
|
37
|
+
const _hoisted_16 = { class: "mld-summary__pill-value" };
|
|
38
|
+
const _hoisted_17 = { class: "mld-summary__table-header" };
|
|
39
|
+
const _hoisted_18 = { class: "mld-summary__section-label" };
|
|
40
|
+
const _hoisted_19 = { class: "mld-summary__section-count" };
|
|
41
|
+
const _hoisted_20 = {
|
|
42
|
+
key: 3,
|
|
43
|
+
class: "mld-data-viewer__empty"
|
|
44
|
+
};
|
|
45
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
46
|
+
__name: "ExperimentDataViewer",
|
|
47
|
+
props: {
|
|
48
|
+
treeData: {},
|
|
49
|
+
tableData: {},
|
|
50
|
+
tableColumns: {},
|
|
51
|
+
summaryData: {},
|
|
52
|
+
defaultView: { default: "summary" },
|
|
53
|
+
title: { default: "Data" },
|
|
54
|
+
pluginName: {},
|
|
55
|
+
pluginRoutePrefix: {},
|
|
56
|
+
experimentId: {},
|
|
57
|
+
loading: { type: Boolean, default: false },
|
|
58
|
+
downloadJsonUrl: {},
|
|
59
|
+
downloadCsvUrl: {}
|
|
60
|
+
},
|
|
61
|
+
emits: ["open-plugin", "download-json", "download-csv"],
|
|
62
|
+
setup(__props, { emit: __emit }) {
|
|
63
|
+
const props = __props;
|
|
64
|
+
const emit = __emit;
|
|
65
|
+
const viewMode = ref(props.defaultView);
|
|
66
|
+
watch(() => props.defaultView, (val) => {
|
|
67
|
+
viewMode.value = val;
|
|
68
|
+
});
|
|
69
|
+
const viewOptions = computed(() => {
|
|
70
|
+
const opts = [];
|
|
71
|
+
if (props.summaryData) {
|
|
72
|
+
opts.push({ value: "summary", label: "Summary" });
|
|
73
|
+
}
|
|
74
|
+
opts.push({ value: "tree", label: "Tree" });
|
|
75
|
+
opts.push({ value: "table", label: "Table" });
|
|
76
|
+
return opts;
|
|
77
|
+
});
|
|
78
|
+
watch(() => props.summaryData, (val) => {
|
|
79
|
+
if (!val && viewMode.value === "summary") {
|
|
80
|
+
viewMode.value = "tree";
|
|
81
|
+
}
|
|
82
|
+
}, { immediate: true });
|
|
83
|
+
const hasTableData = computed(
|
|
84
|
+
() => props.tableData && props.tableData.length > 0
|
|
85
|
+
);
|
|
86
|
+
const metadataEntries = computed(() => {
|
|
87
|
+
var _a;
|
|
88
|
+
if (!((_a = props.summaryData) == null ? void 0 : _a.metadata)) return [];
|
|
89
|
+
return Object.entries(props.summaryData.metadata).filter(([, v]) => v !== null && v !== void 0 && v !== "").map(([key, value]) => ({
|
|
90
|
+
key: key.replace(/_/g, " "),
|
|
91
|
+
value: String(value)
|
|
92
|
+
}));
|
|
93
|
+
});
|
|
94
|
+
function humanizeColumn(col) {
|
|
95
|
+
return col.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
96
|
+
}
|
|
97
|
+
function formatCellValue(value) {
|
|
98
|
+
if (value === null || value === void 0) return "";
|
|
99
|
+
if (typeof value === "object") return JSON.stringify(value);
|
|
100
|
+
return String(value);
|
|
101
|
+
}
|
|
102
|
+
function columnsForSection(columns) {
|
|
103
|
+
return columns.map((col) => ({
|
|
104
|
+
key: col,
|
|
105
|
+
label: humanizeColumn(col),
|
|
106
|
+
sortable: true,
|
|
107
|
+
formatter: (value) => formatCellValue(value)
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
function handleDownloadJson() {
|
|
111
|
+
if (props.downloadJsonUrl) {
|
|
112
|
+
window.open(props.downloadJsonUrl, "_blank");
|
|
113
|
+
}
|
|
114
|
+
emit("download-json");
|
|
115
|
+
}
|
|
116
|
+
function handleDownloadCsv() {
|
|
117
|
+
if (props.downloadCsvUrl) {
|
|
118
|
+
window.open(props.downloadCsvUrl, "_blank");
|
|
119
|
+
}
|
|
120
|
+
emit("download-csv");
|
|
121
|
+
}
|
|
122
|
+
return (_ctx, _cache) => {
|
|
123
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
124
|
+
createElementVNode("div", _hoisted_2, [
|
|
125
|
+
createElementVNode("div", _hoisted_3, [
|
|
126
|
+
createVNode(_sfc_main$1, {
|
|
127
|
+
modelValue: viewMode.value,
|
|
128
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => viewMode.value = $event),
|
|
129
|
+
options: viewOptions.value,
|
|
130
|
+
variant: "card",
|
|
131
|
+
size: "sm",
|
|
132
|
+
"full-width": false
|
|
133
|
+
}, null, 8, ["modelValue", "options"])
|
|
134
|
+
]),
|
|
135
|
+
createElementVNode("div", _hoisted_4, [
|
|
136
|
+
__props.pluginRoutePrefix && __props.experimentId ? (openBlock(), createBlock(_sfc_main$2, {
|
|
137
|
+
key: 0,
|
|
138
|
+
variant: "secondary",
|
|
139
|
+
size: "sm",
|
|
140
|
+
onClick: _cache[1] || (_cache[1] = ($event) => emit("open-plugin"))
|
|
141
|
+
}, {
|
|
142
|
+
default: withCtx(() => [
|
|
143
|
+
createTextVNode(" Open in " + toDisplayString(__props.pluginName || "Plugin"), 1)
|
|
144
|
+
]),
|
|
145
|
+
_: 1
|
|
146
|
+
})) : createCommentVNode("", true),
|
|
147
|
+
createVNode(_sfc_main$2, {
|
|
148
|
+
variant: "ghost",
|
|
149
|
+
size: "sm",
|
|
150
|
+
onClick: handleDownloadJson
|
|
151
|
+
}, {
|
|
152
|
+
default: withCtx(() => [..._cache[2] || (_cache[2] = [
|
|
153
|
+
createTextVNode(" JSON ", -1)
|
|
154
|
+
])]),
|
|
155
|
+
_: 1
|
|
156
|
+
}),
|
|
157
|
+
createVNode(_sfc_main$2, {
|
|
158
|
+
variant: "ghost",
|
|
159
|
+
size: "sm",
|
|
160
|
+
onClick: handleDownloadCsv
|
|
161
|
+
}, {
|
|
162
|
+
default: withCtx(() => [..._cache[3] || (_cache[3] = [
|
|
163
|
+
createTextVNode(" CSV ", -1)
|
|
164
|
+
])]),
|
|
165
|
+
_: 1
|
|
166
|
+
})
|
|
167
|
+
])
|
|
168
|
+
]),
|
|
169
|
+
createElementVNode("div", _hoisted_5, [
|
|
170
|
+
__props.loading ? (openBlock(), createElementBlock("div", _hoisted_6, " Loading... ")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
171
|
+
viewMode.value === "summary" && __props.summaryData ? (openBlock(), createElementBlock("div", _hoisted_7, [
|
|
172
|
+
metadataEntries.value.length ? (openBlock(), createElementBlock("div", _hoisted_8, [
|
|
173
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(metadataEntries.value, (entry) => {
|
|
174
|
+
return openBlock(), createElementBlock("span", {
|
|
175
|
+
key: entry.key,
|
|
176
|
+
class: "mld-summary__pill"
|
|
177
|
+
}, [
|
|
178
|
+
createElementVNode("span", _hoisted_9, toDisplayString(entry.key), 1),
|
|
179
|
+
createElementVNode("span", _hoisted_10, toDisplayString(entry.value), 1)
|
|
180
|
+
]);
|
|
181
|
+
}), 128))
|
|
182
|
+
])) : createCommentVNode("", true),
|
|
183
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.summaryData.sections, (section) => {
|
|
184
|
+
var _a;
|
|
185
|
+
return openBlock(), createElementBlock("div", {
|
|
186
|
+
key: section.key,
|
|
187
|
+
class: "mld-summary__section"
|
|
188
|
+
}, [
|
|
189
|
+
section.type === "group" && section.items ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(section.items, (item, idx) => {
|
|
190
|
+
return openBlock(), createElementBlock("div", {
|
|
191
|
+
key: idx,
|
|
192
|
+
class: "mld-summary__group-card"
|
|
193
|
+
}, [
|
|
194
|
+
createElementVNode("div", _hoisted_11, [
|
|
195
|
+
createElementVNode("span", _hoisted_12, toDisplayString(item.label), 1),
|
|
196
|
+
createElementVNode("span", _hoisted_13, toDisplayString(item.item_count) + " " + toDisplayString(item.item_key), 1)
|
|
197
|
+
]),
|
|
198
|
+
item.metadata && Object.keys(item.metadata).length ? (openBlock(), createElementBlock("div", _hoisted_14, [
|
|
199
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(item.metadata, (val, key) => {
|
|
200
|
+
return openBlock(), createElementBlock("span", {
|
|
201
|
+
key: String(key),
|
|
202
|
+
class: "mld-summary__pill mld-summary__pill--sm"
|
|
203
|
+
}, [
|
|
204
|
+
createElementVNode("span", _hoisted_15, toDisplayString(String(key).replace(/_/g, " ")), 1),
|
|
205
|
+
createElementVNode("span", _hoisted_16, toDisplayString(val), 1)
|
|
206
|
+
]);
|
|
207
|
+
}), 128))
|
|
208
|
+
])) : createCommentVNode("", true),
|
|
209
|
+
item.rows.length ? (openBlock(), createBlock(_sfc_main$3, {
|
|
210
|
+
key: 1,
|
|
211
|
+
data: item.rows,
|
|
212
|
+
columns: columnsForSection(item.columns),
|
|
213
|
+
searchable: item.rows.length > 10,
|
|
214
|
+
sortable: true,
|
|
215
|
+
striped: true,
|
|
216
|
+
size: "sm"
|
|
217
|
+
}, null, 8, ["data", "columns", "searchable"])) : createCommentVNode("", true)
|
|
218
|
+
]);
|
|
219
|
+
}), 128)) : section.type === "table" && section.rows ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
220
|
+
createElementVNode("div", _hoisted_17, [
|
|
221
|
+
createElementVNode("span", _hoisted_18, toDisplayString(section.label), 1),
|
|
222
|
+
createElementVNode("span", _hoisted_19, toDisplayString(section.row_count) + " rows", 1)
|
|
223
|
+
]),
|
|
224
|
+
createVNode(_sfc_main$3, {
|
|
225
|
+
data: section.rows,
|
|
226
|
+
columns: columnsForSection(section.columns || []),
|
|
227
|
+
searchable: (((_a = section.rows) == null ? void 0 : _a.length) || 0) > 10,
|
|
228
|
+
sortable: true,
|
|
229
|
+
striped: true,
|
|
230
|
+
size: "sm"
|
|
231
|
+
}, null, 8, ["data", "columns", "searchable"])
|
|
232
|
+
], 64)) : createCommentVNode("", true)
|
|
233
|
+
]);
|
|
234
|
+
}), 128))
|
|
235
|
+
])) : viewMode.value === "tree" ? (openBlock(), createBlock(_sfc_main$4, {
|
|
236
|
+
key: 1,
|
|
237
|
+
nodes: __props.treeData,
|
|
238
|
+
"expand-all": false,
|
|
239
|
+
"show-icons": true,
|
|
240
|
+
"show-counts": true,
|
|
241
|
+
size: "sm"
|
|
242
|
+
}, null, 8, ["nodes"])) : viewMode.value === "table" && hasTableData.value ? (openBlock(), createBlock(_sfc_main$3, {
|
|
243
|
+
key: 2,
|
|
244
|
+
data: __props.tableData,
|
|
245
|
+
columns: __props.tableColumns ?? [],
|
|
246
|
+
searchable: true,
|
|
247
|
+
sortable: true
|
|
248
|
+
}, null, 8, ["data", "columns"])) : viewMode.value === "table" ? (openBlock(), createElementBlock("div", _hoisted_20, " No tabular data available. Use tree view. ")) : createCommentVNode("", true)
|
|
249
|
+
], 64))
|
|
250
|
+
])
|
|
251
|
+
]);
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
export {
|
|
256
|
+
_sfc_main as default
|
|
257
|
+
};
|
|
258
|
+
//# sourceMappingURL=ExperimentDataViewer.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExperimentDataViewer.vue.js","sources":["../../src/components/ExperimentDataViewer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport type { TreeNode, DataFrameColumn, SummaryData } from '../types'\nimport SampleHierarchyTree from './SampleHierarchyTree.vue'\nimport DataFrame from './DataFrame.vue'\nimport SegmentedControl from './SegmentedControl.vue'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n treeData: TreeNode[]\n tableData?: Record<string, unknown>[]\n tableColumns?: DataFrameColumn[] | undefined\n summaryData?: SummaryData | null\n defaultView?: 'summary' | 'tree' | 'table'\n title?: string\n pluginName?: string\n pluginRoutePrefix?: string\n experimentId?: number\n loading?: boolean\n downloadJsonUrl?: string\n downloadCsvUrl?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Data',\n defaultView: 'summary',\n loading: false,\n})\n\nconst emit = defineEmits<{\n 'open-plugin': []\n 'download-json': []\n 'download-csv': []\n}>()\n\nconst viewMode = ref<string | number>(props.defaultView)\n\n// Reset view mode when defaultView prop changes\nwatch(() => props.defaultView, (val) => { viewMode.value = val })\n\nconst viewOptions = computed(() => {\n const opts = []\n if (props.summaryData) {\n opts.push({ value: 'summary', label: 'Summary' })\n }\n opts.push({ value: 'tree', label: 'Tree' })\n opts.push({ value: 'table', label: 'Table' })\n return opts\n})\n\n// Fall back to tree if summary is selected but no summary data\nwatch(() => props.summaryData, (val) => {\n if (!val && viewMode.value === 'summary') {\n viewMode.value = 'tree'\n }\n}, { immediate: true })\n\nconst hasTableData = computed(() =>\n props.tableData && props.tableData.length > 0\n)\n\nconst metadataEntries = computed(() => {\n if (!props.summaryData?.metadata) return []\n return Object.entries(props.summaryData.metadata)\n .filter(([, v]) => v !== null && v !== undefined && v !== '')\n .map(([key, value]) => ({\n key: key.replace(/_/g, ' '),\n value: String(value),\n }))\n})\n\nfunction humanizeColumn(col: string): string {\n return col.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nfunction columnsForSection(columns: string[]): DataFrameColumn[] {\n return columns.map((col) => ({\n key: col,\n label: humanizeColumn(col),\n sortable: true,\n formatter: (value: unknown) => formatCellValue(value),\n }))\n}\n\nfunction handleDownloadJson() {\n if (props.downloadJsonUrl) {\n window.open(props.downloadJsonUrl, '_blank')\n }\n emit('download-json')\n}\n\nfunction handleDownloadCsv() {\n if (props.downloadCsvUrl) {\n window.open(props.downloadCsvUrl, '_blank')\n }\n emit('download-csv')\n}\n</script>\n\n<template>\n <div class=\"mld-data-viewer\">\n <div class=\"mld-data-viewer__header\">\n <div class=\"mld-data-viewer__controls\">\n <SegmentedControl\n v-model=\"viewMode\"\n :options=\"viewOptions\"\n variant=\"card\"\n size=\"sm\"\n :full-width=\"false\"\n />\n </div>\n <div class=\"mld-data-viewer__actions\">\n <BaseButton\n v-if=\"pluginRoutePrefix && experimentId\"\n variant=\"secondary\"\n size=\"sm\"\n @click=\"emit('open-plugin')\"\n >\n Open in {{ pluginName || 'Plugin' }}\n </BaseButton>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"handleDownloadJson\"\n >\n JSON\n </BaseButton>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"handleDownloadCsv\"\n >\n CSV\n </BaseButton>\n </div>\n </div>\n\n <div class=\"mld-data-viewer__content\">\n <div v-if=\"loading\" class=\"mld-data-viewer__loading\">\n Loading...\n </div>\n <template v-else>\n <!-- Summary View -->\n <div v-if=\"viewMode === 'summary' && summaryData\" class=\"mld-summary\">\n <!-- Metadata pills -->\n <div v-if=\"metadataEntries.length\" class=\"mld-summary__metadata\">\n <span\n v-for=\"entry in metadataEntries\"\n :key=\"entry.key\"\n class=\"mld-summary__pill\"\n >\n <span class=\"mld-summary__pill-key\">{{ entry.key }}</span>\n <span class=\"mld-summary__pill-value\">{{ entry.value }}</span>\n </span>\n </div>\n\n <!-- Sections -->\n <div\n v-for=\"section in summaryData.sections\"\n :key=\"section.key\"\n class=\"mld-summary__section\"\n >\n <!-- Group section: cards with embedded tables -->\n <template v-if=\"section.type === 'group' && section.items\">\n <div\n v-for=\"(item, idx) in section.items\"\n :key=\"idx\"\n class=\"mld-summary__group-card\"\n >\n <div class=\"mld-summary__group-header\">\n <span class=\"mld-summary__group-label\">{{ item.label }}</span>\n <span class=\"mld-summary__group-count\">\n {{ item.item_count }} {{ item.item_key }}\n </span>\n </div>\n <div v-if=\"item.metadata && Object.keys(item.metadata).length\" class=\"mld-summary__group-meta\">\n <span\n v-for=\"(val, key) in item.metadata\"\n :key=\"String(key)\"\n class=\"mld-summary__pill mld-summary__pill--sm\"\n >\n <span class=\"mld-summary__pill-key\">{{ String(key).replace(/_/g, ' ') }}</span>\n <span class=\"mld-summary__pill-value\">{{ val }}</span>\n </span>\n </div>\n <DataFrame\n v-if=\"item.rows.length\"\n :data=\"item.rows\"\n :columns=\"columnsForSection(item.columns)\"\n :searchable=\"item.rows.length > 10\"\n :sortable=\"true\"\n :striped=\"true\"\n size=\"sm\"\n />\n </div>\n </template>\n\n <!-- Table section: flat table -->\n <template v-else-if=\"section.type === 'table' && section.rows\">\n <div class=\"mld-summary__table-header\">\n <span class=\"mld-summary__section-label\">{{ section.label }}</span>\n <span class=\"mld-summary__section-count\">{{ section.row_count }} rows</span>\n </div>\n <DataFrame\n :data=\"section.rows\"\n :columns=\"columnsForSection(section.columns || [])\"\n :searchable=\"(section.rows?.length || 0) > 10\"\n :sortable=\"true\"\n :striped=\"true\"\n size=\"sm\"\n />\n </template>\n </div>\n </div>\n\n <!-- Tree View -->\n <SampleHierarchyTree\n v-else-if=\"viewMode === 'tree'\"\n :nodes=\"treeData\"\n :expand-all=\"false\"\n :show-icons=\"true\"\n :show-counts=\"true\"\n size=\"sm\"\n />\n\n <!-- Table View -->\n <DataFrame\n v-else-if=\"viewMode === 'table' && hasTableData\"\n :data=\"tableData!\"\n :columns=\"tableColumns ?? []\"\n :searchable=\"true\"\n :sortable=\"true\"\n />\n <div v-else-if=\"viewMode === 'table'\" class=\"mld-data-viewer__empty\">\n No tabular data available. Use tree view.\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/experiment-data-viewer.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_createVNode","SegmentedControl","_createBlock","BaseButton","_createTextVNode","_Fragment","_renderList","_toDisplayString","DataFrame","SampleHierarchyTree"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExperimentDataViewer.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -4,11 +4,14 @@ interface Props {
|
|
|
4
4
|
hint?: string;
|
|
5
5
|
required?: boolean;
|
|
6
6
|
htmlFor?: string;
|
|
7
|
+
fieldId?: string;
|
|
7
8
|
}
|
|
8
9
|
declare function __VLS_template(): {
|
|
9
10
|
attrs: Partial<{}>;
|
|
10
11
|
slots: {
|
|
11
|
-
default?(_: {
|
|
12
|
+
default?(_: {
|
|
13
|
+
describedBy: string | undefined;
|
|
14
|
+
}): any;
|
|
12
15
|
};
|
|
13
16
|
refs: {};
|
|
14
17
|
rootEl: HTMLDivElement;
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import { defineComponent, openBlock, createElementBlock, createTextVNode, toDisplayString, createCommentVNode, renderSlot } from "vue";
|
|
1
|
+
import { defineComponent, computed, openBlock, createElementBlock, createTextVNode, toDisplayString, createCommentVNode, renderSlot } from "vue";
|
|
2
2
|
const _hoisted_1 = { class: "mld-form-field" };
|
|
3
3
|
const _hoisted_2 = ["for"];
|
|
4
4
|
const _hoisted_3 = {
|
|
5
5
|
key: 0,
|
|
6
6
|
class: "mld-form-field__required"
|
|
7
7
|
};
|
|
8
|
-
const _hoisted_4 =
|
|
9
|
-
|
|
10
|
-
class: "mld-form-field__error"
|
|
11
|
-
};
|
|
12
|
-
const _hoisted_5 = {
|
|
13
|
-
key: 2,
|
|
14
|
-
class: "mld-form-field__hint"
|
|
15
|
-
};
|
|
8
|
+
const _hoisted_4 = ["id"];
|
|
9
|
+
const _hoisted_5 = ["id"];
|
|
16
10
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
17
11
|
__name: "FormField",
|
|
18
12
|
props: {
|
|
@@ -20,9 +14,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
20
14
|
error: {},
|
|
21
15
|
hint: {},
|
|
22
16
|
required: { type: Boolean },
|
|
23
|
-
htmlFor: {}
|
|
17
|
+
htmlFor: {},
|
|
18
|
+
fieldId: {}
|
|
24
19
|
},
|
|
25
20
|
setup(__props) {
|
|
21
|
+
const props = __props;
|
|
22
|
+
const errorId = computed(
|
|
23
|
+
() => props.error && props.fieldId ? `${props.fieldId}-error` : void 0
|
|
24
|
+
);
|
|
25
|
+
const hintId = computed(
|
|
26
|
+
() => !props.error && props.hint && props.fieldId ? `${props.fieldId}-hint` : void 0
|
|
27
|
+
);
|
|
28
|
+
const describedBy = computed(() => errorId.value ?? hintId.value);
|
|
26
29
|
return (_ctx, _cache) => {
|
|
27
30
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
28
31
|
__props.label ? (openBlock(), createElementBlock("label", {
|
|
@@ -33,8 +36,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
33
36
|
createTextVNode(toDisplayString(__props.label) + " ", 1),
|
|
34
37
|
__props.required ? (openBlock(), createElementBlock("span", _hoisted_3, "*")) : createCommentVNode("", true)
|
|
35
38
|
], 8, _hoisted_2)) : createCommentVNode("", true),
|
|
36
|
-
renderSlot(_ctx.$slots, "default"),
|
|
37
|
-
__props.error ? (openBlock(), createElementBlock("p",
|
|
39
|
+
renderSlot(_ctx.$slots, "default", { describedBy: describedBy.value }),
|
|
40
|
+
__props.error ? (openBlock(), createElementBlock("p", {
|
|
41
|
+
key: 1,
|
|
42
|
+
id: errorId.value,
|
|
43
|
+
class: "mld-form-field__error",
|
|
44
|
+
role: "alert"
|
|
45
|
+
}, toDisplayString(__props.error), 9, _hoisted_4)) : __props.hint ? (openBlock(), createElementBlock("p", {
|
|
46
|
+
key: 2,
|
|
47
|
+
id: hintId.value,
|
|
48
|
+
class: "mld-form-field__hint"
|
|
49
|
+
}, toDisplayString(__props.hint), 9, _hoisted_5)) : createCommentVNode("", true)
|
|
38
50
|
]);
|
|
39
51
|
};
|
|
40
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormField.vue.js","sources":["../../src/components/FormField.vue"],"sourcesContent":["<script setup lang=\"ts\">\ninterface Props {\n label?: string\n error?: string\n hint?: string\n required?: boolean\n htmlFor?: string\n}\n\
|
|
1
|
+
{"version":3,"file":"FormField.vue.js","sources":["../../src/components/FormField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n label?: string\n error?: string\n hint?: string\n required?: boolean\n htmlFor?: string\n fieldId?: string\n}\n\nconst props = defineProps<Props>()\n\nconst errorId = computed(() =>\n props.error && props.fieldId ? `${props.fieldId}-error` : undefined\n)\n\nconst hintId = computed(() =>\n !props.error && props.hint && props.fieldId ? `${props.fieldId}-hint` : undefined\n)\n\nconst describedBy = computed(() => errorId.value ?? hintId.value)\n</script>\n\n<template>\n <div class=\"mld-form-field\">\n <label\n v-if=\"label\"\n :for=\"htmlFor\"\n class=\"mld-form-field__label\"\n >\n {{ label }}\n <span v-if=\"required\" class=\"mld-form-field__required\">*</span>\n </label>\n\n <slot :described-by=\"describedBy\" />\n\n <p v-if=\"error\" :id=\"errorId\" class=\"mld-form-field__error\" role=\"alert\">\n {{ error }}\n </p>\n <p v-else-if=\"hint\" :id=\"hintId\" class=\"mld-form-field__hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<style>\n@import '../styles/components/form-field.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createTextVNode","_toDisplayString","_renderSlot"],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,UAAM,QAAQ;AAEd,UAAM,UAAU;AAAA,MAAS,MACvB,MAAM,SAAS,MAAM,UAAU,GAAG,MAAM,OAAO,WAAW;AAAA,IAAA;AAG5D,UAAM,SAAS;AAAA,MAAS,MACtB,CAAC,MAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,GAAG,MAAM,OAAO,UAAU;AAAA,IAAA;AAG1E,UAAM,cAAc,SAAS,MAAM,QAAQ,SAAS,OAAO,KAAK;;AAI9D,aAAAA,UAAA,GAAAC,mBAkBM,OAlBN,YAkBM;AAAA,QAhBI,QAAA,sBADRA,mBAOQ,SAAA;AAAA;UALL,KAAK,QAAA;AAAA,UACN,OAAM;AAAA,QAAA;UAEHC,gBAAAC,gBAAA,QAAA,KAAK,IAAG,KACX,CAAA;AAAA,UAAY,QAAA,yBAAZF,mBAA+D,QAA/D,YAAuD,GAAC;;QAG1DG,WAAoC,KAAA,QAAA,WAAA,EAA7B,aAAc,YAAA,OAAW;AAAA,QAEvB,QAAA,sBAATH,mBAEI,KAAA;AAAA;UAFa,IAAI,QAAA;AAAA,UAAS,OAAM;AAAA,UAAwB,MAAK;AAAA,QAAA,mBAC5D,QAAA,KAAK,GAAA,GAAA,UAAA,KAEI,QAAA,qBAAdA,mBAEI,KAAA;AAAA;UAFiB,IAAI,OAAA;AAAA,UAAQ,OAAM;AAAA,QAAA,mBAClC,QAAA,IAAI,GAAA,GAAA,UAAA;;;;;"}
|
|
@@ -69,6 +69,8 @@ export { default as FormBuilder } from './FormBuilder.vue';
|
|
|
69
69
|
export { default as FormSection } from './FormSection.vue';
|
|
70
70
|
export { default as FormActions } from './FormActions.vue';
|
|
71
71
|
export { default as FormFieldRenderer } from './FormFieldRenderer.vue';
|
|
72
|
+
export { default as ExperimentDataViewer } from './ExperimentDataViewer.vue';
|
|
73
|
+
export { default as ExperimentCodeBadge } from './ExperimentCodeBadge.vue';
|
|
72
74
|
export { default as DateTimePicker } from './DateTimePicker.vue';
|
|
73
75
|
export { default as TimeRangeInput } from './TimeRangeInput.vue';
|
|
74
76
|
export { default as ScheduleCalendar } from './ScheduleCalendar.vue';
|
package/dist/components/index.js
CHANGED
|
@@ -138,13 +138,17 @@ import { default as default70 } from "./FormSection.vue.js";
|
|
|
138
138
|
import { default as default71 } from "./FormActions.vue.js";
|
|
139
139
|
/* empty css */
|
|
140
140
|
import { default as default72 } from "./FormFieldRenderer.vue.js";
|
|
141
|
-
import { default as default73 } from "./
|
|
141
|
+
import { default as default73 } from "./ExperimentDataViewer.vue.js";
|
|
142
|
+
/* empty css */
|
|
143
|
+
import { default as default74 } from "./ExperimentCodeBadge.vue.js";
|
|
144
|
+
/* empty css */
|
|
145
|
+
import { default as default75 } from "./DateTimePicker.vue.js";
|
|
142
146
|
/* empty css */
|
|
143
|
-
import { default as
|
|
147
|
+
import { default as default76 } from "./TimeRangeInput.vue.js";
|
|
144
148
|
/* empty css */
|
|
145
|
-
import { default as
|
|
149
|
+
import { default as default77 } from "./ScheduleCalendar.vue.js";
|
|
146
150
|
/* empty css */
|
|
147
|
-
import { default as
|
|
151
|
+
import { default as default78 } from "./ResourceCard.vue.js";
|
|
148
152
|
/* empty css */
|
|
149
153
|
export {
|
|
150
154
|
default25 as AlertBox,
|
|
@@ -176,11 +180,13 @@ export {
|
|
|
176
180
|
default44 as ConfirmDialog,
|
|
177
181
|
default18 as DataFrame,
|
|
178
182
|
default20 as DatePicker,
|
|
179
|
-
|
|
183
|
+
default75 as DateTimePicker,
|
|
180
184
|
default37 as Divider,
|
|
181
185
|
default57 as DoseCalculator,
|
|
182
186
|
default16 as DropdownButton,
|
|
183
187
|
default41 as EmptyState,
|
|
188
|
+
default74 as ExperimentCodeBadge,
|
|
189
|
+
default73 as ExperimentDataViewer,
|
|
184
190
|
default51 as ExperimentTimeline,
|
|
185
191
|
default24 as FileUploader,
|
|
186
192
|
default71 as FormActions,
|
|
@@ -201,11 +207,11 @@ export {
|
|
|
201
207
|
default60 as ProtocolStepEditor,
|
|
202
208
|
default48 as RackEditor,
|
|
203
209
|
default58 as ReagentList,
|
|
204
|
-
|
|
210
|
+
default78 as ResourceCard,
|
|
205
211
|
default59 as SampleHierarchyTree,
|
|
206
212
|
default49 as SampleLegend,
|
|
207
213
|
default52 as SampleSelector,
|
|
208
|
-
|
|
214
|
+
default77 as ScheduleCalendar,
|
|
209
215
|
default61 as ScientificNumber,
|
|
210
216
|
default13 as SegmentedControl,
|
|
211
217
|
default64 as SequenceInput,
|
|
@@ -217,7 +223,7 @@ export {
|
|
|
217
223
|
default22 as TagsInput,
|
|
218
224
|
default28 as ThemeToggle,
|
|
219
225
|
default21 as TimePicker,
|
|
220
|
-
|
|
226
|
+
default76 as TimeRangeInput,
|
|
221
227
|
default26 as ToastNotification,
|
|
222
228
|
default43 as Tooltip,
|
|
223
229
|
default65 as UnitInput,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { MLDSdk, default } from './install';
|
|
2
|
-
export { BaseButton, BaseInput, BaseTextarea, BaseSelect, BaseCheckbox, BaseToggle, BaseRadioGroup, BaseSlider, ColorSlider, BaseTabs, BaseModal, FormField, DatePicker, TimePicker, TagsInput, NumberInput, FileUploader, AlertBox, ToastNotification, IconButton, ThemeToggle, SettingsButton, CollapsibleCard, AppTopBar, AppSidebar, AppLayout, AppContainer, Skeleton, WellPlate, RackEditor, SampleLegend, PlateMapEditor, ExperimentTimeline, SampleSelector, GroupingModal, GroupAssigner, MoleculeInput, ConcentrationInput, DoseCalculator, ReagentList, SampleHierarchyTree, ProtocolStepEditor, SegmentedControl, MultiSelect, BasePill, DropdownButton, Calendar, DataFrame, LoadingSpinner, Divider, StatusIndicator, ProgressBar, Avatar, EmptyState, Breadcrumb, Tooltip, ConfirmDialog, ChartContainer, SettingsModal, ScientificNumber, ChemicalFormula, FormulaInput, SequenceInput, UnitInput, StepWizard, AuditTrail, BatchProgressList, DateTimePicker, TimeRangeInput, ScheduleCalendar, ResourceCard, } from './components';
|
|
2
|
+
export { BaseButton, BaseInput, BaseTextarea, BaseSelect, BaseCheckbox, BaseToggle, BaseRadioGroup, BaseSlider, ColorSlider, BaseTabs, BaseModal, FormField, DatePicker, TimePicker, TagsInput, NumberInput, FileUploader, AlertBox, ToastNotification, IconButton, ThemeToggle, SettingsButton, CollapsibleCard, AppTopBar, AppSidebar, AppLayout, AppContainer, Skeleton, WellPlate, RackEditor, SampleLegend, PlateMapEditor, ExperimentTimeline, SampleSelector, GroupingModal, GroupAssigner, MoleculeInput, ConcentrationInput, DoseCalculator, ReagentList, SampleHierarchyTree, ProtocolStepEditor, SegmentedControl, MultiSelect, BasePill, DropdownButton, Calendar, DataFrame, LoadingSpinner, Divider, StatusIndicator, ProgressBar, Avatar, EmptyState, Breadcrumb, Tooltip, ConfirmDialog, ChartContainer, SettingsModal, ScientificNumber, ChemicalFormula, FormulaInput, SequenceInput, UnitInput, StepWizard, AuditTrail, BatchProgressList, ExperimentDataViewer, ExperimentCodeBadge, DateTimePicker, TimeRangeInput, ScheduleCalendar, ResourceCard, } from './components';
|
|
3
3
|
export { useApi, useAuth, usePasskey, useTheme, useToast, usePlatformContext, useWellPlateEditor, useConcentrationUnits, useDoseCalculator, useProtocolTemplates, useRackEditor, useChemicalFormula, ATOMIC_WEIGHTS, useSequenceUtils, type ApiClientOptions, type UseWellPlateEditorOptions, type UseWellPlateEditorReturn, type UseRackEditorOptions, type UseRackEditorReturn, type ConcentrationValue, type ConcentrationUnit, type VolumeValue, type VolumeUnit, type StepTemplate, type FormulaParseResult, type FormulaPart, type SequenceType, type SequenceStats, parseTime, formatTime, generateTimeSlots, rangesOverlap, durationMinutes, formatDuration, isTimeInRange, findAvailableSlots, snapToSlot, addMinutes, compareTime, useScheduleDrag, usePluginConfig, type UsePluginConfigReturn, } from './composables';
|
|
4
4
|
export { useAuthStore, useSettingsStore, colorPalettes, type SettingsState, } from './stores';
|
|
5
|
-
export type { ContainerDirection, ButtonVariant, ButtonSize, InputType, ModalSize, AlertType, Toast, TabItem, SelectOption, RadioOption, FormFieldProps, SidebarToolSection, CollapsibleState, TopBarVariant, TopBarPage, TopBarTab, TopBarTabOption, TopBarSettingsConfig, WellPlateFormat, WellState, WellPlateSelectionMode, Well, HeatmapColorScale, HeatmapConfig, SlotPosition, WellExtendedData, WellEditData, WellEditField, WellLegendItem, Rack, SampleType, PlateMap, PlateMapEditorState, ProtocolStepType, ProtocolStepStatus, ProtocolStep, SampleGroup, GroupItem, FileUploaderMode, SegmentedOption, SegmentedControlVariant, SegmentedControlSize, MultiSelectOption, MultiSelectSize, PillVariant, PillSize, CalendarSelectionMode, CalendarMarker, CalendarDayContext, SortDirection, SortState, DataFrameColumn, PaginationState, SpinnerSize, SpinnerVariant, DividerSpacing, StatusType, ProgressVariant, ProgressSize, AvatarSize, EmptyStateColor, EmptyStateSize, BreadcrumbItem, TooltipPosition, ConfirmVariant, SettingsTab, NumberNotation, TimePickerFormat, TimeRange, ScheduleView, ScheduleEventStatus, ScheduleEvent, ScheduleBlockedSlot, ScheduleSlotContext, ScheduleEventCreateContext, ScheduleEventUpdateContext, ResourceStatus, ResourceSpec, UnitOption, WizardStep, WizardStepState, AuditEntryType, AuditEntry, BatchItemStatus, BatchItem, BatchSummary, AuthConfig, UserInfo, LoginResponse, TokenVerifyResponse, RegisterRequest, UpdateProfileRequest, CredentialInfo, PluginInfo, PluginNavItem, PluginSettings, PluginSettingField, PlatformContext, PlatformEventType, PlatformEvent, ThemeMode, ColorPalette, TableDensity, } from './types';
|
|
5
|
+
export type { ContainerDirection, ButtonVariant, ButtonSize, InputType, ModalSize, AlertType, Toast, TabItem, SelectOption, RadioOption, FormFieldProps, SidebarToolSection, CollapsibleState, TopBarVariant, TopBarPage, TopBarTab, TopBarTabOption, TopBarSettingsConfig, WellPlateFormat, WellState, WellPlateSelectionMode, Well, HeatmapColorScale, HeatmapConfig, SlotPosition, WellExtendedData, WellEditData, WellEditField, WellLegendItem, Rack, SampleType, PlateMap, PlateMapEditorState, ProtocolStepType, ProtocolStepStatus, ProtocolStep, SampleGroup, GroupItem, FileUploaderMode, SegmentedOption, SegmentedControlVariant, SegmentedControlSize, MultiSelectOption, MultiSelectSize, PillVariant, PillSize, CalendarSelectionMode, CalendarMarker, CalendarDayContext, SortDirection, SortState, DataFrameColumn, PaginationState, SpinnerSize, SpinnerVariant, DividerSpacing, StatusType, ProgressVariant, ProgressSize, AvatarSize, EmptyStateColor, EmptyStateSize, BreadcrumbItem, TooltipPosition, ConfirmVariant, SettingsTab, NumberNotation, TimePickerFormat, TimeRange, ScheduleView, ScheduleEventStatus, ScheduleEvent, ScheduleBlockedSlot, ScheduleSlotContext, ScheduleEventCreateContext, ScheduleEventUpdateContext, ResourceStatus, ResourceSpec, UnitOption, WizardStep, WizardStepState, AuditEntryType, AuditEntry, BatchItemStatus, BatchItem, BatchSummary, AuthConfig, UserInfo, LoginResponse, TokenVerifyResponse, RegisterRequest, UpdateProfileRequest, CredentialInfo, SummaryData, SummarySection, SummarySectionItem, TreeNode, TreeNodeType, PluginInfo, PluginNavItem, PluginSettings, PluginSettingField, PlatformContext, PlatformEventType, PlatformEvent, ThemeMode, ColorPalette, TableDensity, } from './types';
|
package/dist/index.js
CHANGED
|
@@ -133,13 +133,17 @@ import { default as default67 } from "./components/AuditTrail.vue.js";
|
|
|
133
133
|
/* empty css */
|
|
134
134
|
import { default as default68 } from "./components/BatchProgressList.vue.js";
|
|
135
135
|
/* empty css */
|
|
136
|
-
import { default as default69 } from "./components/
|
|
136
|
+
import { default as default69 } from "./components/ExperimentDataViewer.vue.js";
|
|
137
|
+
/* empty css */
|
|
138
|
+
import { default as default70 } from "./components/ExperimentCodeBadge.vue.js";
|
|
139
|
+
/* empty css */
|
|
140
|
+
import { default as default71 } from "./components/DateTimePicker.vue.js";
|
|
137
141
|
/* empty css */
|
|
138
|
-
import { default as
|
|
142
|
+
import { default as default72 } from "./components/TimeRangeInput.vue.js";
|
|
139
143
|
/* empty css */
|
|
140
|
-
import { default as
|
|
144
|
+
import { default as default73 } from "./components/ScheduleCalendar.vue.js";
|
|
141
145
|
/* empty css */
|
|
142
|
-
import { default as
|
|
146
|
+
import { default as default74 } from "./components/ResourceCard.vue.js";
|
|
143
147
|
/* empty css */
|
|
144
148
|
import { useApi } from "./composables/useApi.js";
|
|
145
149
|
import { useAuth } from "./composables/useAuth.js";
|
|
@@ -190,11 +194,13 @@ export {
|
|
|
190
194
|
default44 as ConfirmDialog,
|
|
191
195
|
default18 as DataFrame,
|
|
192
196
|
default20 as DatePicker,
|
|
193
|
-
|
|
197
|
+
default71 as DateTimePicker,
|
|
194
198
|
default37 as Divider,
|
|
195
199
|
default57 as DoseCalculator,
|
|
196
200
|
default16 as DropdownButton,
|
|
197
201
|
default41 as EmptyState,
|
|
202
|
+
default70 as ExperimentCodeBadge,
|
|
203
|
+
default69 as ExperimentDataViewer,
|
|
198
204
|
default51 as ExperimentTimeline,
|
|
199
205
|
default24 as FileUploader,
|
|
200
206
|
default19 as FormField,
|
|
@@ -212,11 +218,11 @@ export {
|
|
|
212
218
|
default60 as ProtocolStepEditor,
|
|
213
219
|
default48 as RackEditor,
|
|
214
220
|
default58 as ReagentList,
|
|
215
|
-
|
|
221
|
+
default74 as ResourceCard,
|
|
216
222
|
default59 as SampleHierarchyTree,
|
|
217
223
|
default49 as SampleLegend,
|
|
218
224
|
default52 as SampleSelector,
|
|
219
|
-
|
|
225
|
+
default73 as ScheduleCalendar,
|
|
220
226
|
default61 as ScientificNumber,
|
|
221
227
|
default13 as SegmentedControl,
|
|
222
228
|
default64 as SequenceInput,
|
|
@@ -228,7 +234,7 @@ export {
|
|
|
228
234
|
default22 as TagsInput,
|
|
229
235
|
default28 as ThemeToggle,
|
|
230
236
|
default21 as TimePicker,
|
|
231
|
-
|
|
237
|
+
default72 as TimeRangeInput,
|
|
232
238
|
default26 as ToastNotification,
|
|
233
239
|
default43 as Tooltip,
|
|
234
240
|
default65 as UnitInput,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|