484 lines
19 KiB
JavaScript
Executable File
484 lines
19 KiB
JavaScript
Executable File
import { d as defineComponent, dP as deepCopy, ew as useLogStreamingStore, r as ref, o as onMounted, ex as defaultMessageEventBusDestinationOptions, b1 as onBeforeMount, x as computed, c as useI18n, ey as assert, a8 as resolveComponent, e as createBlock, g as openBlock, s as N8nCard, n as normalizeClass, w as withCtx, j as createBaseVNode, i as createVNode, p as N8nText, k as createTextVNode, t as toDisplayString, l as unref, ed as N8nActionToggle, m as N8nHeading, am as useMessage, an as MODAL_CONFIRM, _ as _export_sfc, v as useSettingsStore, a1 as useWorkflowsStore, Q as useUIStore, d9 as useCredentialsStore, ax as useDocumentTitle, aA as usePageRedirectionHelper, aE as EnterpriseEditionFeature, aD as hasPermission, aq as createEventBus, ez as getCurrentInstance, cc as resolveDirective, h as createElementBlock, f as createCommentVNode, F as Fragment, b2 as withDirectives, cQ as InfoTip, A as renderList, q as N8nButton, dY as N8nActionBox, bD as v4, Y as nextTick, eA as LOG_STREAM_MODAL_KEY } from "./index--OJ5nhDf.js";
|
||
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
||
__name: "EventDestinationCard.ee",
|
||
props: {
|
||
eventBus: {},
|
||
destination: { default: () => deepCopy(defaultMessageEventBusDestinationOptions) },
|
||
readonly: { type: Boolean }
|
||
},
|
||
emits: ["edit", "remove"],
|
||
setup(__props, { emit: __emit }) {
|
||
const DESTINATION_LIST_ITEM_ACTIONS = {
|
||
OPEN: "open",
|
||
DELETE: "delete"
|
||
};
|
||
const { confirm } = useMessage();
|
||
const i18n = useI18n();
|
||
const logStreamingStore = useLogStreamingStore();
|
||
const nodeParameters = ref({});
|
||
const cardActions2 = ref(null);
|
||
const props = __props;
|
||
const emit = __emit;
|
||
onMounted(() => {
|
||
nodeParameters.value = Object.assign(
|
||
deepCopy(defaultMessageEventBusDestinationOptions),
|
||
props.destination
|
||
);
|
||
props.eventBus?.on("destinationWasSaved", onDestinationWasSaved);
|
||
});
|
||
onBeforeMount(() => {
|
||
props.eventBus?.off("destinationWasSaved", onDestinationWasSaved);
|
||
});
|
||
const actions = computed(() => {
|
||
const actionList = [
|
||
{
|
||
label: i18n.baseText("workflows.item.open"),
|
||
value: DESTINATION_LIST_ITEM_ACTIONS.OPEN
|
||
}
|
||
];
|
||
if (!props.readonly) {
|
||
actionList.push({
|
||
label: i18n.baseText("workflows.item.delete"),
|
||
value: DESTINATION_LIST_ITEM_ACTIONS.DELETE
|
||
});
|
||
}
|
||
return actionList;
|
||
});
|
||
const typeLabelName = computed(() => {
|
||
return `settings.log-streaming.${props.destination.__type}`;
|
||
});
|
||
function onDestinationWasSaved() {
|
||
assert(props.destination.id);
|
||
const updatedDestination = logStreamingStore.getDestination(props.destination.id);
|
||
if (updatedDestination) {
|
||
nodeParameters.value = Object.assign(
|
||
deepCopy(defaultMessageEventBusDestinationOptions),
|
||
props.destination
|
||
);
|
||
}
|
||
}
|
||
async function onClick(event) {
|
||
const target = event.target;
|
||
if (cardActions2.value === target || cardActions2.value?.contains(target) || target?.contains(cardActions2.value)) {
|
||
return;
|
||
}
|
||
emit("edit", props.destination.id);
|
||
}
|
||
function onEnabledSwitched(state) {
|
||
nodeParameters.value.enabled = state;
|
||
void saveDestination();
|
||
}
|
||
async function saveDestination() {
|
||
await logStreamingStore.saveDestination(nodeParameters.value);
|
||
}
|
||
async function onAction(action) {
|
||
if (action === DESTINATION_LIST_ITEM_ACTIONS.OPEN) {
|
||
emit("edit", props.destination.id);
|
||
} else if (action === DESTINATION_LIST_ITEM_ACTIONS.DELETE) {
|
||
const deleteConfirmed = await confirm(
|
||
i18n.baseText("settings.log-streaming.destinationDelete.message", {
|
||
interpolate: { destinationName: props.destination.label ?? "" }
|
||
}),
|
||
i18n.baseText("settings.log-streaming.destinationDelete.headline"),
|
||
{
|
||
type: "warning",
|
||
confirmButtonText: i18n.baseText(
|
||
"settings.log-streaming.destinationDelete.confirmButtonText"
|
||
),
|
||
cancelButtonText: i18n.baseText(
|
||
"settings.log-streaming.destinationDelete.cancelButtonText"
|
||
)
|
||
}
|
||
);
|
||
if (deleteConfirmed !== MODAL_CONFIRM) {
|
||
return;
|
||
}
|
||
emit("remove", props.destination.id);
|
||
}
|
||
}
|
||
return (_ctx, _cache) => {
|
||
const _component_n8n_heading = N8nHeading;
|
||
const _component_n8n_text = N8nText;
|
||
const _component_el_switch = resolveComponent("el-switch");
|
||
const _component_n8n_action_toggle = N8nActionToggle;
|
||
const _component_n8n_card = N8nCard;
|
||
return openBlock(), createBlock(_component_n8n_card, {
|
||
class: normalizeClass(_ctx.$style.cardLink),
|
||
"data-test-id": "destination-card",
|
||
onClick
|
||
}, {
|
||
header: withCtx(() => [
|
||
createBaseVNode("div", null, [
|
||
createVNode(_component_n8n_heading, {
|
||
tag: "h2",
|
||
bold: "",
|
||
class: normalizeClass(_ctx.$style.cardHeading)
|
||
}, {
|
||
default: withCtx(() => [
|
||
createTextVNode(toDisplayString(_ctx.destination.label), 1)
|
||
]),
|
||
_: 1
|
||
}, 8, ["class"]),
|
||
createBaseVNode("div", {
|
||
class: normalizeClass(_ctx.$style.cardDescription)
|
||
}, [
|
||
createVNode(_component_n8n_text, {
|
||
color: "text-light",
|
||
size: "small"
|
||
}, {
|
||
default: withCtx(() => [
|
||
createBaseVNode("span", null, toDisplayString(unref(i18n).baseText(typeLabelName.value)), 1)
|
||
]),
|
||
_: 1
|
||
})
|
||
], 2)
|
||
])
|
||
]),
|
||
append: withCtx(() => [
|
||
createBaseVNode("div", {
|
||
ref_key: "cardActions",
|
||
ref: cardActions2,
|
||
class: normalizeClass(_ctx.$style.cardActions)
|
||
}, [
|
||
createBaseVNode("div", {
|
||
class: normalizeClass(_ctx.$style.activeStatusText),
|
||
"data-test-id": "destination-activator-status"
|
||
}, [
|
||
nodeParameters.value.enabled ? (openBlock(), createBlock(_component_n8n_text, {
|
||
key: 0,
|
||
color: "success",
|
||
size: "small",
|
||
bold: ""
|
||
}, {
|
||
default: withCtx(() => [
|
||
createTextVNode(toDisplayString(unref(i18n).baseText("workflowActivator.active")), 1)
|
||
]),
|
||
_: 1
|
||
})) : (openBlock(), createBlock(_component_n8n_text, {
|
||
key: 1,
|
||
color: "text-base",
|
||
size: "small",
|
||
bold: ""
|
||
}, {
|
||
default: withCtx(() => [
|
||
createTextVNode(toDisplayString(unref(i18n).baseText("workflowActivator.inactive")), 1)
|
||
]),
|
||
_: 1
|
||
}))
|
||
], 2),
|
||
createVNode(_component_el_switch, {
|
||
class: "mr-s",
|
||
disabled: _ctx.readonly,
|
||
"model-value": nodeParameters.value.enabled,
|
||
title: nodeParameters.value.enabled ? unref(i18n).baseText("workflowActivator.deactivateWorkflow") : unref(i18n).baseText("workflowActivator.activateWorkflow"),
|
||
"active-color": "#13ce66",
|
||
"inactive-color": "#8899AA",
|
||
"data-test-id": "workflow-activate-switch",
|
||
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => onEnabledSwitched($event))
|
||
}, null, 8, ["disabled", "model-value", "title"]),
|
||
createVNode(_component_n8n_action_toggle, {
|
||
actions: actions.value,
|
||
theme: "dark",
|
||
onAction
|
||
}, null, 8, ["actions"])
|
||
], 2)
|
||
]),
|
||
_: 1
|
||
}, 8, ["class"]);
|
||
};
|
||
}
|
||
});
|
||
const cardLink = "_cardLink_1izy6_123";
|
||
const activeStatusText = "_activeStatusText_1izy6_133";
|
||
const cardHeading = "_cardHeading_1izy6_141";
|
||
const cardDescription = "_cardDescription_1izy6_147";
|
||
const cardActions = "_cardActions_1izy6_154";
|
||
const style0$1 = {
|
||
cardLink,
|
||
activeStatusText,
|
||
cardHeading,
|
||
cardDescription,
|
||
cardActions
|
||
};
|
||
const cssModules$1 = {
|
||
"$style": style0$1
|
||
};
|
||
const EventDestinationCard = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
|
||
const _hoisted_1 = { class: "mb-2xl" };
|
||
const _hoisted_2 = { class: "ml-m" };
|
||
const _hoisted_3 = { class: "mb-l" };
|
||
const _hoisted_4 = { class: "mt-m text-right" };
|
||
const _hoisted_5 = {
|
||
key: 1,
|
||
"data-test-id": "action-box-licensed"
|
||
};
|
||
const _hoisted_6 = {
|
||
key: 0,
|
||
class: "mb-l"
|
||
};
|
||
const _hoisted_7 = { "data-test-id": "action-box-unlicensed" };
|
||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||
__name: "SettingsLogStreamingView",
|
||
setup(__props) {
|
||
const environment = "production";
|
||
const settingsStore = useSettingsStore();
|
||
const logStreamingStore = useLogStreamingStore();
|
||
const workflowsStore = useWorkflowsStore();
|
||
const uiStore = useUIStore();
|
||
const credentialsStore = useCredentialsStore();
|
||
const documentTitle = useDocumentTitle();
|
||
const i18n = useI18n();
|
||
const pageRedirectHelper = usePageRedirectionHelper();
|
||
const eventBus = createEventBus();
|
||
const disableLicense = ref(false);
|
||
const allDestinations = ref([]);
|
||
const sortedItemKeysByLabel = computed(() => {
|
||
const sortedKeys = [];
|
||
for (const [key, value] of Object.entries(logStreamingStore.items)) {
|
||
sortedKeys.push({ key, label: value.destination?.label ?? "Destination" });
|
||
}
|
||
return sortedKeys.sort((a, b) => a.label.localeCompare(b.label));
|
||
});
|
||
const isLicensed = computed(() => {
|
||
if (disableLicense.value) return false;
|
||
return settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.LogStreaming];
|
||
});
|
||
const canManageLogStreaming = computed(() => {
|
||
return hasPermission(["rbac"], { rbac: { scope: "logStreaming:manage" } });
|
||
});
|
||
onMounted(async () => {
|
||
documentTitle.set(i18n.baseText("settings.log-streaming.heading"));
|
||
if (!isLicensed.value) return;
|
||
await credentialsStore.fetchCredentialTypes(false);
|
||
await credentialsStore.fetchAllCredentials();
|
||
uiStore.nodeViewInitialized = false;
|
||
await getDestinationDataFromBackend();
|
||
logStreamingStore.$onAction(({ name, after }) => {
|
||
if (name === "removeDestination" || name === "updateDestination") {
|
||
after(async () => {
|
||
forceUpdateInstance();
|
||
});
|
||
}
|
||
});
|
||
eventBus.on("destinationWasSaved", onDestinationWasSaved);
|
||
eventBus.on("remove", onRemove);
|
||
eventBus.on("closing", onBusClosing);
|
||
});
|
||
onBeforeMount(() => {
|
||
eventBus.off("destinationWasSaved", onDestinationWasSaved);
|
||
eventBus.off("remove", onRemove);
|
||
eventBus.off("closing", onBusClosing);
|
||
});
|
||
function onDestinationWasSaved() {
|
||
forceUpdateInstance();
|
||
}
|
||
function forceUpdateInstance() {
|
||
const instance = getCurrentInstance();
|
||
instance?.proxy?.$forceUpdate();
|
||
}
|
||
function onBusClosing() {
|
||
workflowsStore.removeAllNodes({ setStateDirty: false, removePinData: true });
|
||
uiStore.stateIsDirty = false;
|
||
}
|
||
async function getDestinationDataFromBackend() {
|
||
logStreamingStore.clearEventNames();
|
||
logStreamingStore.clearDestinations();
|
||
allDestinations.value = [];
|
||
const eventNamesData = await logStreamingStore.fetchEventNames();
|
||
if (eventNamesData) {
|
||
for (const eventName of eventNamesData) {
|
||
logStreamingStore.addEventName(eventName);
|
||
}
|
||
}
|
||
const destinationData = await logStreamingStore.fetchDestinations();
|
||
if (destinationData) {
|
||
for (const destination of destinationData) {
|
||
logStreamingStore.addDestination(destination);
|
||
allDestinations.value.push(destination);
|
||
}
|
||
}
|
||
forceUpdateInstance();
|
||
}
|
||
function goToUpgrade() {
|
||
void pageRedirectHelper.goToUpgrade("log-streaming", "upgrade-log-streaming");
|
||
}
|
||
function storeHasItems() {
|
||
return logStreamingStore.items && Object.keys(logStreamingStore.items).length > 0;
|
||
}
|
||
async function addDestination() {
|
||
const newDestination = deepCopy(defaultMessageEventBusDestinationOptions);
|
||
newDestination.id = v4();
|
||
logStreamingStore.addDestination(newDestination);
|
||
await nextTick();
|
||
uiStore.openModalWithData({
|
||
name: LOG_STREAM_MODAL_KEY,
|
||
data: {
|
||
destination: newDestination,
|
||
isNew: true,
|
||
eventBus
|
||
}
|
||
});
|
||
}
|
||
async function onRemove(destinationId) {
|
||
if (!destinationId) return;
|
||
await logStreamingStore.deleteDestination(destinationId);
|
||
const foundNode = workflowsStore.getNodeByName(destinationId);
|
||
if (foundNode) {
|
||
workflowsStore.removeNode(foundNode);
|
||
}
|
||
}
|
||
async function onEdit(destinationId) {
|
||
if (!destinationId) return;
|
||
const editDestination = logStreamingStore.getDestination(destinationId);
|
||
if (editDestination) {
|
||
uiStore.openModalWithData({
|
||
name: LOG_STREAM_MODAL_KEY,
|
||
data: {
|
||
destination: editDestination,
|
||
isNew: false,
|
||
eventBus
|
||
}
|
||
});
|
||
}
|
||
}
|
||
return (_ctx, _cache) => {
|
||
const _component_n8n_heading = N8nHeading;
|
||
const _component_el_switch = resolveComponent("el-switch");
|
||
const _component_n8n_info_tip = InfoTip;
|
||
const _component_el_col = resolveComponent("el-col");
|
||
const _component_el_row = resolveComponent("el-row");
|
||
const _component_n8n_button = N8nButton;
|
||
const _component_n8n_action_box = N8nActionBox;
|
||
const _directive_n8n_html = resolveDirective("n8n-html");
|
||
return openBlock(), createElementBlock("div", null, [
|
||
createBaseVNode("div", {
|
||
class: normalizeClass(_ctx.$style.header)
|
||
}, [
|
||
createBaseVNode("div", _hoisted_1, [
|
||
createVNode(_component_n8n_heading, { size: "2xlarge" }, {
|
||
default: withCtx(() => [
|
||
createTextVNode(toDisplayString(unref(i18n).baseText(`settings.log-streaming.heading`)), 1)
|
||
]),
|
||
_: 1
|
||
}),
|
||
unref(environment) !== "production" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
||
createBaseVNode("span", _hoisted_2, "Disable License (" + toDisplayString(unref(environment)) + ") ", 1),
|
||
createVNode(_component_el_switch, {
|
||
modelValue: disableLicense.value,
|
||
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => disableLicense.value = $event),
|
||
size: "large",
|
||
"data-test-id": "disable-license-toggle"
|
||
}, null, 8, ["modelValue"])
|
||
], 64)) : createCommentVNode("", true)
|
||
])
|
||
], 2),
|
||
isLicensed.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
||
createBaseVNode("div", _hoisted_3, [
|
||
createVNode(_component_n8n_info_tip, {
|
||
theme: "info",
|
||
type: "note"
|
||
}, {
|
||
default: withCtx(() => [
|
||
withDirectives(createBaseVNode("span", null, null, 512), [
|
||
[_directive_n8n_html, unref(i18n).baseText("settings.log-streaming.infoText")]
|
||
])
|
||
]),
|
||
_: 1
|
||
})
|
||
]),
|
||
storeHasItems() ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
||
(openBlock(true), createElementBlock(Fragment, null, renderList(sortedItemKeysByLabel.value, (item) => {
|
||
return openBlock(), createBlock(_component_el_row, {
|
||
key: item.key,
|
||
gutter: 10,
|
||
class: normalizeClass(_ctx.$style.destinationItem)
|
||
}, {
|
||
default: withCtx(() => [
|
||
unref(logStreamingStore).items[item.key]?.destination ? (openBlock(), createBlock(_component_el_col, { key: 0 }, {
|
||
default: withCtx(() => [
|
||
createVNode(EventDestinationCard, {
|
||
destination: unref(logStreamingStore).items[item.key]?.destination,
|
||
"event-bus": unref(eventBus),
|
||
readonly: !canManageLogStreaming.value,
|
||
onRemove: ($event) => onRemove(unref(logStreamingStore).items[item.key]?.destination?.id),
|
||
onEdit: ($event) => onEdit(unref(logStreamingStore).items[item.key]?.destination?.id)
|
||
}, null, 8, ["destination", "event-bus", "readonly", "onRemove", "onEdit"])
|
||
]),
|
||
_: 2
|
||
}, 1024)) : createCommentVNode("", true)
|
||
]),
|
||
_: 2
|
||
}, 1032, ["class"]);
|
||
}), 128)),
|
||
createBaseVNode("div", _hoisted_4, [
|
||
canManageLogStreaming.value ? (openBlock(), createBlock(_component_n8n_button, {
|
||
key: 0,
|
||
size: "large",
|
||
onClick: addDestination
|
||
}, {
|
||
default: withCtx(() => [
|
||
createTextVNode(toDisplayString(unref(i18n).baseText(`settings.log-streaming.add`)), 1)
|
||
]),
|
||
_: 1
|
||
})) : createCommentVNode("", true)
|
||
])
|
||
], 64)) : (openBlock(), createElementBlock("div", _hoisted_5, [
|
||
createVNode(_component_n8n_action_box, {
|
||
"button-text": unref(i18n).baseText(`settings.log-streaming.add`),
|
||
"onClick:button": addDestination
|
||
}, {
|
||
heading: withCtx(() => [
|
||
withDirectives(createBaseVNode("span", null, null, 512), [
|
||
[_directive_n8n_html, unref(i18n).baseText(`settings.log-streaming.addFirstTitle`)]
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 8, ["button-text"])
|
||
]))
|
||
], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
||
unref(i18n).baseText("settings.log-streaming.infoText") ? (openBlock(), createElementBlock("div", _hoisted_6, [
|
||
createVNode(_component_n8n_info_tip, {
|
||
theme: "info",
|
||
type: "note"
|
||
}, {
|
||
default: withCtx(() => [
|
||
withDirectives(createBaseVNode("span", null, null, 512), [
|
||
[_directive_n8n_html, unref(i18n).baseText("settings.log-streaming.infoText")]
|
||
])
|
||
]),
|
||
_: 1
|
||
})
|
||
])) : createCommentVNode("", true),
|
||
createBaseVNode("div", _hoisted_7, [
|
||
createVNode(_component_n8n_action_box, {
|
||
description: unref(i18n).baseText("settings.log-streaming.actionBox.description"),
|
||
"button-text": unref(i18n).baseText("settings.log-streaming.actionBox.button"),
|
||
"onClick:button": goToUpgrade
|
||
}, {
|
||
heading: withCtx(() => [
|
||
withDirectives(createBaseVNode("span", null, null, 512), [
|
||
[_directive_n8n_html, unref(i18n).baseText("settings.log-streaming.actionBox.title")]
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 8, ["description", "button-text"])
|
||
])
|
||
], 64))
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const header = "_header_x2fvs_123";
|
||
const destinationItem = "_destinationItem_x2fvs_133";
|
||
const style0 = {
|
||
header,
|
||
destinationItem
|
||
};
|
||
const cssModules = {
|
||
"$style": style0
|
||
};
|
||
const SettingsLogStreamingView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
|
||
export {
|
||
SettingsLogStreamingView as default
|
||
};
|