From 74f3e9d18b902df234bbc2e905d659053ad4a7a3 Mon Sep 17 00:00:00 2001 From: Brandon Rose Date: Tue, 9 Sep 2025 20:12:19 -0500 Subject: [PATCH 01/15] fix workflow modal selector --- .../components/misc/WorkflowSelectDialog.vue | 391 ++++++++++++++++-- 1 file changed, 347 insertions(+), 44 deletions(-) diff --git a/beaker-vue/src/components/misc/WorkflowSelectDialog.vue b/beaker-vue/src/components/misc/WorkflowSelectDialog.vue index 6f9a509a..80303462 100644 --- a/beaker-vue/src/components/misc/WorkflowSelectDialog.vue +++ b/beaker-vue/src/components/misc/WorkflowSelectDialog.vue @@ -8,7 +8,7 @@
-

Selected:

+

Currently Active:

-
- - - - - + +
+
+ + + + +
+ +
+ + + + + + +
+ +
+ + + +
@@ -84,7 +141,7 @@ const session = inject('session'); const dialogRef: ComputedRef = inject('dialogRef'); const hoveredCard = ref(undefined); - +const selectedWorkflowId = ref(undefined); const searchText = ref(undefined); const setWorkflow = (id?: string) => { @@ -93,25 +150,49 @@ const setWorkflow = (id?: string) => { dialogRef.value.close(); } +const selectWorkflow = (id: string) => { + selectedWorkflowId.value = id; +} + +const confirmSelection = () => { + if (selectedWorkflowId.value) { + setWorkflow(selectedWorkflowId.value); + } +} + const clear = () => setWorkflow(null); const { workflows, attachedWorkflowId, attachedWorkflow } = useWorkflows(beakerSession); -const searchResults = computed<{[key in string]: any}>(() => Object.fromEntries( - Object.entries(workflows.value).filter(([_, workflow]) => - searchText.value === "" - || searchText.value === undefined - || [ - workflow.human_description, - workflow.title, - workflow.category - ].join(' ').toLocaleLowerCase().includes(searchText.value.toLocaleLowerCase())))) +const selectedWorkflow = computed(() => { + if (!selectedWorkflowId.value || !workflows.value) return null; + return workflows.value[selectedWorkflowId.value]; +}); + +const searchResults = computed<{[key in string]: any}>(() => { + if (!workflows.value) return {}; + return Object.fromEntries( + Object.entries(workflows.value).filter(([_, workflow]) => + searchText.value === "" + || searchText.value === undefined + || [ + workflow.human_description, + workflow.title, + workflow.category + ].join(' ').toLocaleLowerCase().includes(searchText.value.toLocaleLowerCase())) + ); +}); From a82bb8e50c301e1ae35557750e1be73f431ac7c0 Mon Sep 17 00:00:00 2001 From: Brandon Rose Date: Tue, 9 Sep 2025 20:34:39 -0500 Subject: [PATCH 02/15] streamline implementation of new workflow select dialog --- .../components/misc/WorkflowSelectDialog.vue | 404 +++++++----------- 1 file changed, 144 insertions(+), 260 deletions(-) diff --git a/beaker-vue/src/components/misc/WorkflowSelectDialog.vue b/beaker-vue/src/components/misc/WorkflowSelectDialog.vue index 80303462..68cc5149 100644 --- a/beaker-vue/src/components/misc/WorkflowSelectDialog.vue +++ b/beaker-vue/src/components/misc/WorkflowSelectDialog.vue @@ -53,18 +53,16 @@ @mouseleave="hoveredCard = undefined" @mouseenter="hoveredCard = id" > -
- - @@ -265,32 +265,28 @@ const searchResults = computed<{[key in string]: any}>(() => { .workflow-preview { flex: 1.2; min-width: 400px; - display: flex; - flex-direction: column; + position: relative; } .preview-content-scrollable { - flex: 1; + height: 100%; overflow-y: auto; - min-height: 0; } .preview-card { height: auto; } -.sticky-footer-flex { - flex-shrink: 0; +.floating-action-gutter { + position: absolute; + bottom: 1rem; + right: 1rem; + z-index: 10; background: var(--p-surface-0); padding: 1rem; - border-top: 1px solid var(--p-surface-200); - box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1); -} - - -.preview-actions { - display: flex; - justify-content: flex-end; + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + border: 1px solid var(--p-surface-200); } .select-button { From 56a4088241903783c6fbd323988dc0d29b8b0fb0 Mon Sep 17 00:00:00 2001 From: Brandon Rose Date: Wed, 10 Sep 2025 11:46:34 -0500 Subject: [PATCH 10/15] fix positioning of submit button --- beaker-vue/src/components/misc/WorkflowSelectDialog.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/beaker-vue/src/components/misc/WorkflowSelectDialog.vue b/beaker-vue/src/components/misc/WorkflowSelectDialog.vue index ffe1f282..8c684081 100644 --- a/beaker-vue/src/components/misc/WorkflowSelectDialog.vue +++ b/beaker-vue/src/components/misc/WorkflowSelectDialog.vue @@ -278,10 +278,10 @@ const searchResults = computed<{[key in string]: any}>(() => { } .floating-action-gutter { - position: absolute; - bottom: 1rem; - right: 1rem; - z-index: 10; + position: fixed; + bottom: 2rem; + right: 2rem; + z-index: 1000; background: var(--p-surface-0); padding: 1rem; border-radius: 8px; From d127f75caf43595b82a6899dad1839138eb4e302 Mon Sep 17 00:00:00 2001 From: "J.Quiles" Date: Thu, 11 Sep 2025 16:01:48 -0400 Subject: [PATCH 11/15] Download as docx button, added functionality to workflow output pane. Needs `npm install`. --- beaker-vue/package-lock.json | 241 +++++++- beaker-vue/package.json | 2 + .../components/panels/WorkflowOutputPanel.vue | 121 +++- .../src/components/sidemenu/SideMenuPanel.vue | 1 + beaker-vue/src/utils/exportUtils.ts | 532 ++++++++++++++++++ 5 files changed, 891 insertions(+), 6 deletions(-) create mode 100644 beaker-vue/src/utils/exportUtils.ts diff --git a/beaker-vue/package-lock.json b/beaker-vue/package-lock.json index f6aaeb06..cdadf0f2 100644 --- a/beaker-vue/package-lock.json +++ b/beaker-vue/package-lock.json @@ -30,9 +30,11 @@ "content-disposition": "^0.5.4", "cookie": "^1.0.2", "cytoscape": "^3.31.2", + "docx": "^9.5.0", "escape-html": "^1.0.3", "filesize": "^10.1.6", "hash-sum": "^2.0.0", + "html2canvas": "^1.4.1", "isomorphic-fetch": "^3.0.0", "json5": "^2.2.3", "katex": "^0.16.22", @@ -4578,6 +4580,15 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4999,6 +5010,12 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -5020,6 +5037,15 @@ "node": ">= 8" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -5197,6 +5223,56 @@ "node": ">=0.10" } }, + "node_modules/docx": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/docx/-/docx-9.5.1.tgz", + "integrity": "sha512-ABDI7JEirFD2+bHhOBlsGZxaG1UgZb2M/QMKhLSDGgVNhxDesTCDcP+qoDnDGjZ4EOXTRfUjUgwHVuZ6VSTfWQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^24.0.1", + "hash.js": "^1.1.7", + "jszip": "^3.10.1", + "nanoid": "^5.1.3", + "xml": "^1.0.1", + "xml-js": "^1.6.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/docx/node_modules/@types/node": { + "version": "24.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", + "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/docx/node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/docx/node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "license": "MIT" + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -6183,6 +6259,16 @@ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", "license": "MIT" }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -6237,6 +6323,19 @@ "node": ">=18" } }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -6337,6 +6436,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immutable": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", @@ -6376,6 +6481,12 @@ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", @@ -6567,6 +6678,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6827,6 +6944,18 @@ "node": ">=0.10.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/katex": { "version": "0.16.22", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", @@ -6914,6 +7043,15 @@ "url": "https://github.com/sponsors/dmonad" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/loader-utils": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", @@ -7098,6 +7236,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -7477,6 +7621,12 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, "node_modules/panel": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/panel/-/panel-6.2.0.tgz", @@ -7879,6 +8029,12 @@ "node": ">=12.11.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -7993,6 +8149,27 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -8580,6 +8757,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -8666,6 +8849,12 @@ "semver": "bin/semver.js" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8816,6 +9005,21 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -9062,6 +9266,15 @@ "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", "license": "MIT" }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -9374,9 +9587,17 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -10164,6 +10385,24 @@ "node": ">=0.8" } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", diff --git a/beaker-vue/package.json b/beaker-vue/package.json index 5c3c999f..1ad644c3 100644 --- a/beaker-vue/package.json +++ b/beaker-vue/package.json @@ -48,9 +48,11 @@ "content-disposition": "^0.5.4", "cookie": "^1.0.2", "cytoscape": "^3.31.2", + "docx": "^9.5.0", "escape-html": "^1.0.3", "filesize": "^10.1.6", "hash-sum": "^2.0.0", + "html2canvas": "^1.4.1", "isomorphic-fetch": "^3.0.0", "json5": "^2.2.3", "katex": "^0.16.22", diff --git a/beaker-vue/src/components/panels/WorkflowOutputPanel.vue b/beaker-vue/src/components/panels/WorkflowOutputPanel.vue index 1c88ab17..9404e3b9 100644 --- a/beaker-vue/src/components/panels/WorkflowOutputPanel.vue +++ b/beaker-vue/src/components/panels/WorkflowOutputPanel.vue @@ -3,36 +3,147 @@

No workflow selected. Select one above or ask the agent about which workflow could work for your task.

-
+ +
+ +
+ +