@morscherlab/mld-sdk 0.9.6 → 0.9.7
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/ExperimentPopover.vue.d.ts +4 -0
- package/dist/components/ExperimentPopover.vue.js +31 -17
- package/dist/components/ExperimentPopover.vue.js.map +1 -1
- package/dist/styles.css +44 -2
- package/package.json +1 -1
- package/src/components/ExperimentPopover.vue +16 -3
- package/src/styles/components/experiment-popover.css +25 -1
|
@@ -2,6 +2,7 @@ interface Props {
|
|
|
2
2
|
experimentName?: string;
|
|
3
3
|
experimentStatus?: string;
|
|
4
4
|
showSave?: boolean;
|
|
5
|
+
showDetach?: boolean;
|
|
5
6
|
saveDisabled?: boolean;
|
|
6
7
|
saveLoading?: boolean;
|
|
7
8
|
saveSuccessMessage?: string;
|
|
@@ -10,11 +11,14 @@ interface Props {
|
|
|
10
11
|
declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
11
12
|
select: () => any;
|
|
12
13
|
save: () => any;
|
|
14
|
+
detach: () => any;
|
|
13
15
|
}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
|
|
14
16
|
onSelect?: (() => any) | undefined;
|
|
15
17
|
onSave?: (() => any) | undefined;
|
|
18
|
+
onDetach?: (() => any) | undefined;
|
|
16
19
|
}>, {
|
|
17
20
|
showSave: boolean;
|
|
21
|
+
showDetach: boolean;
|
|
18
22
|
saveDisabled: boolean;
|
|
19
23
|
saveLoading: boolean;
|
|
20
24
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
@@ -21,27 +21,28 @@ const _hoisted_10 = {
|
|
|
21
21
|
key: 0,
|
|
22
22
|
class: "mld-experiment-popover__card-status"
|
|
23
23
|
};
|
|
24
|
-
const _hoisted_11 = { class: "mld-experiment-
|
|
25
|
-
const _hoisted_12 =
|
|
26
|
-
const _hoisted_13 =
|
|
24
|
+
const _hoisted_11 = { class: "mld-experiment-popover__card-actions" };
|
|
25
|
+
const _hoisted_12 = { class: "mld-experiment-popover__footer" };
|
|
26
|
+
const _hoisted_13 = ["disabled"];
|
|
27
|
+
const _hoisted_14 = {
|
|
27
28
|
key: 0,
|
|
28
29
|
class: "mld-experiment-popover__spinner"
|
|
29
30
|
};
|
|
30
|
-
const
|
|
31
|
+
const _hoisted_15 = {
|
|
31
32
|
key: 1,
|
|
32
33
|
class: "mld-experiment-popover__check-icon",
|
|
33
34
|
fill: "none",
|
|
34
35
|
stroke: "currentColor",
|
|
35
36
|
viewBox: "0 0 24 24"
|
|
36
37
|
};
|
|
37
|
-
const
|
|
38
|
+
const _hoisted_16 = {
|
|
38
39
|
key: 2,
|
|
39
40
|
class: "mld-experiment-popover__save-icon",
|
|
40
41
|
fill: "none",
|
|
41
42
|
stroke: "currentColor",
|
|
42
43
|
viewBox: "0 0 24 24"
|
|
43
44
|
};
|
|
44
|
-
const
|
|
45
|
+
const _hoisted_17 = {
|
|
45
46
|
key: 0,
|
|
46
47
|
class: "mld-experiment-popover__save-hint"
|
|
47
48
|
};
|
|
@@ -51,12 +52,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
51
52
|
experimentName: {},
|
|
52
53
|
experimentStatus: {},
|
|
53
54
|
showSave: { type: Boolean, default: false },
|
|
55
|
+
showDetach: { type: Boolean, default: false },
|
|
54
56
|
saveDisabled: { type: Boolean, default: false },
|
|
55
57
|
saveLoading: { type: Boolean, default: false },
|
|
56
58
|
saveSuccessMessage: {},
|
|
57
59
|
saveDisabledMessage: {}
|
|
58
60
|
},
|
|
59
|
-
emits: ["select", "save"],
|
|
61
|
+
emits: ["select", "save", "detach"],
|
|
60
62
|
setup(__props, { emit: __emit }) {
|
|
61
63
|
const props = __props;
|
|
62
64
|
const emit = __emit;
|
|
@@ -77,6 +79,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
77
79
|
if (props.saveDisabled || props.saveLoading) return;
|
|
78
80
|
emit("save");
|
|
79
81
|
}
|
|
82
|
+
function handleDetach() {
|
|
83
|
+
emit("detach");
|
|
84
|
+
close();
|
|
85
|
+
}
|
|
80
86
|
function handleClickOutside(event) {
|
|
81
87
|
if (popoverRef.value && !popoverRef.value.contains(event.target)) {
|
|
82
88
|
close();
|
|
@@ -187,16 +193,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
187
193
|
createElementVNode("div", _hoisted_9, toDisplayString(__props.experimentName), 1),
|
|
188
194
|
__props.experimentStatus ? (openBlock(), createElementBlock("div", _hoisted_10, toDisplayString(formatStatus(__props.experimentStatus)), 1)) : createCommentVNode("", true)
|
|
189
195
|
]),
|
|
190
|
-
createElementVNode("
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
196
|
+
createElementVNode("div", _hoisted_11, [
|
|
197
|
+
createElementVNode("button", {
|
|
198
|
+
type: "button",
|
|
199
|
+
class: "mld-experiment-popover__change-btn",
|
|
200
|
+
onClick: handleSelect
|
|
201
|
+
}, " Change "),
|
|
202
|
+
__props.showDetach ? (openBlock(), createElementBlock("button", {
|
|
203
|
+
key: 0,
|
|
204
|
+
type: "button",
|
|
205
|
+
class: "mld-experiment-popover__detach-btn",
|
|
206
|
+
onClick: handleDetach
|
|
207
|
+
}, " Detach ")) : createCommentVNode("", true)
|
|
208
|
+
])
|
|
195
209
|
])
|
|
196
210
|
])),
|
|
197
211
|
__props.showSave ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [
|
|
198
212
|
_cache[7] || (_cache[7] = createElementVNode("div", { class: "mld-experiment-popover__divider" }, null, -1)),
|
|
199
|
-
createElementVNode("div",
|
|
213
|
+
createElementVNode("div", _hoisted_12, [
|
|
200
214
|
createElementVNode("button", {
|
|
201
215
|
type: "button",
|
|
202
216
|
class: normalizeClass([
|
|
@@ -207,14 +221,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
207
221
|
disabled: __props.saveDisabled && !showSuccess.value,
|
|
208
222
|
onClick: handleSave
|
|
209
223
|
}, [
|
|
210
|
-
__props.saveLoading ? (openBlock(), createElementBlock("span",
|
|
224
|
+
__props.saveLoading ? (openBlock(), createElementBlock("span", _hoisted_14)) : showSuccess.value ? (openBlock(), createElementBlock("svg", _hoisted_15, [..._cache[5] || (_cache[5] = [
|
|
211
225
|
createElementVNode("path", {
|
|
212
226
|
"stroke-linecap": "round",
|
|
213
227
|
"stroke-linejoin": "round",
|
|
214
228
|
"stroke-width": "2",
|
|
215
229
|
d: "M5 13l4 4L19 7"
|
|
216
230
|
}, null, -1)
|
|
217
|
-
])])) : (openBlock(), createElementBlock("svg",
|
|
231
|
+
])])) : (openBlock(), createElementBlock("svg", _hoisted_16, [..._cache[6] || (_cache[6] = [
|
|
218
232
|
createElementVNode("path", {
|
|
219
233
|
"stroke-linecap": "round",
|
|
220
234
|
"stroke-linejoin": "round",
|
|
@@ -223,8 +237,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
223
237
|
}, null, -1)
|
|
224
238
|
])])),
|
|
225
239
|
createElementVNode("span", null, toDisplayString(showSuccess.value && __props.saveSuccessMessage ? __props.saveSuccessMessage : "Save to Experiment"), 1)
|
|
226
|
-
], 10,
|
|
227
|
-
__props.saveDisabled && __props.saveDisabledMessage && !showSuccess.value ? (openBlock(), createElementBlock("div",
|
|
240
|
+
], 10, _hoisted_13),
|
|
241
|
+
__props.saveDisabled && __props.saveDisabledMessage && !showSuccess.value ? (openBlock(), createElementBlock("div", _hoisted_17, toDisplayString(__props.saveDisabledMessage), 1)) : createCommentVNode("", true)
|
|
228
242
|
])
|
|
229
243
|
], 64)) : createCommentVNode("", true)
|
|
230
244
|
])) : createCommentVNode("", true)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExperimentPopover.vue.js","sources":["../../src/components/ExperimentPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onUnmounted } from 'vue'\n\ninterface Props {\n experimentName?: string\n experimentStatus?: string\n showSave?: boolean\n saveDisabled?: boolean\n saveLoading?: boolean\n saveSuccessMessage?: string\n saveDisabledMessage?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showSave: false,\n saveDisabled: false,\n saveLoading: false,\n})\n\nconst emit = defineEmits<{\n select: []\n save: []\n}>()\n\nconst isOpen = ref(false)\nconst popoverRef = ref<HTMLElement | null>(null)\nconst showSuccess = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleSelect() {\n emit('select')\n close()\n}\n\nfunction handleSave() {\n if (props.saveDisabled || props.saveLoading) return\n emit('save')\n}\n\nfunction handleClickOutside(event: MouseEvent) {\n if (popoverRef.value && !popoverRef.value.contains(event.target as Node)) {\n close()\n }\n}\n\n// Show success state when saveSuccessMessage changes from empty to a value\nwatch(() => props.saveSuccessMessage, (msg) => {\n if (msg) {\n showSuccess.value = true\n setTimeout(() => {\n showSuccess.value = false\n }, 3000)\n }\n})\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n\n// Format status for display (e.g., \"ready_to_extract\" -> \"Ready to extract\")\nfunction formatStatus(status: string): string {\n return status.replace(/_/g, ' ').replace(/^\\w/, c => c.toUpperCase())\n}\n</script>\n\n<template>\n <div ref=\"popoverRef\" class=\"mld-experiment-popover\">\n <!-- Trigger button -->\n <button\n type=\"button\"\n :class=\"[\n 'mld-experiment-popover__trigger',\n { 'mld-experiment-popover__trigger--active': isOpen },\n { 'mld-experiment-popover__trigger--empty': !experimentName },\n ]\"\n @click.stop=\"toggle\"\n >\n <!-- Flask icon -->\n <svg class=\"mld-experiment-popover__trigger-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n <span class=\"mld-experiment-popover__trigger-text\">\n {{ experimentName || 'No experiment' }}\n </span>\n <!-- Chevron -->\n <svg class=\"mld-experiment-popover__trigger-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Popover panel -->\n <div v-if=\"isOpen\" class=\"mld-experiment-popover__panel\">\n <!-- Header -->\n <div class=\"mld-experiment-popover__header\">\n <div class=\"mld-experiment-popover__title\">Experiment</div>\n <div class=\"mld-experiment-popover__subtitle\">\n {{ experimentName ? 'Linked experiment context' : 'Link to an MLD experiment' }}\n </div>\n </div>\n\n <!-- No experiment selected -->\n <div v-if=\"!experimentName\" class=\"mld-experiment-popover__body\">\n <button type=\"button\" class=\"mld-experiment-popover__select-btn\" @click=\"handleSelect\">\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\" />\n </svg>\n Select Experiment\n </button>\n </div>\n\n <!-- Experiment selected -->\n <div v-else class=\"mld-experiment-popover__body\">\n <div class=\"mld-experiment-popover__card\">\n <div class=\"mld-experiment-popover__card-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n </div>\n <div class=\"mld-experiment-popover__card-info\">\n <div class=\"mld-experiment-popover__card-name\">{{ experimentName }}</div>\n <div v-if=\"experimentStatus\" class=\"mld-experiment-popover__card-status\">\n {{ formatStatus(experimentStatus) }}\n </div>\n </div>\n <button type=\"button\" class=\"mld-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n </div>\n </div>\n\n <!-- Save section -->\n <template v-if=\"showSave\">\n <div class=\"mld-experiment-popover__divider\" />\n <div class=\"mld-experiment-popover__footer\">\n <button\n type=\"button\"\n :class=\"[\n 'mld-experiment-popover__save-btn',\n { 'mld-experiment-popover__save-btn--loading': saveLoading },\n { 'mld-experiment-popover__save-btn--success': showSuccess },\n ]\"\n :disabled=\"saveDisabled && !showSuccess\"\n @click=\"handleSave\"\n >\n <!-- Loading spinner -->\n <span v-if=\"saveLoading\" class=\"mld-experiment-popover__spinner\" />\n <!-- Success check -->\n <svg v-else-if=\"showSuccess\" class=\"mld-experiment-popover__check-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n <!-- Save icon -->\n <svg v-else class=\"mld-experiment-popover__save-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n </svg>\n <!-- Label -->\n <span>{{ showSuccess && saveSuccessMessage ? saveSuccessMessage : 'Save to Experiment' }}</span>\n </button>\n <div v-if=\"saveDisabled && saveDisabledMessage && !showSuccess\" class=\"mld-experiment-popover__save-hint\">\n {{ saveDisabledMessage }}\n </div>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/experiment-popover.css';\n</style>\n"],"names":["_createElementBlock","_createElementVNode","_normalizeClass","_toDisplayString","_openBlock","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExperimentPopover.vue.js","sources":["../../src/components/ExperimentPopover.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onUnmounted } from 'vue'\n\ninterface Props {\n experimentName?: string\n experimentStatus?: string\n showSave?: boolean\n showDetach?: boolean\n saveDisabled?: boolean\n saveLoading?: boolean\n saveSuccessMessage?: string\n saveDisabledMessage?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showSave: false,\n showDetach: false,\n saveDisabled: false,\n saveLoading: false,\n})\n\nconst emit = defineEmits<{\n select: []\n save: []\n detach: []\n}>()\n\nconst isOpen = ref(false)\nconst popoverRef = ref<HTMLElement | null>(null)\nconst showSuccess = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleSelect() {\n emit('select')\n close()\n}\n\nfunction handleSave() {\n if (props.saveDisabled || props.saveLoading) return\n emit('save')\n}\n\nfunction handleDetach() {\n emit('detach')\n close()\n}\n\nfunction handleClickOutside(event: MouseEvent) {\n if (popoverRef.value && !popoverRef.value.contains(event.target as Node)) {\n close()\n }\n}\n\n// Show success state when saveSuccessMessage changes from empty to a value\nwatch(() => props.saveSuccessMessage, (msg) => {\n if (msg) {\n showSuccess.value = true\n setTimeout(() => {\n showSuccess.value = false\n }, 3000)\n }\n})\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n\n// Format status for display (e.g., \"ready_to_extract\" -> \"Ready to extract\")\nfunction formatStatus(status: string): string {\n return status.replace(/_/g, ' ').replace(/^\\w/, c => c.toUpperCase())\n}\n</script>\n\n<template>\n <div ref=\"popoverRef\" class=\"mld-experiment-popover\">\n <!-- Trigger button -->\n <button\n type=\"button\"\n :class=\"[\n 'mld-experiment-popover__trigger',\n { 'mld-experiment-popover__trigger--active': isOpen },\n { 'mld-experiment-popover__trigger--empty': !experimentName },\n ]\"\n @click.stop=\"toggle\"\n >\n <!-- Flask icon -->\n <svg class=\"mld-experiment-popover__trigger-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n <span class=\"mld-experiment-popover__trigger-text\">\n {{ experimentName || 'No experiment' }}\n </span>\n <!-- Chevron -->\n <svg class=\"mld-experiment-popover__trigger-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <!-- Popover panel -->\n <div v-if=\"isOpen\" class=\"mld-experiment-popover__panel\">\n <!-- Header -->\n <div class=\"mld-experiment-popover__header\">\n <div class=\"mld-experiment-popover__title\">Experiment</div>\n <div class=\"mld-experiment-popover__subtitle\">\n {{ experimentName ? 'Linked experiment context' : 'Link to an MLD experiment' }}\n </div>\n </div>\n\n <!-- No experiment selected -->\n <div v-if=\"!experimentName\" class=\"mld-experiment-popover__body\">\n <button type=\"button\" class=\"mld-experiment-popover__select-btn\" @click=\"handleSelect\">\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\" />\n </svg>\n Select Experiment\n </button>\n </div>\n\n <!-- Experiment selected -->\n <div v-else class=\"mld-experiment-popover__body\">\n <div class=\"mld-experiment-popover__card\">\n <div class=\"mld-experiment-popover__card-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.75\"\n d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\"\n />\n </svg>\n </div>\n <div class=\"mld-experiment-popover__card-info\">\n <div class=\"mld-experiment-popover__card-name\">{{ experimentName }}</div>\n <div v-if=\"experimentStatus\" class=\"mld-experiment-popover__card-status\">\n {{ formatStatus(experimentStatus) }}\n </div>\n </div>\n <div class=\"mld-experiment-popover__card-actions\">\n <button type=\"button\" class=\"mld-experiment-popover__change-btn\" @click=\"handleSelect\">\n Change\n </button>\n <button v-if=\"showDetach\" type=\"button\" class=\"mld-experiment-popover__detach-btn\" @click=\"handleDetach\">\n Detach\n </button>\n </div>\n </div>\n </div>\n\n <!-- Save section -->\n <template v-if=\"showSave\">\n <div class=\"mld-experiment-popover__divider\" />\n <div class=\"mld-experiment-popover__footer\">\n <button\n type=\"button\"\n :class=\"[\n 'mld-experiment-popover__save-btn',\n { 'mld-experiment-popover__save-btn--loading': saveLoading },\n { 'mld-experiment-popover__save-btn--success': showSuccess },\n ]\"\n :disabled=\"saveDisabled && !showSuccess\"\n @click=\"handleSave\"\n >\n <!-- Loading spinner -->\n <span v-if=\"saveLoading\" class=\"mld-experiment-popover__spinner\" />\n <!-- Success check -->\n <svg v-else-if=\"showSuccess\" class=\"mld-experiment-popover__check-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n <!-- Save icon -->\n <svg v-else class=\"mld-experiment-popover__save-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n </svg>\n <!-- Label -->\n <span>{{ showSuccess && saveSuccessMessage ? saveSuccessMessage : 'Save to Experiment' }}</span>\n </button>\n <div v-if=\"saveDisabled && saveDisabledMessage && !showSuccess\" class=\"mld-experiment-popover__save-hint\">\n {{ saveDisabledMessage }}\n </div>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/experiment-popover.css';\n</style>\n"],"names":["_createElementBlock","_createElementVNode","_normalizeClass","_toDisplayString","_openBlock","_Fragment"],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -13055,8 +13055,14 @@ html.dark .mld-settings-modal__option-btn--active {
|
|
|
13055
13055
|
font-size: 0.6875rem;
|
|
13056
13056
|
color: var(--text-muted, var(--mld-text-muted, #94a3b8));
|
|
13057
13057
|
}
|
|
13058
|
-
.mld-experiment-
|
|
13058
|
+
.mld-experiment-popover__card-actions {
|
|
13059
|
+
display: flex;
|
|
13060
|
+
flex-direction: column;
|
|
13061
|
+
align-items: flex-end;
|
|
13062
|
+
gap: 0.125rem;
|
|
13059
13063
|
flex-shrink: 0;
|
|
13064
|
+
}
|
|
13065
|
+
.mld-experiment-popover__change-btn {
|
|
13060
13066
|
padding: 0.25rem 0.375rem;
|
|
13061
13067
|
border: none;
|
|
13062
13068
|
background: transparent;
|
|
@@ -13070,6 +13076,21 @@ html.dark .mld-settings-modal__option-btn--active {
|
|
|
13070
13076
|
.mld-experiment-popover__change-btn:hover {
|
|
13071
13077
|
background: rgba(99, 102, 241, 0.08);
|
|
13072
13078
|
}
|
|
13079
|
+
.mld-experiment-popover__detach-btn {
|
|
13080
|
+
padding: 0.25rem 0.375rem;
|
|
13081
|
+
border: none;
|
|
13082
|
+
background: transparent;
|
|
13083
|
+
border-radius: 0.25rem;
|
|
13084
|
+
color: var(--text-muted, var(--mld-text-muted, #94a3b8));
|
|
13085
|
+
font-size: 0.6875rem;
|
|
13086
|
+
font-weight: 400;
|
|
13087
|
+
cursor: pointer;
|
|
13088
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
13089
|
+
}
|
|
13090
|
+
.mld-experiment-popover__detach-btn:hover {
|
|
13091
|
+
color: #ef4444;
|
|
13092
|
+
background: rgba(239, 68, 68, 0.08);
|
|
13093
|
+
}
|
|
13073
13094
|
/* Divider */
|
|
13074
13095
|
.mld-experiment-popover__divider {
|
|
13075
13096
|
height: 1px;
|
|
@@ -25860,8 +25881,14 @@ to { transform: rotate(360deg);
|
|
|
25860
25881
|
font-size: 0.6875rem;
|
|
25861
25882
|
color: var(--text-muted, var(--mld-text-muted, #94a3b8));
|
|
25862
25883
|
}
|
|
25863
|
-
.mld-experiment-
|
|
25884
|
+
.mld-experiment-popover__card-actions {
|
|
25885
|
+
display: flex;
|
|
25886
|
+
flex-direction: column;
|
|
25887
|
+
align-items: flex-end;
|
|
25888
|
+
gap: 0.125rem;
|
|
25864
25889
|
flex-shrink: 0;
|
|
25890
|
+
}
|
|
25891
|
+
.mld-experiment-popover__change-btn {
|
|
25865
25892
|
padding: 0.25rem 0.375rem;
|
|
25866
25893
|
border: none;
|
|
25867
25894
|
background: transparent;
|
|
@@ -25875,6 +25902,21 @@ to { transform: rotate(360deg);
|
|
|
25875
25902
|
.mld-experiment-popover__change-btn:hover {
|
|
25876
25903
|
background: rgba(99, 102, 241, 0.08);
|
|
25877
25904
|
}
|
|
25905
|
+
.mld-experiment-popover__detach-btn {
|
|
25906
|
+
padding: 0.25rem 0.375rem;
|
|
25907
|
+
border: none;
|
|
25908
|
+
background: transparent;
|
|
25909
|
+
border-radius: 0.25rem;
|
|
25910
|
+
color: var(--text-muted, var(--mld-text-muted, #94a3b8));
|
|
25911
|
+
font-size: 0.6875rem;
|
|
25912
|
+
font-weight: 400;
|
|
25913
|
+
cursor: pointer;
|
|
25914
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
25915
|
+
}
|
|
25916
|
+
.mld-experiment-popover__detach-btn:hover {
|
|
25917
|
+
color: #ef4444;
|
|
25918
|
+
background: rgba(239, 68, 68, 0.08);
|
|
25919
|
+
}
|
|
25878
25920
|
|
|
25879
25921
|
/* Divider */
|
|
25880
25922
|
.mld-experiment-popover__divider {
|
package/package.json
CHANGED
|
@@ -5,6 +5,7 @@ interface Props {
|
|
|
5
5
|
experimentName?: string
|
|
6
6
|
experimentStatus?: string
|
|
7
7
|
showSave?: boolean
|
|
8
|
+
showDetach?: boolean
|
|
8
9
|
saveDisabled?: boolean
|
|
9
10
|
saveLoading?: boolean
|
|
10
11
|
saveSuccessMessage?: string
|
|
@@ -13,6 +14,7 @@ interface Props {
|
|
|
13
14
|
|
|
14
15
|
const props = withDefaults(defineProps<Props>(), {
|
|
15
16
|
showSave: false,
|
|
17
|
+
showDetach: false,
|
|
16
18
|
saveDisabled: false,
|
|
17
19
|
saveLoading: false,
|
|
18
20
|
})
|
|
@@ -20,6 +22,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
20
22
|
const emit = defineEmits<{
|
|
21
23
|
select: []
|
|
22
24
|
save: []
|
|
25
|
+
detach: []
|
|
23
26
|
}>()
|
|
24
27
|
|
|
25
28
|
const isOpen = ref(false)
|
|
@@ -44,6 +47,11 @@ function handleSave() {
|
|
|
44
47
|
emit('save')
|
|
45
48
|
}
|
|
46
49
|
|
|
50
|
+
function handleDetach() {
|
|
51
|
+
emit('detach')
|
|
52
|
+
close()
|
|
53
|
+
}
|
|
54
|
+
|
|
47
55
|
function handleClickOutside(event: MouseEvent) {
|
|
48
56
|
if (popoverRef.value && !popoverRef.value.contains(event.target as Node)) {
|
|
49
57
|
close()
|
|
@@ -143,9 +151,14 @@ function formatStatus(status: string): string {
|
|
|
143
151
|
{{ formatStatus(experimentStatus) }}
|
|
144
152
|
</div>
|
|
145
153
|
</div>
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
|
|
154
|
+
<div class="mld-experiment-popover__card-actions">
|
|
155
|
+
<button type="button" class="mld-experiment-popover__change-btn" @click="handleSelect">
|
|
156
|
+
Change
|
|
157
|
+
</button>
|
|
158
|
+
<button v-if="showDetach" type="button" class="mld-experiment-popover__detach-btn" @click="handleDetach">
|
|
159
|
+
Detach
|
|
160
|
+
</button>
|
|
161
|
+
</div>
|
|
149
162
|
</div>
|
|
150
163
|
</div>
|
|
151
164
|
|
|
@@ -181,8 +181,15 @@
|
|
|
181
181
|
color: var(--text-muted, var(--mld-text-muted, #94a3b8));
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
.mld-experiment-
|
|
184
|
+
.mld-experiment-popover__card-actions {
|
|
185
|
+
display: flex;
|
|
186
|
+
flex-direction: column;
|
|
187
|
+
align-items: flex-end;
|
|
188
|
+
gap: 0.125rem;
|
|
185
189
|
flex-shrink: 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.mld-experiment-popover__change-btn {
|
|
186
193
|
padding: 0.25rem 0.375rem;
|
|
187
194
|
border: none;
|
|
188
195
|
background: transparent;
|
|
@@ -198,6 +205,23 @@
|
|
|
198
205
|
background: rgba(99, 102, 241, 0.08);
|
|
199
206
|
}
|
|
200
207
|
|
|
208
|
+
.mld-experiment-popover__detach-btn {
|
|
209
|
+
padding: 0.25rem 0.375rem;
|
|
210
|
+
border: none;
|
|
211
|
+
background: transparent;
|
|
212
|
+
border-radius: 0.25rem;
|
|
213
|
+
color: var(--text-muted, var(--mld-text-muted, #94a3b8));
|
|
214
|
+
font-size: 0.6875rem;
|
|
215
|
+
font-weight: 400;
|
|
216
|
+
cursor: pointer;
|
|
217
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.mld-experiment-popover__detach-btn:hover {
|
|
221
|
+
color: #ef4444;
|
|
222
|
+
background: rgba(239, 68, 68, 0.08);
|
|
223
|
+
}
|
|
224
|
+
|
|
201
225
|
/* Divider */
|
|
202
226
|
.mld-experiment-popover__divider {
|
|
203
227
|
height: 1px;
|