UNPKG

n8n-editor-ui

Version:

Workflow Editor UI for n8n

832 lines (831 loc) 33.5 kB
import { C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, Gt as unref, I as guardReactiveProps, It as ref, M as createVNode, P as defineComponent, T as createBlock, U as mergeModels, Z as onMounted, _ as Fragment, bt as withCtx, et as openBlock, ft as useModel, it as renderList, j as createTextVNode, vn as normalizeClass, w as createBaseVNode, yn as normalizeProps } from "./vue.runtime.esm-bundler-tP5dCd7J.js"; import { _t as useI18n, it as useDebounceFn, vt as I18nT } from "./_MapCache-ficiegRb.js"; import { Ct as N8nActionBox_default, Sn as N8nButton_default, Tt as ElSwitch, g as N8nUserInfo_default, ht as N8nTooltip_default, it as N8nActionToggle_default, k as N8nNotice_default, lt as N8nBadge_default, mt as N8nLink_default, ot as N8nActionDropdown_default, u as N8nDataTableServer_default, wn as N8nIcon_default, xn as N8nText_default, yn as N8nHeading_default, yt as N8nInput_default } from "./src-DgvumQTi.js"; import "./en-CF30SCh2.js"; import "./preload-helper-CR0ecmWK.js"; import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js"; import "./truncate-B1HVeveJ.js"; import { Ba as DELETE_USER_MODAL_KEY, Dr as useUsersStore, Yn as useDocumentTitle, gs as useSettingsStore, m as useMessage, oa as useUIStore, ro as INVITE_USER_MODAL_KEY, v as useToast, vr as hasPermission } from "./builder.store-sBTWwxRU.js"; import "./empty-BuGRxzl4.js"; import { t as ElRadio } from "./radio-BeejvdFG.js"; import "./sanitize-html-Cc45ZKm8.js"; import "./CalendarDate-zWqgZMlk.js"; import { t as Alert_default } from "./Alert-C3_SkWnL.js"; import "./path-browserify-BtCDmZ3_.js"; import { Kr as ROLE, bc as EnterpriseEditionFeature, ni as USERS_LIST_SORT_OPTIONS, rs as MODAL_CONFIRM } from "./constants-BbpucWL4.js"; import "./merge-k8vSyyXH.js"; import "./_baseOrderBy-B_6CV8x6.js"; import "./dateformat-CM9k0--B.js"; import "./useDebounce-Bnb8W2LR.js"; import "./versions.store-BwdT833-.js"; import { t as usePageRedirectionHelper } from "./usePageRedirectionHelper-fGNB6ZKK.js"; import { t as useClipboard } from "./useClipboard-CyG-SBdG.js"; import { r as formatTimeAgo } from "./dateFormatter-DDfPHI9I.js"; import { t as EnterpriseEdition_ee_default } from "./EnterpriseEdition.ee-UkQT-fFo.js"; import { n as useSSOStore } from "./sso.store-Ba2eVE3K.js"; import { t as useUserRoleProvisioningStore } from "./userRoleProvisioning.store-CCk1ab9D.js"; var _hoisted_1$1 = { key: 1 }; var SettingsUsersRoleCell_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "SettingsUsersRoleCell", props: { data: {}, roles: {}, actions: {} }, emits: ["update:role"], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const selectedRole = ref(props.data.role ?? ROLE.Default); const isEditable = computed(() => props.data.role !== ROLE.Owner); const roleLabel$1 = computed(() => props.roles[selectedRole.value]?.label); const onActionSelect = (role) => { emit("update:role", { role, userId: props.data.id }); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", null, [isEditable.value ? (openBlock(), createBlock(unref(N8nActionDropdown_default), { key: 0, placement: "bottom-start", items: props.actions, "data-test-id": "user-role-dropdown", onSelect: onActionSelect }, { activator: withCtx(() => [createBaseVNode("button", { class: normalizeClass(_ctx.$style.roleLabel), type: "button" }, [createVNode(unref(N8nText_default), { color: "text-dark" }, { default: withCtx(() => [createTextVNode(toDisplayString(roleLabel$1.value), 1)]), _: 1 }), createVNode(unref(N8nIcon_default), { color: "text-dark", icon: "chevron-down", size: "large" })], 2)]), menuItem: withCtx((item) => [createVNode(unref(ElRadio), { "model-value": selectedRole.value, label: item.id, "onUpdate:modelValue": ($event) => selectedRole.value = item.id }, { default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.radioLabel) }, [createVNode(unref(N8nText_default), { color: "text-dark", class: "pb-3xs" }, { default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]), _: 2 }, 1024), createVNode(unref(N8nText_default), { color: "text-dark", size: "small" }, { default: withCtx(() => [createTextVNode(toDisplayString(props.roles[item.id]?.desc), 1)]), _: 2 }, 1024)], 2)]), _: 2 }, 1032, [ "model-value", "label", "onUpdate:modelValue" ])]), _: 1 }, 8, ["items"])) : (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(roleLabel$1.value), 1))]); }; } }); var SettingsUsersRoleCell_vue_vue_type_style_index_0_lang_module_default = { roleLabel: "_roleLabel_uhits_123", radioLabel: "_radioLabel_uhits_133", removeUser: "_removeUser_uhits_143" }; var SettingsUsersRoleCell_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SettingsUsersRoleCell_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SettingsUsersRoleCell_vue_vue_type_style_index_0_lang_module_default }]]); var SettingsUsersProjectsCell_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "SettingsUsersProjectsCell", props: { data: {} }, setup(__props) { const props = __props; const i18n = useI18n(); const rolesAccessingAllProjects = ref([ROLE.Owner, ROLE.Admin]); const visibleProjectsNum = ref(2); const allProjects = computed(() => { if (props.data.role && rolesAccessingAllProjects.value.includes(props.data.role)) return [i18n.baseText("settings.users.table.row.allProjects")]; else if (!props.data.projectRelations?.length) return [i18n.baseText("settings.users.table.row.personalProject")]; else return props.data.projectRelations.map(({ name }) => name); }); const projects$1 = computed(() => ({ visible: allProjects.value.slice(0, visibleProjectsNum.value), additional: allProjects.value.slice(visibleProjectsNum.value) })); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.projects) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(projects$1.value.visible, (project$1, index) => { return openBlock(), createElementBlock(Fragment, { key: index }, [createBaseVNode("span", { class: normalizeClass(_ctx.$style.project) }, toDisplayString(project$1), 3), index < projects$1.value.visible.length - 1 ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(_ctx.$style.comma) }, ",", 2)) : createCommentVNode("", true)], 64); }), 128)), projects$1.value.additional.length > 0 ? (openBlock(), createElementBlock("span", { key: 0, class: normalizeClass(_ctx.$style.comma) }, ",", 2)) : createCommentVNode("", true), projects$1.value.additional.length > 0 ? (openBlock(), createBlock(unref(N8nTooltip_default), { key: 1 }, { content: withCtx(() => [createBaseVNode("ul", { class: normalizeClass(_ctx.$style.projectList) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(projects$1.value.additional, (project$1, index) => { return openBlock(), createElementBlock("li", { key: index }, toDisplayString(project$1), 1); }), 128))], 2)]), default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.project) }, "+ " + toDisplayString(projects$1.value.additional.length), 3)]), _: 1 })) : createCommentVNode("", true) ], 2); }; } }); var SettingsUsersProjectsCell_vue_vue_type_style_index_0_lang_module_default = { projects: "_projects_1l6q5_123", project: "_project_1l6q5_123", comma: "_comma_1l6q5_138", projectList: "_projectList_1l6q5_143" }; var SettingsUsersProjectsCell_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SettingsUsersProjectsCell_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SettingsUsersProjectsCell_vue_vue_type_style_index_0_lang_module_default }]]); var SettingsUsersActionsCell_default = /* @__PURE__ */ defineComponent({ __name: "SettingsUsersActionsCell", props: { data: {}, actions: {} }, emits: ["action"], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const onUserAction = (action) => { emit("action", { action, userId: props.data.id }); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", null, [props.data.signInType !== "ldap" && props.actions.length > 0 ? (openBlock(), createBlock(unref(N8nActionToggle_default), { key: 0, placement: "bottom", actions: props.actions, theme: "dark", onAction: onUserAction }, null, 8, ["actions"])) : createCommentVNode("", true)]); }; } }); var SettingsUsersLastActiveCell_default = /* @__PURE__ */ defineComponent({ __name: "SettingsUsersLastActiveCell", props: { data: {} }, setup(__props) { const i18n = useI18n(); const props = __props; const formattedDate = computed(() => props.data.lastActiveAt ? formatTimeAgo(props.data.lastActiveAt) : i18n.baseText("generic.never")); return (_ctx, _cache) => { return openBlock(), createElementBlock("span", null, toDisplayString(formattedDate.value), 1); }; } }); var _hoisted_1 = { class: "pt-xs pb-xs" }; var SettingsUsersTable_default = /* @__PURE__ */ defineComponent({ __name: "SettingsUsersTable", props: /* @__PURE__ */ mergeModels({ data: {}, actions: {}, loading: { type: Boolean }, canEditRole: { type: Boolean } }, { "tableOptions": { default: () => ({}) }, "tableOptionsModifiers": {} }), emits: /* @__PURE__ */ mergeModels([ "update:options", "update:role", "action" ], ["update:tableOptions"]), setup(__props, { emit: __emit }) { const i18n = useI18n(); const settingsStore = useSettingsStore(); const props = __props; const emit = __emit; const tableOptions = useModel(__props, "tableOptions"); const rows = computed(() => props.data.items); const headers = ref([ { title: i18n.baseText("settings.users.table.header.user"), key: "name", width: 400, value(row) { return { ...row, isPendingUser: row.isPending }; } }, { title: i18n.baseText("settings.users.table.header.accountType"), key: "role" }, { title: i18n.baseText("settings.users.table.header.lastActive"), key: "lastActiveAt", value(row) { return { ...row, lastActiveAt: row.lastActiveAt ?? "" }; } }, { title: i18n.baseText("settings.users.table.header.2fa"), key: "mfaEnabled", value(row) { return row.mfaEnabled ? i18n.baseText("settings.users.table.row.2fa.enabled") : i18n.baseText("settings.users.table.row.2fa.disabled"); } }, { title: i18n.baseText("projects.menu.title"), key: "projects", disableSort: true, value() {} }, { title: "", key: "actions", align: "end", width: 46, disableSort: true, value() {} } ]); const roles = computed(() => ({ [ROLE.Owner]: { label: i18n.baseText("auth.roles.owner"), desc: "" }, [ROLE.Admin]: { label: i18n.baseText("auth.roles.admin"), desc: i18n.baseText("settings.users.table.row.role.description.admin") }, [ROLE.Member]: { label: i18n.baseText("auth.roles.member"), desc: i18n.baseText("settings.users.table.row.role.description.member") }, ...settingsStore.isChatFeatureEnabled && { [ROLE.ChatUser]: { label: i18n.baseText("auth.roles.chatUser"), desc: i18n.baseText("settings.users.table.row.role.description.chatUser") } }, [ROLE.Default]: { label: i18n.baseText("auth.roles.default"), desc: "" } })); const roleActions = computed(() => [ { id: ROLE.Member, label: i18n.baseText("auth.roles.member") }, ...settingsStore.isChatFeatureEnabled ? [{ id: ROLE.ChatUser, label: i18n.baseText("auth.roles.chatUser") }] : [], { id: ROLE.Admin, label: i18n.baseText("auth.roles.admin") } ]); const canUpdateRole = computed(() => { if (!hasPermission(["rbac"], { rbac: { scope: ["user:update", "user:changeRole"] } })) return false; if (!props.canEditRole) return false; return true; }); const filterActions = (user) => { if (user.isOwner) return []; return props.actions.filter((action) => action.guard?.({ ...user, isPendingUser: user.isPending }) ?? true); }; const onRoleChange = ({ role, userId }) => { emit("update:role", { role, userId }); }; return (_ctx, _cache) => { return openBlock(), createElementBlock("div", null, [createVNode(unref(N8nDataTableServer_default), { "sort-by": tableOptions.value.sortBy, "onUpdate:sortBy": _cache[1] || (_cache[1] = ($event) => tableOptions.value.sortBy = $event), page: tableOptions.value.page, "onUpdate:page": _cache[2] || (_cache[2] = ($event) => tableOptions.value.page = $event), "items-per-page": tableOptions.value.itemsPerPage, "onUpdate:itemsPerPage": _cache[3] || (_cache[3] = ($event) => tableOptions.value.itemsPerPage = $event), headers: headers.value, items: rows.value, "items-length": _ctx.data.count, "page-sizes": [ 10, 25, 50 ], "onUpdate:options": _cache[4] || (_cache[4] = ($event) => emit("update:options", $event)) }, { [`item.name`]: withCtx(({ value }) => [createBaseVNode("div", _hoisted_1, [createVNode(unref(N8nUserInfo_default), normalizeProps(guardReactiveProps(value)), null, 16)])]), [`item.role`]: withCtx(({ item }) => [canUpdateRole.value ? (openBlock(), createBlock(SettingsUsersRoleCell_default, { key: 0, data: item, roles: roles.value, actions: roleActions.value, "onUpdate:role": onRoleChange }, null, 8, [ "data", "roles", "actions" ])) : (openBlock(), createBlock(unref(N8nText_default), { key: 1, color: "text-dark" }, { default: withCtx(() => [createTextVNode(toDisplayString(roles.value[item.role ?? unref(ROLE).Default]?.label), 1)]), _: 2 }, 1024))]), [`item.lastActiveAt`]: withCtx(({ item }) => [createVNode(SettingsUsersLastActiveCell_default, { data: item }, null, 8, ["data"])]), [`item.projects`]: withCtx(({ item }) => [createVNode(SettingsUsersProjectsCell_default, { data: item }, null, 8, ["data"])]), [`item.actions`]: withCtx(({ item }) => [createVNode(SettingsUsersActionsCell_default, { data: item, actions: filterActions(item), onAction: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("action", $event)) }, null, 8, ["data", "actions"])]), _: 2 }, 1032, [ "sort-by", "page", "items-per-page", "headers", "items", "items-length" ])]); }; } }); var tooltipKey = "settings.personal.mfa.enforce.unlicensed_tooltip"; var SettingsUsersView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ __name: "SettingsUsersView", setup(__props) { const clipboard = useClipboard(); const { showToast, showError } = useToast(); const message = useMessage(); const settingsStore = useSettingsStore(); const uiStore = useUIStore(); const usersStore = useUsersStore(); const ssoStore = useSSOStore(); const documentTitle = useDocumentTitle(); const pageRedirectionHelper = usePageRedirectionHelper(); const userRoleProvisioningStore = useUserRoleProvisioningStore(); const i18n = useI18n(); const search$1 = ref(""); const usersTableState = ref({ page: 0, itemsPerPage: 10, sortBy: [ { id: "firstName", desc: false }, { id: "lastName", desc: false }, { id: "email", desc: false } ] }); const showUMSetupWarning = computed(() => hasPermission(["defaultUser"])); const isEnforceMFAEnabled = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.EnforceMFA]); const isInstanceRoleProvisioningEnabled = computed(() => userRoleProvisioningStore.provisioningConfig?.scopesProvisionInstanceRole || false); onMounted(async () => { documentTitle.set(i18n.baseText("settings.users")); if (!showUMSetupWarning.value) await updateUsersTableData(usersTableState.value); await userRoleProvisioningStore.getProvisioningConfig(); }); const usersListActions = computed(() => { return [ { label: i18n.baseText("settings.users.actions.copyInviteLink"), value: "copyInviteLink", guard: (user) => usersStore.usersLimitNotReached && !user.firstName && !!user.inviteAcceptUrl }, { label: i18n.baseText("settings.users.actions.reinvite"), value: "reinvite", guard: (user) => usersStore.usersLimitNotReached && !user.firstName && settingsStore.isSmtpSetup }, { label: i18n.baseText("settings.users.actions.delete"), value: "delete", guard: (user) => hasPermission(["rbac"], { rbac: { scope: "user:delete" } }) && user.id !== usersStore.currentUserId }, { label: i18n.baseText("settings.users.actions.copyPasswordResetLink"), value: "copyPasswordResetLink", guard: (user) => hasPermission(["rbac"], { rbac: { scope: "user:resetPassword" } }) && usersStore.usersLimitNotReached && !user.isPendingUser && user.id !== usersStore.currentUserId }, { label: i18n.baseText("settings.users.actions.allowSSOManualLogin"), value: "allowSSOManualLogin", guard: (user) => !!ssoStore.isSamlLoginEnabled && !user.settings?.allowSSOManualLogin }, { label: i18n.baseText("settings.users.actions.disallowSSOManualLogin"), value: "disallowSSOManualLogin", guard: (user) => !!ssoStore.isSamlLoginEnabled && user.settings?.allowSSOManualLogin === true } ]; }); const isAdvancedPermissionsEnabled = computed(() => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.AdvancedPermissions]); const userRoles = computed(() => { return [ { value: ROLE.Member, label: i18n.baseText("auth.roles.member") }, { value: ROLE.ChatUser, label: i18n.baseText("auth.roles.chatUser"), disabled: !isAdvancedPermissionsEnabled.value }, { value: ROLE.Admin, label: i18n.baseText("auth.roles.admin"), disabled: !isAdvancedPermissionsEnabled.value } ]; }); async function onUsersListAction({ action, userId }) { switch (action) { case "delete": await onDelete(userId); break; case "reinvite": await onReinvite(userId); break; case "copyInviteLink": await onCopyInviteLink(userId); break; case "copyPasswordResetLink": await onCopyPasswordResetLink(userId); break; case "allowSSOManualLogin": await onAllowSSOManualLogin(userId); break; case "disallowSSOManualLogin": await onDisallowSSOManualLogin(userId); break; } } function onInvite() { uiStore.openModalWithData({ name: INVITE_USER_MODAL_KEY, data: { afterInvite: async () => { await updateUsersTableData(usersTableState.value); } } }); } async function onDelete(userId) { uiStore.openModalWithData({ name: DELETE_USER_MODAL_KEY, data: { userId, afterDelete: async () => { await updateUsersTableData(usersTableState.value); } } }); } async function onReinvite(userId) { try { const user = usersStore.usersList.state.items.find((u) => u.id === userId); if (user?.email && user?.role) { if (!["global:admin", "global:member"].includes(user.role)) throw new Error("Invalid role name on reinvite"); await usersStore.reinviteUser({ email: user.email, role: user.role }); showToast({ type: "success", title: i18n.baseText("settings.users.inviteResent"), message: i18n.baseText("settings.users.emailSentTo", { interpolate: { email: user.email ?? "" } }) }); } } catch (e) { showError(e, i18n.baseText("settings.users.userReinviteError")); } } async function onCopyInviteLink(userId) { const user = usersStore.usersList.state.items.find((u) => u.id === userId); if (user?.inviteAcceptUrl) { clipboard.copy(user.inviteAcceptUrl); showToast({ type: "success", title: i18n.baseText("settings.users.inviteUrlCreated"), message: i18n.baseText("settings.users.inviteUrlCreated.message") }); } } async function onCopyPasswordResetLink(userId) { try { const user = usersStore.usersList.state.items.find((u) => u.id === userId); if (user) { const url = await usersStore.getUserPasswordResetLink(user); clipboard.copy(url.link); showToast({ type: "success", title: i18n.baseText("settings.users.passwordResetUrlCreated"), message: i18n.baseText("settings.users.passwordResetUrlCreated.message") }); } } catch (error) { showError(error, i18n.baseText("settings.users.passwordResetLinkError")); } } async function onAllowSSOManualLogin(userId) { const user = usersStore.usersList.state.items.find((u) => u.id === userId); if (user) { if (!user.settings) user.settings = {}; user.settings.allowSSOManualLogin = true; await usersStore.updateOtherUserSettings(userId, user.settings); await updateUsersTableData(usersTableState.value); showToast({ type: "success", title: i18n.baseText("settings.users.allowSSOManualLogin"), message: i18n.baseText("settings.users.allowSSOManualLogin.message") }); } } async function onDisallowSSOManualLogin(userId) { const user = usersStore.usersList.state.items.find((u) => u.id === userId); if (user?.settings) { user.settings.allowSSOManualLogin = false; await usersStore.updateOtherUserSettings(userId, user.settings); await updateUsersTableData(usersTableState.value); showToast({ type: "success", title: i18n.baseText("settings.users.disallowSSOManualLogin"), message: i18n.baseText("settings.users.disallowSSOManualLogin.message") }); } } function goToUpgrade() { pageRedirectionHelper.goToUpgrade("settings-users", "upgrade-users"); } function goToUpgradeAdvancedPermissions() { pageRedirectionHelper.goToUpgrade("settings-users", "upgrade-advanced-permissions"); } const onUpdateRole = async (payload) => { const user = usersStore.usersList.state.items.find((u) => u.id === payload.userId); if (!user) { showError(/* @__PURE__ */ new Error("User not found"), i18n.baseText("settings.users.userNotFound")); return; } await onRoleChange(user, payload.role); }; async function onRoleChange(user, newRoleName) { if (newRoleName === user.role) return; const name = user.firstName && user.lastName ? `${user.firstName} ${user.lastName}` : user.email ?? ""; const role = userRoles.value.find(({ value }) => value === newRoleName)?.label ?? newRoleName; if (newRoleName === ROLE.ChatUser) { if (await message.confirm(i18n.baseText("settings.users.userRoleUpdated.confirm.message", { interpolate: { role } }), i18n.baseText("settings.users.userRoleUpdated.confirm.title", { interpolate: { user: name } }), { confirmButtonText: i18n.baseText("settings.users.userRoleUpdated.confirm.button"), cancelButtonText: i18n.baseText("settings.users.userRoleUpdated.cancel.button") }) !== "confirm") return; } try { await usersStore.updateGlobalRole({ id: user.id, newRoleName }); showToast({ type: "success", title: i18n.baseText("settings.users.userRoleUpdated"), message: i18n.baseText("settings.users.userRoleUpdated.message", { interpolate: { user: name, role } }) }); } catch (e) { showError(e, i18n.baseText("settings.users.userRoleUpdatedError")); } } const isValidSortKey = (key) => USERS_LIST_SORT_OPTIONS.includes(key); const updateUsersTableData = async ({ page, itemsPerPage, sortBy }) => { try { usersTableState.value = { page, itemsPerPage, sortBy }; const skip = page * itemsPerPage; const take = itemsPerPage; const transformedSortBy = sortBy.flatMap(({ id, desc }) => { const dir = desc ? "desc" : "asc"; if (id === "name") return [ `firstName:${dir}`, `lastName:${dir}`, `email:${dir}` ]; return `${id}:${dir}`; }).filter(isValidSortKey); await usersStore.usersList.execute(0, { skip, take, sortBy: transformedSortBy, expand: ["projectRelations"], filter: { fullText: search$1.value.trim() } }); } catch (error) { showError(error, i18n.baseText("settings.users.table.update.error")); } }; const debouncedUpdateUsersTableData = useDebounceFn(() => { usersTableState.value.page = 0; updateUsersTableData(usersTableState.value); }, 300); const onSearch = (value) => { search$1.value = value; debouncedUpdateUsersTableData(); }; async function onUpdateMfaEnforced(value) { const boolValue = typeof value === "boolean" ? value : Boolean(value); try { await usersStore.updateEnforceMfa(boolValue); showToast({ type: "success", title: boolValue ? i18n.baseText("settings.personal.mfa.enforce.enabled.title") : i18n.baseText("settings.personal.mfa.enforce.disabled.title"), message: boolValue ? i18n.baseText("settings.personal.mfa.enforce.enabled.message") : i18n.baseText("settings.personal.mfa.enforce.disabled.message") }); } catch (error) { showError(error, i18n.baseText("settings.personal.mfa.enforce.error")); } } return (_ctx, _cache) => { return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.container) }, [ createVNode(unref(N8nHeading_default), { tag: "h1", size: "2xlarge", class: "mb-xl" }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.users")) + " ", 1), !showUMSetupWarning.value ? (openBlock(), createBlock(unref(N8nText_default), { key: 0, class: normalizeClass(_ctx.$style.userCount), color: "text-light" }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.users.count", { interpolate: { count: unref(usersStore).usersList.state.count }, adjustToNumber: unref(usersStore).usersList.state.count })), 1)]), _: 1 }, 8, ["class"])) : createCommentVNode("", true)]), _: 1 }), !unref(usersStore).usersLimitNotReached ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(_ctx.$style.setupInfoContainer) }, [createVNode(unref(N8nActionBox_default), { heading: unref(i18n).baseText(unref(uiStore).contextBasedTranslationKeys.users.settings.unavailable.title), description: unref(i18n).baseText(unref(uiStore).contextBasedTranslationKeys.users.settings.unavailable.description), "button-text": unref(i18n).baseText(unref(uiStore).contextBasedTranslationKeys.users.settings.unavailable.button), "onClick:button": goToUpgrade }, null, 8, [ "heading", "description", "button-text" ])], 2)) : createCommentVNode("", true), !isAdvancedPermissionsEnabled.value ? (openBlock(), createBlock(unref(N8nNotice_default), { key: 1 }, { default: withCtx(() => [createVNode(unref(I18nT), { keypath: "settings.users.advancedPermissions.warning", scope: "global" }, { link: withCtx(() => [createVNode(unref(N8nLink_default), { "data-test-id": "upgrade-permissions-link", size: "small", onClick: goToUpgradeAdvancedPermissions }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.upgrade")), 1)]), _: 1 })]), _: 1 })]), _: 1 })) : createCommentVNode("", true), createBaseVNode("div", { class: normalizeClass(_ctx.$style.settingsContainer) }, [createBaseVNode("div", { class: normalizeClass(_ctx.$style.settingsContainerInfo) }, [createVNode(unref(N8nText_default), { bold: true }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.personal.mfa.enforce.title")) + " ", 1), !isEnforceMFAEnabled.value ? (openBlock(), createBlock(unref(N8nBadge_default), { key: 0, class: "ml-4xs" }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("generic.upgrade")), 1)]), _: 1 })) : createCommentVNode("", true)]), _: 1 }), createVNode(unref(N8nText_default), { size: "small", color: "text-light" }, { default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.personal.mfa.enforce.message")), 1)]), _: 1 })], 2), createBaseVNode("div", { class: normalizeClass(_ctx.$style.settingsContainerAction) }, [createVNode(EnterpriseEdition_ee_default, { features: [unref(EnterpriseEditionFeature).EnforceMFA] }, { fallback: withCtx(() => [createVNode(unref(N8nTooltip_default), null, { content: withCtx(() => [createVNode(unref(I18nT), { keypath: tooltipKey, tag: "span", scope: "global" }, { action: withCtx(() => [createBaseVNode("a", { onClick: goToUpgrade }, toDisplayString(unref(i18n).baseText("settings.personal.mfa.enforce.unlicensed_tooltip.link")), 1)]), _: 1 })]), default: withCtx(() => [createVNode(unref(ElSwitch), { "model-value": unref(settingsStore).isMFAEnforced, size: "large", disabled: true }, null, 8, ["model-value"])]), _: 1 })]), default: withCtx(() => [createVNode(unref(ElSwitch), { "model-value": unref(settingsStore).isMFAEnforced, size: "large", "data-test-id": "enable-force-mfa", "onUpdate:modelValue": onUpdateMfaEnforced }, null, 8, ["model-value"])]), _: 1 }, 8, ["features"])], 2)], 2), isInstanceRoleProvisioningEnabled.value ? (openBlock(), createElementBlock("div", { key: 2, class: normalizeClass(_ctx.$style.container) }, [createVNode(Alert_default, { type: "info", title: unref(i18n).baseText("settings.provisioningInstanceRolesHandledBySsoProvider.description") }, null, 8, ["title"])], 2)) : createCommentVNode("", true), !showUMSetupWarning.value ? (openBlock(), createElementBlock("div", { key: 3, class: normalizeClass(_ctx.$style.buttonContainer) }, [createVNode(unref(N8nInput_default), { class: normalizeClass(_ctx.$style.search), "model-value": search$1.value, placeholder: unref(i18n).baseText("settings.users.search.placeholder"), clearable: "", "data-test-id": "users-list-search", "onUpdate:modelValue": onSearch }, { prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]), _: 1 }, 8, [ "class", "model-value", "placeholder" ]), createVNode(unref(N8nTooltip_default), { disabled: !unref(ssoStore).isSamlLoginEnabled }, { content: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n).baseText("settings.users.invite.tooltip")), 1)]), default: withCtx(() => [createBaseVNode("div", null, [createVNode(unref(N8nButton_default), { disabled: unref(ssoStore).isSamlLoginEnabled || !unref(usersStore).usersLimitNotReached || isInstanceRoleProvisioningEnabled.value, label: unref(i18n).baseText("settings.users.invite"), size: "large", "data-test-id": "settings-users-invite-button", onClick: onInvite }, null, 8, ["disabled", "label"])])]), _: 1 }, 8, ["disabled"])], 2)) : createCommentVNode("", true), unref(usersStore).usersLimitNotReached || unref(usersStore).usersList.state.count > 1 ? (openBlock(), createElementBlock("div", { key: 4, class: normalizeClass(_ctx.$style.usersContainer) }, [createVNode(SettingsUsersTable_default, { "table-options": usersTableState.value, "onUpdate:tableOptions": _cache[0] || (_cache[0] = ($event) => usersTableState.value = $event), "data-test-id": "settings-users-table", "can-edit-role": !isInstanceRoleProvisioningEnabled.value, data: unref(usersStore).usersList.state, loading: unref(usersStore).usersList.isLoading, actions: usersListActions.value, "onUpdate:options": updateUsersTableData, "onUpdate:role": onUpdateRole, onAction: onUsersListAction }, null, 8, [ "table-options", "can-edit-role", "data", "loading", "actions" ])], 2)) : createCommentVNode("", true) ], 2); }; } }); var SettingsUsersView_vue_vue_type_style_index_0_lang_module_default = { userCount: "_userCount_1n3d0_123", buttonContainer: "_buttonContainer_1n3d0_128", search: "_search_1n3d0_135", setupInfoContainer: "_setupInfoContainer_1n3d0_139", settingsContainer: "_settingsContainer_1n3d0_143", settingsContainerInfo: "_settingsContainerInfo_1n3d0_154", settingsContainerAction: "_settingsContainerAction_1n3d0_163", container: "_container_1n3d0_171" }; var SettingsUsersView_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SettingsUsersView_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": SettingsUsersView_vue_vue_type_style_index_0_lang_module_default }]]); export { SettingsUsersView_default as default };