534 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			534 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| import { d as defineComponent, Q as useUIStore, d9 as useCredentialsStore, au as useProjectsStore, x as computed, c as useI18n, aB as getResourcePermissions, fY as dateFormat, e as createBlock, g as openBlock, s as N8nCard, B as withModifiers, n as normalizeClass, w as withCtx, j as createBaseVNode, i as createVNode, h as createElementBlock, f as createCommentVNode, b2 as withDirectives, t as toDisplayString, b3 as vShow, k as createTextVNode, l as unref, eK as _sfc_main$2, p as N8nText, aS as ResourceType, g5 as ProjectCardBadge, ed as N8nActionToggle, aK as N8nBadge, go as CredentialIcon, am as useMessage, an as MODAL_CONFIRM, aT as PROJECT_MOVE_RESOURCE_MODAL, _ as _export_sfc, ad as useNodeTypesStore, af as useSourceControlStore, da as useExternalSecretsStore, u as useUsersStore, gb as useInsightsStore, ax as useDocumentTitle, a2 as useRoute, b as useRouter, r as ref, gp as listenForModalChanges, a7 as watch, o as onMounted, dY as N8nActionBox, e5 as N8nInputLabel, e8 as N8nSelect, F as Fragment, A as renderList, e9 as _sfc_main$4, eZ as N8nCheckbox, gq as CREDENTIAL_EMPTY_VALUE, al as useTelemetry, v as useSettingsStore, aE as EnterpriseEditionFeature, cH as useEnvironmentsStore, gr as CREDENTIAL_SELECT_MODAL_KEY, V as VIEWS, gs as CREDENTIAL_EDIT_MODAL_KEY, gt as isCredentialsResource } from "./index--OJ5nhDf.js";
 | |
| import { _ as _sfc_main$3 } from "./EmptySharedSectionActionBox.vue_vue_type_script_setup_true_lang-DirQeoxa.js";
 | |
| import { R as ResourcesListLayout } from "./ResourcesListLayout-O-Z59wTE.js";
 | |
| import { P as ProjectHeader } from "./ProjectHeader-CVfPUZNI.js";
 | |
| import { u as useProjectPages } from "./useProjectPages-CH519D2j.js";
 | |
| import { I as InsightsSummary } from "./InsightsSummary-I5vKNG0I.js";
 | |
| import { p as pickBy } from "./pickBy-BljOBsPy.js";
 | |
| import "./TableBase-DBeBHkOY.js";
 | |
| import "./PageViewLayout--7SkYsc9.js";
 | |
| const _hoisted_1$1 = { key: 0 };
 | |
| const _sfc_main$1 = /* @__PURE__ */ defineComponent({
 | |
|   __name: "CredentialCard",
 | |
|   props: {
 | |
|     data: {},
 | |
|     readOnly: { type: Boolean, default: false },
 | |
|     needsSetup: { type: Boolean, default: false }
 | |
|   },
 | |
|   emits: ["click"],
 | |
|   setup(__props, { emit: __emit }) {
 | |
|     const CREDENTIAL_LIST_ITEM_ACTIONS = {
 | |
|       OPEN: "open",
 | |
|       DELETE: "delete",
 | |
|       MOVE: "move"
 | |
|     };
 | |
|     const emit = __emit;
 | |
|     const props = __props;
 | |
|     const locale = useI18n();
 | |
|     const message = useMessage();
 | |
|     const uiStore = useUIStore();
 | |
|     const credentialsStore = useCredentialsStore();
 | |
|     const projectsStore = useProjectsStore();
 | |
|     const resourceTypeLabel = computed(() => locale.baseText("generic.credential").toLowerCase());
 | |
|     const credentialType = computed(
 | |
|       () => credentialsStore.getCredentialTypeByName(props.data.type ?? "")
 | |
|     );
 | |
|     const credentialPermissions = computed(() => getResourcePermissions(props.data.scopes).credential);
 | |
|     const actions = computed(() => {
 | |
|       const items = [
 | |
|         {
 | |
|           label: locale.baseText("credentials.item.open"),
 | |
|           value: CREDENTIAL_LIST_ITEM_ACTIONS.OPEN
 | |
|         }
 | |
|       ];
 | |
|       if (credentialPermissions.value.delete) {
 | |
|         items.push({
 | |
|           label: locale.baseText("credentials.item.delete"),
 | |
|           value: CREDENTIAL_LIST_ITEM_ACTIONS.DELETE
 | |
|         });
 | |
|       }
 | |
|       if (credentialPermissions.value.move && projectsStore.isTeamProjectFeatureEnabled) {
 | |
|         items.push({
 | |
|           label: locale.baseText("credentials.item.move"),
 | |
|           value: CREDENTIAL_LIST_ITEM_ACTIONS.MOVE
 | |
|         });
 | |
|       }
 | |
|       return items;
 | |
|     });
 | |
|     const formattedCreatedAtDate = computed(() => {
 | |
|       const currentYear = (/* @__PURE__ */ new Date()).getFullYear().toString();
 | |
|       return dateFormat(
 | |
|         props.data.createdAt,
 | |
|         `d mmmm${String(props.data.createdAt).startsWith(currentYear) ? "" : ", yyyy"}`
 | |
|       );
 | |
|     });
 | |
|     function onClick() {
 | |
|       emit("click", props.data.id);
 | |
|     }
 | |
|     async function onAction(action) {
 | |
|       switch (action) {
 | |
|         case CREDENTIAL_LIST_ITEM_ACTIONS.OPEN:
 | |
|           onClick();
 | |
|           break;
 | |
|         case CREDENTIAL_LIST_ITEM_ACTIONS.DELETE:
 | |
|           await deleteResource();
 | |
|           break;
 | |
|         case CREDENTIAL_LIST_ITEM_ACTIONS.MOVE:
 | |
|           moveResource();
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|     async function deleteResource() {
 | |
|       const deleteConfirmed = await message.confirm(
 | |
|         locale.baseText("credentialEdit.credentialEdit.confirmMessage.deleteCredential.message", {
 | |
|           interpolate: { savedCredentialName: props.data.name }
 | |
|         }),
 | |
|         locale.baseText("credentialEdit.credentialEdit.confirmMessage.deleteCredential.headline"),
 | |
|         {
 | |
|           confirmButtonText: locale.baseText(
 | |
|             "credentialEdit.credentialEdit.confirmMessage.deleteCredential.confirmButtonText"
 | |
|           )
 | |
|         }
 | |
|       );
 | |
|       if (deleteConfirmed === MODAL_CONFIRM) {
 | |
|         await credentialsStore.deleteCredential({ id: props.data.id });
 | |
|       }
 | |
|     }
 | |
|     function moveResource() {
 | |
|       uiStore.openModalWithData({
 | |
|         name: PROJECT_MOVE_RESOURCE_MODAL,
 | |
|         data: {
 | |
|           resource: props.data,
 | |
|           resourceType: ResourceType.Credential,
 | |
|           resourceTypeLabel: resourceTypeLabel.value
 | |
|         }
 | |
|       });
 | |
|     }
 | |
|     return (_ctx, _cache) => {
 | |
|       const _component_N8nBadge = N8nBadge;
 | |
|       const _component_n8n_text = N8nText;
 | |
|       const _component_n8n_action_toggle = N8nActionToggle;
 | |
|       const _component_n8n_card = N8nCard;
 | |
|       return openBlock(), createBlock(_component_n8n_card, {
 | |
|         class: normalizeClass(_ctx.$style.cardLink),
 | |
|         onClick: withModifiers(onClick, ["stop"])
 | |
|       }, {
 | |
|         prepend: withCtx(() => [
 | |
|           createVNode(CredentialIcon, {
 | |
|             "credential-type-name": credentialType.value?.name ?? ""
 | |
|           }, null, 8, ["credential-type-name"])
 | |
|         ]),
 | |
|         header: withCtx(() => [
 | |
|           createVNode(_component_n8n_text, {
 | |
|             tag: "h2",
 | |
|             bold: "",
 | |
|             class: normalizeClass(_ctx.$style.cardHeading)
 | |
|           }, {
 | |
|             default: withCtx(() => [
 | |
|               createTextVNode(toDisplayString(_ctx.data.name) + " ", 1),
 | |
|               _ctx.readOnly ? (openBlock(), createBlock(_component_N8nBadge, {
 | |
|                 key: 0,
 | |
|                 class: "ml-3xs",
 | |
|                 theme: "tertiary",
 | |
|                 bold: ""
 | |
|               }, {
 | |
|                 default: withCtx(() => [
 | |
|                   createTextVNode(toDisplayString(unref(locale).baseText("credentials.item.readonly")), 1)
 | |
|                 ]),
 | |
|                 _: 1
 | |
|               })) : createCommentVNode("", true),
 | |
|               _ctx.needsSetup ? (openBlock(), createBlock(_component_N8nBadge, {
 | |
|                 key: 1,
 | |
|                 class: "ml-3xs",
 | |
|                 theme: "warning"
 | |
|               }, {
 | |
|                 default: withCtx(() => [
 | |
|                   createTextVNode(toDisplayString(unref(locale).baseText("credentials.item.needsSetup")), 1)
 | |
|                 ]),
 | |
|                 _: 1
 | |
|               })) : createCommentVNode("", true)
 | |
|             ]),
 | |
|             _: 1
 | |
|           }, 8, ["class"])
 | |
|         ]),
 | |
|         append: withCtx(() => [
 | |
|           createBaseVNode("div", {
 | |
|             class: normalizeClass(_ctx.$style.cardActions),
 | |
|             onClick: _cache[0] || (_cache[0] = withModifiers(() => {
 | |
|             }, ["stop"]))
 | |
|           }, [
 | |
|             createVNode(ProjectCardBadge, {
 | |
|               class: normalizeClass(_ctx.$style.cardBadge),
 | |
|               resource: _ctx.data,
 | |
|               "resource-type": unref(ResourceType).Credential,
 | |
|               "resource-type-label": resourceTypeLabel.value,
 | |
|               "personal-project": unref(projectsStore).personalProject,
 | |
|               "show-badge-border": false
 | |
|             }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"]),
 | |
|             createVNode(_component_n8n_action_toggle, {
 | |
|               "data-test-id": "credential-card-actions",
 | |
|               actions: actions.value,
 | |
|               theme: "dark",
 | |
|               onAction
 | |
|             }, null, 8, ["actions"])
 | |
|           ], 2)
 | |
|         ]),
 | |
|         default: withCtx(() => [
 | |
|           createBaseVNode("div", {
 | |
|             class: normalizeClass(_ctx.$style.cardDescription)
 | |
|           }, [
 | |
|             createVNode(_component_n8n_text, {
 | |
|               color: "text-light",
 | |
|               size: "small"
 | |
|             }, {
 | |
|               default: withCtx(() => [
 | |
|                 credentialType.value ? (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(credentialType.value.displayName) + " | ", 1)) : createCommentVNode("", true),
 | |
|                 withDirectives(createBaseVNode("span", null, [
 | |
|                   createTextVNode(toDisplayString(unref(locale).baseText("credentials.item.updated")) + " ", 1),
 | |
|                   createVNode(_sfc_main$2, {
 | |
|                     date: _ctx.data.updatedAt
 | |
|                   }, null, 8, ["date"]),
 | |
|                   _cache[1] || (_cache[1] = createTextVNode(" | "))
 | |
|                 ], 512), [
 | |
|                   [vShow, _ctx.data]
 | |
|                 ]),
 | |
|                 withDirectives(createBaseVNode("span", null, toDisplayString(unref(locale).baseText("credentials.item.created")) + " " + toDisplayString(formattedCreatedAtDate.value), 513), [
 | |
|                   [vShow, _ctx.data]
 | |
|                 ])
 | |
|               ]),
 | |
|               _: 1
 | |
|             })
 | |
|           ], 2)
 | |
|         ]),
 | |
|         _: 1
 | |
|       }, 8, ["class"]);
 | |
|     };
 | |
|   }
 | |
| });
 | |
| const cardLink = "_cardLink_14jai_123";
 | |
| const cardHeading = "_cardHeading_14jai_133";
 | |
| const cardDescription = "_cardDescription_14jai_138";
 | |
| const cardActions = "_cardActions_14jai_145";
 | |
| const cardBadge = "_cardBadge_14jai_165";
 | |
| const style0$1 = {
 | |
|   cardLink,
 | |
|   cardHeading,
 | |
|   cardDescription,
 | |
|   cardActions,
 | |
|   cardBadge
 | |
| };
 | |
| const cssModules$1 = {
 | |
|   "$style": style0$1
 | |
| };
 | |
| const CredentialCard = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
 | |
| const _hoisted_1 = { class: "mb-s" };
 | |
| const _hoisted_2 = { class: "mb-s" };
 | |
| const _sfc_main = /* @__PURE__ */ defineComponent({
 | |
|   __name: "CredentialsView",
 | |
|   props: {
 | |
|     credentialId: {}
 | |
|   },
 | |
|   setup(__props) {
 | |
|     const props = __props;
 | |
|     const credentialsStore = useCredentialsStore();
 | |
|     const nodeTypesStore = useNodeTypesStore();
 | |
|     const uiStore = useUIStore();
 | |
|     const sourceControlStore = useSourceControlStore();
 | |
|     const externalSecretsStore = useExternalSecretsStore();
 | |
|     const projectsStore = useProjectsStore();
 | |
|     const usersStore = useUsersStore();
 | |
|     const insightsStore = useInsightsStore();
 | |
|     const documentTitle = useDocumentTitle();
 | |
|     const route = useRoute();
 | |
|     const router = useRouter();
 | |
|     const telemetry = useTelemetry();
 | |
|     const i18n = useI18n();
 | |
|     const overview = useProjectPages();
 | |
|     const updateFilter = (state) => {
 | |
|       void router.replace({ query: pickBy(state) });
 | |
|     };
 | |
|     const onSearchUpdated = (search) => {
 | |
|       updateFilter({ ...filters.value, search });
 | |
|     };
 | |
|     const filters = ref({
 | |
|       ...route.query,
 | |
|       setupNeeded: route.query.setupNeeded?.toString() === "true"
 | |
|     });
 | |
|     const loading = ref(false);
 | |
|     const needsSetup = (data) => {
 | |
|       const dataObject = data;
 | |
|       if (!dataObject) return false;
 | |
|       if (Object.keys(dataObject).length === 0) return true;
 | |
|       return Object.values(dataObject).every((value) => !value || value === CREDENTIAL_EMPTY_VALUE);
 | |
|     };
 | |
|     const allCredentials = computed(
 | |
|       () => credentialsStore.allCredentials.map((credential) => ({
 | |
|         resourceType: "credential",
 | |
|         id: credential.id,
 | |
|         name: credential.name,
 | |
|         value: "",
 | |
|         updatedAt: credential.updatedAt,
 | |
|         createdAt: credential.createdAt,
 | |
|         homeProject: credential.homeProject,
 | |
|         scopes: credential.scopes,
 | |
|         sharedWithProjects: credential.sharedWithProjects,
 | |
|         readOnly: !getResourcePermissions(credential.scopes).credential.update,
 | |
|         needsSetup: needsSetup(credential.data),
 | |
|         type: credential.type
 | |
|       }))
 | |
|     );
 | |
|     const allCredentialTypes = computed(() => credentialsStore.allCredentialTypes);
 | |
|     const credentialTypesById = computed(
 | |
|       () => credentialsStore.credentialTypesById
 | |
|     );
 | |
|     const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
 | |
|     const projectPermissions = computed(
 | |
|       () => getResourcePermissions(
 | |
|         projectsStore.currentProject?.scopes ?? projectsStore.personalProject?.scopes
 | |
|       )
 | |
|     );
 | |
|     const personalProject = computed(() => {
 | |
|       return projectsStore.personalProject;
 | |
|     });
 | |
|     const setRouteCredentialId = (credentialId) => {
 | |
|       void router.replace({ params: { credentialId }, query: route.query });
 | |
|     };
 | |
|     const addCredential = () => {
 | |
|       setRouteCredentialId("create");
 | |
|       telemetry.track("User clicked add cred button", {
 | |
|         source: "Creds list"
 | |
|       });
 | |
|     };
 | |
|     listenForModalChanges({
 | |
|       store: uiStore,
 | |
|       onModalClosed(modalName) {
 | |
|         if ([CREDENTIAL_SELECT_MODAL_KEY, CREDENTIAL_EDIT_MODAL_KEY].includes(modalName)) {
 | |
|           void router.replace({ params: { credentialId: "" }, query: route.query });
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|     const onFilter = (resource, newFilters, matches) => {
 | |
|       if (!isCredentialsResource(resource)) return false;
 | |
|       const filtersToApply = newFilters;
 | |
|       if (filtersToApply.type && filtersToApply.type.length > 0) {
 | |
|         matches = matches && filtersToApply.type.includes(resource.type);
 | |
|       }
 | |
|       if (filtersToApply.search) {
 | |
|         const searchString = filtersToApply.search.toLowerCase();
 | |
|         matches = matches || credentialTypesById.value[resource.type] && credentialTypesById.value[resource.type].displayName.toLowerCase().includes(searchString);
 | |
|       }
 | |
|       if (filtersToApply.setupNeeded) {
 | |
|         matches = matches && resource.needsSetup;
 | |
|       }
 | |
|       return matches;
 | |
|     };
 | |
|     const maybeCreateCredential = () => {
 | |
|       if (props.credentialId === "create") {
 | |
|         if (projectPermissions.value.credential.create) {
 | |
|           uiStore.openModal(CREDENTIAL_SELECT_MODAL_KEY);
 | |
|         } else {
 | |
|           void router.replace({ name: VIEWS.HOMEPAGE });
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|     const maybeEditCredential = async () => {
 | |
|       if (!!props.credentialId && props.credentialId !== "create") {
 | |
|         const credential = credentialsStore.getCredentialById(props.credentialId);
 | |
|         const credentialPermissions = getResourcePermissions(credential?.scopes).credential;
 | |
|         if (!credential) {
 | |
|           return await router.replace({
 | |
|             name: VIEWS.ENTITY_NOT_FOUND,
 | |
|             params: { entityType: "credential" }
 | |
|           });
 | |
|         }
 | |
|         if (credentialPermissions.update || credentialPermissions.read) {
 | |
|           uiStore.openExistingCredential(props.credentialId);
 | |
|           return;
 | |
|         }
 | |
|         return await router.replace({
 | |
|           name: VIEWS.ENTITY_UNAUTHORIZED,
 | |
|           params: { entityType: "credential" }
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|     const initialize = async () => {
 | |
|       loading.value = true;
 | |
|       const isVarsEnabled = useSettingsStore().isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Variables];
 | |
|       const loadPromises = [
 | |
|         credentialsStore.fetchAllCredentials(
 | |
|           route?.params?.projectId,
 | |
|           true,
 | |
|           overview.isSharedSubPage
 | |
|         ),
 | |
|         credentialsStore.fetchCredentialTypes(false),
 | |
|         externalSecretsStore.fetchAllSecrets(),
 | |
|         nodeTypesStore.loadNodeTypesIfNotLoaded(),
 | |
|         isVarsEnabled ? useEnvironmentsStore().fetchAllVariables() : Promise.resolve()
 | |
|         // for expression resolution
 | |
|       ];
 | |
|       await Promise.all(loadPromises);
 | |
|       maybeCreateCredential();
 | |
|       await maybeEditCredential();
 | |
|       loading.value = false;
 | |
|     };
 | |
|     credentialsStore.$onAction(({ name, after }) => {
 | |
|       if (name === "createNewCredential") {
 | |
|         after(() => {
 | |
|           void credentialsStore.fetchAllCredentials(route?.params?.projectId);
 | |
|         });
 | |
|       }
 | |
|     });
 | |
|     sourceControlStore.$onAction(({ name, after }) => {
 | |
|       if (name !== "pullWorkfolder") return;
 | |
|       after(() => {
 | |
|         void initialize();
 | |
|       });
 | |
|     });
 | |
|     watch(() => route?.params?.projectId, initialize);
 | |
|     watch(
 | |
|       () => props.credentialId,
 | |
|       () => {
 | |
|         maybeCreateCredential();
 | |
|         void maybeEditCredential();
 | |
|       }
 | |
|     );
 | |
|     onMounted(() => {
 | |
|       documentTitle.set(i18n.baseText("credentials.heading"));
 | |
|     });
 | |
|     return (_ctx, _cache) => {
 | |
|       const _component_N8nInputLabel = N8nInputLabel;
 | |
|       const _component_N8nOption = _sfc_main$4;
 | |
|       const _component_N8nSelect = N8nSelect;
 | |
|       const _component_EmptySharedSectionActionBox = _sfc_main$3;
 | |
|       const _component_n8n_action_box = N8nActionBox;
 | |
|       return openBlock(), createBlock(ResourcesListLayout, {
 | |
|         ref: "layout",
 | |
|         filters: filters.value,
 | |
|         "onUpdate:filters": [
 | |
|           _cache[0] || (_cache[0] = ($event) => filters.value = $event),
 | |
|           updateFilter
 | |
|         ],
 | |
|         "resource-key": "credentials",
 | |
|         resources: allCredentials.value,
 | |
|         initialize,
 | |
|         "additional-filters-handler": onFilter,
 | |
|         "type-props": { itemSize: 77 },
 | |
|         loading: loading.value,
 | |
|         disabled: readOnlyEnv.value || !projectPermissions.value.credential.create,
 | |
|         "onUpdate:search": onSearchUpdated
 | |
|       }, {
 | |
|         header: withCtx(() => [
 | |
|           createVNode(ProjectHeader, null, {
 | |
|             default: withCtx(() => [
 | |
|               unref(overview).isOverviewSubPage && unref(insightsStore).isSummaryEnabled ? (openBlock(), createBlock(InsightsSummary, {
 | |
|                 key: 0,
 | |
|                 loading: unref(insightsStore).weeklySummary.isLoading,
 | |
|                 summary: unref(insightsStore).weeklySummary.state,
 | |
|                 "time-range": "week"
 | |
|               }, null, 8, ["loading", "summary"])) : createCommentVNode("", true)
 | |
|             ]),
 | |
|             _: 1
 | |
|           })
 | |
|         ]),
 | |
|         default: withCtx(({ data }) => [
 | |
|           createVNode(CredentialCard, {
 | |
|             "data-test-id": "resources-list-item",
 | |
|             class: "mb-2xs",
 | |
|             data,
 | |
|             "read-only": data.readOnly,
 | |
|             "needs-setup": data.needsSetup,
 | |
|             onClick: setRouteCredentialId
 | |
|           }, null, 8, ["data", "read-only", "needs-setup"])
 | |
|         ]),
 | |
|         filters: withCtx(({ setKeyValue }) => [
 | |
|           createBaseVNode("div", _hoisted_1, [
 | |
|             createVNode(_component_N8nInputLabel, {
 | |
|               label: unref(i18n).baseText("credentials.filters.type"),
 | |
|               bold: false,
 | |
|               size: "small",
 | |
|               color: "text-base",
 | |
|               class: "mb-3xs"
 | |
|             }, null, 8, ["label"]),
 | |
|             createVNode(_component_N8nSelect, {
 | |
|               ref: "typeInput",
 | |
|               "model-value": filters.value.type,
 | |
|               size: "medium",
 | |
|               multiple: "",
 | |
|               filterable: "",
 | |
|               class: normalizeClass(_ctx.$style["type-input"]),
 | |
|               "onUpdate:modelValue": ($event) => setKeyValue("type", $event)
 | |
|             }, {
 | |
|               default: withCtx(() => [
 | |
|                 (openBlock(true), createElementBlock(Fragment, null, renderList(allCredentialTypes.value, (credentialType) => {
 | |
|                   return openBlock(), createBlock(_component_N8nOption, {
 | |
|                     key: credentialType.name,
 | |
|                     value: credentialType.name,
 | |
|                     label: credentialType.displayName
 | |
|                   }, null, 8, ["value", "label"]);
 | |
|                 }), 128))
 | |
|               ]),
 | |
|               _: 2
 | |
|             }, 1032, ["model-value", "class", "onUpdate:modelValue"])
 | |
|           ]),
 | |
|           createBaseVNode("div", _hoisted_2, [
 | |
|             createVNode(_component_N8nInputLabel, {
 | |
|               label: unref(i18n).baseText("credentials.filters.status"),
 | |
|               bold: false,
 | |
|               size: "small",
 | |
|               color: "text-base",
 | |
|               class: "mb-3xs"
 | |
|             }, null, 8, ["label"]),
 | |
|             createVNode(unref(N8nCheckbox), {
 | |
|               label: unref(i18n).baseText("credentials.filters.setup"),
 | |
|               "data-test-id": "credential-filter-setup-needed",
 | |
|               "model-value": filters.value.setupNeeded,
 | |
|               "onUpdate:modelValue": ($event) => setKeyValue("setupNeeded", $event)
 | |
|             }, null, 8, ["label", "model-value", "onUpdate:modelValue"])
 | |
|           ])
 | |
|         ]),
 | |
|         empty: withCtx(() => [
 | |
|           unref(overview).isSharedSubPage && personalProject.value ? (openBlock(), createBlock(_component_EmptySharedSectionActionBox, {
 | |
|             key: 0,
 | |
|             "personal-project": personalProject.value,
 | |
|             "resource-type": "credentials"
 | |
|           }, null, 8, ["personal-project"])) : (openBlock(), createBlock(_component_n8n_action_box, {
 | |
|             key: 1,
 | |
|             "data-test-id": "empty-resources-list",
 | |
|             emoji: "👋",
 | |
|             heading: unref(i18n).baseText(
 | |
|               unref(usersStore).currentUser?.firstName ? "credentials.empty.heading" : "credentials.empty.heading.userNotSetup",
 | |
|               {
 | |
|                 interpolate: { name: unref(usersStore).currentUser?.firstName ?? "" }
 | |
|               }
 | |
|             ),
 | |
|             description: unref(i18n).baseText("credentials.empty.description"),
 | |
|             "button-text": unref(i18n).baseText("credentials.empty.button"),
 | |
|             "button-type": "secondary",
 | |
|             "button-disabled": readOnlyEnv.value || !projectPermissions.value.credential.create,
 | |
|             "button-icon": readOnlyEnv.value ? "lock" : void 0,
 | |
|             "onClick:button": addCredential
 | |
|           }, {
 | |
|             disabledButtonTooltip: withCtx(() => [
 | |
|               createTextVNode(toDisplayString(readOnlyEnv.value ? unref(i18n).baseText("readOnlyEnv.cantAdd.credential") : unref(i18n).baseText("credentials.empty.button.disabled.tooltip")), 1)
 | |
|             ]),
 | |
|             _: 1
 | |
|           }, 8, ["heading", "description", "button-text", "button-disabled", "button-icon"]))
 | |
|         ]),
 | |
|         _: 1
 | |
|       }, 8, ["filters", "resources", "loading", "disabled"]);
 | |
|     };
 | |
|   }
 | |
| });
 | |
| const sidebarContainer = "_sidebarContainer_d99g5_127";
 | |
| const style0 = {
 | |
|   "type-input": "_type-input_d99g5_123",
 | |
|   sidebarContainer
 | |
| };
 | |
| const cssModules = {
 | |
|   "$style": style0
 | |
| };
 | |
| const CredentialsView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
 | |
| export {
 | |
|   CredentialsView as default
 | |
| };
 |