2022-08-12 08:20:21 +00:00
|
|
|
<script lang="ts" setup>
|
2022-09-14 03:17:15 +00:00
|
|
|
import {
|
|
|
|
IconList,
|
2024-05-21 07:10:44 +00:00
|
|
|
VDropdownItem,
|
2022-09-14 03:17:15 +00:00
|
|
|
VEntity,
|
|
|
|
VEntityField,
|
2024-05-21 07:10:44 +00:00
|
|
|
VStatusDot,
|
|
|
|
VTag,
|
2022-09-14 03:17:15 +00:00
|
|
|
} from "@halo-dev/components";
|
2024-05-21 07:10:44 +00:00
|
|
|
import { VueDraggable } from "vue-draggable-plus";
|
2023-11-09 06:56:06 +00:00
|
|
|
import type { MenuTreeItem } from "@console/modules/interface/menus/utils";
|
2022-09-30 09:48:19 +00:00
|
|
|
import { usePermission } from "@/utils/permission";
|
2023-03-23 08:54:33 +00:00
|
|
|
import { useI18n } from "vue-i18n";
|
2024-05-21 07:10:44 +00:00
|
|
|
import type { PropType } from "vue";
|
2022-09-30 09:48:19 +00:00
|
|
|
|
|
|
|
const { currentUserHasPermission } = usePermission();
|
2023-03-23 08:54:33 +00:00
|
|
|
const { t } = useI18n();
|
2022-08-12 08:20:21 +00:00
|
|
|
|
2024-05-21 07:10:44 +00:00
|
|
|
const menuTreeItems = defineModel({
|
|
|
|
type: Array as PropType<MenuTreeItem[]>,
|
|
|
|
default: [],
|
|
|
|
});
|
2022-08-12 08:20:21 +00:00
|
|
|
|
2022-08-15 12:31:51 +00:00
|
|
|
const emit = defineEmits<{
|
|
|
|
(event: "change"): void;
|
|
|
|
(event: "open-editing", menuItem: MenuTreeItem): void;
|
2022-10-11 07:33:51 +00:00
|
|
|
(event: "open-create-by-parent", menuItem: MenuTreeItem): void;
|
2022-08-15 12:31:51 +00:00
|
|
|
(event: "delete", menuItem: MenuTreeItem): void;
|
|
|
|
}>();
|
2022-08-12 08:20:21 +00:00
|
|
|
|
|
|
|
function onChange() {
|
|
|
|
emit("change");
|
|
|
|
}
|
|
|
|
|
|
|
|
function onOpenEditingModal(menuItem: MenuTreeItem) {
|
|
|
|
emit("open-editing", menuItem);
|
|
|
|
}
|
|
|
|
|
2022-10-11 07:33:51 +00:00
|
|
|
function onOpenCreateByParentModal(menuItem: MenuTreeItem) {
|
|
|
|
emit("open-create-by-parent", menuItem);
|
|
|
|
}
|
|
|
|
|
2022-08-12 08:20:21 +00:00
|
|
|
function onDelete(menuItem: MenuTreeItem) {
|
|
|
|
emit("delete", menuItem);
|
|
|
|
}
|
2022-09-06 07:24:11 +00:00
|
|
|
|
2022-11-30 03:51:47 +00:00
|
|
|
const TargetRef = {
|
2023-03-23 08:54:33 +00:00
|
|
|
Post: t("core.menu.menu_item_editing_modal.fields.ref_kind.options.post"),
|
|
|
|
SinglePage: t(
|
|
|
|
"core.menu.menu_item_editing_modal.fields.ref_kind.options.single_page"
|
|
|
|
),
|
|
|
|
Category: t(
|
|
|
|
"core.menu.menu_item_editing_modal.fields.ref_kind.options.category"
|
|
|
|
),
|
|
|
|
Tag: t("core.menu.menu_item_editing_modal.fields.ref_kind.options.tag"),
|
2022-11-30 03:51:47 +00:00
|
|
|
};
|
|
|
|
|
2022-09-06 07:24:11 +00:00
|
|
|
function getMenuItemRefDisplayName(menuItem: MenuTreeItem) {
|
2022-11-30 03:51:47 +00:00
|
|
|
const { kind } = menuItem.spec.targetRef || {};
|
|
|
|
|
|
|
|
if (kind && TargetRef[kind]) {
|
|
|
|
return TargetRef[kind];
|
2022-09-06 07:24:11 +00:00
|
|
|
}
|
2022-11-30 03:51:47 +00:00
|
|
|
|
2022-09-06 07:24:11 +00:00
|
|
|
return undefined;
|
|
|
|
}
|
2022-08-12 08:20:21 +00:00
|
|
|
</script>
|
|
|
|
<template>
|
2024-05-21 07:10:44 +00:00
|
|
|
<VueDraggable
|
|
|
|
v-model="menuTreeItems"
|
2022-08-12 08:20:21 +00:00
|
|
|
class="box-border h-full w-full divide-y divide-gray-100"
|
|
|
|
ghost-class="opacity-50"
|
|
|
|
group="menu-item"
|
|
|
|
handle=".drag-element"
|
|
|
|
tag="ul"
|
2024-05-21 07:10:44 +00:00
|
|
|
@sort="onChange"
|
2022-08-12 08:20:21 +00:00
|
|
|
>
|
2024-05-21 07:10:44 +00:00
|
|
|
<li v-for="menuItem in menuTreeItems" :key="menuItem.metadata.name">
|
|
|
|
<VEntity>
|
|
|
|
<template #prepend>
|
|
|
|
<div
|
|
|
|
v-permission="['system:menus:manage']"
|
|
|
|
class="drag-element absolute inset-y-0 left-0 hidden w-3.5 cursor-move items-center bg-gray-100 transition-all hover:bg-gray-200 group-hover:flex"
|
2022-09-30 09:48:19 +00:00
|
|
|
>
|
2024-05-21 07:10:44 +00:00
|
|
|
<IconList class="h-3.5 w-3.5" />
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<template #start>
|
|
|
|
<VEntityField :title="menuItem.status?.displayName">
|
|
|
|
<template #extra>
|
|
|
|
<VTag v-if="getMenuItemRefDisplayName(menuItem)">
|
|
|
|
{{ getMenuItemRefDisplayName(menuItem) }}
|
|
|
|
</VTag>
|
|
|
|
</template>
|
|
|
|
<template #description>
|
|
|
|
<a
|
|
|
|
v-if="menuItem.status?.href"
|
|
|
|
:href="menuItem.status?.href"
|
|
|
|
:title="menuItem.status?.href"
|
|
|
|
target="_blank"
|
|
|
|
class="truncate text-xs text-gray-500 group-hover:text-gray-900"
|
|
|
|
>
|
|
|
|
{{ menuItem.status.href }}
|
|
|
|
</a>
|
|
|
|
</template>
|
|
|
|
</VEntityField>
|
|
|
|
</template>
|
|
|
|
<template #end>
|
|
|
|
<VEntityField v-if="menuItem.metadata.deletionTimestamp">
|
|
|
|
<template #description>
|
|
|
|
<VStatusDot
|
|
|
|
v-tooltip="$t('core.common.status.deleting')"
|
|
|
|
state="warning"
|
|
|
|
animate
|
|
|
|
/>
|
|
|
|
</template>
|
|
|
|
</VEntityField>
|
|
|
|
</template>
|
|
|
|
<template
|
|
|
|
v-if="currentUserHasPermission(['system:menus:manage'])"
|
|
|
|
#dropdownItems
|
|
|
|
>
|
|
|
|
<VDropdownItem @click="onOpenEditingModal(menuItem)">
|
|
|
|
{{ $t("core.common.buttons.edit") }}
|
|
|
|
</VDropdownItem>
|
|
|
|
<VDropdownItem @click="onOpenCreateByParentModal(menuItem)">
|
|
|
|
{{ $t("core.menu.operations.add_sub_menu_item.button") }}
|
|
|
|
</VDropdownItem>
|
|
|
|
<VDropdownItem type="danger" @click="onDelete(menuItem)">
|
|
|
|
{{ $t("core.common.buttons.delete") }}
|
|
|
|
</VDropdownItem>
|
|
|
|
</template>
|
|
|
|
</VEntity>
|
|
|
|
<MenuItemListItem
|
|
|
|
v-model="menuItem.spec.children"
|
|
|
|
class="pl-10 transition-all duration-300"
|
|
|
|
@change="onChange"
|
|
|
|
@delete="onDelete"
|
|
|
|
@open-editing="onOpenEditingModal"
|
|
|
|
@open-create-by-parent="onOpenCreateByParentModal"
|
|
|
|
/>
|
|
|
|
</li>
|
|
|
|
</VueDraggable>
|
2022-08-12 08:20:21 +00:00
|
|
|
</template>
|