382 lines
14 KiB
JavaScript
Executable File
382 lines
14 KiB
JavaScript
Executable File
import { d as defineComponent, r as ref, x as computed, a7 as watch, h as createElementBlock, g as openBlock, n as normalizeClass, X as renderSlot, j as createBaseVNode, f as createCommentVNode, t as toDisplayString, e as createBlock, i as createVNode, l as unref, ed as N8nActionToggle, w as withCtx, p as N8nText, k as createTextVNode, a9 as Tooltip, dK as N8nLoading, F as Fragment, A as renderList, B as withModifiers, C as N8nLink, _ as _export_sfc, aF as ProjectTypes, fr as isIconOrEmoji, c as useI18n, fs as __unplugin_components_0$1 } from "./index--OJ5nhDf.js";
|
|
const _hoisted_1 = { "data-test-id": "hidden-items-tooltip" };
|
|
const _hoisted_2 = ["title", "data-resourceid", "onClick", "onMouseenter", "onMouseup"];
|
|
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
...{ name: "N8nBreadcrumbs" },
|
|
__name: "Breadcrumbs",
|
|
props: {
|
|
items: {},
|
|
hiddenItems: { default: () => new Array() },
|
|
theme: { default: "medium" },
|
|
showBorder: { type: Boolean, default: false },
|
|
loadingSkeletonRows: { default: 3 },
|
|
separator: { default: "/" },
|
|
highlightLastItem: { type: Boolean, default: true },
|
|
hiddenItemsTrigger: { default: "click" },
|
|
pathTruncated: { type: Boolean, default: false },
|
|
dragActive: { type: Boolean, default: false }
|
|
},
|
|
emits: ["tooltipOpened", "tooltipClosed", "hiddenItemsLoadingError", "itemSelected", "itemHover", "itemDrop"],
|
|
setup(__props, { emit: __emit }) {
|
|
const emit = __emit;
|
|
const props = __props;
|
|
const loadedHiddenItems = ref([]);
|
|
const isLoadingHiddenItems = ref(false);
|
|
const currentPromise = ref(null);
|
|
const hasHiddenItems = computed(() => {
|
|
return Array.isArray(props.hiddenItems) ? props.hiddenItems.length > 0 : props.hiddenItems !== void 0;
|
|
});
|
|
const showEllipsis = computed(() => {
|
|
return props.items.length && (hasHiddenItems.value || props.pathTruncated);
|
|
});
|
|
const dropdownDisabled = computed(() => {
|
|
return props.pathTruncated && !hasHiddenItems.value;
|
|
});
|
|
const hiddenItemActions = computed(() => {
|
|
return loadedHiddenItems.value.map((item2) => ({
|
|
value: item2.id,
|
|
label: item2.label,
|
|
disabled: false
|
|
}));
|
|
});
|
|
const getHiddenItems = async () => {
|
|
if (loadedHiddenItems.value.length > 0 && props.hiddenItems === currentPromise.value) {
|
|
return;
|
|
}
|
|
if (Array.isArray(props.hiddenItems)) {
|
|
loadedHiddenItems.value = props.hiddenItems;
|
|
return;
|
|
}
|
|
isLoadingHiddenItems.value = true;
|
|
try {
|
|
currentPromise.value = props.hiddenItems;
|
|
const items = await props.hiddenItems;
|
|
loadedHiddenItems.value = items;
|
|
} catch (error) {
|
|
loadedHiddenItems.value = [];
|
|
emit("hiddenItemsLoadingError", error);
|
|
} finally {
|
|
isLoadingHiddenItems.value = false;
|
|
}
|
|
};
|
|
watch(
|
|
() => props.hiddenItems,
|
|
(_newValue) => {
|
|
void getHiddenItems();
|
|
}
|
|
);
|
|
const onHiddenMenuVisibleChange = async (visible) => {
|
|
if (visible) {
|
|
emit("tooltipOpened");
|
|
await getHiddenItems();
|
|
} else {
|
|
emit("tooltipClosed");
|
|
}
|
|
};
|
|
const emitItemSelected = (id) => {
|
|
const item2 = [...props.items, ...loadedHiddenItems.value].find((i) => i.id === id);
|
|
if (!item2) {
|
|
return;
|
|
}
|
|
emit("itemSelected", item2);
|
|
};
|
|
const emitItemHover = (id) => {
|
|
const item2 = [...props.items, ...loadedHiddenItems.value].find((i) => i.id === id);
|
|
if (!item2) {
|
|
return;
|
|
}
|
|
emit("itemHover", item2);
|
|
};
|
|
const onHiddenItemMouseUp = (item2) => {
|
|
const pathItem = [...props.items, ...loadedHiddenItems.value].find((i) => i.id === item2.value);
|
|
if (!pathItem || !props.dragActive) {
|
|
return;
|
|
}
|
|
emit("itemDrop", pathItem);
|
|
};
|
|
const onItemMouseUp = (item2) => {
|
|
if (!props.dragActive) {
|
|
return;
|
|
}
|
|
emit("itemDrop", item2);
|
|
};
|
|
const handleTooltipShow = async () => {
|
|
emit("tooltipOpened");
|
|
await getHiddenItems();
|
|
};
|
|
const handleTooltipClose = () => {
|
|
emit("tooltipClosed");
|
|
};
|
|
return (_ctx, _cache) => {
|
|
return openBlock(), createElementBlock("div", {
|
|
class: normalizeClass({
|
|
[_ctx.$style.container]: true,
|
|
[_ctx.$style.border]: props.showBorder,
|
|
[_ctx.$style[props.theme]]: true,
|
|
["n8n-breadcrumbs"]: true
|
|
})
|
|
}, [
|
|
renderSlot(_ctx.$slots, "prepend"),
|
|
createBaseVNode("ul", {
|
|
class: normalizeClass(_ctx.$style.list)
|
|
}, [
|
|
_ctx.$slots.prepend && _ctx.items.length ? (openBlock(), createElementBlock("li", {
|
|
key: 0,
|
|
class: normalizeClass(_ctx.$style.separator)
|
|
}, toDisplayString(_ctx.separator), 3)) : createCommentVNode("", true),
|
|
showEllipsis.value ? (openBlock(), createElementBlock("li", {
|
|
key: 1,
|
|
class: normalizeClass({ [_ctx.$style.ellipsis]: true, [_ctx.$style.disabled]: dropdownDisabled.value }),
|
|
"data-test-id": "ellipsis"
|
|
}, [
|
|
props.theme !== "small" ? (openBlock(), createElementBlock("div", {
|
|
key: 0,
|
|
class: normalizeClass(_ctx.$style["hidden-items-menu"])
|
|
}, [
|
|
createVNode(unref(N8nActionToggle), {
|
|
actions: hiddenItemActions.value,
|
|
loading: isLoadingHiddenItems.value,
|
|
"loading-row-count": _ctx.loadingSkeletonRows,
|
|
disabled: dropdownDisabled.value,
|
|
class: normalizeClass(_ctx.$style["action-toggle"]),
|
|
"popper-class": `${_ctx.$style["hidden-items-menu-popper"]} ${_ctx.dragActive ? _ctx.$style.dragging : ""}`,
|
|
trigger: _ctx.hiddenItemsTrigger,
|
|
theme: "dark",
|
|
placement: "bottom",
|
|
size: "small",
|
|
"icon-orientation": "horizontal",
|
|
"data-test-id": "hidden-items-menu",
|
|
onVisibleChange: onHiddenMenuVisibleChange,
|
|
onAction: emitItemSelected,
|
|
onItemMouseup: onHiddenItemMouseUp
|
|
}, {
|
|
default: withCtx(() => [
|
|
createVNode(unref(N8nText), {
|
|
bold: true,
|
|
class: normalizeClass(_ctx.$style.dots)
|
|
}, {
|
|
default: withCtx(() => _cache[0] || (_cache[0] = [
|
|
createTextVNode("...")
|
|
])),
|
|
_: 1
|
|
}, 8, ["class"])
|
|
]),
|
|
_: 1
|
|
}, 8, ["actions", "loading", "loading-row-count", "disabled", "class", "popper-class", "trigger"])
|
|
], 2)) : (openBlock(), createBlock(unref(Tooltip), {
|
|
key: 1,
|
|
"popper-class": _ctx.$style.tooltip,
|
|
disabled: dropdownDisabled.value,
|
|
trigger: _ctx.hiddenItemsTrigger,
|
|
placement: "bottom",
|
|
onBeforeShow: handleTooltipShow,
|
|
onHide: handleTooltipClose
|
|
}, {
|
|
content: withCtx(() => [
|
|
isLoadingHiddenItems.value ? (openBlock(), createElementBlock("div", {
|
|
key: 0,
|
|
class: normalizeClass(_ctx.$style["tooltip-loading"])
|
|
}, [
|
|
createVNode(unref(N8nLoading), {
|
|
rows: 1,
|
|
loading: isLoadingHiddenItems.value,
|
|
animated: "",
|
|
variant: "p",
|
|
"shrink-last": false
|
|
}, null, 8, ["loading"])
|
|
], 2)) : (openBlock(), createElementBlock("div", {
|
|
key: 1,
|
|
class: normalizeClass(_ctx.$style.tooltipContent)
|
|
}, [
|
|
createBaseVNode("div", _hoisted_1, [
|
|
createVNode(unref(N8nText), null, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(loadedHiddenItems.value.map((item2) => item2.label).join(" / ")), 1)
|
|
]),
|
|
_: 1
|
|
})
|
|
])
|
|
], 2))
|
|
]),
|
|
default: withCtx(() => [
|
|
createBaseVNode("span", {
|
|
class: normalizeClass(_ctx.$style["tooltip-ellipsis"])
|
|
}, "...", 2)
|
|
]),
|
|
_: 1
|
|
}, 8, ["popper-class", "disabled", "trigger"]))
|
|
], 2)) : createCommentVNode("", true),
|
|
showEllipsis.value ? (openBlock(), createElementBlock("li", {
|
|
key: 2,
|
|
class: normalizeClass(_ctx.$style.separator)
|
|
}, toDisplayString(_ctx.separator), 3)) : createCommentVNode("", true),
|
|
(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.items, (item2, index) => {
|
|
return openBlock(), createElementBlock(Fragment, {
|
|
key: item2.id
|
|
}, [
|
|
createBaseVNode("li", {
|
|
class: normalizeClass({
|
|
[_ctx.$style.item]: true,
|
|
[_ctx.$style.current]: props.highlightLastItem && index === _ctx.items.length - 1,
|
|
[_ctx.$style.dragging]: props.dragActive
|
|
}),
|
|
title: item2.label,
|
|
"data-resourceid": item2.id,
|
|
"data-test-id": "breadcrumbs-item",
|
|
"data-target": "folder-breadcrumb-item",
|
|
onClick: withModifiers(($event) => emitItemSelected(item2.id), ["prevent"]),
|
|
onMouseenter: ($event) => emitItemHover(item2.id),
|
|
onMouseup: ($event) => onItemMouseUp(item2)
|
|
}, [
|
|
item2.href ? (openBlock(), createBlock(unref(N8nLink), {
|
|
key: 0,
|
|
href: item2.href,
|
|
theme: "text"
|
|
}, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(item2.label), 1)
|
|
]),
|
|
_: 2
|
|
}, 1032, ["href"])) : (openBlock(), createBlock(unref(N8nText), { key: 1 }, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(item2.label), 1)
|
|
]),
|
|
_: 2
|
|
}, 1024))
|
|
], 42, _hoisted_2),
|
|
index !== _ctx.items.length - 1 ? (openBlock(), createElementBlock("li", {
|
|
key: 0,
|
|
class: normalizeClass(_ctx.$style.separator)
|
|
}, toDisplayString(_ctx.separator), 3)) : createCommentVNode("", true)
|
|
], 64);
|
|
}), 128))
|
|
], 2),
|
|
renderSlot(_ctx.$slots, "append")
|
|
], 2);
|
|
};
|
|
}
|
|
});
|
|
const container = "_container_1kcxp_123";
|
|
const small = "_small_1kcxp_127";
|
|
const border = "_border_1kcxp_131";
|
|
const list = "_list_1kcxp_136";
|
|
const item = "_item_1kcxp_142";
|
|
const dragging$1 = "_dragging_1kcxp_146";
|
|
const current = "_current_1kcxp_162";
|
|
const ellipsis = "_ellipsis_1kcxp_166";
|
|
const dots = "_dots_1kcxp_166";
|
|
const disabled = "_disabled_1kcxp_172";
|
|
const tooltip = "_tooltip_1kcxp_167";
|
|
const separator = "_separator_1kcxp_257";
|
|
const medium = "_medium_1kcxp_262";
|
|
const style0$1 = {
|
|
container,
|
|
small,
|
|
border,
|
|
list,
|
|
item,
|
|
dragging: dragging$1,
|
|
current,
|
|
ellipsis,
|
|
dots,
|
|
"tooltip-ellipsis": "_tooltip-ellipsis_1kcxp_167",
|
|
disabled,
|
|
"hidden-items-menu": "_hidden-items-menu_1kcxp_184",
|
|
"hidden-items-menu-popper": "_hidden-items-menu-popper_1kcxp_189",
|
|
"tooltip-loading": "_tooltip-loading_1kcxp_205",
|
|
tooltip,
|
|
separator,
|
|
medium
|
|
};
|
|
const cssModules$1 = {
|
|
"$style": style0$1
|
|
};
|
|
const Breadcrumbs = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
|
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
__name: "ProjectBreadcrumb",
|
|
props: {
|
|
currentProject: {},
|
|
isDragging: { type: Boolean, default: false }
|
|
},
|
|
emits: ["projectHover", "projectDrop"],
|
|
setup(__props, { emit: __emit }) {
|
|
const props = __props;
|
|
const emit = __emit;
|
|
const i18n = useI18n();
|
|
const projectIcon = computed(() => {
|
|
if (props.currentProject?.type === ProjectTypes.Personal) {
|
|
return { type: "icon", value: "user" };
|
|
} else if (props.currentProject?.name) {
|
|
return isIconOrEmoji(props.currentProject.icon) ? props.currentProject.icon : { type: "icon", value: "layers" };
|
|
} else {
|
|
return { type: "icon", value: "house" };
|
|
}
|
|
});
|
|
const projectName = computed(() => {
|
|
if (props.currentProject.type === ProjectTypes.Personal) {
|
|
return i18n.baseText("projects.menu.personal");
|
|
}
|
|
return props.currentProject.name;
|
|
});
|
|
const onHover = () => {
|
|
emit("projectHover");
|
|
};
|
|
const onProjectMouseUp = () => {
|
|
if (props.isDragging) {
|
|
emit("projectDrop");
|
|
}
|
|
};
|
|
return (_ctx, _cache) => {
|
|
const _component_ProjectIcon = __unplugin_components_0$1;
|
|
const _component_N8nText = N8nText;
|
|
const _component_n8n_link = N8nLink;
|
|
return openBlock(), createElementBlock("div", {
|
|
class: normalizeClass({ [_ctx.$style["home-project"]]: true, [_ctx.$style.dragging]: _ctx.isDragging }),
|
|
"data-test-id": "home-project",
|
|
onMouseenter: onHover,
|
|
onMouseup: _cache[0] || (_cache[0] = ($event) => _ctx.isDragging ? onProjectMouseUp() : null)
|
|
}, [
|
|
createVNode(_component_n8n_link, {
|
|
to: `/projects/${_ctx.currentProject.id}`,
|
|
class: normalizeClass([_ctx.$style["project-link"]])
|
|
}, {
|
|
default: withCtx(() => [
|
|
createVNode(_component_ProjectIcon, {
|
|
icon: projectIcon.value,
|
|
"border-less": true,
|
|
size: "mini",
|
|
title: projectName.value
|
|
}, null, 8, ["icon", "title"]),
|
|
createVNode(_component_N8nText, {
|
|
size: "medium",
|
|
color: "text-base",
|
|
class: normalizeClass(_ctx.$style["project-label"])
|
|
}, {
|
|
default: withCtx(() => [
|
|
createTextVNode(toDisplayString(projectName.value), 1)
|
|
]),
|
|
_: 1
|
|
}, 8, ["class"])
|
|
]),
|
|
_: 1
|
|
}, 8, ["to", "class"])
|
|
], 34);
|
|
};
|
|
}
|
|
});
|
|
const dragging = "_dragging_1gp09_128";
|
|
const style0 = {
|
|
"home-project": "_home-project_1gp09_123",
|
|
dragging,
|
|
"project-link": "_project-link_1gp09_141",
|
|
"project-label": "_project-label_1gp09_148"
|
|
};
|
|
const cssModules = {
|
|
"$style": style0
|
|
};
|
|
const __unplugin_components_0 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
|
|
export {
|
|
Breadcrumbs as B,
|
|
__unplugin_components_0 as _
|
|
};
|