UNPKG

n8n-editor-ui

Version:

Workflow Editor UI for n8n

263 lines (262 loc) 11.8 kB
import { o as __toESM } from "./chunk-6z4oVpB-.js"; 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, U as mergeModels, _ as Fragment, _t as watch, at as renderSlot, bt as withCtx, et as openBlock, ft as useModel, it as renderList, j as createTextVNode, vn as normalizeClass, w as createBaseVNode } from "./vue.runtime.esm-bundler-tP5dCd7J.js"; import { _t as useI18n } from "./_MapCache-ficiegRb.js"; import { J as N8nSelect_default, Sn as N8nButton_default, Y as N8nOption_default, lt as N8nBadge_default, rt as N8nAvatar_default, wn as N8nIcon_default, xn as N8nText_default } from "./src-DgvumQTi.js"; import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js"; import { Qn as ProjectTypes, di as splitName } from "./builder.store-sBTWwxRU.js"; import { n as isIconOrEmoji, t as ProjectIcon_default } from "./ProjectIcon-A2WPT9dM.js"; import { t as require_orderBy } from "./orderBy-EuatZUAl.js"; var _hoisted_1 = { key: 0 }; var ProjectSharingInfo_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "ProjectSharingInfo", props: { project: {} }, setup(__props) { const props = __props; const processedName = computed(() => { const { name, email } = splitName(props.project.name ?? ""); const nameArray = name?.split(" "); const lastName = nameArray?.pop() ?? ""; return { firstName: nameArray?.join(" ") ?? "", lastName, email }; }); const projectIcon = computed(() => { if (props.project.icon && isIconOrEmoji(props.project.icon)) return props.project.icon; return null; }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.projectInfo), "data-test-id": "project-sharing-info" }, [createBaseVNode("div", null, [projectIcon.value ? (openBlock(), createBlock(ProjectIcon_default, { key: 0, icon: projectIcon.value, size: "large", round: true }, null, 8, ["icon"])) : (openBlock(), createBlock(unref(N8nAvatar_default), { key: 1, "first-name": processedName.value.firstName, "last-name": processedName.value.lastName }, null, 8, ["first-name", "last-name"])), createBaseVNode("div", { class: normalizeClass(_ctx.$style.text) }, [processedName.value.firstName || processedName.value.lastName ? (openBlock(), createElementBlock("p", _hoisted_1, toDisplayString(processedName.value.firstName) + " " + toDisplayString(processedName.value.lastName), 1)) : createCommentVNode("", true), createBaseVNode("small", null, toDisplayString(processedName.value.email), 1)], 2)]), renderSlot(_ctx.$slots, "default")], 2); }; } }); var ProjectSharingInfo_vue_vue_type_style_index_0_lang_module_default = { projectInfo: "_projectInfo_5ycyd_123", text: "_text_5ycyd_148" }; var ProjectSharingInfo_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectSharingInfo_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectSharingInfo_vue_vue_type_style_index_0_lang_module_default }]]); var import_orderBy = /* @__PURE__ */ __toESM(require_orderBy()); var ProjectSharing_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "ProjectSharing", props: /* @__PURE__ */ mergeModels({ projects: {}, homeProject: {}, roles: {}, readonly: { type: Boolean }, static: { type: Boolean }, placeholder: {}, emptyOptionsText: {}, size: {}, clearable: { type: Boolean }, canShareGlobally: { type: Boolean }, isSharedGlobally: { type: Boolean } }, { "modelValue": { required: true }, "modelModifiers": {} }), emits: /* @__PURE__ */ mergeModels([ "projectAdded", "projectRemoved", "clear", "update:shareWithAllUsers" ], ["update:modelValue"]), setup(__props, { emit: __emit }) { const locale = useI18n(); const GLOBAL_GROUP = { id: "all_users", name: locale.baseText("projects.sharing.allUsers"), type: "public", icon: { type: "icon", value: "globe" }, role: "member", createdAt: `${Date.now()}`, updatedAt: `${Date.now()}` }; const props = __props; const model = useModel(__props, "modelValue"); const emit = __emit; const selectedProject = ref(Array.isArray(model.value) ? "" : model.value?.id ?? ""); const selectedProjects$1 = computed(() => { if (!Array.isArray(model.value)) return null; return props.isSharedGlobally ? [GLOBAL_GROUP, ...model.value] : model.value; }); const filter = ref(""); const selectPlaceholder = computed(() => props.placeholder ?? locale.baseText("projects.sharing.select.placeholder")); const noDataText = computed(() => props.emptyOptionsText ?? locale.baseText("projects.sharing.noMatchingUsers")); const filteredProjects = computed(() => props.projects.filter((project$1) => project$1.name?.toLowerCase().includes(filter.value.toLowerCase()) && (Array.isArray(model.value) ? !model.value?.find((p) => p.id === project$1.id) : true))); const sortedProjects = computed(() => [...props.canShareGlobally && !props.isSharedGlobally ? [GLOBAL_GROUP] : [], ...(0, import_orderBy.default)(filteredProjects.value, ["type", (project$1) => project$1.name?.toLowerCase()], ["desc", "asc"])]); const projectIcon = computed(() => { const defaultIcon = { type: "icon", value: "layers" }; const project$1 = props.projects.find((p) => p.id === selectedProject.value); if (project$1?.type === ProjectTypes.Personal) return { type: "icon", value: "user" }; else if (project$1?.type === ProjectTypes.Team) return isIconOrEmoji(project$1.icon) ? project$1.icon : defaultIcon; return defaultIcon; }); const setFilter = (query) => { filter.value = query; }; const onProjectSelected = (projectId) => { if (projectId === GLOBAL_GROUP.id) { emit("update:shareWithAllUsers", true); return; } const project$1 = props.projects.find((p) => p.id === projectId); if (!project$1) return; if (Array.isArray(model.value)) model.value = [...model.value, project$1]; else model.value = project$1; emit("projectAdded", project$1); }; const onRoleAction = (project$1, role) => { if (!Array.isArray(model.value) || props.readonly) return; if (project$1.id === GLOBAL_GROUP.id && role === "remove") { emit("update:shareWithAllUsers", false); return; } if ((model.value?.findIndex((p) => p.id === project$1.id) ?? -1) === -1) return; if (role === "remove") { model.value = model.value.filter((p) => p.id !== project$1.id); emit("projectRemoved", project$1); } }; watch(() => model.value, () => { if (model.value === null || Array.isArray(model.value)) selectedProject.value = ""; else selectedProject.value = model.value.id; }, { immediate: true }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", null, [!props.static ? (openBlock(), createBlock(unref(N8nSelect_default), { key: 0, "model-value": selectedProject.value, "data-test-id": "project-sharing-select", filterable: true, "filter-method": setFilter, placeholder: selectPlaceholder.value, "default-first-option": true, "no-data-text": noDataText.value, size: _ctx.size ?? "medium", disabled: props.readonly, clearable: _ctx.clearable, "popper-class": _ctx.$style.popper, "onUpdate:modelValue": onProjectSelected, onClear: _cache[0] || (_cache[0] = ($event) => emit("clear")) }, { prefix: withCtx(() => [projectIcon.value.type === "icon" ? (openBlock(), createBlock(unref(N8nIcon_default), { key: 0, icon: projectIcon.value.value, color: "text-dark" }, null, 8, ["icon"])) : projectIcon.value.type === "emoji" ? (openBlock(), createBlock(unref(N8nText_default), { key: 1, color: "text-light", class: normalizeClass(_ctx.$style.emoji) }, { default: withCtx(() => [createTextVNode(toDisplayString(projectIcon.value.value), 1)]), _: 1 }, 8, ["class"])) : createCommentVNode("", true)]), default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(sortedProjects.value, (project$1) => { return openBlock(), createBlock(unref(N8nOption_default), { key: project$1.id, value: project$1.id, label: project$1.name ?? "" }, { default: withCtx(() => [createVNode(ProjectSharingInfo_default, { project: project$1 }, null, 8, ["project"])]), _: 2 }, 1032, ["value", "label"]); }), 128))]), _: 1 }, 8, [ "model-value", "placeholder", "no-data-text", "size", "disabled", "clearable", "popper-class" ])) : createCommentVNode("", true), selectedProjects$1.value ? (openBlock(), createElementBlock("ul", { key: 1, class: normalizeClass(_ctx.$style.selectedProjects) }, [props.homeProject ? (openBlock(), createElementBlock("li", { key: 0, class: normalizeClass(_ctx.$style.project), "data-test-id": "project-sharing-owner" }, [createVNode(ProjectSharingInfo_default, { project: props.homeProject }, { default: withCtx(() => [createVNode(unref(N8nBadge_default), { theme: "tertiary", bold: "" }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("auth.roles.owner")), 1)]), _: 1 })]), _: 1 }, 8, ["project"])], 2)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(selectedProjects$1.value, (project$1) => { return openBlock(), createElementBlock("li", { key: project$1.id, class: normalizeClass(_ctx.$style.project), "data-test-id": "project-sharing-list-item" }, [ createVNode(ProjectSharingInfo_default, { project: project$1 }, null, 8, ["project"]), props.roles?.length && !props.static && !(project$1.id === GLOBAL_GROUP.id && !_ctx.canShareGlobally) ? (openBlock(), createBlock(unref(N8nSelect_default), { key: 0, class: normalizeClass(_ctx.$style.projectRoleSelect), "model-value": props.roles[0], disabled: props.readonly, size: "small", "onUpdate:modelValue": ($event) => onRoleAction(project$1, $event) }, { default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.roles, (role) => { return openBlock(), createBlock(unref(N8nOption_default), { key: role.slug, value: role.slug, label: role.displayName }, null, 8, ["value", "label"]); }), 128))]), _: 2 }, 1032, [ "class", "model-value", "disabled", "onUpdate:modelValue" ])) : createCommentVNode("", true), !props.static && !(project$1.id === GLOBAL_GROUP.id && !_ctx.canShareGlobally) ? (openBlock(), createBlock(unref(N8nButton_default), { key: 1, type: "tertiary", "native-type": "button", square: "", icon: "trash-2", disabled: props.readonly, "data-test-id": "project-sharing-remove", onClick: ($event) => onRoleAction(project$1, "remove") }, null, 8, ["disabled", "onClick"])) : createCommentVNode("", true) ], 2); }), 128))], 2)) : createCommentVNode("", true)]); }; } }); var ProjectSharing_vue_vue_type_style_index_0_lang_module_default = { project: "_project_5tpba_123", selectedProjects: "_selectedProjects_5tpba_131", projectRoleSelect: "_projectRoleSelect_5tpba_142", popper: "_popper_5tpba_146", emoji: "_emoji_5tpba_150" }; var ProjectSharing_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectSharing_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectSharing_vue_vue_type_style_index_0_lang_module_default }]]); export { ProjectSharing_default as t };