Commit 38e881c9 authored by 仇晓婷's avatar 仇晓婷

Merge branch 'product' of http://git.mes123.com/zhouyx/mes-ui into product

parents cfed2bdb 438f3eb4
//-------------蓝色-----------
@Theme: rgba(38, 128, 235, 1);
//滚动条颜色
@scrollbar-track-bg-color: rgb(239, 239, 239);
@scrollbar-thumb-bg-color: rgba(38, 128, 235, 0.5);
......
......@@ -87,8 +87,10 @@ export default {
handleChange(date, t) {
if (date.length == 2) {
this.value3 = date;
this.value[this.start] = date[0];
this.value[this.end] = dayjs(date[1]).format("YYYY-MM-DD 23:59:59");
// this.value[this.start] = date[0];
// this.value[this.end] = dayjs(date[1]).format("YYYY-MM-DD 23:59:59");
this.$set(this.value,this.start,date[0])
this.$set(this.value,this.end,dayjs(date[1]).format("YYYY-MM-DD 23:59:59"))
this.$emit("on-change", this.value);
}
this.open = false;
......
......@@ -14,9 +14,17 @@
<table>
<thead>
<tr>
<th v-for="(column, index) in columns" :key="index" :style="tdStyle(column)">
<th
v-for="(column, index) in columns"
:key="index"
:style="tdStyle(column)"
>
<label v-if="column.type === 'selection'">
<Checkbox v-model="all"></Checkbox>
<Checkbox
v-model="checkAll"
@on-change="checked"
:indeterminate="indeterminate"
></Checkbox>
</label>
<label v-else>
{{ renderHeader(column, index) }}
......@@ -40,9 +48,9 @@
<tr
v-for="(item, index) in trs"
:key="item.id"
v-show="show(item)"
class="treetr"
:id="'tr' + index"
v-show="show(item)"
:draggable="drag && !item._drag"
@dragstart="dragstart($event, index, item)"
@drop="dragdrop($event, index, item)"
......@@ -50,6 +58,7 @@
@dragover="dragover($event, index, item)"
@dragleave="dragleave($event, index, item)"
>
<!-- -->
<td
v-for="(column, snum) in columns"
:key="column.key"
......@@ -58,35 +67,32 @@
<!-- 多选 -->
<label
v-if="column.type === 'selection'"
@click="handleCheckClick(item, $event, index)"
@click="rowChecked(item, index, $event)"
>
<Checkbox v-model="item.checked"></Checkbox>
<Checkbox
v-model="item._checked"
:indeterminate="item._indeterminate"
></Checkbox>
</label>
<!-- 图标 -->
<div v-if="column.type === 'icon'">
<i
class="icon-set"
size="small"
@click="RowClick(item, $event, index, action.text)"
v-for="action in column.actions"
:key="action.text"
<Icon v-if="column.type === 'drag'" type="md-more" class="drag" />
<DTSpan v-if="column.type == 'date'" :value="item[column.key]" />
<div v-if="column.type == 'user'">
<User :value="item[column.key]" />
</div>
<div
v-if="
column.type == 'users' &&
item[column.key] &&
item[column.key].length > 0
"
>
<Icon
:type="action.type"
:title="action.text"
:style="action.style"
<User
v-for="li in item[column.key]"
:value="li"
:key="li"
class="ml10"
/>
</i>
</div>
<div v-if="column.type === 'icons'">
<Icon :type="item[column.key]" size="20" />
</div>
<DTSpan v-if="column.type=='date'" :value="item[column.key]"/>
<div v-if="column.type=='user'">
<User :value="item[column.key]"/>
</div>
<div v-if="column.type=='users'&&item[column.key]&&item[column.key].length>0">
<User v-for="li in item[column.key]" :value="li" :key="li" class="ml10"/>
</div>
<state
v-if="column.code"
......@@ -94,17 +100,13 @@
:value="item[column.key]"
/>
<!-- 树图标 -->
<span @click="toggle(index, item)" v-if="snum == iconRow()">
<span v-html="item.spaceHtml"></span>
<a v-if="item.children && item.children.length > 0">
<i
class="ivu-icon"
:class="{
'ivu-icon-ios-arrow-forward': !item.expanded,
'ivu-icon-ios-arrow-down': item.expanded,
}"
></i> </a
><i v-else class="ms-tree-space"></i>
<span @click="toggle(index, item)" v-if="snum == treeColumn()">
<span class="ib" v-width="spaceWidth * item._level"></span>
<a v-if="item._count > 0" class="expand"
><Icon :type="!item._expanded ? 'ios-add' : 'ios-remove'" /> </a
><i v-else class="ms-tree-space"></i> {{ item._level }}v{{
item._count
}}:{{ show(item) }}
</span>
<!-- 菜单名称、排序、请求地址 -->
<label
......@@ -115,7 +117,7 @@
{{ renderBody(item, column) }}
</label>
<table-expand
v-if="column.render && !column.type&&!column.solt"
v-if="column.render && !column.type && !column.solt"
:row="item"
:column="column"
:index="snum"
......@@ -159,7 +161,7 @@ export default {
level: {
//展开层级
type: Number,
default: 0,
default: 1,
},
query: {
//参数
......@@ -184,21 +186,22 @@ export default {
return [];
},
},
rowKey: {
keyname: {
//默认行主键
type: [String],
default: "id",
},
upname: {
// 父级字段名称
type: String,
default: "upId",
},
root: {
// 根级UpId的值.
type: [String, Number],
default: 0,
},
parent: {
// 父级字段名称
type: String,
default: "upId",
},
iconName: false,
drag: {
//拖拽
......@@ -219,7 +222,7 @@ export default {
data() {
return {
color: "#19be6b",
all: true,
checkAll: false,
logs: [],
trs: [], // 处理后数据数组
cloneColumns: [], // 处理后的表头数据
......@@ -231,13 +234,18 @@ export default {
dragIndex: -1, //拖拽开始的序号
};
},
computed: {},
computed: {
indeterminate() {
var checkeds=this.trs.filter(u=>{
return u._checked;
}).length;
return 0<checkeds && checkeds<this.trs.length;
},
},
watch: {
items() {
if (this.items) {
this.trs = [];
this.dataLength = this.Length(this.items);
this.initData(this.deepCopy(this.items), 1, null);
this.trs = this.treeToList(this.items);
this.checkGroup = this.renderCheck(this.items);
if (this.checkGroup.length == this.dataLength) {
this.checks = true;
......@@ -246,6 +254,7 @@ export default {
}
}
},
data(v) {},
columns: {
handler() {
this.cloneColumns = this.makeColumns();
......@@ -258,8 +267,7 @@ export default {
},
mounted() {
if (this.items && this.items.length > 0) {
this.dataLength = this.Length(this.items);
this.initData(this.deepCopy(this.items), 1, null);
this.trs = this.treeToList(this.items);
this.cloneColumns = this.makeColumns();
this.checkGroup = this.renderCheck(this.items);
if (this.checkGroup.length == this.dataLength) {
......@@ -268,10 +276,8 @@ export default {
this.checks = false;
}
}
//this.initData();
},
methods: {
initData() {},
slots() {
return this.$scopedSlots;
},
......@@ -288,21 +294,18 @@ export default {
} else if (this.dragIndex < index) {
tr.className += " sort";
}
// console.warn("进入",e, e.clientY,tr.clientTop, tr.className);
},
// 悬浮
dragover(e, index, row) {
// console.warn("悬浮",e)
e.preventDefault();
// 鼠标Y
var my = e.offsetY;
var h = e.toElement.clientHeight;
var tr = document.getElementById("tr" + index);
if (this.dragIndex > index && my/h<0.5) {
if (this.dragIndex > index && my / h < 0.5) {
tr.className = tr.className.replace(" move", " sort");
}
if (this.dragIndex < index && my/h>0.5) {
if (this.dragIndex < index && my / h > 0.5) {
tr.className = tr.className.replace(" sort", " move");
}
},
......@@ -319,14 +322,13 @@ export default {
if (index != this.dragIndex) {
this.$emit("on-drag-drop", this.dragIndex, index, this.trs, e);
}
console.log(e.offsetY/ e.toElement.clientHeight);
},
/**
* @dragover="dragover($event, index, item)"
@dragleave="dragleave($event,index,item)"
*/
// 有无多选框折叠位置优化
iconRow() {
treeColumn() {
var num = 0;
for (let i = 0, len = this.columns.length; i < len; i++) {
if (this.columns[i].tree) {
......@@ -347,7 +349,6 @@ export default {
}
return style;
},
// 排序事件
handleSort(index, type) {
this.cloneColumns.forEach((col) => (col._sortType = "normal"));
......@@ -364,50 +365,12 @@ export default {
},
// 点击某一行事件
RowClick(data, event, index, text) {
// this.iconName = true;
const result = this.makeData(data);
this.$emit("on-row-click", result, event, index, text);
this.$emit("on-row-click", data, event, index, text);
},
//点击图标
RowClickIcon(event, index, text) {
this.$emit("on-icon-click", event, index, text);
},
// 点击事件 返回数据处理
makeData(data) {
const t = this.type(data);
let o;
if (t === "array") {
o = [];
} else if (t === "object") {
o = {};
} else {
return data;
}
if (t === "array") {
for (let i = 0; i < data.length; i++) {
o.push(this.makeData(data[i]));
}
} else if (t === "object") {
for (const i in data) {
if (
i != "spaceHtml" &&
i != "parent" &&
i != "level" &&
i != "expanded" &&
i != "isShow" &&
i != "load"
) {
o[i] = this.makeData(data[i]);
}
}
}
return o;
},
// 处理表头数据
makeColumns() {
const columns = this.deepCopy(this.columns);
const columns = this.$u.clone(this.columns);
this.tdsWidth = 0;
columns.forEach((column, index) => {
column._index = index;
......@@ -417,82 +380,43 @@ export default {
});
return columns;
},
// 数据处理 增加自定义属性监听
initData(items, level, parent) {
// this.trs = []
let spaceHtml = "";
for (let i = 1; i < level; i++) {
spaceHtml += "<i class='ms-tree-space'></i>";
}
items.forEach((item, index) => {
item = Object.assign({}, item, {
parent,
level,
spaceHtml,
});
if (typeof item.expanded === "undefined") {
item = Object.assign({}, item, {
expanded: true,
});
}
if (typeof item.show === "undefined") {
item = Object.assign({}, item, {
isShow: true,
});
}
if (typeof item.isChecked === "undefined") {
item = Object.assign({}, item, {
isChecked: false,
});
// // 隐藏显示
toggle(index, item) {
if (item._count > 0) {
this.$set(this.trs[index], "_expanded", !item._expanded);
this.trs.forEach((u, i) => {
if (u[this.upname] === item.id) {
this.$set(this.trs[i], "_show", !item._expanded);
}
item = Object.assign({}, item, {
load: !!item.expanded,
});
this.trs.push(item);
if (item.children && item.expanded) {
this.initData(item.children, level + 1, item);
}
items.splice(index, 1, item);
});
console.warn(index, item._expanded, item);
},
// 隐藏显示
show(item) {
if (item._level == 0) {
return true;
} else {
var parents = this.getRoots(item);
return (
item.level == 1 || (item.parent && item.parent.expanded && item.isShow)
parents.filter((u) => {
return !u._expanded;
}).length == 0
);
},
toggle(index, item) {
const level = item.level + 1;
let spaceHtml = "";
for (let i = 1; i < level; i++) {
spaceHtml += "<i class='ms-tree-space'></i>";
}
if (item.children) {
if (item.expanded) {
item.expanded = !item.expanded;
this.close(index, item);
} else {
item.expanded = !item.expanded;
if (item.load) {
this.open(index, item);
} else {
item.load = true;
item.children.forEach((child, childIndex) => {
this.trs.splice(index + childIndex + 1, 0, child);
// 设置监听属性
this.$set(this.trs[index + childIndex + 1], "parent", item);
this.$set(this.trs[index + childIndex + 1], "level", level);
this.$set(
this.trs[index + childIndex + 1],
"spaceHtml",
spaceHtml
);
this.$set(this.trs[index + childIndex + 1], "isShow", true);
this.$set(this.trs[index + childIndex + 1], "expanded", false);
},
getRoots(item) {
var parents = [];
var root = this.trs.filter((u) => {
return u[this.keyname] == item[this.upname];
});
while (root.length == 1) {
parents.push(root[0]);
root = this.trs.filter((u) => {
return u[this.keyname] === root[0][this.upname];
});
}
}
}
return parents;
},
open(index, item) {
if (item.children) {
......@@ -516,39 +440,39 @@ export default {
}
},
// 点击check勾选框,判断是否有children节点 如果有就一并勾选
handleCheckClick(data, event, index) {
data.isChecked = !data.isChecked;
const arr = data.children;
if (arr) {
if (data.isChecked) {
this.checkGroup.push(data.id);
for (let i = 0; i < arr.length; i++) {
this.checkGroup.push(arr[i].id);
}
} else {
for (let i = 0; i < this.checkGroup.length; i++) {
if (this.checkGroup[i] == data.id) {
this.checkGroup.splice(i, 1);
}
for (let j = 0; j < arr.length; j++) {
if (this.checkGroup[i] == arr[j].id) {
this.checkGroup.splice(i, 1);
}
}
rowChecked(data, index, event) {
var boys = this.getChildrens(data);
this.trs.forEach((u, i) => {
var items = boys.filter((b) => {
return b[this.keyname] == u[this.keyname];
});
if (items.length == 1) {
this.$set(this.trs[i], "_checked", !data._checked);
}
});
this.checkAll= this.trs.length>this.trs.filter(u=>{
return !u._checked;
}).length
},
getChildrens(data) {
var childrens = [];
var that=this;
getChildren(data);
function getChildren(f) {
that.trs.forEach(u=>{
if(u[that.upname]==f[that.keyname]){
childrens.push(u);
getChildren(u);
}
})
}
return childrens;
},
// checkbox 全选 选择事件
handleCheckAll() {
this.checks = !this.checks;
if (this.checks) {
this.checkGroup = this.getArray(
this.checkGroup.concat(this.All(this.items))
);
} else {
this.checkGroup = [];
}
checked(v) {
this.trs.forEach((u, i) => {
this.$set(this.trs[i], "_checked", v);
});
// this.$emit('on-selection-change', this.checkGroup)
},
// 数组去重
......@@ -582,16 +506,7 @@ export default {
});
return arr;
},
// 返回树形数据长度
Length(data) {
let { length } = data;
data.forEach((child) => {
if (child.children) {
length += this.Length(child.children);
}
});
return length;
},
// 返回表头
renderHeader(column, $index) {
if ("renderHeader" in this.columns[$index]) {
......@@ -599,6 +514,30 @@ export default {
}
return column.title || "#";
},
treeToList(tree) {
var that = this;
let list = [];
function treeToList(data, level) {
data.map((u) => {
let copy = that.$u.clone(u);
copy._count = 0;
copy._level = level;
copy._expanded = copy._expanded || that.level>level;
copy._show = true;
copy._indeterminate = false;
copy._checked = copy._checked || false;
list.push(copy);
if (u.children) {
treeToList(u.children, level + 1);
copy._count = u.children.length;
delete copy.children;
}
});
}
treeToList(tree, 0);
return list;
},
// 返回内容
renderBody(row, column, index) {
......@@ -617,57 +556,16 @@ export default {
});
return arr;
},
// 深度拷贝函数
deepCopy(data) {
const t = this.type(data);
let o;
let i;
let ni;
if (t === "array") {
o = [];
} else if (t === "object") {
o = {};
} else {
return data;
}
if (t === "array") {
for (i = 0, ni = data.length; i < ni; i++) {
o.push(this.deepCopy(data[i]));
}
return o;
}
if (t === "object") {
for (i in data) {
o[i] = this.deepCopy(data[i]);
}
return o;
}
},
type(obj) {
const { toString } = Object.prototype;
const map = {
"[object Boolean]": "boolean",
"[object Number]": "number",
"[object String]": "string",
"[object Function]": "function",
"[object Array]": "array",
"[object Date]": "date",
"[object RegExp]": "regExp",
"[object Undefined]": "undefined",
"[object Null]": "null",
"[object Object]": "object",
};
return map[toString.call(obj)];
},
},
beforeDestroy() {
window.onresize = null;
},
};
</script>
<style lang="less">
@import "../../../assets/css/custom.less";
@table_theme: #2680eb;
@table_head: #e9f2fd;
@table_line_height: 50px;
@table_hover: #f2f8fe;
@table_border: #accef7;
.treeTbale {
overflow: 0 auto;
width: 100% !important;
......@@ -701,27 +599,56 @@ export default {
border-collapse: collapse;
margin: 0 auto;
width: 100%;
border: 1px solid @table_border;
th {
background: #f8f8f9;
background: @table_head;
}
td,
th {
border: #dcdee2 solid 1px;
line-height: 40px;
border-left: @table_border solid 1px;
border-right: @table_border solid 1px;
border-bottom: #e8e9eb solid 1px;
line-height: 50px;
padding: 0 5px;
.drag:hover {
cursor: move;
}
.expand {
width: 18px;
height: 18px;
border: 1px solid @table_border;
text-align: center;
padding: 0 1px;
font-size: 14px;
font-weight: bold;
}
.expand:hover {
background: @table_theme;
color: white;
}
.ib {
display: inline-block;
}
}
th {
border-top: @table_border solid 1px;
}
tr.treetr:hover td {
background: #f7f7f7;
background: @table_hover;
}
tr.move {
td {
background-color: blue;
background-color: #d3e6fb;
}
}
tr.sort {
td {
border-top: 2px solid blue;
border-top: 2px solid #3b8ded;
}
}
tbody {
border-bottom: @table_border solid 1px;
}
.ms-tree-space {
position: relative;
......
<template>
<Poptip placement="bottom-start" trigger="hover" width="240" transfer>
<label :class="css">{{ user.name }}</label>
<label v-if="mode=='text'" :class="css">{{ user.name }}</label>
<Avatar v-else :style="{background:user.gender=='男'?'#1479D7':'red'}"
:icon="user.gender=='男'?'md-person':'md-woman'" shape="square" :src="img">{{user.name}}</Avatar>
<div slot="content">
<Avatar v-if="user.face" size="large" :src="img"></Avatar>
<Avatar
......@@ -31,6 +33,13 @@ export default {
type: [Number, String],
default: 0,
},
mode:{
type:String,
default:"text",
validator:(v)=>{
return ["text","face"].indexOf(v)>-1
}
}
},
data() {
return {
......
......@@ -2042,6 +2042,8 @@ document_category: {
startDate: '开始日期',
endDate: '结束日期',
businessUnits: '业务单位',
date: '计划日期',
users: '成员',
},
//项目任务
project_task: {
......
......@@ -2,30 +2,48 @@ import XLSX from 'xlsx';
import Api from '@/plugins/request'
let henq = {};
let pdfInfo = ''
henq.clone = (obj) => {
henq.clone = (data)=> {
var that = henq
var o
if (typeof obj === 'object') {
if (obj === null) {
o = null
const t = that.type(data);
let o;
let i;
let ni;
if (t === "array") {
o = [];
} else if (t === "object") {
o = {};
} else {
if (obj instanceof Array) {
o = []
for (var i = 0, len = obj.length; i < len; i++) {
o.push(that.clone(obj[i]))
return data;
}
} else {
o = {}
for (var j in obj) {
o[j] = that.clone(obj[j])
if (t === "array") {
for (i = 0, ni = data.length; i < ni; i++) {
o.push(that.clone(data[i]));
}
return o;
}
if (t === "object") {
for (i in data) {
o[i] = that.clone(data[i]);
}
} else {
o = obj
return o;
}
return o
}
henq.type=(obj) =>{
const { toString } = Object.prototype;
const map = {
"[object Boolean]": "boolean",
"[object Number]": "number",
"[object String]": "string",
"[object Function]": "function",
"[object Array]": "array",
"[object Date]": "date",
"[object RegExp]": "regExp",
"[object Undefined]": "undefined",
"[object Null]": "null",
"[object Object]": "object",
};
return map[toString.call(obj)];
},
henq.merge = () => {
Object.assign(argments)
}
......
......@@ -134,32 +134,6 @@ export default {
fanlist: [],
feilist: [],
titleCode: '', //送审单号
problemList: [{
problem: "问题描述01",
id: 1
},
{
problem: "问题描述02",
id: 2
},
{
problem: "问题描述03",
id: 3
}
],
blameList: [{
user: "责任人01",
id: 1
},
{
user: "责任人02",
id: 2
},
{
user: "责任人03",
id: 3
}
]
};
},
created() {
......
<template>
<div>
<Card>
<EditGrid :columns="columns" ref="grid" :items="list">
<EditGrid :columns="columns" ref="grid" :items="list" :level="8" :drag="true" >
<template slot="easySearch"
><Form ref="formInline" :model="easySearch" inline
><FormItem prop="keys"
......@@ -86,6 +86,26 @@ export default {
// { key:"projectId",title:this.l("projectId") ,align:"left" ,high:true },
// { key:"upId",title:this.l("upId") ,align:"left" ,high:true },
// { type: "selection", width: 80, align: "center" },
{
key:"drag",
type:"drag",
width:50,
align:'center'
},
{
key: "upId",
width: 50,
type:"selection",
align:'center'
},
{
key: "title",
title: this.l("title"),
align: "left",
tree: true,
easy: true,
high: true,
},
{
key: "type",
width: 90,
......@@ -106,14 +126,7 @@ export default {
easy: true,
high: true,
},
{
key: "title",
title: this.l("title"),
align: "left",
tree: true,
easy: true,
high: true,
},
{
key: "status",
title: this.l("status"),
......
......@@ -3,17 +3,18 @@
<div class="top-title">
<div class="new-detail row-left">
<Row>
<Filed :span="12" :name="l('title') + ':'">{{ entity.title }}</Filed>
<Filed :span="12" :name="l('state') + ':'">
<Filed :span="6" :name="l('title') + ':'">{{ entity.title }}</Filed>
<Filed :span="6" :name="l('state') + ':'">
<state code="project.main.state" :value="entity.state" />
</Filed>
<!-- <Filed :span="12" :name="l('phase')">{{ entity.phase }}</Filed> -->
<Filed :span="12" :name="l('startDate') + ':'">{{
entity.startDate
}}</Filed>
<Filed :span="12" :name="l('endDate') + ':'">{{
entity.endDate
}}</Filed>
<Filed :span="12" :name="l('date') + ':'">
<DateRange v-model="entity"/>
</Filed>
<Filed :span="24" :name="l('users')+ ':'">
<User :value="1" mode="face"/>
<a><Avatar icon="md-add" size="24" /></a>
</Filed>
</Row>
</div>
<ul>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment