n8n-editor-ui 1.101.0 → 1.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/assets/{ActionDropdown-BujIG0Jq.js → ActionDropdown-D-JmCYsp.js} +2 -2
  2. package/dist/assets/{AnimatedSpinner-B5cpb6Fs.js → AnimatedSpinner-BiuDg2x2.js} +1 -1
  3. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-BPigGQTI.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-Bp194Fz4.js} +1 -1
  4. package/dist/assets/{AuthView-BOTPYtpM.js → AuthView-DF-20OPE.js} +2 -2
  5. package/dist/assets/{ChangePasswordView-DbeC55bz.js → ChangePasswordView-DSn8-M1-.js} +3 -3
  6. package/dist/assets/CollectionParameter-Bz5DzZqs.js +4 -0
  7. package/dist/assets/{CredentialsView-DUh5K-2r.js → CredentialsView-IQx76pD4.js} +8 -8
  8. package/dist/assets/{DemoFooter-BXPfbNJE.js → DemoFooter-49OiW0k2.js} +8 -7
  9. package/dist/assets/{EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-CDDQIxv5.js → EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-FNKd4r6R.js} +1 -1
  10. package/dist/assets/{EntityNotFound-CBUuOOYw.js → EntityNotFound-DScKsOtg.js} +1 -1
  11. package/dist/assets/{EntityUnAuthorised-7xgN3ECo.js → EntityUnAuthorised-DweZmhgI.js} +1 -1
  12. package/dist/assets/{ErrorView-BVfcsoOa.js → ErrorView-CNDVS4gm.js} +4 -4
  13. package/dist/assets/{EvaluationsRootView-BjrpKDj-.js → EvaluationsRootView-81SdPChp.js} +19 -27
  14. package/dist/assets/{EvaluationsView-DdmFZCH-.js → EvaluationsView-BAyQWPF9.js} +7 -7
  15. package/dist/assets/{ExecutionsTime-kMSlccIr.css → ExecutionsTime-DkME6I3E.css} +26 -19
  16. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-Ctx5Ybnr.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-Qw7S05EC.js} +23 -21
  17. package/dist/assets/{ExecutionsView-8BjGHy2I.js → ExecutionsView--yDyvnL8.js} +15 -16
  18. package/dist/assets/{ExecutionsView-DSsowKj4.css → ExecutionsView-BHBePl1_.css} +1 -1
  19. package/dist/assets/{FileSaver.min-C5wzcK59.js → FileSaver.min-CeGSkamF.js} +1 -1
  20. package/dist/assets/{FixedCollectionParameter-DjlaZyUQ.css → FixedCollectionParameter-CEzpjeQZ.css} +18 -18
  21. package/dist/assets/{FixedCollectionParameter-BrPQ5Vay.js → FixedCollectionParameter-tgbkzIuD.js} +7 -7
  22. package/dist/assets/{ForgotMyPasswordView-L0afefc1.js → ForgotMyPasswordView-CVwKac4K.js} +3 -3
  23. package/dist/assets/{InfoAccordion-CEk3XG5b.js → InfoAccordion-75IQV-_q.js} +1 -1
  24. package/dist/assets/{InsightsChartAverageRuntime-BrwBWr_R.js → InsightsChartAverageRuntime-C4C4zghF.js} +4 -4
  25. package/dist/assets/{InsightsChartFailed-ILKWvikG.js → InsightsChartFailed-DyhWE17m.js} +4 -4
  26. package/dist/assets/{InsightsChartFailureRate-D1AVYwU7.js → InsightsChartFailureRate-B09GcGvY.js} +4 -4
  27. package/dist/assets/{InsightsChartTimeSaved-D49Rwn6-.js → InsightsChartTimeSaved-DGzFyou3.js} +4 -4
  28. package/dist/assets/{InsightsChartTotal-Bs-pUgA3.js → InsightsChartTotal-fIUzF41H.js} +4 -4
  29. package/dist/assets/{InsightsDashboard-BIC4uZpW.js → InsightsDashboard-Qhv7fScv.js} +10 -10
  30. package/dist/assets/{InsightsPaywall-DmwFI-6e.js → InsightsPaywall-C3-la0kD.js} +1 -1
  31. package/dist/assets/{InsightsSummary-D9lEzWNT.js → InsightsSummary-CJgV5s0y.js} +14 -13
  32. package/dist/assets/{InsightsSummary-DzGQpM5h.css → InsightsSummary-DTFIhBF3.css} +25 -27
  33. package/dist/assets/InsightsTableWorkflows-P5OHXu1Y.js +177 -0
  34. package/dist/assets/{Logo-DNxOhbuV.js → Logo-8MWdHUz0.js} +1 -1
  35. package/dist/assets/{LogsPanel-DvWnD7rJ.js → LogsPanel-BabpRONg.js} +279 -212
  36. package/dist/assets/{LogsPanel-D5R6F35L.css → LogsPanel-Bvy4ANV7.css} +106 -61
  37. package/dist/assets/{MainHeader-BVHIuVVT.js → MainHeader-0ppftO6b.js} +10 -10
  38. package/dist/assets/{MainSidebar-CEHr93uL.js → MainSidebar-BnXOkYK4.js} +23 -16
  39. package/dist/assets/{MainSidebar-DqrgzqvZ.css → MainSidebar-CaLHZgDB.css} +2 -2
  40. package/dist/assets/{InsightsTableWorkflows-CC8t-sAL.js → N8nDataTableServer-Cx18Zd1O.js} +9 -181
  41. package/dist/assets/{NodeCreation-Bq5626Ha.js → NodeCreation-DKbc91uY.js} +7 -7
  42. package/dist/assets/{NodeCreator-Dk0sNXFZ.css → NodeCreator-DWE25utr.css} +51 -58
  43. package/dist/assets/{NodeCreator-D7xT3ogw.js → NodeCreator-xRYJHbTG.js} +118 -112
  44. package/dist/assets/NodeDetailsView-CPVE5S8P.js +1155 -0
  45. package/dist/assets/NodeDetailsView-CaTI-1QQ.css +668 -0
  46. package/dist/assets/NodeDetailsViewV2-5pxsZwAo.js +1061 -0
  47. package/dist/assets/NodeDetailsViewV2-BxNx4ZUM.css +506 -0
  48. package/dist/assets/{NodeView-DL8JxnMc.css → NodeView-Cgf2HuDk.css} +263 -110
  49. package/dist/assets/{NodeView-DoR46iB5.js → NodeView-DYjZmKNE.js} +580 -409
  50. package/dist/assets/{ProjectHeader-DSKKwiQ0.js → ProjectHeader-e8JosKaj.js} +5 -5
  51. package/dist/assets/{ProjectSettings-C3sMIDHh.js → ProjectSettings-DNKcVLkd.js} +201 -25
  52. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-cnANEo9o.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-EuKDPqQH.js} +3 -3
  53. package/dist/assets/{ResourcesListLayout-BVbjqFbc.js → ResourcesListLayout-C4y0iPmg.js} +4 -4
  54. package/dist/assets/{RunData-DG20AzLo.js → RunData-D3xzjO33.js} +124 -99
  55. package/dist/assets/{RunData-B5_okvCv.css → RunData-DuKNwYqe.css} +99 -85
  56. package/dist/assets/{RunDataJson-7okRLIES.js → RunDataJson-D5YFtOcJ.js} +16 -20
  57. package/dist/assets/{RunDataJsonActions-DrgwFS0W.css → RunDataJsonActions-B2jW3_UG.css} +3 -5
  58. package/dist/assets/{RunDataJsonActions-Qkg8HmUd.js → RunDataJsonActions-BWvs4coo.js} +15 -16
  59. package/dist/assets/{RunDataParsedAiContent-DRO1Bjsh.js → RunDataParsedAiContent-BYISiW-I.js} +12 -12
  60. package/dist/assets/{RunDataParsedAiContent-9EEUzCKp.css → RunDataParsedAiContent-wfIiKsq7.css} +16 -13
  61. package/dist/assets/{RunDataSearch-R6qtl0Jf.css → RunDataSearch-2eEalFoi.css} +8 -7
  62. package/dist/assets/{RunDataSearch-D5eQUWvi.js → RunDataSearch-oo3_BoLt.js} +4 -4
  63. package/dist/assets/{RunDataTable-CJmmTtEp.js → RunDataTable-6rCOQNCX.js} +126 -54
  64. package/dist/assets/{RunDataTable-CykHIwNT.css → RunDataTable-CTBtmQIs.css} +84 -44
  65. package/dist/assets/{SamlOnboarding-ClxYfm5z.js → SamlOnboarding-BG-gGcbY.js} +3 -3
  66. package/dist/assets/{SettingsApiView-Ds7FYVrN.js → SettingsApiView-Bmlbp7pD.js} +1 -1
  67. package/dist/assets/{SettingsCommunityNodesView-QKvLs6gi.js → SettingsCommunityNodesView-4DWd4UiC.js} +32 -6
  68. package/dist/assets/{SettingsExternalSecrets-d1KDgYYp.css → SettingsExternalSecrets-BAX9ENm9.css} +9 -6
  69. package/dist/assets/{SettingsExternalSecrets-DGRdvsMy.js → SettingsExternalSecrets-hpUcipWw.js} +17 -13
  70. package/dist/assets/{SettingsLdapView-C_LJwixk.js → SettingsLdapView-7p7L95v9.js} +1 -1
  71. package/dist/assets/{SettingsLogStreamingView-CaEJvgJ9.js → SettingsLogStreamingView-4CpWJqj_.js} +1 -1
  72. package/dist/assets/{SettingsPersonalView-DlwXaGDs.js → SettingsPersonalView-9iP06ihA.js} +11 -3
  73. package/dist/assets/{SettingsSourceControl-B6eULOfX.js → SettingsSourceControl-BGjWhqqJ.js} +5 -5
  74. package/dist/assets/{SettingsSso-5zcg-J4E.js → SettingsSso-ChOyD3kc.js} +1 -1
  75. package/dist/assets/{SettingsUsageAndPlan-CMBvYdjo.js → SettingsUsageAndPlan-jP8nn4Rh.js} +1 -1
  76. package/dist/assets/SettingsUsersView-BhfbqjxW.js +861 -0
  77. package/dist/assets/SettingsUsersView-BuZbf1jq.css +446 -0
  78. package/dist/assets/{SettingsView-Bawwm19P.css → SettingsView-4yzof_Pb.css} +4 -4
  79. package/dist/assets/{SettingsView-BuDKhqwZ.js → SettingsView-DTFEdRdj.js} +14 -14
  80. package/dist/assets/{SetupView-DSaQcQDF.js → SetupView-CXuAO6tx.js} +3 -3
  81. package/dist/assets/{SetupWorkflowCredentialsButton-BWISZAxq.js → SetupWorkflowCredentialsButton-Bj4rSqAV.js} +2 -2
  82. package/dist/assets/{SetupWorkflowFromTemplateView-CfDWCwoA.js → SetupWorkflowFromTemplateView-DG8Ml3A0.js} +8 -12
  83. package/dist/assets/{SigninView-BpjyswHb.js → SigninView-KmmptKWN.js} +7 -3
  84. package/dist/assets/{SignoutView-f_CoUl4S.js → SignoutView-8rAPEX_X.js} +1 -1
  85. package/dist/assets/{SignupView-q3f9g3P9.js → SignupView-ZYUP6f-Y.js} +3 -3
  86. package/dist/assets/{TableBase-DruQl-SO.js → TableBase-7XxrB0dw.js} +1 -1
  87. package/dist/assets/{Tags-DbmKHzWo.js → Tags-C8Jnw74N.js} +1 -1
  88. package/dist/assets/{TemplateDetails-DP_5pkzG.js → TemplateDetails-Bk1ixuRQ.js} +2 -2
  89. package/dist/assets/{TemplateList-y8Aumcsb.js → TemplateList-9SAC8OGn.js} +6 -3
  90. package/dist/assets/{TemplatesCollectionView-VdQpHtxs.js → TemplatesCollectionView-CLZDJ4HM.js} +6 -6
  91. package/dist/assets/{TemplatesSearchView-BUcYRVEK.js → TemplatesSearchView-DRzdGp3s.js} +8 -8
  92. package/dist/assets/{TemplatesView-4DUEEEtD.js → TemplatesView-V6ud-nM5.js} +3 -3
  93. package/dist/assets/{TemplatesWorkflowView--zUXMB8f.js → TemplatesWorkflowView-CLb4CuR2.js} +6 -6
  94. package/dist/assets/{NodeDetailsView-DB-5JPUD.js → TriggerPanel-BOC7PYsi.js} +498 -1415
  95. package/dist/assets/{NodeDetailsView-BaIj2qAa.css → TriggerPanel-DRpKKKun.css} +296 -903
  96. package/dist/assets/{VariablesView-DoWb0Vtv.js → VariablesView-BDzhSaxw.js} +6 -6
  97. package/dist/assets/{VariablesView-Kog_9PMT.css → VariablesView-Bh0OeH4s.css} +6 -6
  98. package/dist/assets/{WorkerView-D56d7XJA.js → WorkerView-C2A7cYkr.js} +9 -9
  99. package/dist/assets/{WorkflowActivator-CQxaDCfA.js → WorkflowActivator-BmIzNsA8.js} +8 -8
  100. package/dist/assets/{WorkflowActivator-BJPsIkXE.css → WorkflowActivator-DhLX6i1H.css} +2 -2
  101. package/dist/assets/{WorkflowExecutionsInfoAccordion-D9p_ZqmA.js → WorkflowExecutionsInfoAccordion-Cn4GRGO_.js} +6 -6
  102. package/dist/assets/{WorkflowExecutionsLandingPage-CymYth6K.js → WorkflowExecutionsLandingPage-s-dIgG6D.js} +3 -3
  103. package/dist/assets/{WorkflowExecutionsPreview-DRvf3WQC.js → WorkflowExecutionsPreview-BE7NfRAa.js} +12 -12
  104. package/dist/assets/{WorkflowExecutionsView-DxiIaUKV.js → WorkflowExecutionsView-DFmBdF-B.js} +16 -16
  105. package/dist/assets/{WorkflowHistory-DBPIq2u7.js → WorkflowHistory-3wO0nQYD.js} +4 -4
  106. package/dist/assets/{WorkflowOnboardingView-D4QKSetf.js → WorkflowOnboardingView-mBVE6x-i.js} +1 -1
  107. package/dist/assets/{WorkflowPreview-D3YRZjYi.js → WorkflowPreview-DlNMFCKn.js} +1 -1
  108. package/dist/assets/{WorkflowsView-ipf8KKwB.css → WorkflowsView-CyJbJBc8.css} +25 -21
  109. package/dist/assets/{WorkflowsView-DPADmBVd.js → WorkflowsView-DsAOuPT0.js} +77 -72
  110. package/dist/assets/{chartjs.utils-Cou_ISuU.js → chartjs.utils-BywXqBmg.js} +2 -2
  111. package/dist/assets/{en-DzZibgm_.js → en-CcKAtA8V.js} +45 -5
  112. package/dist/assets/{global-link-actions-olwfH36z.js → global-link-actions-BzAw9ZbO.js} +1 -1
  113. package/dist/assets/{import-curl-DD21H3kK.js → import-curl-1LWAxRTV.js} +1 -1
  114. package/dist/assets/{index-uJOu4Uio.js → index-B6A1nL2x.js} +1 -1
  115. package/dist/assets/{index-BzamKJpD.css → index-C66_v3sX.css} +1302 -1279
  116. package/dist/assets/{index-7S5ADieN.js → index-V0GOmfo8.js} +40721 -34933
  117. package/dist/assets/{pickBy-DPxZbMic.js → pickBy-CtRItcCT.js} +1 -1
  118. package/dist/assets/{templateActions-DJJfyIhq.js → templateActions-DpIzx0ws.js} +2 -2
  119. package/dist/assets/{useBeforeUnload-DveXGtGN.js → useBeforeUnload-B0EP7Q2i.js} +1 -1
  120. package/dist/assets/{useExecutionDebugging-DM4nhx6D.js → useExecutionDebugging-AwlOA2KI.js} +2 -1
  121. package/dist/assets/{useExecutionHelpers-BfF56crp.js → useExecutionHelpers-DvBwGIzz.js} +1 -1
  122. package/dist/assets/{useImportCurlCommand-BAgQhwtE.js → useImportCurlCommand-DIFC7Epr.js} +2 -2
  123. package/dist/assets/{useKeybindings-CV0VsjNP.js → useKeybindings-CduQ2pi5.js} +4 -4
  124. package/dist/assets/{useProjectPages-DgMGWOaO.js → useProjectPages-DmNmAOdq.js} +1 -1
  125. package/dist/assets/{usePushConnection-D8SE-itT.js → usePushConnection-Dyd5__87.js} +6 -12
  126. package/dist/assets/{useWorkflowActivate-BKz3N1SO.js → useWorkflowActivate-z9iwP6OY.js} +1 -1
  127. package/dist/index.html +2 -2
  128. package/package.json +1 -1
  129. package/vite.config.mts +2 -2
  130. package/dist/assets/CollectionParameter-CExdr4jd.js +0 -4
  131. package/dist/assets/SettingsUsersView-BL3TAhT8.js +0 -338
  132. package/dist/assets/SettingsUsersView-By12E2li.css +0 -143
@@ -0,0 +1,861 @@
1
+ import { d as defineComponent, r as ref, f3 as ROLE, x as computed, O as resolveComponent, h as createElementBlock, g as openBlock, e as createBlock, w as withCtx, p as N8nText, n as normalizeClass, k as createTextVNode, t as toDisplayString, j as createBaseVNode, i as createVNode, l as unref, N as N8nIcon, _ as _export_sfc, c as useI18n, f as createCommentVNode, F as Fragment, y as renderList, $ as N8nTooltip, fc as N8nActionToggle, cR as mergeModels, cS as useModel, ao as hasPermission, C as N8nUserInfo, bW as normalizeProps, bX as guardReactiveProps, c2 as useClipboard, a as useToast, v as useSettingsStore, T as useUIStore, u as useUsersStore, eW as useSSOStore, ai as useDocumentTitle, al as usePageRedirectionHelper, o as onMounted, ap as EnterpriseEditionFeature, fd as USERS_LIST_SORT_OPTIONS, m as N8nHeading, eY as N8nActionBox, a1 as N8nLink, dB as N8nNotice, dO as N8nInput, q as N8nButton, fe as INVITE_USER_MODAL_KEY, ff as DELETE_USER_MODAL_KEY, fg as useDebounceFn } from "./index-V0GOmfo8.js";
2
+ import { N as N8nDataTableServer } from "./N8nDataTableServer-Cx18Zd1O.js";
3
+ import { N as N8nActionDropdown } from "./ActionDropdown-D-JmCYsp.js";
4
+ const _hoisted_1$1 = { key: 1 };
5
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
6
+ __name: "SettingsUsersRoleCell",
7
+ props: {
8
+ data: {},
9
+ roles: {},
10
+ actions: {}
11
+ },
12
+ emits: ["update:role"],
13
+ setup(__props, { emit: __emit }) {
14
+ const props = __props;
15
+ const emit = __emit;
16
+ const selectedRole = ref(props.data.role ?? ROLE.Default);
17
+ const isEditable = computed(() => props.data.role !== ROLE.Owner);
18
+ const roleLabel2 = computed(() => props.roles[selectedRole.value].label);
19
+ const onActionSelect = (role) => {
20
+ emit("update:role", {
21
+ role,
22
+ userId: props.data.id
23
+ });
24
+ };
25
+ return (_ctx, _cache) => {
26
+ const _component_N8nText = N8nText;
27
+ const _component_ElRadio = resolveComponent("ElRadio");
28
+ return openBlock(), createElementBlock("div", null, [
29
+ isEditable.value ? (openBlock(), createBlock(unref(N8nActionDropdown), {
30
+ key: 0,
31
+ placement: "bottom-start",
32
+ items: props.actions,
33
+ "data-test-id": "user-role-dropdown",
34
+ onSelect: onActionSelect
35
+ }, {
36
+ activator: withCtx(() => [
37
+ createBaseVNode("button", {
38
+ class: normalizeClass(_ctx.$style.roleLabel),
39
+ type: "button"
40
+ }, [
41
+ createVNode(_component_N8nText, { color: "text-dark" }, {
42
+ default: withCtx(() => [
43
+ createTextVNode(toDisplayString(roleLabel2.value), 1)
44
+ ]),
45
+ _: 1
46
+ }),
47
+ createVNode(unref(N8nIcon), {
48
+ color: "text-dark",
49
+ icon: "chevron-down",
50
+ size: "large"
51
+ })
52
+ ], 2)
53
+ ]),
54
+ menuItem: withCtx((item) => [
55
+ item.id === "delete" ? (openBlock(), createBlock(_component_N8nText, {
56
+ key: 0,
57
+ color: "text-dark",
58
+ class: normalizeClass(_ctx.$style.removeUser)
59
+ }, {
60
+ default: withCtx(() => [
61
+ createTextVNode(toDisplayString(item.label), 1)
62
+ ]),
63
+ _: 2
64
+ }, 1032, ["class"])) : (openBlock(), createBlock(_component_ElRadio, {
65
+ key: 1,
66
+ "model-value": selectedRole.value,
67
+ label: item.id,
68
+ "onUpdate:modelValue": ($event) => selectedRole.value = item.id
69
+ }, {
70
+ default: withCtx(() => [
71
+ createBaseVNode("span", {
72
+ class: normalizeClass(_ctx.$style.radioLabel)
73
+ }, [
74
+ createVNode(_component_N8nText, {
75
+ color: "text-dark",
76
+ class: "pb-3xs"
77
+ }, {
78
+ default: withCtx(() => [
79
+ createTextVNode(toDisplayString(item.label), 1)
80
+ ]),
81
+ _: 2
82
+ }, 1024),
83
+ createVNode(_component_N8nText, {
84
+ color: "text-dark",
85
+ size: "small"
86
+ }, {
87
+ default: withCtx(() => [
88
+ createTextVNode(toDisplayString(props.roles[item.id].desc), 1)
89
+ ]),
90
+ _: 2
91
+ }, 1024)
92
+ ], 2)
93
+ ]),
94
+ _: 2
95
+ }, 1032, ["model-value", "label", "onUpdate:modelValue"]))
96
+ ]),
97
+ _: 1
98
+ }, 8, ["items"])) : (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(roleLabel2.value), 1))
99
+ ]);
100
+ };
101
+ }
102
+ });
103
+ const roleLabel = "_roleLabel_xwvmw_123";
104
+ const radioLabel = "_radioLabel_xwvmw_133";
105
+ const removeUser = "_removeUser_xwvmw_143";
106
+ const style0$2 = {
107
+ roleLabel,
108
+ radioLabel,
109
+ removeUser
110
+ };
111
+ const cssModules$2 = {
112
+ "$style": style0$2
113
+ };
114
+ const SettingsUsersRoleCell = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__cssModules", cssModules$2]]);
115
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
116
+ __name: "SettingsUsersProjectsCell",
117
+ props: {
118
+ data: {}
119
+ },
120
+ setup(__props) {
121
+ const props = __props;
122
+ const i18n = useI18n();
123
+ const rolesAccessingAllProjects = ref([ROLE.Owner, ROLE.Admin]);
124
+ const visibleProjectsNum = ref(2);
125
+ const allProjects = computed(() => {
126
+ if (props.data.role && rolesAccessingAllProjects.value.includes(props.data.role)) {
127
+ return [i18n.baseText("settings.users.table.row.allProjects")];
128
+ } else if (!props.data.projectRelations?.length) {
129
+ return [i18n.baseText("settings.users.table.row.personalProject")];
130
+ } else {
131
+ return props.data.projectRelations.map(({ name }) => name);
132
+ }
133
+ });
134
+ const projects2 = computed(() => ({
135
+ visible: allProjects.value.slice(0, visibleProjectsNum.value),
136
+ additional: allProjects.value.slice(visibleProjectsNum.value)
137
+ }));
138
+ return (_ctx, _cache) => {
139
+ return openBlock(), createElementBlock("div", {
140
+ class: normalizeClass(_ctx.$style.projects)
141
+ }, [
142
+ (openBlock(true), createElementBlock(Fragment, null, renderList(projects2.value.visible, (project2, index) => {
143
+ return openBlock(), createElementBlock(Fragment, { key: index }, [
144
+ createBaseVNode("span", {
145
+ class: normalizeClass(_ctx.$style.project)
146
+ }, toDisplayString(project2), 3),
147
+ index < projects2.value.visible.length - 1 ? (openBlock(), createElementBlock("span", {
148
+ key: 0,
149
+ class: normalizeClass(_ctx.$style.comma)
150
+ }, ",", 2)) : createCommentVNode("", true)
151
+ ], 64);
152
+ }), 128)),
153
+ projects2.value.additional.length > 0 ? (openBlock(), createElementBlock("span", {
154
+ key: 0,
155
+ class: normalizeClass(_ctx.$style.comma)
156
+ }, ",", 2)) : createCommentVNode("", true),
157
+ projects2.value.additional.length > 0 ? (openBlock(), createBlock(unref(N8nTooltip), { key: 1 }, {
158
+ content: withCtx(() => [
159
+ createBaseVNode("ul", {
160
+ class: normalizeClass(_ctx.$style.projectList)
161
+ }, [
162
+ (openBlock(true), createElementBlock(Fragment, null, renderList(projects2.value.additional, (project2, index) => {
163
+ return openBlock(), createElementBlock("li", { key: index }, toDisplayString(project2), 1);
164
+ }), 128))
165
+ ], 2)
166
+ ]),
167
+ default: withCtx(() => [
168
+ createBaseVNode("span", {
169
+ class: normalizeClass(_ctx.$style.project)
170
+ }, "+ " + toDisplayString(projects2.value.additional.length), 3)
171
+ ]),
172
+ _: 1
173
+ })) : createCommentVNode("", true)
174
+ ], 2);
175
+ };
176
+ }
177
+ });
178
+ const projects = "_projects_1clp6_123";
179
+ const project = "_project_1clp6_123";
180
+ const comma = "_comma_1clp6_138";
181
+ const projectList = "_projectList_1clp6_143";
182
+ const style0$1 = {
183
+ projects,
184
+ project,
185
+ comma,
186
+ projectList
187
+ };
188
+ const cssModules$1 = {
189
+ "$style": style0$1
190
+ };
191
+ const SettingsUsersProjectsCell = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$1]]);
192
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
193
+ __name: "SettingsUsersActionsCell",
194
+ props: {
195
+ data: {},
196
+ actions: {}
197
+ },
198
+ emits: ["action"],
199
+ setup(__props, { emit: __emit }) {
200
+ const props = __props;
201
+ const emit = __emit;
202
+ const onUserAction = (action) => {
203
+ emit("action", {
204
+ action,
205
+ userId: props.data.id
206
+ });
207
+ };
208
+ return (_ctx, _cache) => {
209
+ const _component_N8nActionToggle = N8nActionToggle;
210
+ return openBlock(), createElementBlock("div", null, [
211
+ !props.data.isOwner && props.data.signInType !== "ldap" && props.actions.length > 0 ? (openBlock(), createBlock(_component_N8nActionToggle, {
212
+ key: 0,
213
+ placement: "bottom",
214
+ actions: props.actions,
215
+ theme: "dark",
216
+ onAction: onUserAction
217
+ }, null, 8, ["actions"])) : createCommentVNode("", true)
218
+ ]);
219
+ };
220
+ }
221
+ });
222
+ const _hoisted_1 = { class: "pt-xs pb-xs" };
223
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
224
+ __name: "SettingsUsersTable",
225
+ props: /* @__PURE__ */ mergeModels({
226
+ data: {},
227
+ actions: {},
228
+ loading: { type: Boolean }
229
+ }, {
230
+ "tableOptions": {
231
+ default: () => ({})
232
+ },
233
+ "tableOptionsModifiers": {}
234
+ }),
235
+ emits: /* @__PURE__ */ mergeModels(["update:options", "update:role", "action"], ["update:tableOptions"]),
236
+ setup(__props, { emit: __emit }) {
237
+ const i18n = useI18n();
238
+ const props = __props;
239
+ const emit = __emit;
240
+ const tableOptions = useModel(__props, "tableOptions");
241
+ const rows = computed(() => props.data.items);
242
+ const headers = ref([
243
+ {
244
+ title: i18n.baseText("settings.users.table.header.user"),
245
+ key: "name",
246
+ width: 400,
247
+ value(row) {
248
+ return {
249
+ ...row,
250
+ // TODO: Fix UsersInfoProps type, it should be aligned with the API response and implement 'isPending' instead of `isPendingUser`
251
+ isPendingUser: row.isPending
252
+ };
253
+ }
254
+ },
255
+ {
256
+ title: i18n.baseText("settings.users.table.header.accountType"),
257
+ key: "role"
258
+ },
259
+ {
260
+ title: i18n.baseText("settings.users.table.header.2fa"),
261
+ key: "mfaEnabled",
262
+ value(row) {
263
+ return row.mfaEnabled ? i18n.baseText("settings.users.table.row.2fa.enabled") : i18n.baseText("settings.users.table.row.2fa.disabled");
264
+ }
265
+ },
266
+ {
267
+ title: i18n.baseText("projects.menu.title"),
268
+ key: "projects",
269
+ disableSort: true,
270
+ // TODO: Fix TableHeader type so it allows `disableSort` without `value` (which is not used here)
271
+ value() {
272
+ return;
273
+ }
274
+ },
275
+ {
276
+ title: "",
277
+ key: "actions",
278
+ align: "end",
279
+ width: 46,
280
+ disableSort: true,
281
+ // TODO: Fix TableHeader type so it allows `disableSort` without `value` (which is not used here)
282
+ value() {
283
+ return;
284
+ }
285
+ }
286
+ ]);
287
+ const roles = computed(() => ({
288
+ [ROLE.Owner]: { label: i18n.baseText("auth.roles.owner"), desc: "" },
289
+ [ROLE.Admin]: {
290
+ label: i18n.baseText("auth.roles.admin"),
291
+ desc: i18n.baseText("settings.users.table.row.role.description.admin")
292
+ },
293
+ [ROLE.Member]: {
294
+ label: i18n.baseText("auth.roles.member"),
295
+ desc: i18n.baseText("settings.users.table.row.role.description.member")
296
+ },
297
+ [ROLE.Default]: { label: i18n.baseText("auth.roles.default"), desc: "" }
298
+ }));
299
+ const roleActions = computed(() => [
300
+ {
301
+ id: ROLE.Member,
302
+ label: i18n.baseText("auth.roles.member")
303
+ },
304
+ {
305
+ id: ROLE.Admin,
306
+ label: i18n.baseText("auth.roles.admin")
307
+ },
308
+ {
309
+ id: "delete",
310
+ label: i18n.baseText("settings.users.table.row.deleteUser"),
311
+ divided: true
312
+ }
313
+ ]);
314
+ const canUpdateRole = computed(() => {
315
+ return hasPermission(["rbac"], { rbac: { scope: ["user:update", "user:changeRole"] } });
316
+ });
317
+ const filterActions = (user) => {
318
+ if (user.isOwner) return [];
319
+ return props.actions.filter(
320
+ (action) => action.guard?.({ ...user, isPendingUser: user.isPending }) ?? true
321
+ );
322
+ };
323
+ const onRoleChange = ({ role, userId }) => {
324
+ if (role === "delete") {
325
+ emit("action", { action: "delete", userId });
326
+ } else {
327
+ emit("update:role", { role, userId });
328
+ }
329
+ };
330
+ return (_ctx, _cache) => {
331
+ const _component_N8nText = N8nText;
332
+ return openBlock(), createElementBlock("div", null, [
333
+ createVNode(unref(N8nDataTableServer), {
334
+ "sort-by": tableOptions.value.sortBy,
335
+ "onUpdate:sortBy": _cache[1] || (_cache[1] = ($event) => tableOptions.value.sortBy = $event),
336
+ page: tableOptions.value.page,
337
+ "onUpdate:page": _cache[2] || (_cache[2] = ($event) => tableOptions.value.page = $event),
338
+ "items-per-page": tableOptions.value.itemsPerPage,
339
+ "onUpdate:itemsPerPage": _cache[3] || (_cache[3] = ($event) => tableOptions.value.itemsPerPage = $event),
340
+ headers: headers.value,
341
+ items: rows.value,
342
+ "items-length": _ctx.data.count,
343
+ "onUpdate:options": _cache[4] || (_cache[4] = ($event) => emit("update:options", $event))
344
+ }, {
345
+ [`item.name`]: withCtx(({ value }) => [
346
+ createBaseVNode("div", _hoisted_1, [
347
+ createVNode(unref(N8nUserInfo), normalizeProps(guardReactiveProps(value)), null, 16)
348
+ ])
349
+ ]),
350
+ [`item.role`]: withCtx(({ item }) => [
351
+ canUpdateRole.value ? (openBlock(), createBlock(SettingsUsersRoleCell, {
352
+ key: 0,
353
+ data: item,
354
+ roles: roles.value,
355
+ actions: roleActions.value,
356
+ "onUpdate:role": onRoleChange
357
+ }, null, 8, ["data", "roles", "actions"])) : (openBlock(), createBlock(_component_N8nText, {
358
+ key: 1,
359
+ color: "text-dark"
360
+ }, {
361
+ default: withCtx(() => [
362
+ createTextVNode(toDisplayString(roles.value[item.role ?? unref(ROLE).Default].label), 1)
363
+ ]),
364
+ _: 2
365
+ }, 1024))
366
+ ]),
367
+ [`item.projects`]: withCtx(({ item }) => [
368
+ createVNode(SettingsUsersProjectsCell, { data: item }, null, 8, ["data"])
369
+ ]),
370
+ [`item.actions`]: withCtx(({ item }) => [
371
+ createVNode(_sfc_main$2, {
372
+ data: item,
373
+ actions: filterActions(item),
374
+ onAction: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("action", $event))
375
+ }, null, 8, ["data", "actions"])
376
+ ]),
377
+ _: 2
378
+ }, 1032, ["sort-by", "page", "items-per-page", "headers", "items", "items-length"])
379
+ ]);
380
+ };
381
+ }
382
+ });
383
+ const tooltipKey = "settings.personal.mfa.enforce.unlicensed_tooltip";
384
+ const _sfc_main = /* @__PURE__ */ defineComponent({
385
+ __name: "SettingsUsersView",
386
+ setup(__props) {
387
+ const clipboard = useClipboard();
388
+ const { showToast, showError } = useToast();
389
+ const settingsStore = useSettingsStore();
390
+ const uiStore = useUIStore();
391
+ const usersStore = useUsersStore();
392
+ const ssoStore = useSSOStore();
393
+ const documentTitle = useDocumentTitle();
394
+ const pageRedirectionHelper = usePageRedirectionHelper();
395
+ const i18n = useI18n();
396
+ const search2 = ref("");
397
+ const usersTableState = ref({
398
+ page: 0,
399
+ itemsPerPage: 10,
400
+ sortBy: [
401
+ { id: "firstName", desc: false },
402
+ { id: "lastName", desc: false },
403
+ { id: "email", desc: false }
404
+ ]
405
+ });
406
+ const showUMSetupWarning = computed(() => hasPermission(["defaultUser"]));
407
+ onMounted(async () => {
408
+ documentTitle.set(i18n.baseText("settings.users"));
409
+ if (!showUMSetupWarning.value) {
410
+ await updateUsersTableData(usersTableState.value);
411
+ }
412
+ });
413
+ const usersListActions = computed(() => {
414
+ return [
415
+ {
416
+ label: i18n.baseText("settings.users.actions.copyInviteLink"),
417
+ value: "copyInviteLink",
418
+ guard: (user) => usersStore.usersLimitNotReached && !user.firstName && !!user.inviteAcceptUrl
419
+ },
420
+ {
421
+ label: i18n.baseText("settings.users.actions.reinvite"),
422
+ value: "reinvite",
423
+ guard: (user) => usersStore.usersLimitNotReached && !user.firstName && settingsStore.isSmtpSetup
424
+ },
425
+ {
426
+ label: i18n.baseText("settings.users.actions.copyPasswordResetLink"),
427
+ value: "copyPasswordResetLink",
428
+ guard: (user) => hasPermission(["rbac"], { rbac: { scope: "user:resetPassword" } }) && usersStore.usersLimitNotReached && !user.isPendingUser && user.id !== usersStore.currentUserId
429
+ },
430
+ {
431
+ label: i18n.baseText("settings.users.actions.allowSSOManualLogin"),
432
+ value: "allowSSOManualLogin",
433
+ guard: (user) => !!ssoStore.isSamlLoginEnabled && !user.settings?.allowSSOManualLogin
434
+ },
435
+ {
436
+ label: i18n.baseText("settings.users.actions.disallowSSOManualLogin"),
437
+ value: "disallowSSOManualLogin",
438
+ guard: (user) => !!ssoStore.isSamlLoginEnabled && user.settings?.allowSSOManualLogin === true
439
+ }
440
+ ];
441
+ });
442
+ const isAdvancedPermissionsEnabled = computed(
443
+ () => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.AdvancedPermissions]
444
+ );
445
+ const userRoles = computed(() => {
446
+ return [
447
+ {
448
+ value: ROLE.Member,
449
+ label: i18n.baseText("auth.roles.member")
450
+ },
451
+ {
452
+ value: ROLE.Admin,
453
+ label: i18n.baseText("auth.roles.admin"),
454
+ disabled: !isAdvancedPermissionsEnabled.value
455
+ }
456
+ ];
457
+ });
458
+ async function onUsersListAction({ action, userId }) {
459
+ switch (action) {
460
+ case "delete":
461
+ await onDelete(userId);
462
+ break;
463
+ case "reinvite":
464
+ await onReinvite(userId);
465
+ break;
466
+ case "copyInviteLink":
467
+ await onCopyInviteLink(userId);
468
+ break;
469
+ case "copyPasswordResetLink":
470
+ await onCopyPasswordResetLink(userId);
471
+ break;
472
+ case "allowSSOManualLogin":
473
+ await onAllowSSOManualLogin(userId);
474
+ break;
475
+ case "disallowSSOManualLogin":
476
+ await onDisallowSSOManualLogin(userId);
477
+ break;
478
+ }
479
+ }
480
+ function onInvite() {
481
+ uiStore.openModalWithData({
482
+ name: INVITE_USER_MODAL_KEY,
483
+ data: {
484
+ afterInvite: async () => {
485
+ await updateUsersTableData(usersTableState.value);
486
+ }
487
+ }
488
+ });
489
+ }
490
+ async function onDelete(userId) {
491
+ uiStore.openModalWithData({
492
+ name: DELETE_USER_MODAL_KEY,
493
+ data: {
494
+ userId,
495
+ afterDelete: async () => {
496
+ await updateUsersTableData(usersTableState.value);
497
+ }
498
+ }
499
+ });
500
+ }
501
+ async function onReinvite(userId) {
502
+ try {
503
+ const user = usersStore.usersList.state.items.find((u) => u.id === userId);
504
+ if (user?.email && user?.role) {
505
+ if (!["global:admin", "global:member"].includes(user.role)) {
506
+ throw new Error("Invalid role name on reinvite");
507
+ }
508
+ await usersStore.reinviteUser({
509
+ email: user.email,
510
+ role: user.role
511
+ });
512
+ showToast({
513
+ type: "success",
514
+ title: i18n.baseText("settings.users.inviteResent"),
515
+ message: i18n.baseText("settings.users.emailSentTo", {
516
+ interpolate: { email: user.email ?? "" }
517
+ })
518
+ });
519
+ }
520
+ } catch (e) {
521
+ showError(e, i18n.baseText("settings.users.userReinviteError"));
522
+ }
523
+ }
524
+ async function onCopyInviteLink(userId) {
525
+ const user = usersStore.usersList.state.items.find((u) => u.id === userId);
526
+ if (user?.inviteAcceptUrl) {
527
+ void clipboard.copy(user.inviteAcceptUrl);
528
+ showToast({
529
+ type: "success",
530
+ title: i18n.baseText("settings.users.inviteUrlCreated"),
531
+ message: i18n.baseText("settings.users.inviteUrlCreated.message")
532
+ });
533
+ }
534
+ }
535
+ async function onCopyPasswordResetLink(userId) {
536
+ try {
537
+ const user = usersStore.usersList.state.items.find((u) => u.id === userId);
538
+ if (user) {
539
+ const url = await usersStore.getUserPasswordResetLink(user);
540
+ void clipboard.copy(url.link);
541
+ showToast({
542
+ type: "success",
543
+ title: i18n.baseText("settings.users.passwordResetUrlCreated"),
544
+ message: i18n.baseText("settings.users.passwordResetUrlCreated.message")
545
+ });
546
+ }
547
+ } catch (error) {
548
+ showError(error, i18n.baseText("settings.users.passwordResetLinkError"));
549
+ }
550
+ }
551
+ async function onAllowSSOManualLogin(userId) {
552
+ const user = usersStore.usersList.state.items.find((u) => u.id === userId);
553
+ if (user) {
554
+ if (!user.settings) {
555
+ user.settings = {};
556
+ }
557
+ user.settings.allowSSOManualLogin = true;
558
+ await usersStore.updateOtherUserSettings(userId, user.settings);
559
+ await updateUsersTableData(usersTableState.value);
560
+ showToast({
561
+ type: "success",
562
+ title: i18n.baseText("settings.users.allowSSOManualLogin"),
563
+ message: i18n.baseText("settings.users.allowSSOManualLogin.message")
564
+ });
565
+ }
566
+ }
567
+ async function onDisallowSSOManualLogin(userId) {
568
+ const user = usersStore.usersList.state.items.find((u) => u.id === userId);
569
+ if (user?.settings) {
570
+ user.settings.allowSSOManualLogin = false;
571
+ await usersStore.updateOtherUserSettings(userId, user.settings);
572
+ await updateUsersTableData(usersTableState.value);
573
+ showToast({
574
+ type: "success",
575
+ title: i18n.baseText("settings.users.disallowSSOManualLogin"),
576
+ message: i18n.baseText("settings.users.disallowSSOManualLogin.message")
577
+ });
578
+ }
579
+ }
580
+ function goToUpgrade() {
581
+ void pageRedirectionHelper.goToUpgrade("settings-users", "upgrade-users");
582
+ }
583
+ function goToUpgradeAdvancedPermissions() {
584
+ void pageRedirectionHelper.goToUpgrade("settings-users", "upgrade-advanced-permissions");
585
+ }
586
+ const onUpdateRole = async (payload) => {
587
+ const user = usersStore.usersList.state.items.find((u) => u.id === payload.userId);
588
+ if (!user) {
589
+ showError(new Error("User not found"), i18n.baseText("settings.users.userNotFound"));
590
+ return;
591
+ }
592
+ await onRoleChange(user, payload.role);
593
+ };
594
+ async function onRoleChange(user, newRoleName) {
595
+ try {
596
+ await usersStore.updateGlobalRole({ id: user.id, newRoleName });
597
+ const role = userRoles.value.find(({ value }) => value === newRoleName)?.label || newRoleName;
598
+ showToast({
599
+ type: "success",
600
+ title: i18n.baseText("settings.users.userRoleUpdated"),
601
+ message: i18n.baseText("settings.users.userRoleUpdated.message", {
602
+ interpolate: {
603
+ user: user.firstName && user.lastName ? `${user.firstName} ${user.lastName}` : user.email ?? "",
604
+ role
605
+ }
606
+ })
607
+ });
608
+ } catch (e) {
609
+ showError(e, i18n.baseText("settings.users.userReinviteError"));
610
+ }
611
+ }
612
+ const isValidSortKey = (key) => USERS_LIST_SORT_OPTIONS.includes(key);
613
+ const updateUsersTableData = async ({ page, itemsPerPage, sortBy }) => {
614
+ try {
615
+ usersTableState.value = {
616
+ page,
617
+ itemsPerPage,
618
+ sortBy
619
+ };
620
+ const skip = page * itemsPerPage;
621
+ const take = itemsPerPage;
622
+ const transformedSortBy = sortBy.flatMap(({ id, desc }) => {
623
+ const dir = desc ? "desc" : "asc";
624
+ if (id === "name") {
625
+ return [`firstName:${dir}`, `lastName:${dir}`, `email:${dir}`];
626
+ }
627
+ return `${id}:${dir}`;
628
+ }).filter(isValidSortKey);
629
+ await usersStore.usersList.execute(0, {
630
+ skip,
631
+ take,
632
+ sortBy: transformedSortBy,
633
+ expand: ["projectRelations"],
634
+ filter: {
635
+ fullText: search2.value.trim()
636
+ }
637
+ });
638
+ } catch (error) {
639
+ showError(error, i18n.baseText("settings.users.table.update.error"));
640
+ }
641
+ };
642
+ const debouncedUpdateUsersTableData = useDebounceFn(() => {
643
+ usersTableState.value.page = 0;
644
+ void updateUsersTableData(usersTableState.value);
645
+ }, 300);
646
+ const onSearch = (value) => {
647
+ search2.value = value;
648
+ void debouncedUpdateUsersTableData();
649
+ };
650
+ async function onUpdateMfaEnforced(value) {
651
+ try {
652
+ await usersStore.updateEnforceMfa(value);
653
+ showToast({
654
+ type: "success",
655
+ title: value ? i18n.baseText("settings.personal.mfa.enforce.enabled.title") : i18n.baseText("settings.personal.mfa.enforce.disabled.title"),
656
+ message: value ? i18n.baseText("settings.personal.mfa.enforce.enabled.message") : i18n.baseText("settings.personal.mfa.enforce.disabled.message")
657
+ });
658
+ } catch (error) {
659
+ showError(error, i18n.baseText("settings.personal.mfa.enforce.error"));
660
+ }
661
+ }
662
+ return (_ctx, _cache) => {
663
+ const _component_n8n_heading = N8nHeading;
664
+ const _component_n8n_action_box = N8nActionBox;
665
+ const _component_n8n_link = N8nLink;
666
+ const _component_i18n_t = resolveComponent("i18n-t");
667
+ const _component_n8n_notice = N8nNotice;
668
+ const _component_n8n_text = N8nText;
669
+ const _component_el_switch = resolveComponent("el-switch");
670
+ const _component_N8nTooltip = N8nTooltip;
671
+ const _component_EnterpriseEdition = resolveComponent("EnterpriseEdition");
672
+ const _component_n8n_icon = N8nIcon;
673
+ const _component_n8n_input = N8nInput;
674
+ const _component_n8n_button = N8nButton;
675
+ const _component_n8n_tooltip = N8nTooltip;
676
+ return openBlock(), createElementBlock("div", {
677
+ class: normalizeClass(_ctx.$style.container)
678
+ }, [
679
+ createVNode(_component_n8n_heading, {
680
+ tag: "h1",
681
+ size: "2xlarge",
682
+ class: "mb-xl"
683
+ }, {
684
+ default: withCtx(() => [
685
+ createTextVNode(toDisplayString(unref(i18n).baseText("settings.users")), 1)
686
+ ]),
687
+ _: 1
688
+ }),
689
+ !unref(usersStore).usersLimitNotReached ? (openBlock(), createElementBlock("div", {
690
+ key: 0,
691
+ class: normalizeClass(_ctx.$style.setupInfoContainer)
692
+ }, [
693
+ createVNode(_component_n8n_action_box, {
694
+ heading: unref(i18n).baseText(unref(uiStore).contextBasedTranslationKeys.users.settings.unavailable.title),
695
+ description: unref(i18n).baseText(unref(uiStore).contextBasedTranslationKeys.users.settings.unavailable.description),
696
+ "button-text": unref(i18n).baseText(unref(uiStore).contextBasedTranslationKeys.users.settings.unavailable.button),
697
+ "onClick:button": goToUpgrade
698
+ }, null, 8, ["heading", "description", "button-text"])
699
+ ], 2)) : createCommentVNode("", true),
700
+ !isAdvancedPermissionsEnabled.value ? (openBlock(), createBlock(_component_n8n_notice, { key: 1 }, {
701
+ default: withCtx(() => [
702
+ createVNode(_component_i18n_t, { keypath: "settings.users.advancedPermissions.warning" }, {
703
+ link: withCtx(() => [
704
+ createVNode(_component_n8n_link, {
705
+ "data-test-id": "upgrade-permissions-link",
706
+ size: "small",
707
+ onClick: goToUpgradeAdvancedPermissions
708
+ }, {
709
+ default: withCtx(() => [
710
+ createTextVNode(toDisplayString(unref(i18n).baseText("settings.users.advancedPermissions.warning.link")), 1)
711
+ ]),
712
+ _: 1
713
+ })
714
+ ]),
715
+ _: 1
716
+ })
717
+ ]),
718
+ _: 1
719
+ })) : createCommentVNode("", true),
720
+ createBaseVNode("div", {
721
+ class: normalizeClass(_ctx.$style.settingsContainer)
722
+ }, [
723
+ createBaseVNode("div", {
724
+ class: normalizeClass(_ctx.$style.settingsContainerInfo)
725
+ }, [
726
+ createVNode(_component_n8n_text, { bold: true }, {
727
+ default: withCtx(() => [
728
+ createTextVNode(toDisplayString(unref(i18n).baseText("settings.personal.mfa.enforce.title")), 1)
729
+ ]),
730
+ _: 1
731
+ }),
732
+ createVNode(_component_n8n_text, {
733
+ size: "small",
734
+ color: "text-light"
735
+ }, {
736
+ default: withCtx(() => [
737
+ createTextVNode(toDisplayString(unref(i18n).baseText("settings.personal.mfa.enforce.message")), 1)
738
+ ]),
739
+ _: 1
740
+ })
741
+ ], 2),
742
+ createBaseVNode("div", {
743
+ class: normalizeClass(_ctx.$style.settingsContainerAction)
744
+ }, [
745
+ createVNode(_component_EnterpriseEdition, {
746
+ features: [unref(EnterpriseEditionFeature).EnforceMFA]
747
+ }, {
748
+ fallback: withCtx(() => [
749
+ createVNode(_component_N8nTooltip, null, {
750
+ content: withCtx(() => [
751
+ createVNode(_component_i18n_t, {
752
+ keypath: tooltipKey,
753
+ tag: "span"
754
+ }, {
755
+ action: withCtx(() => [
756
+ createBaseVNode("a", { onClick: goToUpgrade }, toDisplayString(unref(i18n).baseText("settings.personal.mfa.enforce.unlicensed_tooltip.link")), 1)
757
+ ]),
758
+ _: 1
759
+ })
760
+ ]),
761
+ default: withCtx(() => [
762
+ createVNode(_component_el_switch, {
763
+ "model-value": unref(settingsStore).isMFAEnforced,
764
+ size: "large",
765
+ disabled: true,
766
+ "onUpdate:modelValue": onUpdateMfaEnforced
767
+ }, null, 8, ["model-value"])
768
+ ]),
769
+ _: 1
770
+ })
771
+ ]),
772
+ default: withCtx(() => [
773
+ createVNode(_component_el_switch, {
774
+ "model-value": unref(settingsStore).isMFAEnforced,
775
+ size: "large",
776
+ "data-test-id": "enable-force-mfa",
777
+ "onUpdate:modelValue": onUpdateMfaEnforced
778
+ }, null, 8, ["model-value"])
779
+ ]),
780
+ _: 1
781
+ }, 8, ["features"])
782
+ ], 2)
783
+ ], 2),
784
+ !showUMSetupWarning.value ? (openBlock(), createElementBlock("div", {
785
+ key: 2,
786
+ class: normalizeClass(_ctx.$style.buttonContainer)
787
+ }, [
788
+ createVNode(_component_n8n_input, {
789
+ class: normalizeClass(_ctx.$style.search),
790
+ "model-value": search2.value,
791
+ placeholder: unref(i18n).baseText("settings.users.search.placeholder"),
792
+ clearable: "",
793
+ "data-test-id": "users-list-search",
794
+ "onUpdate:modelValue": onSearch
795
+ }, {
796
+ prefix: withCtx(() => [
797
+ createVNode(_component_n8n_icon, { icon: "search" })
798
+ ]),
799
+ _: 1
800
+ }, 8, ["class", "model-value", "placeholder"]),
801
+ createVNode(_component_n8n_tooltip, {
802
+ disabled: !unref(ssoStore).isSamlLoginEnabled
803
+ }, {
804
+ content: withCtx(() => [
805
+ createBaseVNode("span", null, toDisplayString(unref(i18n).baseText("settings.users.invite.tooltip")), 1)
806
+ ]),
807
+ default: withCtx(() => [
808
+ createBaseVNode("div", null, [
809
+ createVNode(_component_n8n_button, {
810
+ disabled: unref(ssoStore).isSamlLoginEnabled || !unref(usersStore).usersLimitNotReached,
811
+ label: unref(i18n).baseText("settings.users.invite"),
812
+ size: "large",
813
+ "data-test-id": "settings-users-invite-button",
814
+ onClick: onInvite
815
+ }, null, 8, ["disabled", "label"])
816
+ ])
817
+ ]),
818
+ _: 1
819
+ }, 8, ["disabled"])
820
+ ], 2)) : createCommentVNode("", true),
821
+ unref(usersStore).usersLimitNotReached || unref(usersStore).usersList.state.count > 1 ? (openBlock(), createElementBlock("div", {
822
+ key: 3,
823
+ class: normalizeClass(_ctx.$style.usersContainer)
824
+ }, [
825
+ createVNode(_sfc_main$1, {
826
+ "table-options": usersTableState.value,
827
+ "onUpdate:tableOptions": _cache[0] || (_cache[0] = ($event) => usersTableState.value = $event),
828
+ "data-test-id": "settings-users-table",
829
+ data: unref(usersStore).usersList.state,
830
+ loading: unref(usersStore).usersList.isLoading,
831
+ actions: usersListActions.value,
832
+ "onUpdate:options": updateUsersTableData,
833
+ "onUpdate:role": onUpdateRole,
834
+ onAction: onUsersListAction
835
+ }, null, 8, ["table-options", "data", "loading", "actions"])
836
+ ], 2)) : createCommentVNode("", true)
837
+ ], 2);
838
+ };
839
+ }
840
+ });
841
+ const buttonContainer = "_buttonContainer_iin51_123";
842
+ const search = "_search_iin51_130";
843
+ const setupInfoContainer = "_setupInfoContainer_iin51_134";
844
+ const settingsContainer = "_settingsContainer_iin51_138";
845
+ const settingsContainerInfo = "_settingsContainerInfo_iin51_149";
846
+ const settingsContainerAction = "_settingsContainerAction_iin51_158";
847
+ const style0 = {
848
+ buttonContainer,
849
+ search,
850
+ setupInfoContainer,
851
+ settingsContainer,
852
+ settingsContainerInfo,
853
+ settingsContainerAction
854
+ };
855
+ const cssModules = {
856
+ "$style": style0
857
+ };
858
+ const SettingsUsersView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
859
+ export {
860
+ SettingsUsersView as default
861
+ };