240 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| import { d as defineComponent, a as useToast, aZ as useExecutionsStore, r as ref, x as computed, o as onMounted, W as onBeforeUnmount, a7 as watch, h as createElementBlock, g as openBlock, f as createCommentVNode, j as createBaseVNode, n as normalizeClass, i as createVNode, dD as N8nLoading, dC as _sfc_main$1, c as useI18n, _ as _export_sfc } from "./index-CeNA_ukL.js";
 | |
| const _hoisted_1 = ["src"];
 | |
| const _sfc_main = /* @__PURE__ */ defineComponent({
 | |
|   __name: "WorkflowPreview",
 | |
|   props: {
 | |
|     loading: { type: Boolean, default: false },
 | |
|     mode: { default: "workflow" },
 | |
|     workflow: { default: void 0 },
 | |
|     executionId: { default: void 0 },
 | |
|     executionMode: { default: void 0 },
 | |
|     nodeId: { default: void 0 },
 | |
|     loaderType: { default: "image" },
 | |
|     canOpenNDV: { type: Boolean, default: true },
 | |
|     hideNodeIssues: { type: Boolean, default: false },
 | |
|     focusOnLoad: { type: Boolean, default: true }
 | |
|   },
 | |
|   emits: ["close"],
 | |
|   setup(__props, { emit: __emit }) {
 | |
|     const props = __props;
 | |
|     const emit = __emit;
 | |
|     const i18n = useI18n();
 | |
|     const toast = useToast();
 | |
|     const executionsStore = useExecutionsStore();
 | |
|     const iframeRef = ref(null);
 | |
|     const nodeViewDetailsOpened = ref(false);
 | |
|     const ready = ref(false);
 | |
|     const insideIframe = ref(false);
 | |
|     const scrollX = ref(0);
 | |
|     const scrollY = ref(0);
 | |
|     const iframeSrc = computed(() => {
 | |
|       return `${window.BASE_PATH ?? "/"}workflows/demo`;
 | |
|     });
 | |
|     const showPreview = computed(() => {
 | |
|       return !props.loading && (props.mode === "workflow" && !!props.workflow || props.mode === "execution" && !!props.executionId) && ready.value;
 | |
|     });
 | |
|     const loadWorkflow = () => {
 | |
|       try {
 | |
|         if (!props.workflow) {
 | |
|           throw new Error(i18n.baseText("workflowPreview.showError.missingWorkflow"));
 | |
|         }
 | |
|         if (!props.workflow.nodes || !Array.isArray(props.workflow.nodes)) {
 | |
|           throw new Error(i18n.baseText("workflowPreview.showError.arrayEmpty"));
 | |
|         }
 | |
|         iframeRef.value?.contentWindow?.postMessage?.(
 | |
|           JSON.stringify({
 | |
|             command: "openWorkflow",
 | |
|             workflow: props.workflow,
 | |
|             canOpenNDV: props.canOpenNDV,
 | |
|             hideNodeIssues: props.hideNodeIssues
 | |
|           }),
 | |
|           "*"
 | |
|         );
 | |
|       } catch (error) {
 | |
|         toast.showError(
 | |
|           error,
 | |
|           i18n.baseText("workflowPreview.showError.previewError.title"),
 | |
|           i18n.baseText("workflowPreview.showError.previewError.message")
 | |
|         );
 | |
|       }
 | |
|     };
 | |
|     const loadExecution = () => {
 | |
|       try {
 | |
|         if (!props.executionId) {
 | |
|           throw new Error(i18n.baseText("workflowPreview.showError.missingExecution"));
 | |
|         }
 | |
|         iframeRef.value?.contentWindow?.postMessage?.(
 | |
|           JSON.stringify({
 | |
|             command: "openExecution",
 | |
|             executionId: props.executionId,
 | |
|             executionMode: props.executionMode ?? "",
 | |
|             nodeId: props.nodeId,
 | |
|             canOpenNDV: props.canOpenNDV
 | |
|           }),
 | |
|           "*"
 | |
|         );
 | |
|         if (executionsStore.activeExecution) {
 | |
|           iframeRef.value?.contentWindow?.postMessage?.(
 | |
|             JSON.stringify({
 | |
|               command: "setActiveExecution",
 | |
|               executionId: executionsStore.activeExecution.id
 | |
|             }),
 | |
|             "*"
 | |
|           );
 | |
|         }
 | |
|       } catch (error) {
 | |
|         toast.showError(
 | |
|           error,
 | |
|           i18n.baseText("workflowPreview.showError.previewError.title"),
 | |
|           i18n.baseText("workflowPreview.executionMode.showError.previewError.message")
 | |
|         );
 | |
|       }
 | |
|     };
 | |
|     const onMouseEnter = () => {
 | |
|       insideIframe.value = true;
 | |
|       scrollX.value = window.scrollX;
 | |
|       scrollY.value = window.scrollY;
 | |
|     };
 | |
|     const onMouseLeave = () => {
 | |
|       insideIframe.value = false;
 | |
|     };
 | |
|     const receiveMessage = ({ data }) => {
 | |
|       if (!data?.includes?.('"command"')) {
 | |
|         return;
 | |
|       }
 | |
|       try {
 | |
|         const json = JSON.parse(data);
 | |
|         if (json.command === "n8nReady") {
 | |
|           onReady();
 | |
|         } else if (json.command === "openNDV") {
 | |
|           onOpenNDV();
 | |
|         } else if (json.command === "closeNDV") {
 | |
|           onCloseNDV();
 | |
|         } else if (json.command === "error") {
 | |
|           onError();
 | |
|         }
 | |
|       } catch (e) {
 | |
|         console.error(e);
 | |
|       }
 | |
|     };
 | |
|     const onReady = () => {
 | |
|       ready.value = true;
 | |
|       if (props.focusOnLoad) {
 | |
|         setTimeout(() => {
 | |
|           iframeRef.value?.contentWindow?.focus();
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     const onOpenNDV = () => {
 | |
|       nodeViewDetailsOpened.value = true;
 | |
|     };
 | |
|     const onCloseNDV = () => {
 | |
|       nodeViewDetailsOpened.value = false;
 | |
|     };
 | |
|     const onError = () => {
 | |
|       emit("close");
 | |
|     };
 | |
|     const onDocumentScroll = () => {
 | |
|       if (insideIframe.value) {
 | |
|         window.scrollTo(scrollX.value, scrollY.value);
 | |
|       }
 | |
|     };
 | |
|     onMounted(() => {
 | |
|       window.addEventListener("message", receiveMessage);
 | |
|       document.addEventListener("scroll", onDocumentScroll);
 | |
|     });
 | |
|     onBeforeUnmount(() => {
 | |
|       window.removeEventListener("message", receiveMessage);
 | |
|       document.removeEventListener("scroll", onDocumentScroll);
 | |
|     });
 | |
|     watch(
 | |
|       () => showPreview.value,
 | |
|       () => {
 | |
|         if (showPreview.value) {
 | |
|           if (props.mode === "workflow") {
 | |
|             loadWorkflow();
 | |
|           } else if (props.mode === "execution") {
 | |
|             loadExecution();
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     );
 | |
|     watch(
 | |
|       () => props.executionId,
 | |
|       () => {
 | |
|         if (props.mode === "execution" && props.executionId) {
 | |
|           loadExecution();
 | |
|         }
 | |
|       }
 | |
|     );
 | |
|     watch(
 | |
|       () => props.workflow,
 | |
|       () => {
 | |
|         if (props.mode === "workflow" && props.workflow) {
 | |
|           loadWorkflow();
 | |
|         }
 | |
|       }
 | |
|     );
 | |
|     return (_ctx, _cache) => {
 | |
|       const _component_n8n_loading = N8nLoading;
 | |
|       const _component_n8n_spinner = _sfc_main$1;
 | |
|       return openBlock(), createElementBlock("div", {
 | |
|         class: normalizeClass(_ctx.$style.container)
 | |
|       }, [
 | |
|         _ctx.loaderType === "image" && !showPreview.value ? (openBlock(), createElementBlock("div", {
 | |
|           key: 0,
 | |
|           class: normalizeClass(_ctx.$style.imageLoader)
 | |
|         }, [
 | |
|           createVNode(_component_n8n_loading, {
 | |
|             loading: !showPreview.value,
 | |
|             rows: 1,
 | |
|             variant: "image"
 | |
|           }, null, 8, ["loading"])
 | |
|         ], 2)) : _ctx.loaderType === "spinner" && !showPreview.value ? (openBlock(), createElementBlock("div", {
 | |
|           key: 1,
 | |
|           class: normalizeClass(_ctx.$style.spinner)
 | |
|         }, [
 | |
|           createVNode(_component_n8n_spinner, { type: "dots" })
 | |
|         ], 2)) : createCommentVNode("", true),
 | |
|         createBaseVNode("iframe", {
 | |
|           ref_key: "iframeRef",
 | |
|           ref: iframeRef,
 | |
|           class: normalizeClass({
 | |
|             [_ctx.$style.workflow]: !nodeViewDetailsOpened.value,
 | |
|             [_ctx.$style.executionPreview]: _ctx.mode === "execution",
 | |
|             [_ctx.$style.openNDV]: nodeViewDetailsOpened.value,
 | |
|             [_ctx.$style.show]: showPreview.value
 | |
|           }),
 | |
|           src: iframeSrc.value,
 | |
|           "data-test-id": "workflow-preview-iframe",
 | |
|           onMouseenter: onMouseEnter,
 | |
|           onMouseleave: onMouseLeave
 | |
|         }, null, 42, _hoisted_1)
 | |
|       ], 2);
 | |
|     };
 | |
|   }
 | |
| });
 | |
| const container = "_container_idflw_123";
 | |
| const workflow = "_workflow_idflw_130";
 | |
| const show = "_show_idflw_136";
 | |
| const openNDV = "_openNDV_idflw_142";
 | |
| const spinner = "_spinner_idflw_151";
 | |
| const imageLoader = "_imageLoader_idflw_159";
 | |
| const executionPreview = "_executionPreview_idflw_167";
 | |
| const style0 = {
 | |
|   container,
 | |
|   workflow,
 | |
|   show,
 | |
|   openNDV,
 | |
|   spinner,
 | |
|   imageLoader,
 | |
|   executionPreview
 | |
| };
 | |
| const cssModules = {
 | |
|   "$style": style0
 | |
| };
 | |
| const WorkflowPreview = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
 | |
| export {
 | |
|   WorkflowPreview as W
 | |
| };
 |