2024-08-12 02:18:11 +00:00
|
|
|
<template>
|
|
|
|
|
<VueDraggable v-model="from" :animation="500" target=".sort-target" handle=".icon-drag" :scroll="true" :on-sort="on_sort">
|
|
|
|
|
<TransitionGroup type="transition" tag="ul" name="fade" class="sort-target flex-col gap-x-20">
|
2024-09-18 07:40:56 +00:00
|
|
|
<li v-for="(item, index) in from" :key="index" :class="className" class="flex gap-y-16 re" @click="on_click(item, index)">
|
2024-10-16 07:12:57 +00:00
|
|
|
<icon name="drag" size="16" class="cursor-move" />
|
2024-08-12 02:18:11 +00:00
|
|
|
<slot :row="item" :index="index" />
|
2024-10-16 07:12:57 +00:00
|
|
|
<icon v-if="type == 'card'" name="close-fillup" class="abs c-pointer cr-c top-de-5 right-de-5" size="18" color="6" @click="remove(index)" />
|
|
|
|
|
<icon v-if="type == 'line'" name="delete-o" class="c-pointer do-not-trigger" size="18" color="6" @click="remove(index)" />
|
2024-10-15 09:32:51 +00:00
|
|
|
<el-dropdown v-if="isShowEdit" placement="bottom">
|
2024-10-16 06:54:11 +00:00
|
|
|
<icon name="more-o" size="18" class="icon-edit-o" color="primary"></icon>
|
2024-10-15 09:32:51 +00:00
|
|
|
<template #dropdown>
|
|
|
|
|
<el-dropdown-menu>
|
|
|
|
|
<el-dropdown-item @click.stop="edit(index)">编辑</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item @click.stop="replace(index)">替换</el-dropdown-item>
|
|
|
|
|
</el-dropdown-menu>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dropdown>
|
2024-08-12 02:18:11 +00:00
|
|
|
</li>
|
|
|
|
|
</TransitionGroup>
|
|
|
|
|
</VueDraggable>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { VueDraggable } from 'vue-draggable-plus';
|
2024-10-15 09:32:51 +00:00
|
|
|
const emits = defineEmits(['click', 'remove', 'edit', 'onSort', 'replace']);
|
2024-08-12 02:18:11 +00:00
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
|
data: any; // 拖拽列表数据
|
|
|
|
|
type?: string; // card: 卡片区域 line: 一行
|
|
|
|
|
spaceCol?: number; // 上下间距
|
|
|
|
|
iconPosition?: string; // top/bottom/center
|
2024-08-21 08:28:19 +00:00
|
|
|
isShowEdit?: boolean;
|
2024-08-12 02:18:11 +00:00
|
|
|
}
|
|
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
|
|
|
|
type: () => 'line',
|
2024-08-21 08:28:19 +00:00
|
|
|
isShowEdit: false,
|
2024-08-12 02:18:11 +00:00
|
|
|
spaceCol: () => 5,
|
|
|
|
|
iconPosition: 'center',
|
|
|
|
|
});
|
|
|
|
|
const className = ref('');
|
|
|
|
|
if (props.type == 'card') {
|
|
|
|
|
className.value += `card-background box-shadow-sm pt-${props.spaceCol} pb-${props.spaceCol}`;
|
|
|
|
|
if (props.iconPosition == 'top') {
|
|
|
|
|
className.value += '';
|
|
|
|
|
} else if (props.iconPosition == 'bottom') {
|
|
|
|
|
className.value += ' align-e';
|
|
|
|
|
} else {
|
|
|
|
|
className.value += ' align-c';
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 不是卡片类型的设置居中显示
|
|
|
|
|
className.value = 'align-c';
|
|
|
|
|
}
|
2024-08-22 03:49:41 +00:00
|
|
|
watch(
|
|
|
|
|
() => props.data,
|
|
|
|
|
() => {
|
|
|
|
|
from.value = props.data;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
const from = ref(props.data);
|
2024-08-21 10:39:14 +00:00
|
|
|
|
2024-08-12 02:18:11 +00:00
|
|
|
const on_click = (item: any, index: number) => {
|
|
|
|
|
emits('click', item, index);
|
|
|
|
|
};
|
|
|
|
|
|
2024-10-15 09:32:51 +00:00
|
|
|
// 删除
|
2024-08-12 02:18:11 +00:00
|
|
|
const remove = (index: number) => {
|
|
|
|
|
emits('remove', index);
|
|
|
|
|
};
|
2024-10-15 09:32:51 +00:00
|
|
|
// 编辑
|
2024-08-21 08:28:19 +00:00
|
|
|
const edit = (index: number) => {
|
|
|
|
|
emits('edit', index);
|
|
|
|
|
};
|
2024-10-15 09:32:51 +00:00
|
|
|
// 替换
|
|
|
|
|
const replace = (index: number) => {
|
|
|
|
|
emits('replace', index);
|
|
|
|
|
};
|
2024-08-12 02:18:11 +00:00
|
|
|
// 拖拽更新之后用户更新数据
|
|
|
|
|
const on_sort = () => {
|
2024-08-22 03:49:41 +00:00
|
|
|
emits('onSort', from.value);
|
2024-08-12 02:18:11 +00:00
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
<style scoped>
|
|
|
|
|
.card-background {
|
|
|
|
|
background: #fff;
|
|
|
|
|
padding-left: 1.6rem;
|
|
|
|
|
padding-right: 2rem;
|
|
|
|
|
}
|
|
|
|
|
.size-16 {
|
|
|
|
|
font-size: 1.6rem !important;
|
|
|
|
|
}
|
2024-08-22 03:49:41 +00:00
|
|
|
.icon-del-o,
|
2024-10-16 02:52:32 +00:00
|
|
|
.icon-edit-o {
|
2024-08-12 02:18:11 +00:00
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
.cursor-move {
|
|
|
|
|
color: #ddd;
|
|
|
|
|
cursor: move;
|
|
|
|
|
}
|
|
|
|
|
</style>
|