n8n-editor-ui
Version:
Workflow Editor UI for n8n
334 lines (333 loc) • 14.5 kB
JavaScript
import { C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, Gt as unref, It as ref, M as createVNode, P as defineComponent, T as createBlock, _ as Fragment, _t as watch, bt as withCtx, et as openBlock, h as withModifiers, it as renderList, j as createTextVNode, vn as normalizeClass, w as createBaseVNode } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
import { M as useMediaQuery, gt as useI18n } from "./_MapCache-B159LOu5.js";
import { G as N8nSelect_default, Hn as N8nButton_default, K as N8nOption_default, Vn as N8nText_default, Wn as N8nIcon_default, at as N8nBadge_default, nt as N8nActionDropdown_default, xt as N8nIconButton_default, yt as N8nInput_default } from "./src-BW7zuOU1.js";
import "./en-b3uD8cvU.js";
import "./preload-helper-CR0ecmWK.js";
import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
import { f as RouterLink, y as useRouter } from "./truncate-Dc5upPom.js";
import "./icon-MZ_3fB_h.js";
import "./overlay-CftFqN-S.js";
import "./empty-4-N75rxI.js";
import { t as useMessage } from "./useMessage-C1bozAQq.js";
import { Fi as useUIStore, nr as useUsersStore } from "./useTelemetry-C797TaYa.js";
import { t as useToast } from "./useToast-ZaUhbG9w.js";
import "./sanitize-html-CgpOSgtK.js";
import "./CalendarDate-DxkU3CHY.js";
import "./path-browserify-B5h_dP_u.js";
import { Io as VIEWS, ts as MODAL_CONFIRM } from "./constants-CX1ozgFz.js";
import "./merge-BArJwbQo.js";
import "./_baseOrderBy-DL6Sy5xK.js";
import "./dateformat-CMLc6OKJ.js";
import "./useDebounce-RgPaX171.js";
import "./useExternalHooks-CYMS6JpD.js";
import "./useStyles-DhM0cpS7.js";
import "./retry-CalJieID.js";
import "./CredentialIcon-DJSoDYWS.js";
import { t as AGENT_EDITOR_MODAL_KEY, u as MOBILE_MEDIA_QUERY } from "./constants-D2fYduVh.js";
import { d as stringifyModel, n as filterAndSortAgents, o as getAgentRoute, t as useChatStore } from "./chat.store-VUDdXt4K.js";
import "./fileUtils-BIVczUdz.js";
import { t as ChatAgentAvatar_default } from "./ChatAgentAvatar-C3dUgLPz.js";
import { n as ChatLayout_default, r as useChatCredentials, t as ChatSidebarOpener_default } from "./ChatSidebarOpener-DTZUxSbg.js";
import "./useChatHubSidebarState-XHgTWB-4.js";
var ChatAgentCard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ChatAgentCard",
props: { agent: {} },
emits: ["edit", "delete"],
setup(__props, { emit: __emit }) {
const emit = __emit;
const i18n = useI18n();
const menuItems = computed(() => {
return [{
id: "edit",
label: i18n.baseText("chatHub.agent.card.menu.edit")
}, ...__props.agent.model.provider === "custom-agent" ? [{
id: "delete",
label: i18n.baseText("chatHub.agent.card.menu.delete")
}] : []];
});
function handleSelectMenu(action) {
switch (action) {
case "delete":
emit("delete");
return;
case "edit": emit("edit");
}
}
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(RouterLink), {
to: unref(getAgentRoute)(_ctx.agent.model),
class: normalizeClass(_ctx.$style.card)
}, {
default: withCtx(() => [
createVNode(ChatAgentAvatar_default, {
agent: _ctx.agent,
size: "lg"
}, null, 8, ["agent"]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.content) }, [createVNode(unref(N8nText_default), {
tag: "h3",
size: "medium",
bold: "",
class: normalizeClass(_ctx.$style.title)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.agent.name), 1)]),
_: 1
}, 8, ["class"]), createVNode(unref(N8nText_default), {
size: "small",
color: "text-light",
class: normalizeClass(_ctx.$style.description)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.agent.description || unref(i18n).baseText("chatHub.agent.card.noDescription")), 1)]),
_: 1
}, 8, ["class"])], 2),
createVNode(unref(N8nBadge_default), {
theme: "tertiary",
"show-border": "",
class: normalizeClass(_ctx.$style.badge)
}, {
default: withCtx(() => [createTextVNode(toDisplayString(_ctx.agent.model.provider === "n8n" ? unref(i18n).baseText("chatHub.agent.card.badge.n8nWorkflow") : unref(i18n).baseText("chatHub.agent.card.badge.customAgent")), 1)]),
_: 1
}, 8, ["class"]),
createBaseVNode("div", { class: normalizeClass(_ctx.$style.actions) }, [createVNode(unref(N8nIconButton_default), {
icon: "pen",
type: "tertiary",
size: "medium",
title: unref(i18n).baseText("chatHub.agent.card.button.edit"),
onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("edit"), ["prevent"]))
}, null, 8, ["title"]), createVNode(unref(N8nActionDropdown_default), {
items: menuItems.value,
placement: "bottom-end",
onSelect: handleSelectMenu,
onClick: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop", "prevent"]))
}, {
activator: withCtx(() => [createVNode(unref(N8nIconButton_default), {
icon: "ellipsis-vertical",
type: "tertiary",
size: "medium",
title: unref(i18n).baseText("chatHub.agent.card.button.moreOptions"),
text: "",
class: normalizeClass(_ctx.$style.actionDropdownTrigger)
}, null, 8, ["title", "class"])]),
_: 1
}, 8, ["items"])], 2)
]),
_: 1
}, 8, ["to", "class"]);
};
}
});
var ChatAgentCard_vue_vue_type_style_index_0_lang_module_default = {
card: "_card_1v5ca_123",
avatar: "_avatar_1v5ca_139",
content: "_content_1v5ca_143",
badge: "_badge_1v5ca_151",
title: "_title_1v5ca_155",
description: "_description_1v5ca_161",
actions: "_actions_1v5ca_167",
actionDropdownTrigger: "_actionDropdownTrigger_1v5ca_173"
};
var ChatAgentCard_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ChatAgentCard_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ChatAgentCard_vue_vue_type_style_index_0_lang_module_default }]]);
var ChatAgentsView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "ChatAgentsView",
setup(__props) {
const chatStore = useChatStore();
const uiStore = useUIStore();
const toast = useToast();
const message = useMessage();
const usersStore = useUsersStore();
const router = useRouter();
const isMobileDevice$1 = useMediaQuery(MOBILE_MEDIA_QUERY);
const i18n = useI18n();
const agentFilter = ref({
search: "",
provider: "",
sortBy: "updatedAt"
});
const { credentialsByProvider } = useChatCredentials(usersStore.currentUserId ?? "anonymous");
const readyToShowList = computed(() => chatStore.agentsReady);
const allModels = computed(() => chatStore.agents.n8n.models.concat(chatStore.agents["custom-agent"].models));
const agents = computed(() => filterAndSortAgents(allModels.value, agentFilter.value));
const providerOptions = computed(() => [
{
label: i18n.baseText("chatHub.agents.filter.all"),
value: ""
},
{
label: i18n.baseText("chatHub.agents.filter.customAgents"),
value: "custom-agent"
},
{
label: i18n.baseText("chatHub.agents.filter.n8nWorkflows"),
value: "n8n"
}
]);
const sortOptions = computed(() => [{
label: i18n.baseText("chatHub.agents.sort.updatedAt"),
value: "updatedAt"
}, {
label: i18n.baseText("chatHub.agents.sort.createdAt"),
value: "createdAt"
}]);
function handleCreateAgent() {
uiStore.openModalWithData({
name: AGENT_EDITOR_MODAL_KEY,
data: { credentials: credentialsByProvider }
});
}
async function handleEditAgent(model) {
if (model.provider === "n8n") {
const routeData = router.resolve({
name: VIEWS.WORKFLOW,
params: { name: model.workflowId }
});
window.open(routeData.href, "_blank");
return;
}
if (model.provider === "custom-agent") uiStore.openModalWithData({
name: AGENT_EDITOR_MODAL_KEY,
data: {
agentId: model.agentId,
credentials: credentialsByProvider
}
});
}
async function handleDeleteAgent(agentId) {
if (await message.confirm(i18n.baseText("chatHub.agents.delete.confirm.message"), i18n.baseText("chatHub.agents.delete.confirm.title"), {
confirmButtonText: i18n.baseText("chatHub.agents.delete.confirm.button"),
cancelButtonText: i18n.baseText("chatHub.agents.delete.cancel.button")
}) !== "confirm" || !credentialsByProvider.value) return;
try {
await chatStore.deleteCustomAgent(agentId, credentialsByProvider.value);
toast.showMessage({
type: "success",
title: i18n.baseText("chatHub.agents.delete.success")
});
} catch (error) {
toast.showError(error, i18n.baseText("chatHub.agents.delete.error"));
}
}
watch(credentialsByProvider, (credentials) => {
if (credentials) chatStore.fetchAgents(credentials);
}, { immediate: true });
return (_ctx, _cache) => {
return openBlock(), createBlock(ChatLayout_default, null, {
default: withCtx(() => [createBaseVNode("div", { class: normalizeClass([_ctx.$style.container, { [_ctx.$style.isMobileDevice]: unref(isMobileDevice$1) }]) }, [
createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.headerContent) }, [createVNode(unref(N8nText_default), {
tag: "h1",
size: "xlarge",
bold: ""
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("chatHub.agents.title")), 1)]),
_: 1
}), createVNode(unref(N8nText_default), { color: "text-light" }, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("chatHub.agents.description")), 1)]),
_: 1
})], 2), createVNode(unref(N8nButton_default), {
icon: "plus",
type: "primary",
size: "medium",
onClick: handleCreateAgent
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("chatHub.agents.button.newAgent")), 1)]),
_: 1
})], 2),
readyToShowList.value && allModels.value.length > 0 ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass(_ctx.$style.controls)
}, [
createVNode(unref(N8nInput_default), {
modelValue: agentFilter.value.search,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => agentFilter.value.search = $event),
class: normalizeClass(_ctx.$style.search),
placeholder: unref(i18n).baseText("chatHub.agents.search.placeholder"),
clearable: ""
}, {
prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
_: 1
}, 8, [
"modelValue",
"class",
"placeholder"
]),
createVNode(unref(N8nSelect_default), {
modelValue: agentFilter.value.provider,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => agentFilter.value.provider = $event),
class: normalizeClass(_ctx.$style.filter)
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(providerOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: String(option.value),
label: option.label,
value: option.value
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, ["modelValue", "class"]),
createVNode(unref(N8nSelect_default), {
modelValue: agentFilter.value.sortBy,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => agentFilter.value.sortBy = $event),
class: normalizeClass(_ctx.$style.sort)
}, {
default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(sortOptions.value, (option) => {
return openBlock(), createBlock(unref(N8nOption_default), {
key: option.value,
label: option.label,
value: option.value
}, null, 8, ["label", "value"]);
}), 128))]),
_: 1
}, 8, ["modelValue", "class"])
], 2)) : createCommentVNode("", true),
!readyToShowList.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [], 64)) : allModels.value.length === 0 ? (openBlock(), createElementBlock("div", {
key: 2,
class: normalizeClass(_ctx.$style.empty)
}, [createVNode(unref(N8nText_default), {
color: "text-light",
size: "medium"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("chatHub.agents.empty.noAgents")), 1)]),
_: 1
})], 2)) : agents.value.length === 0 ? (openBlock(), createElementBlock("div", {
key: 3,
class: normalizeClass(_ctx.$style.empty)
}, [createVNode(unref(N8nText_default), {
color: "text-light",
size: "medium"
}, {
default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("chatHub.agents.empty.noMatch")), 1)]),
_: 1
})], 2)) : (openBlock(), createElementBlock("div", {
key: 4,
class: normalizeClass(_ctx.$style.agentsGrid)
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(agents.value, (agent) => {
return openBlock(), createBlock(ChatAgentCard_default, {
key: unref(stringifyModel)(agent.model),
agent,
onEdit: ($event) => handleEditAgent(agent.model),
onDelete: ($event) => agent.model.provider === "custom-agent" ? handleDeleteAgent(agent.model.agentId) : void 0
}, null, 8, [
"agent",
"onEdit",
"onDelete"
]);
}), 128))], 2))
], 2), createVNode(ChatSidebarOpener_default, { class: normalizeClass(_ctx.$style.menuButton) }, null, 8, ["class"])]),
_: 1
});
};
}
});
var ChatAgentsView_vue_vue_type_style_index_0_lang_module_default = {
container: "_container_18hjw_123",
menuButton: "_menuButton_18hjw_136",
isMobileDevice: "_isMobileDevice_18hjw_142",
header: "_header_18hjw_146",
headerContent: "_headerContent_18hjw_154",
controls: "_controls_18hjw_160",
search: "_search_18hjw_166",
filter: "_filter_18hjw_171",
sort: "_sort_18hjw_175",
empty: "_empty_18hjw_179",
agentsGrid: "_agentsGrid_18hjw_188"
};
var ChatAgentsView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ChatAgentsView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ChatAgentsView_vue_vue_type_style_index_0_lang_module_default }]]);
export { ChatAgentsView_default as default };