hberp/hb_client/src/views/pm/components/leftMenu.vue

397 lines
9.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="tableMneu">
<div
class="mask"
v-if="isShowHeaderBox || menuOpen"
@click="maskClick"
></div>
<el-table
ref="tableMenu"
:data="tableData"
border
fit
style="width: 100%"
row-key="id"
height="100%"
default-expand-all
highlight-current-row
@row-click="handlerRowClick"
@expand-change="handlerExpand"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<el-table-column
v-for="col in columns"
:prop="col.prop"
:key="col.prop"
:label="col.label"
:align="col.align"
:resizable="col.resizable"
>
<template slot-scope="scope">
<span v-if="col.prop == 'type'">{{
projectType[scope.row.type]
}}</span>
<span v-else>{{ scope.row[col.prop] }}</span>
</template>
</el-table-column>
</el-table>
<el-collapse-transition>
</el-collapse-transition>
<transition name="el-zoom-in-top">
<div class="menulist" v-show="menuOpen" ref="menulist">
<div
class="item"
v-for="(item, index) in menuLists"
@click="handleMenuClick(index, item)"
:key="item + index"
>
{{ item }}
</div>
</div>
</transition>
</div>
</template>
<script>
export default {
props: {
list: Array,
BGScrollTop: Number
},
computed: {
tableData() {
return this.list;
}
},
watch: {
BGScrollTop: {
handler: function(newValue) {
let table = this.$refs.tableMenu.bodyWrapper;
// console.log(newValue, table);
table.scrollTo(0, newValue);
// table.scrollTo({
// top: newValue,
// left: 0,
// behavior: "smooth"
// });
}
}
},
data() {
return {
// tableData: [],
checkList: [],
isShowHeaderBox: false,
menuOpen: false,
headerList: {
name: true,
ower: true,
per: true,
type: true
},
projectType: {
1: "计划项目",
2: "里程碑",
3: "分组"
},
menuLists: ["编辑", "里程碑", "分组", "删除"],
columns: [
{
prop: "name",
label: "名称",
width: "200px",
resizable: false
},
{
prop: "ower",
label: "负责人",
align: "center",
resizable: false
},
{
prop: "per",
label: "进度",
align: "center",
resizable: false
},
{
prop: "type",
label: "项目类型",
align: "center",
resizable: false
}
],
columnsCopy: [
{
prop: "name",
label: "名称",
width: "200px",
resizable: false
},
{
prop: "ower",
label: "负责人",
align: "center",
resizable: false
},
{
prop: "per",
label: "进度",
align: "center",
resizable: false
},
{
prop: "type",
label: "项目类型",
align: "center",
resizable: false
}
],
//当前点击的row
currentRow: {}
};
},
methods: {
handlerWatchScroll() {
let table = this.$refs.tableMenu.bodyWrapper;
table.addEventListener("scroll", e => {
// console.log(e.srcElement.scrollTop);
this.$emit("TableScrollTop", e.srcElement.scrollTop);
});
},
handlerSelect(row) {
this.$refs.tableMenu.setCurrentRow(row);
},
handlerExpand(row, expand) {
// console.log(row, expanded);
this.$emit("handlerExpand", row, expand);
},
handlerSave() {
this.isShowHeaderBox = false;
let arr = [];
this.columnsCopy.forEach(item => {
if (this.headerList[item.prop] == true) {
arr.push(item);
}
});
this.columns = arr;
},
maskClick() {
this.isShowHeaderBox = false;
this.menuOpen = false;
this.currentRow = {};
},
handlerRowClick(row, column) {
// console.log(column);
if (row.type != 3) {
this.$emit("handlerRowClick", row);
}
},
handleRowMore(row, e) {
this.menuLists = ["编辑", "里程碑", "分组", "删除"];
if (row.parentId) {
this.menuLists = ["编辑", "里程碑", "删除"];
}
if (row.type == "1") {
this.menuLists[1] = "里程碑";
} else if (row.type == "2") {
this.menuLists[1] = "计划项目";
} else if (row.type == "3") {
this.menuLists = ["编辑", "添加任务", "删除分组"];
}
this.menuOpen = true;
this.currentRow = row;
let s = this.$refs.menulist.style;
s.top = e.y - 10 - 40 + "px";
s.left = e.x + 20 + "px";
},
handleShowHeaderCheckBox() {
this.isShowHeaderBox = !this.isShowHeaderBox;
},
handleMenuClick(index, name) {
this.menuOpen = false;
if (index == 3) {
this.$confirm("此操作将永久删除该项目, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
center: true
})
.then(() => {
this.$emit("handlerDel", this.currentRow);
})
.catch(() => {});
} else if (index == 1) {
if (this.currentRow.type == 3) {
console.log("添加任务");
this.$emit("handleGroupAdd", this.currentRow);
return;
}
this.$confirm(`确定转为${this.menuLists[1]}`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info",
center: true
})
.then(() => {
if (this.currentRow.type == "1") {
this.$emit("milestone", this.currentRow);
} else if (this.currentRow.type == "2") {
this.$emit("planProject", this.currentRow);
}
})
.catch(() => {});
} else if (index == 0) {
this.$emit("handlerEdit", this.currentRow);
} else if (index == 2) {
console.log(name);
if (this.currentRow.type == 3 && name == "删除分组") {
this.$confirm("此操作将永久删除该分组及其子项目, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
center: true
})
.then(() => {
this.$emit("handlerDel", this.currentRow);
})
.catch(() => {});
return;
}
if (name == "删除") {
this.$confirm("此操作将永久删除该项目, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
center: true
})
.then(() => {
this.$emit("handlerDel", this.currentRow);
})
.catch(() => {});
return;
}
this.$confirm(`确定转为分组`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info",
center: true
})
.then(() => {
this.$emit("handlerGroup", this.currentRow);
})
.catch(() => {});
}
}
},
mounted() {
this.handlerWatchScroll();
}
};
</script>
<style lang="scss" scoped>
.tableMneu {
width: 100%;
position: relative;
height: 100%;
.mask {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: transparent;
z-index: 9999;
}
.icons {
cursor: pointer;
&:hover {
color: #409eff;
}
}
.menulist {
width: 100px;
position: absolute;
background-color: rgb(255, 255, 255);
border-radius: 5px;
border: 1px solid #ebeef5;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
transition: 0.3s;
width: 70px;
z-index: 9999;
.item {
background-color: rgb(255, 255, 255);
line-height: 30px;
text-align: center;
font-size: 12px;
color: rgb(102, 102, 102);
cursor: pointer;
height: 30px;
}
.item:hover {
color: #409eff;
}
}
.headerBox {
z-index: 9999;
position: absolute;
right: -128px;
top: 50px;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
width: 170px;
background-color: #fff;
&::after {
content: " ";
position: absolute;
top: -5px;
left: 16px;
width: 0;
height: 0;
border-right: 7px solid transparent;
border-left: 7px solid transparent;
border-bottom: 7px solid #fff;
}
.title {
margin: 0;
padding: 8px 16px;
min-height: 32px;
border-bottom: 1px solid #e9e9e9;
color: #303030;
font-weight: 500;
}
.main {
.line {
padding: 8px 10px;
display: flex;
flex-direction: row;
align-items: center;
width: 150px;
.pre {
flex: 1 1 auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
}
</style>
<style lang="scss" >
.tableMneu {
.el-table th.gutter {
display: table-cell !important;
}
.el-table td,
.el-table th {
padding: 8px 0;
}
.el-table--border td {
border-right: none;
}
}
</style>