this.scroller = ref} className="kanban-scroller" >
+
this.container = ref} className="kanban-container" style={{ minWidth: (React.Children.count(this.props.children) + 1) * 320 }}>
+ {
+ React.Children.map(this.props.children, child => {
+ return child.toString() === '[object Object]' ? React.Children.map(child, c => {
+ return React.cloneElement(c, { root: this, scroller: this.scroller })
+ }) : React.cloneElement(child, { root: this, scroller: this.scroller })
+ })
+ }
+
this.place = ref} />
+
this.itemPlace = ref} />
+ {this.props.addAction}
+
+
+ );
+ }
+}
\ No newline at end of file
diff --git a/pc4mobx/prj/components/kanban/style/index.less b/pc4mobx/prj/components/kanban/style/index.less
new file mode 100644
index 0000000..1178513
--- /dev/null
+++ b/pc4mobx/prj/components/kanban/style/index.less
@@ -0,0 +1,556 @@
+.kanban-scroller {
+ width: 100%;
+ height: calc(100% - 10px);
+ overflow-x: auto;
+ a{
+ display: inline-block;
+ }
+ .kanban-container {
+ height: 100%;
+ background: white;
+
+ .addNewStage {
+ width: 300px;
+ height: 52px;
+ line-height: 52px;
+ border-radius: 8px;
+ background: rgba(77,77,77,.5);
+ color: #fff;
+ font-size: 14px;
+ cursor: pointer;
+ margin: 10px;
+ box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
+ }
+
+ .addNewStage:not(.Hidden) {
+ display: inline-block
+ }
+
+ .addNewStage i {
+ width: 32px;
+ height: 32px;
+ line-height: 32px;
+ display: inline-block;
+ text-align: center;
+ vertical-align: top;
+ margin: 10px 10px 0;
+ background: transparent;
+ border-radius: 8px;
+ font-weight: bold;
+ }
+
+ .addNewStage:hover {
+ background: rgba(77,77,77,.75)
+ }
+
+ .addNewStage:hover i {
+ color: #9e9e9e;
+ background: #fff
+ }
+ .kanban-group-place {
+ border: 0px dashed #1890ff;
+ display: none;
+ margin: 10px;
+ line-height: 1.5;
+ padding: 0;
+ border-radius: 2px;
+ vertical-align: top;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 10px;
+ }
+ .kanban-group-item-place {
+ border: 0px dashed #1890ff;
+ display: none;
+ line-height: 1.5;
+ padding: 0;
+ border-radius: 2px;
+ vertical-align: top;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .kanban-group {
+ height: e("calc(100% - 20px)");
+ width: 300px;
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.5;
+ color: rgba(0, 0, 0, .65);
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 10px;
+ padding: 0;
+ list-style: none;
+ background: #eef0f4;
+ border-radius: 8px;
+ position: relative;
+ vertical-align: top;
+ box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
+ &.moving {
+ box-shadow: 0 6px 100px 0 rgba(0, 0, 0, .35)
+ }
+ .kanban-group-head {
+ background: #eef0f4;
+ border-bottom: 1px solid #e8e8e8;
+ padding: 0 24px;
+ border-radius: 8px;
+ zoom: 1;
+ margin-bottom: -1px;
+ min-height: 48px;
+ .kanban-group-head-wrapper {
+ cursor: pointer;
+ .kanban-group-head-title {
+ font-size: 15px;
+ padding: 16px 0;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ color: rgba(0, 0, 0, .85);
+ font-weight: 500;
+ display: inline-block;
+ }
+ .kanban-group-head-extra {
+ float: right;
+ padding: 17.5px 0;
+ text-align: right;
+ margin-left: auto;
+ }
+ input{
+ width: 250px;
+ height: 44px;
+ margin: -12px 10px -2px 0px;
+ padding: 0 13px;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: 3px;
+ font-size: 15px;
+ color: #333;
+ line-height: 1.5;
+ }
+ }
+
+ }
+ .kanban-group-body {
+ zoom: 1;
+ overflow-y: auto;
+ width: 100%;
+ .kanban-group-item-place{
+ transition: all 1s;
+ }
+ .kanban-item {
+
+ border-bottom: 1px solid #e8e8e8;
+ margin: 0 5px 5px 5px;
+ box-shadow: 0 1px 3px rgba(0,0,0,.2);
+ background-color: white;
+ border-radius: 8px;
+ position: relative;
+ cursor: pointer;
+ overflow: hidden;
+ &:not(.moving){
+ transition: all 1s;
+ }
+ :hover{
+ background-color: rgb(226, 226, 226);
+ .kanban-item-icon{
+ color:white;
+ }
+ .kanban-item-landmark{
+ color:white;
+ }
+ }
+ &.moving {
+ box-shadow: 0 6px 100px 0 rgba(0, 0, 0, .35)
+ }
+ .kanban-item-extra-wrapper{
+ padding: 8px 24px;
+ }
+ .kanban-item-extra {
+ width: 58px;
+ display: inline-block;
+ vertical-align: top;
+ }
+ .kanban-item-landmark{
+ width: 24px;
+ height: 24px;
+ border-radius: 100%;
+ // background-color: #e9e9e9;
+ float: right;
+ vertical-align: top;
+ margin-left: 8px;
+ font-size: 24px;
+ color: #e9e9e9;
+ position: relative;
+ top: -23px;
+ }
+ .kanban-item-manager{
+ width: 24px;
+ height: 24px;
+ border-radius: 100%;
+ background-color: #e9e9e9;
+ float: right;
+ vertical-align: top;
+ position: relative;
+ top: -23px;
+ margin-left: 8px;
+ margin-bottom: 5px;
+ .kanban-item-manager-img{
+ width: 24px;
+ height: 24px;
+ border-radius: 100%;
+ }
+ }
+ .kanban-item-icon{
+ width: 24px;
+ height: 24px;
+ border-radius: 100%;
+ /* background-color: #e9e9e9; */
+ float: right;
+ vertical-align: top;
+ position: relative;
+ top: -23px;
+ margin-left: 8px;
+ font-size: 23px;
+ color: #e9e9e9;
+ }
+ .kanban-item-finish{
+ left: 0px;
+ position: absolute;
+ width: 4px;
+ background-color: gray;
+ height: 110%;
+ display: inline-block;
+ // top:8px;
+ margin: auto;
+ .kanban-item-finish-status{
+ width: 100%;
+ bottom: 0px;
+ z-index: 10;
+ position:absolute;
+ left: 0;
+ bottom: 0;
+ }
+ }
+ .kanban-item-main {
+ display: inline-block;
+ width: 100%;
+ .kanban-item-main-meta {
+ margin-bottom: 8px;
+ .kanban-item-main-meta-avatar {
+ margin-right: 16px;
+ }
+ .kanban-item-main-meta-content {
+ display: inline-block;
+ width: 100%;
+ .kanban-item-main-meta-title {
+ color: rgba(0, 0, 0, .85);
+ margin-bottom: 12px;
+ font-size: 13px;
+ line-height: 24px;
+ .title-content{
+ width: 67%;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ height: 24px;
+ }
+ }
+ .kanban-item-main-meta-description {
+ color: rgba(0, 0, 0, .45);
+ font-size: 12px;
+ line-height: 22px;
+ // white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ }
+ }
+ .kanban-item-action {
+ margin-left: 0px;
+ font-size: 0;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ padding: 0;
+ list-style: none;
+ &>li {
+ display: inline-block;
+ color: rgba(0, 0, 0, .45);
+ cursor: pointer;
+ position: relative;
+ font-size: 14px;
+ line-height: 22px;
+ text-align: center;
+ &:not(:first-child) {
+ padding-left: 8px;
+ }
+ padding-right: 8px;
+ }
+ .kanban-item-action-split {
+ background-color: #e8e8e8;
+ margin-top: -7px;
+ position: absolute;
+ top: 50%;
+ right: 0;
+ width: 1px;
+ height: 14px;
+ }
+ }
+ }
+ }
+ }
+
+ .kanban-group-addNewTask{
+ position: relative;
+ padding: 0;
+ background-color: #e4e7ec!important;
+ border-bottom: 1px solid #e8e8e8;
+ margin: 0 5px 5px 5px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+ background-color: white;
+ // border-radius: 8px;
+ position: relative;
+ // cursor: pointer;
+ overflow: hidden;
+ .managericons{
+ position: absolute;
+ top: 7px;
+ right: 35px;
+ display: inline-block;
+ width: 25px;
+ height: 25px;
+ margin-left: 5px;
+ vertical-align: top;
+ cursor: pointer;
+ font-size: 19px;
+ }
+ .kanban-group-manager{
+ position: absolute;
+ top: 10px;
+ right: 19px;
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ margin-left: 5px;
+ cursor: pointer;
+ font-size: 19px;
+ border-radius: 100%;
+ background-color: #e9e9e9;
+ vertical-align: top;
+
+ .kanban-group-manager-img{
+ width: 25px;
+ height: 25px;
+ border-radius: 100%;
+ }
+ }
+ .kanban-group-landmark{
+ position: absolute;
+ top: 55px;
+ right: 27px;
+ margin-left: 5px;
+ cursor: pointer;
+ font-size: 19px;
+ border-radius: 100%;
+ background-color: rgb(233, 233, 233);
+ vertical-align: top;
+
+ span.ant-input{
+ position: static;
+ display: table-footer-group;
+ cursor: pointer;
+ }
+ .wea-rangerpicker {
+ position: static;
+ display: block;
+ width: 0%;
+ }
+ .ant-calendar-picker {
+ position: static;
+ display: block;
+ width: 0%;
+ }
+ .ant-calendar-range-picker-input{
+ display: none;
+ }
+ .ant-calendar-range-picker-separator{
+ display: none;
+ }
+ .ant-calendar-range-picker-input{
+ display: none;
+ }
+ .picker-icon{
+ position: absolute;
+ // -webkit-user-select: none;
+ // -moz-user-select: none;
+ // -ms-user-select: none;
+ user-select: none;
+ // -webkit-transition: all .3s cubic-bezier(.645,.045,.355,1);
+ // -o-transition: all .3s cubic-bezier(.645,.045,.355,1);
+ // transition: all .3s cubic-bezier(.645,.045,.355,1);
+ width: 12px;
+ height: 12px;
+ line-height: 12px;
+ right: 0px;
+ top: 63%;
+ margin-top: -6px;
+ color: #b2b2b2;
+ font-size: 17px;
+ }
+ }
+ }
+ .topBox{
+ border: 1px solid #48a3ce;
+ background-color: #fff;
+ border-radius: 3px
+ }
+ .ThemeBorderColor3 {
+ border-color: #424242!important;
+ }
+
+ .teaStageNameBox {
+ width: 100%;
+ border-right: 65px solid transparent;
+ textarea{
+ border: 0px solid #d9d9d9;
+ resize:none
+ }
+ // height: 50px;
+ .teaStageName{
+ display: block;
+ overflow: hidden;
+ width: 100%;
+ padding-top: 5px;
+ padding-left: 5px;
+ resize: none;
+ border: 0;
+ border-radius: 3px;
+ height: 80px;
+ overflow-y: hidden;
+ }
+ }
+ }
+ .kanban-group-footer{
+ // background-color: #eef0f4;
+ border-radius: 0 0 3px 3px;
+ height: 44px;
+
+ .btnBottomNew{
+ // float: right;
+ background-color: #fff;
+ color: rgb(59, 56, 56);
+ line-height: 32px;
+ display: inline-block;
+ height: 32px;
+ margin: 6px 5px;
+ padding: 0 18px;
+ cursor: pointer;
+ border-radius: 18px;
+ box-shadow: 0 1px 2px rgba(0,0,0,.12);
+ font-size: 12px;
+ // :hover{
+ // color: #fff;
+ // background: #757575;
+ // }
+ }
+ .btnBottomNew:hover {
+ background-color: rgb(59, 56, 56);
+ color: white;
+ }
+ .btnBottomSubmit{
+ float: right;
+ background-color: #fff;
+ color: #3b3838;
+ line-height: 32px;
+ // display: inline-block;
+ height: 32px;
+ margin: 6px 5px;
+ padding: 0 18px;
+ cursor: pointer;
+ border-radius: 18px;
+ box-shadow: 0 1px 2px rgba(0,0,0,.12);
+ font-size: 12px;
+ }
+ .btnBottomSubmit:hover {
+ background-color: rgb(59, 56, 56);
+ color: white;
+ }
+ .footer-card {
+ padding: 15px;
+ width: 100%;
+ position: absolute;
+ z-index: 1;
+ bottom: 0;
+ left: 0;
+ border-bottom: 1px solid #eaeaea;
+ border-top: 1px solid #eaeaea;
+ background: #fff;
+ box-shadow: 0 -2px 6px rgba(0,0,0,0.12);
+ textarea{
+ border-radius: 3px;
+ }
+ .card-content{
+ // padding : 20px 0 0 0 ;
+ // height: 100px;
+ width: 100%;
+ border-radius: 3px;
+ border: 1px solid #d9d9d9;
+ font-size: 11px;
+ .clearFix{
+ border-width: 0 0 1px 0;
+ border-style: solid;
+ border-color: #d9d9d9;
+ }
+ .kanban-group-manager{
+ // position: absolute;
+ // top: 2px;
+ // // right: 19px;
+ // display: inline-block;
+ // width: 24px;
+ // height: 24px;
+ // margin-left: 5px;
+ // cursor: pointer;
+ // font-size: 19px;
+ // border-radius: 100%;
+ // background-color: #e9e9e9;
+ // vertical-align: top;
+
+ // .kanban-group-manager-img{
+ // width: 25px;
+ // height: 25px;
+ // border-radius: 100%;
+ // }
+ .wea-associative-search {
+ min-height: 30px;
+ border-width: 1px;
+ border-style: solid;
+ border-color: rgb(217, 217, 217);
+ border-image: initial;
+ border-radius: 3px;
+ }
+ }
+ .content-landmark {
+ margin-left: 9px;
+ span.ant-input{
+ position: static;
+ cursor: pointer;
+ }
+ .picker-icon + span {
+ margin-left: 20px;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+div.kanban-item-landmark:hover span {
+ color: rgb(161, 161, 161);
+}
+
+
diff --git a/pc4mobx/prj/components/list/listCondition.js b/pc4mobx/prj/components/list/listCondition.js
new file mode 100644
index 0000000..48b5ead
--- /dev/null
+++ b/pc4mobx/prj/components/list/listCondition.js
@@ -0,0 +1,44 @@
+import { WeaSearchGroup,WeaFormItem,WeaBrowser,WeaLocaleProvider} from 'ecCom';
+import { Button,Form } from 'antd';
+import {toJS} from "mobx"
+import {WeaSwitch} from "comsMobx"
+import { inject, observer} from 'mobx-react';
+const getLabel = WeaLocaleProvider.getLabel;
+
+@observer
+class Condition extends React.Component{
+
+ render(){
+ const { condition, } = this.props.listStore;
+ const {form,onEnterSearch} = this.props;
+ const {isFormInit} = form;
+ let group = [];
+ isFormInit && toJS(condition).map((c,i) =>{
+ let items = [];
+ c.items.map((fields,index) => {
+ items.push({
+ com:(
+
+ ),
+ colSpan:1,
+ })
+ });
+ group.push(
)
+ });
+ return group;
+ }
+}
+
+const getAdButtons = (listStore,ecid) => {
+ const {doSearch,setShowSearchAd,clearFormFields,setSelectedTreeKey} = listStore;
+ return [
+ (),
+ (),
+ ()
+ ];
+}
+
+export {Condition,getAdButtons}
diff --git a/pc4mobx/prj/components/list/listLeftTree.js b/pc4mobx/prj/components/list/listLeftTree.js
new file mode 100644
index 0000000..fe3c474
--- /dev/null
+++ b/pc4mobx/prj/components/list/listLeftTree.js
@@ -0,0 +1,66 @@
+import { WeaLeftTree } from 'ecCom';
+import * as mobx from 'mobx';
+import { observer } from 'mobx-react';
+import { toJS } from 'mobx';
+
+@observer
+class ListLeftTree extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ searchValue: ""
+ }
+ }
+
+ componentWillReceiveProps(nextProps) {
+
+ if (this.props.key !== nextProps.key) {
+ this.setState({
+ searchValue: ""
+ })
+ }
+ }
+
+ render() {
+ const { leftTree, leftTreeCount, leftTreeCountType, topTab, selectedTreeKey } = this.props.listStore;
+ const { setShowSearchAd, clearFormFields, initDatas, doSearch, setSelectedTreeKey } = this.props.listStore;
+ const { initkey } = this.props;
+
+ return (
+ {
+ this.setState({
+ searchValue: v
+ })
+ }}
+ onSearchLabelClick={() => {
+ setShowSearchAd(false);
+ setSelectedTreeKey("");
+ clearFormFields();
+ initDatas({ tabkey: initkey });
+ doSearch({
+ tabkey: initkey,
+ prjtype: ""
+ });
+ }}
+ onSelect={(key, topTabCount, countsType) => {
+ setShowSearchAd(false);
+ setSelectedTreeKey(topTabCount.keyid);
+ clearFormFields();
+ doSearch({
+ tabkey: initkey,
+ prjtype: topTabCount.keyid
+ });
+ }}
+ />
+ );
+ }
+}
+
+export default ListLeftTree;
\ No newline at end of file
diff --git a/pc4mobx/prj/components/list/portalCondition.js b/pc4mobx/prj/components/list/portalCondition.js
new file mode 100644
index 0000000..dbcb952
--- /dev/null
+++ b/pc4mobx/prj/components/list/portalCondition.js
@@ -0,0 +1,47 @@
+import { WeaSearchGroup,WeaFormItem,WeaBrowser,WeaLocaleProvider} from 'ecCom';
+import { Button,Form } from 'antd';
+import {toJS} from "mobx"
+import {WeaSwitch} from "comsMobx"
+import { inject, observer} from 'mobx-react';
+const getLabel = WeaLocaleProvider.getLabel;
+
+@observer
+class Condition extends React.Component{
+
+ render(){
+ const { condition, } = this.props.listStore;
+ const {form,onEnterSearch} = this.props;
+ const {isFormInit} = form;
+ let group = [];
+ isFormInit && toJS(condition).map((c,i) =>{
+ let items = [];
+ c.items.map((fields,index) => {
+ fields.labelcol = 8;
+ fields.fieldcol = 16;
+ items.push({
+ com:(
+
+ ),
+ colSpan:1,
+ })
+ });
+ group.push()
+ });
+ return group;
+ }
+}
+
+const getAdButtons = (listStore,projectPortalStore,doSearch) => {
+ const {setShowSearchAd,clearFormFields,setSelectedTreeKey,form} = listStore;
+ const formParams = form.getFormParams() || {};
+ return [
+ (),
+ (),
+ ()
+ ];
+}
+
+export {Condition,getAdButtons}
diff --git a/pc4mobx/prj/components/list/projectCondition.js b/pc4mobx/prj/components/list/projectCondition.js
new file mode 100644
index 0000000..2a822fd
--- /dev/null
+++ b/pc4mobx/prj/components/list/projectCondition.js
@@ -0,0 +1,183 @@
+import { WeaSearchGroup,WeaFormItem ,WeaProgress,WeaRichText,WeaUpload,WeaLocaleProvider,WeaError,WeaTools,WeaInputEncrypt} from 'ecCom';
+import { Button,Row,Col,InputNumber,Tooltip } from 'antd';
+import {toJS} from "mobx"
+import {WeaSwitch} from "comsMobx"
+import {observer} from 'mobx-react';
+
+const view_basicToolBar = {
+ uploadUrl: (window.ecologyContentPath || '')+"/api/blog/fileupload/uploadimage",
+ startupFocus: false,
+ toolbar: [],
+ };
+
+const basicToolBar = {
+ uploadUrl: (window.ecologyContentPath || '')+"/api/blog/fileupload/uploadimage",
+ startupFocus: false,
+ toolbar: [
+ { name: 'markdown', items: ['Markdown'] },
+ { name: 'document', items: ['Source', '-', 'Save', 'NewPage', 'Preview', '-', 'Templates'] },
+ { name: 'clipboard', items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo'] },
+ { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'CopyFormatting', 'RemoveFormat'] },
+ { name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },
+ { name: 'colors', items: ['TextColor', 'BGColor'] },
+ { name: 'tools', items: ['Maximize', 'ShowBlocks'] },
+ { name: 'insert', items: ['Image', 'Table', 'Smiley'] }
+ ],
+ };
+
+const getLabel = WeaLocaleProvider.getLabel;
+
+@observer
+export default class ProjectCondition extends React.Component{
+ constructor(props) {
+ super(props);
+ this.formParams = {};
+ }
+ render(){
+ const { fieldInfo, form,setFormFields,setValidate } = this.props;
+ const {isFormInit} = form;
+ let group = [];
+ const formParamsTemp = form.getFormParams();
+ for(let param in formParamsTemp){
+ this.formParams[param] = formParamsTemp[param];
+ }
+ isFormInit && fieldInfo.map((c,i) =>{
+ let items = [];
+ c.items.map(fields => {
+ let hide = false;
+ let dom;
+ let hasunderline = false;
+ //只读样式控制
+ let stylecss = {'margin-right':'5px','margin-top': '6px'};
+ if(fields.viewAttr == "1" || (fields.conditionType == "BROWSER" && fields.browserConditionParam.viewAttr == "1")) {
+ hasunderline = true;
+ stylecss = {'margin-right':'5px','margin-top': '16px'};
+ }
+ if(fields.viewAttr == "1" || (fields.conditionType == "BROWSER" && fields.browserConditionParam.viewAttr == "1")) {hasunderline = true} //只读样式控制
+ if(fields.domkey[0] == "prjprocess"){
+ if(fields.viewAttr == "1"){
+ dom =
+
+
+
+
+ }else{
+ dom =
+
+ `${value}%`} parser={value =>value.replace('%','')} onChange={(v)=>{setFormFields({finish:{value:v}})}} />
+ %
+
+
+ }
+ }else if(fields.conditionType == "RICHTEXT"){
+ if(fields.viewAttr == "1"){
+ dom = WeaTools.EncryBase.desensitization(fields.value)? :
+
;
+ }else{
+ dom =
+ }
+ }else if(fields.conditionType == "ATTACHEMENT"){
+ let domkey = fields.domkey[0];
+ dom =
+
+ {setFormFields({[domkey]:{value:v}})}}
+ viewAttr={fields.viewAttr}
+ // onUploading={(state)=>{}}
+ />
+
+
+ }else{
+ dom = ;
+ }
+ if(fields.domkey[0] == "members" || fields.domkey[0] == "hrmids02"){
+ if(hasunderline){
+ items.push({
+ com:(
+ {fields.label+" :"}
+ {(fields.browserConditionParam.viewAttr == 1 ? "" :
+
+
+ )}
+ }
+ labelCol={{span: `${fields.labelcol}`}}
+ error={form.getError(fields)}
+ tipPosition="bottom"
+ wrapperCol={{span: `${fields.fieldcol}`}} underline>
+
+ ),
+ colSpan:1,
+ hide:hide
+ });
+ }else{
+ items.push({
+ com:(
+ {fields.label+" :"}
+ {(fields.browserConditionParam.viewAttr == 1 ? "" :
+
+
+ )}
+ }
+ labelCol={{span: `${fields.labelcol}`}}
+ error={form.getError(fields)}
+ tipPosition="bottom"
+ wrapperCol={{span: `${fields.fieldcol}`}} >
+
+ ),
+ colSpan:1,
+ hide:hide
+ });
+ }
+
+ }else{
+ if(hasunderline){
+ items.push({
+ com:(
+ {dom}
+ ),
+ colSpan:1,
+ hide:hide
+ });
+ }else{
+ items.push({
+ com:(
+ {dom}
+ ),
+ colSpan:1,
+ hide:hide
+ });
+ }
+ }
+ });
+ group.push()
+ });
+ return group;
+ }
+}
+
+
+
diff --git a/pc4mobx/prj/components/mindmap/MindMapPage.js b/pc4mobx/prj/components/mindmap/MindMapPage.js
new file mode 100644
index 0000000..5ad45e7
--- /dev/null
+++ b/pc4mobx/prj/components/mindmap/MindMapPage.js
@@ -0,0 +1,225 @@
+import React, { Component } from 'react';
+import { inject, observer } from 'mobx-react';
+import { toJS } from 'mobx';
+import MindMap from '../common/mindMap/MindMap';
+import TaskInfoDialog from '../dialog/taskDialog'
+import { message, Modal } from "antd"
+import * as Task_Apis from "../../apis/task"
+import { WeaLocaleProvider } from 'ecCom';
+import TaskCard from './TaskCard';
+import ProjectCard from '../project/ProjectCard'
+const getLabel = WeaLocaleProvider.getLabel;
+
+@inject("mindMapStore")
+@observer
+class MindMapPage extends Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ selectObj : {},
+ showRight : false,
+ renderType : ""
+ }
+
+ }
+
+ componentDidMount() {
+ const { mindMapStore, location: { query }} = this.props;
+ mindMapStore.initPath(query);
+ }
+
+ componentWillReceiveProps(nextProps){
+ let oldquery = this.props.location.query;
+ let newquery = nextProps.location.query;
+ const { mindMapStore, location: { query }} = nextProps;
+
+ if(oldquery !== newquery) {
+ mindMapStore.initPath(query);
+ }
+ }
+
+ render() {
+
+ const { mindMapStore, location: { query } } = this.props;
+ const { taskInfoStore, _key, showRight, showSlideModal, setRenderType } = mindMapStore;
+ const { prjid } = this.props.location.query;
+ const _this = this;
+ return (
+
+ {mindMapStore.nodeTreeData && {
+ this.setState({
+ selectObj : obj,
+ showRight : false,
+ renderType : ""
+ })
+ showSlideModal(false);
+ setRenderType("");
+ }}
+ showRight={showRight}
+ renderRight={this.getRenderRight()}
+ renderRightTitle={getLabel(16290,"项目信息")}
+ layout={'0'}
+ style={{ height: 'calc(100% - 32px)', top: 50 }}
+ scale={mindMapStore.scale}
+ zoom={_this.zoom}
+ // ref={ref => prjCardStore.d3Tree = ref}
+ topButtons={[]}
+ rightMenus={this.getRightMenus()}
+ showMenu={false}
+ store={mindMapStore}
+ pathType={1}
+ closeRight={(bool)=>{showSlideModal(bool)}}
+ // onDelete={(readonly || !nodeForm.parentid) || this.deleteNode}
+ // onAddChild={readonly || this.addChildren}
+ // onDeleteChild={(readonly) || (hasChildren && this.deleteChildren)}
+ // onSynchro={readonly || this.synchronize}
+ showname={(d)=>{return `${d.name}`}}
+ desc="description"
+ >}
+ { mindMapStore.initPath(query);}} />
+ {/* */}
+
+ )
+
+ }
+
+ closeRight = (bool) => {
+ this.setState({
+ showRight : bool
+ })
+ }
+
+ getRenderRight = () => {
+ const { mindMapStore, location: { query } } = this.props;
+ const {prjTaskCardStore, renderType} = mindMapStore;
+ if(renderType == "prjEdit" && this.state.selectObj.type == "prj"){
+ return ;
+ }
+ if(renderType == "taskEdit" && this.state.selectObj.type == "task"){
+ return this.state.selectObj.id.replace("task_","") && { mindMapStore.initPath(query);}} contentStore={mindMapStore} taskCardStore={prjTaskCardStore} taskid={this.state.selectObj.id.replace("task_","").replace("prj_","")} />;
+
+ // return "/spa/prj/index.html#/main/prj/taskCard?taskid="+this.state.selectObj.id.replace("task_","");
+ }
+ }
+
+ getRightMenus = () => {
+ let selectObj = this.state.selectObj;
+ let rightMenus = [];
+ if(selectObj.type == "prj"){
+ rightMenus.push({
+ action : (e)=>this.editProject(e),
+ name : getLabel(33564, "查看"),
+ icon : "icon-coms-search",
+ });
+ // if(selectObj.editOk){
+ // rightMenus.push({
+ // action : (e)=>this.editProject(e),
+ // name : "编辑",
+ // icon : "icon-coms-edit",
+ // });
+ // }
+ if(selectObj.editTaskOk){
+ rightMenus.push({
+ action : (e)=>this.addTask(e),
+ name : getLabel('15266', '新建任务'),
+ icon : "icon-coms-New-Flow",
+ });
+ }
+
+ }else if(selectObj.type == "task"){
+ rightMenus.push({
+ action : (e)=>this.editTask(e),
+ name : getLabel(33564, "查看"),
+ icon : "icon-coms-search",
+ });
+ if(selectObj.canEditAndDel){
+ // rightMenus.push({
+ // action : (e)=>this.editTask(e),
+ // name : "编辑",
+ // icon : "icon-coms-edit",
+ // });
+ rightMenus.push({
+ action : (e)=>this.delTask(e),
+ name : getLabel(131966,"删除"),
+ icon : "icon-coms-delete",
+ });
+ }
+ if(selectObj.canAddChild){
+ rightMenus.push({
+ action : (e)=>this.addChildTask(e),
+ name : getLabel('382600','新建下级任务') ,
+ icon : "icon-coms-New-Flow",
+ });
+ }
+ }
+ return rightMenus;
+ }
+
+ editProject = (e) => {
+ e.stopPropagation && e.stopPropagation();
+ // this.setState({
+ // renderType : "prjEdit",
+ // // showRight : true,
+ // });
+ const { showSlideModal, setRenderType } = this.props.mindMapStore;
+ showSlideModal(true);
+ setRenderType("prjEdit");
+ }
+
+ editTask = (e) => {
+ e.stopPropagation && e.stopPropagation();
+ // this.setState({
+ // renderType : "taskEdit",
+ // // showRight : true,
+ // });
+ const { showSlideModal, setRenderType } = this.props.mindMapStore;
+ showSlideModal(true);
+ setRenderType("taskEdit");
+ }
+
+ delTask = (e) => {
+ e.stopPropagation && e.stopPropagation();
+ const _this = this;
+ const { mindMapStore, location: { query } } = this.props;
+ Modal.confirm({
+ title: getLabel(15172, "系统提示"),
+ content: getLabel(83925, "该任务及其子任务都会被删除,您确认要删除吗?"),
+ onOk() {
+ Task_Apis.delTask({ method: "del" , taskid: _this.state.selectObj.id.replace("task_","")}).then(data => {
+ if (data.success) {
+ mindMapStore.initPath(query);
+ message.success(getLabel(83472, "删除成功!"));
+ } else {
+ message.error(getLabel(383746, "请求失败") + ":" + data.msgcode);
+ }
+ })
+ },
+ onCancel() { },
+ })
+ }
+
+ addTask = (e) => {
+ e.stopPropagation && e.stopPropagation();
+ const { mindMapStore, location: { query : { prjid }} } = this.props;
+ const { taskInfoStore } = mindMapStore;
+ taskInfoStore.handleDialog(true, "add", '', { prjid: prjid, parentid: "" });
+ }
+
+ addChildTask = (e) => {
+ e.stopPropagation && e.stopPropagation();
+ const { mindMapStore, location: { query : { prjid }} } = this.props;
+ const { taskInfoStore } = mindMapStore;
+ taskInfoStore.handleDialog(true, "add", '', { prjid: prjid, parentid: this.state.selectObj.id.replace("task_","") });
+ }
+
+ zoom = (scale) => {
+ const { mindMapStore, params } = this.props;
+ mindMapStore.changeScale(parseInt(scale * 10));
+ }
+
+}
+
+export default MindMapPage;
\ No newline at end of file
diff --git a/pc4mobx/prj/components/mindmap/TaskCard.js b/pc4mobx/prj/components/mindmap/TaskCard.js
new file mode 100644
index 0000000..3c42c30
--- /dev/null
+++ b/pc4mobx/prj/components/mindmap/TaskCard.js
@@ -0,0 +1,496 @@
+import React from 'react';
+import { Button, Tabs, Row, Col, InputNumber, Modal, message } from 'antd';
+import { inject, observer } from 'mobx-react';
+import { toJS } from "mobx"
+import { WeaRightMenu, WeaReqTop, WeaNewScroll, WeaTools, WeaAlertPage, WeaDialog, WeaBrowser, WeaLocaleProvider, WeaTop, WeaTab } from "ecCom"
+import { WeaTableNew, WeaSwitch } from 'comsMobx';
+const WeaTable = WeaTableNew.WeaTable;
+const getKey = WeaTools.getKey;
+const getLabel = WeaLocaleProvider.getLabel;
+import RelareExchange from '../common/relateExchange'
+import TabDiscuss from '../common/TabDiscuss'
+import RelateWorkFlow from '../common/relateWorkFlow'
+import RelateDocument from "../common/relateDocument"
+import TaskSub from '../projectBoard/taskSub'
+import TaskShare from '../common/sharePage'
+import TaskInfo from '../common/taskInfo'
+import RealteCrmDialog from '../dialog/relateCrmDialog'
+import "../projectBoard/style/slide.less"
+@observer
+export default class TaskCard extends React.Component {
+ componentDidMount() {
+ const { taskCardStore, taskid } = this.props;
+ const { getTaskTabs } = taskCardStore;
+ getTaskTabs({taskid: taskid });
+ }
+ componentWillUnmount() {
+
+ }
+
+ componentWillReceiveProps(nextprops) {
+ const { taskCardStore } = this.props;
+ const { clearStatus, getTaskTabs } = taskCardStore;
+ if (this.props.taskid !== nextprops.taskid) {
+ clearStatus();
+ getTaskTabs({ taskid: nextprops.taskid });
+ }
+ }
+
+ render() {
+ const { taskCardStore, callBack } = this.props;
+ const { tabDatas, selectTabKey, loading, taskname, shareStore, hasRight, verified, form, taskid, saveAndReLoadWf } = taskCardStore;
+ if (verified && !hasRight) {
+ return (
+
+ {getLabel(2012, "对不起,您暂时没有权限!")}
+
+
+ )
+ }
+ if (verified && hasRight) {
+ const tabDatas1 = toJS(tabDatas);
+ let _this = this;
+ let tabUrl = function (key) {
+ if (tabDatas1) {
+ for (let i = 0; i < tabDatas1.length; i++) {
+ if (tabDatas1[i].id == key && tabDatas1[i].shortname == "taskinfo") {
+ return
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "tasksub") {
+ return
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "exchange") {
+ return
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "taskshare") {
+ return
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "req") {
+ return
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "doc") {
+ return
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "crm") {
+ return {_this.getReleateCrmOrCpt("crm")}
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "cpt") {
+ return {_this.getReleateCrmOrCpt("cpt")}
+ _this.addCapital(ids, names, datas)} customized={true} hasAdvanceSerach={true}>
+
+ } else if (tabDatas1[i].id == key && tabDatas1[i].shortname == "") {
+ if (tabDatas[i].linkurl.indexOf("noright") > -1) {
+ return
+
+ {getLabel(2012, "对不起,您暂时没有权限!")}
+
+
+ } else {
+ return tabDatas1[i].linkurl;
+ }
+ }
+ }
+ return ""
+ }
+ }(selectTabKey);
+ return (
+
+
+ }
+ iconBgcolor='#217346'
+ buttons={this.getButtons()}
+ buttonSpace={10}
+ showDropIcon={true}
+ dropMenuDatas={this.getRightMenu()}
+ onDropMenuClick={this.onRightMenuClick.bind(this)}
+ tabDatas={tabDatas}
+ selectedKey={selectTabKey}
+ onChange={this.taskCardChangeTab.bind(this)}
+ >
+
+
+
+ {
+ typeof tabUrl === "object" ? tabUrl :
+
+ }
+
+
+
+
+
+
+ )
+ }
+ return ()
+ }
+ getReleateCrmOrCpt(type) {
+ const { taskRelRight: { hasRight, verified }, taskCrmStore, taskCptStore } = this.props.taskCardStore;
+ if (verified && !hasRight) {
+ return (
+
+ {getLabel(2012, "对不起,您暂时没有权限!")}
+
+
+ )
+ }
+ if (verified && hasRight) {
+ if (type == "crm") {
+ return
+ }
+ if (type == "cpt") {
+ return
+ }
+ }
+ return
+ }
+ getButtons() {
+ const { taskCardStore, contentStore } = this.props;
+ const { rightMenu, taskid, selectTabKey, taskInfoStore, prjid, shareTableStore, taskCptStore, taskCrmStore, tabDatas, canSave , setCanSave } = taskCardStore;
+ let btnArr = [];
+ let that = this;
+ const tabDatas1 = toJS(tabDatas);
+ rightMenu && rightMenu.length > 0 && rightMenu.map(m => {
+ let disabled = false;
+ if (tabDatas1) {
+ for (let i = 0; i < tabDatas1.length; i++) {
+ if (tabDatas1[i].shortname == "taskshare" && tabDatas1[i].key == selectTabKey) {
+ let { selectedRowKeys } = shareTableStore;
+ disabled = selectedRowKeys.length == 0 ? true : false;
+ } else if (tabDatas1[i].shortname == "cpt" && tabDatas1[i].key == selectTabKey) {
+ let { selectedRowKeys } = taskCptStore;
+ disabled = selectedRowKeys.length == 0 ? true : false;
+ } else if (tabDatas1[i].shortname == "crm" && tabDatas1[i].key == selectTabKey) {
+ let { selectedRowKeys } = taskCrmStore;
+ disabled = selectedRowKeys.length == 0 ? true : false;
+ } else if (tabDatas1[i].shortname == "taskinfo" && tabDatas1[i].key == selectTabKey) {
+ disabled = canSave ? false : true;
+ }
+ }
+ }
+
+ m.isTop == '1' && btnArr.length < 4 && btnArr.push(
+
+ );
+ });
+ return btnArr;
+ }
+ getRightMenu() {
+ const { taskCardStore } = this.props;
+ const { rightMenu, selectTabKey, shareTableStore, taskCptStore, taskCrmStore, tabDatas, canSave } = taskCardStore;
+ let btnArr = [];
+ const tabDatas1 = toJS(tabDatas);
+ rightMenu && rightMenu.length > 0 && rightMenu.map(m => {
+ let disabled = false;
+ if (tabDatas1) {
+ for (let i = 0; i < tabDatas1.length; i++) {
+ if (tabDatas1[i].shortname == "taskshare" && tabDatas1[i].key == selectTabKey) {
+ let { selectedRowKeys } = shareTableStore;
+ disabled = selectedRowKeys.length == 0 ? true : false;
+ } else if (tabDatas1[i].shortname == "cpt" && tabDatas1[i].key == selectTabKey) {
+ let { selectedRowKeys } = taskCptStore;
+ disabled = selectedRowKeys.length == 0 ? true : false;
+ } else if (tabDatas1[i].shortname == "crm" && tabDatas1[i].key == selectTabKey) {
+ let { selectedRowKeys } = taskCrmStore;
+ disabled = selectedRowKeys.length == 0 ? true : false;
+ } else if (tabDatas1[i].shortname == "taskinfo" && tabDatas1[i].key == selectTabKey) {
+ disabled = canSave ? false : true;
+ }
+ }
+ }
+ btnArr.push({
+ icon: ,
+ content: m.menuName,
+ disabled: (m.type == "BTN_DELETEBATCH"||m.type == "BTN_SAVE") ? disabled : false
+ })
+ });
+ return btnArr
+ }
+ onRightMenuClick(key) {
+ const { taskCardStore, contentStore } = this.props;
+ const { rightMenu, taskid, selectTabKey, taskInfoStore, prjid, shareTableStore, tabDatas, setCanSave } = taskCardStore;
+ let that = this;
+ const tabDatas1 = toJS(tabDatas);
+ rightMenu && rightMenu.length > 0 && rightMenu.map((m, i) => {
+ if (Number(key) == i) {
+ if (tabDatas1) {
+ for (let i = 0; i < tabDatas1.length; i++) {
+ if (tabDatas1[i].shortname == "taskinfo" && tabDatas1[i].key == selectTabKey) {
+ if (m.type == "BTN_EDIT") { //编辑
+ taskCardStore.getTaskForm({ viewtype: 'edit', taskid: taskid });
+ } else if (m.type == "BTN_SAVE") { //保存
+ setCanSave(false);
+ taskCardStore.saveTaskInfo({ taskid: taskid }, contentStore);
+ } else if (m.type == "BTN_DELETE") { //删除
+ taskCardStore.delTask("del", taskid, contentStore);
+ } else if (m.type == "BTN_BACK") { //返回
+ taskCardStore.getTaskForm({ viewtype: 'view', taskid: taskid });
+ }
+ } else if (tabDatas1[i].shortname == "cpt" && tabDatas1[i].key == selectTabKey) {
+ if (m.type == "BTN_APPEND") { //添加
+ this.refs.addCpt.openModal();
+ } else if (m.type == "BTN_DELETEBATCH") { //删除
+ this.deleteCrmOrCpt('cpt');
+ }
+ } else if (tabDatas1[i].shortname == "crm" && tabDatas1[i].key == selectTabKey) {
+ if (m.type == "BTN_APPEND") { //添加
+ taskCardStore.handleRelateCrmDialog(true, "add", {
+ crmid: { value: '', valueSpan: '', valueObj: [] },
+ reasondesc: { value: "" }
+ });
+ } else if (m.type == "BTN_DELETEBATCH") { //删除
+ this.deleteCrmOrCpt('crm');
+ }
+ } else if (tabDatas1[i].shortname == "req" && tabDatas1[i].key == selectTabKey) {
+ if (m.type == "BTN_NEWREQ") {
+ //console.log("新建流程")
+ this.openFullWindow((window.ecologyContentPath || '')+"/spa/workflow/static/index.html#/main/workflow/add?openNewWindow=0&taskid=" + taskid);
+ }
+ } else if (tabDatas1[i].shortname == "doc" && tabDatas1[i].key == selectTabKey) {
+ if (m.type == "BTN_NEWDOC") {
+ //console.log("新建文档")
+ this.openFullWindow((window.ecologyContentPath || '')+'/spa/document/static/index.html#/main/document/add?openNewWindow=0&moudleFrom=task');
+ let _this = this;
+ window.__createDocFn = function (obj) {
+ let docid = obj.docid;
+ let docsubject = obj.docSubject;
+ // console.log(docid,docsubject);
+ _this.addDocument(docid,docsubject,'');
+ }
+ }
+ } else if (tabDatas1[i].shortname == "taskshare" && tabDatas1[i].key == selectTabKey) {
+ if (m.type == "BTN_APPEND") { //添加
+ taskCardStore.showAddShareModal(true);
+ } else if (m.type == "BTN_DELETEBATCH") { //删除
+ let { selectedRowKeys } = shareTableStore;
+ taskCardStore.delBatchShare(`${toJS(selectedRowKeys)}`);
+ }
+ }
+ }
+ }
+ if (m.type == "BTN_NEWSUB") { //添加子任务
+ taskInfoStore.handleDialog(true, "add", taskid, { prjid: prjid, parentid: taskid });
+ } else if (m.type == "BTN_COLUMN") { //定制列
+ taskCardStore.onShowColumn();
+ }
+ }
+ });
+ }
+ taskCardChangeTab(key) {
+ const { taskCardStore } = this.props;
+ taskCardStore.changeTab(key);
+ }
+ cancelShare = () => {
+ const { taskCardStore } = this.props;
+ taskCardStore.showTaskShare(false);
+ }
+ saveShare = () => {
+ const { taskCardStore } = this.props;
+ taskCardStore.showTaskShare(false);
+ }
+ reloadExchanges = () => {
+ const { taskCardStore } = this.props;
+ taskCardStore.getRelateExchangeInfo();
+ }
+ deleteCrmOrCpt = (type) => {
+ const { taskCardStore } = this.props;
+ const { taskid, doDspTaskReferenceOpt, taskCrmStore, taskCptStore } = taskCardStore;
+ const { selectedRowKeys } = (type == "cpt" ? taskCptStore : taskCrmStore);
+ if (selectedRowKeys.length > 0) {
+ Modal.confirm({
+ title: getLabel(15172, "系统提示"),
+ content: getLabel(83601, "您确认要删除选中的记录吗?"),
+ onOk() {
+ doDspTaskReferenceOpt({
+ dotype: type,
+ method: 'del',
+ prjid: "",
+ taskid: taskid,
+ ids: `${toJS(selectedRowKeys)}`
+ }, type)
+ },
+ onCancel() { },
+ })
+ } else {
+ // Modal.warning({
+ // title: getLabel(15172, "系统提示"),
+ // content: getLabel(84093, "请至少选择一条记录!"),
+ // })
+ message.error(getLabel(84093, "请至少选择一条记录!"));
+ }
+ }
+ //资产操作按钮
+ onCrmOperatesClick = (record, index, operate, flag) => {
+ let _href = operate && operate.href ? operate.href : "";
+ let fn = _href.replace("javascript:", "");
+ fn = fn.substring(0, fn.indexOf('('));
+ const { taskCardStore } = this.props;
+ const { doDspTaskReferenceOpt, taskid, taskDocStore } = taskCardStore;
+ if (fn != "") {
+ if ("onDelRelated" == fn) { //delete
+ Modal.confirm({
+ title: getLabel(15172, "系统提示"),
+ content: getLabel(83600, "您确认要删除吗?"),
+ onOk() {
+ doDspTaskReferenceOpt({
+ dotype: 'crm',
+ method: 'del',
+ prjid: "",
+ taskid: taskid,
+ ids: record.randomFieldId
+ }, 'crm')
+ },
+ onCancel() { },
+ })
+ } else if ("onEdit" == fn) { //编辑
+ taskCardStore.setRelateCrmUpdateID(record.randomFieldId);
+ taskCardStore.handleRelateCrmDialog(true, "edit", {
+ crmid: {
+ value: record.customerid,
+ valueSpan: record.customeridspan,
+ valueObj: [{ id: record.customerid, name: record.customeridspan, }],
+ },
+ reasondesc: { value: record.reasondesc }
+ });
+ }
+ }
+ }
+ //资产操作按钮
+ onCptOperatesClick = (record, index, operate, flag) => {
+ let _href = operate && operate.href ? operate.href : "";
+ let fn = _href.replace("javascript:", "");
+ fn = fn.substring(0, fn.indexOf('('));
+ const { taskCardStore } = this.props;
+ const { doDspTaskReferenceOpt, taskid, taskDocStore } = taskCardStore;
+ if (fn != "") {
+ if ("onDelRelated" == fn) { //delete
+ Modal.confirm({
+ title: getLabel(15172, "系统提示"),
+ content: getLabel(83600, "您确认要删除吗?"),
+ onOk() {
+ doDspTaskReferenceOpt({
+ dotype: 'cpt',
+ method: 'del',
+ prjid: "",
+ taskid: taskid,
+ ids: record.randomFieldId
+ }, 'cpt')
+ },
+ onCancel() { },
+ })
+ }
+ }
+ }
+ //资产新建
+ addCapital = (ids, name, data) => {
+ const { taskCardStore } = this.props;
+ const { doDspTaskReferenceOpt, taskid, prjid } = taskCardStore;
+ doDspTaskReferenceOpt({
+ dotype: 'cpt',
+ method: 'add',
+ prjid: prjid,
+ taskid: taskid,
+ cptid: ids
+ }, 'cpt');
+ }
+
+ openFullWindow = (url) => {
+ const width = screen.availWidth - 10;
+ const height = screen.availHeight - 50;
+ let szFeatures = 'top=0,';
+ szFeatures += 'left=0,';
+ szFeatures += `width=${width},`;
+ szFeatures += `height=${height},`;
+ szFeatures += 'directories=no,';
+ szFeatures += 'status=yes,toolbar=no,location=no,';
+ szFeatures += 'menubar=no,';
+ szFeatures += 'scrollbars=yes,';
+ szFeatures += 'resizable=yes';
+ window.open(url, '', szFeatures);
+ }
+
+ //新建
+ addDocument=(ids, names, datas)=>{
+ const {taskCardStore} = this.props;
+ const {doDspTaskReferenceOpt,taskid,prjid} = taskCardStore;
+ doDspTaskReferenceOpt({
+ dotype:'doc',
+ method:'add',
+ prjid : prjid,
+ taskid:taskid,
+ docid:ids,
+ ids:""
+ },'doc')
+ }
+}
\ No newline at end of file
diff --git a/pc4mobx/prj/components/mineProject.js b/pc4mobx/prj/components/mineProject.js
new file mode 100644
index 0000000..36041aa
--- /dev/null
+++ b/pc4mobx/prj/components/mineProject.js
@@ -0,0 +1,250 @@
+import React from 'react';
+import { inject, observer } from 'mobx-react';
+import { Button, Tabs,Card,Pagination,Row,Col } from 'antd';
+import {toJS} from "mobx";
+import {Condition,getAdButtons} from './list/listCondition';
+import {WeaTableNew} from 'comsMobx';
+const WeaTable = WeaTableNew.WeaTable;
+import {WeaRightMenu,WeaTop,WeaTab,WeaErrorPage,WeaBrowser,WeaTools,WeaLeftRightLayout,WeaProgress,WeaLocaleProvider} from 'ecCom';
+import ListLeftTree from './list/listLeftTree'
+import ShareDialog from './dialog/shareDialog'
+import ExchangeDialog from './dialog/exchangeDialog'
+import ProjectDialog from './dialog/projectDialog'
+const getLabel = WeaLocaleProvider.getLabel;
+
+@inject('minePrjStore')
+@observer
+class MineProject extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+
+ componentDidMount() {
+ this.doInit(this.props);
+ }
+ doInit(props){
+ const { location:{query},minePrjStore } = props;
+ const {initDatas,doSearch,initTreeDatas} = minePrjStore;
+ initDatas(query);
+ //initTreeDatas(query);
+ }
+ componentWillReceiveProps(nextProps){
+ const keyOld = this.props.location.key;
+ const keyNew = nextProps.location.key;
+ const oldParams = this.props.location.query;
+ const newParams = nextProps.location.query;
+ if (keyOld !== keyNew || oldParams !== newParams) {
+ const {minePrjStore} = nextProps;
+ minePrjStore.clearStatus();
+ this.doInit(nextProps);
+ }
+ }
+ componentWillUnmount(){
+ const { minePrjStore } = this.props;
+ minePrjStore.clearStatus();
+ }
+ render(){
+ let title = getLabel(1211,"我的项目");
+ let topTab = [
+ {
+ color: '#000000',
+ groupid: 'totalCount1',
+ showcount: true,
+ title: getLabel(332,"全部"),
+ tabkey: "all"
+ },
+ {
+ color: '#ff3232',
+ groupid: 'totalCount2',
+ showcount: true,
+ title: getLabel(732,"未完成"),
+ tabkey: "doing"
+ },
+ {
+ color: '#fea468',
+ groupid: 'totalCount3',
+ showcount: true,
+ title: getLabel(1232,"冻结"),
+ tabkey: "frozen"
+ },
+ {
+ color: '#9766fd',
+ groupid: 'totalCount4',
+ showcount: true,
+ title: getLabel(555,"完成"),
+ tabkey: "complete"
+ }
+ ];
+ const {minePrjStore} = this.props;
+ const {loading,tableStore,showSearchAd,showBatchSubmit,form,config,topTabCount,exchangeStore,projectInfoStore,searchParams,reLoad,showLeft} = minePrjStore;
+ const formParams = form.getFormParams() || {};
+ return (
+
+ }
+ iconBgcolor='#217346'
+ buttons={[]}
+ buttonSpace={10}
+ showDropIcon={true}
+ dropMenuDatas={this.getRightMenu()}
+ onDropMenuClick={this.onRightMenuClick.bind(this)}
+ >
+ }
+ onCollapse={showLeft => minePrjStore.setLeftShow(showLeft)}
+ >
+ {minePrjStore.setShowSearchAd(bool)}}
+ hideSearchAd={()=> minePrjStore.setShowSearchAd(false)}
+ searchsAd={
+
+ }
+ showSearchAd={showSearchAd}
+ onSearch={v=>{minePrjStore.doSearch()}}
+ onSearchChange={v=>{minePrjStore.setFormFields({prjname:{value:v}})}}
+ onChange={ this.changeData }
+ />
+ reLoad()}
+ getColumns={c=>this.reRenderColumns(c)}
+ tableWidth={this.tableWidth}
+ onOperatesClick={this.onOperatesClick.bind(this)}
+ />
+
+
+
+
+
+ {//
+ }
+ )
+
+ }
+
+ getRightMenu(){
+ const {minePrjStore }= this.props;
+ const {rightMenu} = minePrjStore;
+ let btnArr = [];
+ rightMenu && rightMenu.length>0 && rightMenu.map(m=>{
+ btnArr.push({
+ icon: ,
+ content: m.menuName
+ })
+ });
+ return btnArr
+ }
+ onRightMenuClick(key){
+ const {minePrjStore }= this.props;
+ const {rightMenu} = minePrjStore;
+ let that = this;
+ rightMenu && rightMenu.length>0 && rightMenu.map((m,i)=>{
+ if(Number(key) == i){
+ let fn = m.menuFun.indexOf('this') >= 0 ? `${m.menuFun.split('this')[0]})` : m.menuFun;
+ if(m.type == "BTN_SEARCH"){ //定制列
+ minePrjStore.doSearch();
+ }else if(m.type == "BTN_COLUMN"){ //定制列
+ minePrjStore.onShowColumn();
+ }
+ }
+ });
+ }
+ reRenderColumns(columns){
+ columns.forEach((c,i)=>{
+ if(c.dataIndex=='finish'){
+ c.render = function(text, record){
+ return
+
+
+ }
+ } else {
+ // c.render = function(text, record){
+ // let valueSpan = record[c.dataIndex + "span"] !== undefined ? record[c.dataIndex + "span"] : record[c.dataIndex];
+ // return
+ // }
+ }
+ })
+ return columns;
+ }
+
+ tableWidth = (columns) => {
+ let width = 0;
+ let cols = 0;
+ columns.map(col => {
+ if (col.display === 'true') {
+ let oldwidth = col.oldWidth || '10%';
+ let widthInt = parseFloat(oldwidth.replace('%', ''));
+ if (widthInt <= 0) {
+ widthInt = 10;
+ }
+ width += widthInt;
+ cols++
+ }
+ })
+ //超过10列,才出现滚动条,width>100才出现滚动条
+ if(cols<=10){
+ width = 100 ;
+ }
+ return `${width}%`;
+ }
+
+ changeData=(key)=>{
+ const {minePrjStore} = this.props;
+ minePrjStore.setShowSearchAd(false);
+ minePrjStore.doSearch({tabkey:key });
+ // minePrjStore.initDatas({tabkey:key });
+ }
+ onOperatesClick(record,index,operate,flag){
+ const {minePrjStore} = this.props;
+ const {shareStore,exchangeStore,projectInfoStore} = minePrjStore;
+ let _href = operate && operate.href ? operate.href : "";
+ let fn = _href.replace("javascript:","");
+ fn = fn.substring(0,fn.indexOf('('));
+ let that = this;
+ if(fn != ""){
+ if("onShare"==fn){ //共享
+ shareStore.handleShareDialog(true,"prj",record.randomFieldId)
+ }else if('onNormal' == fn){ //正常
+ minePrjStore.doPlanOpt({method:'normal',prjid:record.randomFieldId})
+ }else if('onOver' == fn){ //延期
+ minePrjStore.doPlanOpt({method:'delay',prjid:record.randomFieldId})
+ }else if('onFinish' == fn){ //完成
+ minePrjStore.doPlanOpt({method:'complete',prjid:record.randomFieldId})
+ }else if('onFrozen' == fn){ //冻结
+ minePrjStore.doPlanOpt({method:'freeze',prjid:record.randomFieldId})
+ }else if('onEdit' == fn){ //编辑
+ projectInfoStore.handleDialog(true,record.randomFieldId,{viewtype:'edit',prjid:record.randomFieldId}) ;
+ }else if('onListTask' == fn){ //任务列表
+ // taskListStore.showTaskLiskModal(true,record.randomFieldId);
+ }else if('onDiscuss' == fn){ //相关交流
+ exchangeStore.handleExchangeDialog(true,"prj",record.randomFieldId,{})
+ }else if('onDel' == fn){ //项目删除
+ minePrjStore.delPrjInfo({method:"del",prjid:record.randomFieldId,from:"mymanagerproject"})
+ }
+ }
+ }
+ onEnterSearch=() =>{
+ const {minePrjStore }= this.props;
+ minePrjStore.doSearch();
+ minePrjStore.setShowSearchAd(false);
+ }
+}
+
+export default WeaTools.tryCatch(React,
+ props => ,
+ {error: ""}
+)(MineProject);
\ No newline at end of file
diff --git a/pc4mobx/prj/components/monitor/MonitorResult.js b/pc4mobx/prj/components/monitor/MonitorResult.js
new file mode 100644
index 0000000..4d38a37
--- /dev/null
+++ b/pc4mobx/prj/components/monitor/MonitorResult.js
@@ -0,0 +1,231 @@
+import React from 'react';
+import { inject, observer } from 'mobx-react';
+import { Button, Tabs,Card,Pagination,Row,Col } from 'antd';
+import {WeaRightMenu,WeaTop,WeaTab,WeaErrorPage,WeaAlertPage,WeaTools,WeaLeftRightLayout,WeaProgress,WeaLocaleProvider} from 'ecCom';
+import {toJS} from "mobx";
+import {Condition,getAdButtons} from '../list/listCondition';
+import {WeaTableNew} from 'comsMobx';
+const WeaTable = WeaTableNew.WeaTable;
+const getLabel = WeaLocaleProvider.getLabel;
+import ListLeftTree from '../list/listLeftTree'
+
+@inject('prjMonitorStore')
+@observer
+class MonitorResult extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+
+ componentDidMount(){
+ const { prjMonitorStore } = this.props;
+ WeaTools.callApi('/api/proj/pcproject/getPrjMonitorRight', 'GET', {}).then(data=>{
+ prjMonitorStore.hasRight = data.isright;
+ prjMonitorStore.verified = true;
+ if(data.isright){
+ this.doInit(this.props);
+ //initTreeDatas();
+ }
+ });
+ }
+
+ doInit(props){
+ const { location:{query},prjMonitorStore } = props;
+ const {initTreeDatas,initDatas,} = prjMonitorStore;
+ initDatas(query);
+ // initTreeDatas();
+ }
+ componentWillUnmount(){
+ const { prjMonitorStore } = this.props;
+ prjMonitorStore.clearStatus();
+ }
+ render(){
+ const {prjMonitorStore} = this.props;
+ const {title,loading,tableStore,showSearchAd,form,showLeft,verified,hasRight} = prjMonitorStore;
+ const formParams = form.getFormParams() || {};
+ if (verified && !hasRight) {
+ return (
+
+ {getLabel(2012,"对不起,您暂时没有权限!")}
+
+
+ )
+ }
+ if (verified && hasRight) {
+ return (
+
+ }
+ iconBgcolor='#217346'
+ buttons={this.getTopButtons()}
+ buttonSpace={10}
+ showDropIcon={true}
+ dropMenuDatas={this.getRightMenu()}
+ onDropMenuClick={this.onRightMenuClick.bind(this)}
+ >
+ }
+ onCollapse={showLeft => prjMonitorStore.setLeftShow(showLeft)}
+ >
+ {prjMonitorStore.setShowSearchAd(bool)}}
+ hideSearchAd={()=> prjMonitorStore.setShowSearchAd(false)}
+ searchsAd={
+
+ }
+ showSearchAd={showSearchAd}
+ onSearch={v=>{prjMonitorStore.doSearch()}}
+ onSearchChange={v=>{prjMonitorStore.appendFormFields({name:{value:v}})}}
+ onChange={ this.changeData }
+ />
+ this.reRenderColumns(c)}
+ tableWidth={this.tableWidth}
+ onOperatesClick={this.onOperatesClick.bind(this)}
+ />
+
+
+ )
+ }
+ return ;
+
+
+ }
+
+ getTopButtons(){
+ const {prjMonitorStore} = this.props;
+ const {rightMenu,tableStore} = prjMonitorStore;
+ let {selectedRowKeys} = tableStore;
+ let btnArr = [];
+ let that = this;
+ const isDisabled = !(selectedRowKeys.length>0 && `${toJS(selectedRowKeys)}`);
+ rightMenu && rightMenu.length>0 && toJS(rightMenu).map(m=>{
+ m.isTop == '1' && btnArr.length < 4 && btnArr.push(
+
+ );
+ });
+ return btnArr;
+ }
+
+ getRightMenu(){
+ const {prjMonitorStore }= this.props;
+ const {rightMenu, tableStore} = prjMonitorStore;
+ let {selectedRowKeys} = tableStore;
+ const isDisabled = !(selectedRowKeys.length>0 && `${toJS(selectedRowKeys)}`);
+ let btnArr = [];
+ rightMenu && rightMenu.length>0 && rightMenu.map(m=>{
+ btnArr.push({
+ icon: ,
+ content: m.menuName,
+ disabled : isDisabled && m.isControl == "1"
+ })
+ });
+ return btnArr
+ }
+ onRightMenuClick(key){
+ const {prjMonitorStore }= this.props;
+ const {rightMenu,tableStore} = prjMonitorStore;
+ let {selectedRowKeys} = tableStore;
+ let that = this;
+ rightMenu && rightMenu.length>0 && rightMenu.map((m,i)=>{
+ if(Number(key) == i){
+ let fn = m.menuFun.indexOf('this') >= 0 ? `${m.menuFun.split('this')[0]})` : m.menuFun;
+ if(m.type == "BTN_SEARCH"){ //定制列
+ prjMonitorStore.doSearch();
+ }else if(m.type == "BTN_COLUMN"){ //定制列
+ prjMonitorStore.onShowColumn();
+ }else if(m.type == "BTN_DELETEBATCH"){
+ prjMonitorStore.delPrjInfo({method:"del",prjid:`${toJS(selectedRowKeys)}`});
+ }
+ }
+ });
+ }
+ reRenderColumns(columns){
+ columns.forEach((c,i)=>{
+ if(c.dataIndex=='finish'){
+ c.render = function(text, record){
+ return
+
+
+ }
+ } else {
+ // c.render = function(text, record){
+ // let valueSpan = record[c.dataIndex + "span"] !== undefined ? record[c.dataIndex + "span"] : record[c.dataIndex];
+ // return
+ // }
+ }
+ })
+ return columns;
+ }
+
+ tableWidth = (columns) => {
+ let width = 0;
+ let cols = 0;
+ columns.map(col => {
+ if (col.display === 'true') {
+ let oldwidth = col.oldWidth || '10%';
+ let widthInt = parseFloat(oldwidth.replace('%', ''));
+ if (widthInt <= 0) {
+ widthInt = 10;
+ }
+ width += widthInt;
+ cols++
+ }
+ })
+ //超过10列,才出现滚动条,width>100才出现滚动条
+ if(cols<=10){
+ width = 100 ;
+ }
+ return `${width}%`;
+ }
+
+ changeData=(key)=>{
+ const {prjMonitorStore} = this.props;
+ prjMonitorStore.setShowSearchAd(false);
+ prjMonitorStore.doSearch({
+ tabkey:key
+ });
+ }
+
+ onOperatesClick(record,index,operate,flag){
+ let that = this;
+ const {prjMonitorStore }= this.props;
+ let _href = operate && operate.href ? operate.href : "";
+ let fn = _href.replace("javascript:","");
+ fn = fn.substring(0,fn.indexOf('('));
+ if(fn != ""){
+ if("onDel"==fn){
+ prjMonitorStore.delPrjInfo({method:"del",prjid:record.randomFieldId});
+ }
+ }
+ }
+
+ onEnterSearch=() =>{
+ const {prjMonitorStore }= this.props;
+ prjMonitorStore.doSearch();
+ prjMonitorStore.setShowSearchAd(false);
+ }
+
+}
+
+export default WeaTools.tryCatch(React,
+ props => ,
+ {error: ""}
+)(MonitorResult);
\ No newline at end of file
diff --git a/pc4mobx/prj/components/monitor/ProjectMonitor.js b/pc4mobx/prj/components/monitor/ProjectMonitor.js
new file mode 100644
index 0000000..6b2c344
--- /dev/null
+++ b/pc4mobx/prj/components/monitor/ProjectMonitor.js
@@ -0,0 +1,119 @@
+import React from 'react';
+import { inject, observer } from 'mobx-react';
+import {routerShape} from 'react-router';
+import { Button} from 'antd';
+import {Condition} from '../list/listCondition';
+import {WeaRightMenu,WeaTop,WeaErrorPage,WeaTools,WeaAlertPage,WeaLocaleProvider} from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+
+@inject('prjMonitorStore')
+@observer
+class ProjectMonitor extends React.Component {
+ static contextTypes = {
+ router: routerShape
+ }
+ constructor(props) {
+ super(props);
+ }
+ componentDidMount(){
+ const { prjMonitorStore } = this.props;
+ const {initDatas} = prjMonitorStore;
+ WeaTools.callApi('/api/proj/pcproject/getPrjMonitorRight', 'GET', {}).then(data=>{
+ prjMonitorStore.hasRight = data.isright;
+ prjMonitorStore.verified = true;
+ if(data.isright){
+ initDatas({},true);
+ //initTreeDatas();
+ }
+ });
+ }
+ componentWillReceiveProps(nextProps){
+ const { prjMonitorStore } = this.props;
+ const {initDatas} = prjMonitorStore;
+ if(this.props.location.key !== nextProps.location.key){
+ WeaTools.callApi('/api/proj/pcproject/getPrjMonitorRight', 'GET', {}).then(data=>{
+ prjMonitorStore.hasRight = data.isright;
+ prjMonitorStore.verified = true;
+ if(data.isright){
+ initDatas({},true);
+ //initTreeDatas();
+ }
+ });
+ }
+ }
+ resetHeight(height){
+ jQuery(".prj-query-condition").height(height - 60);
+ }
+ render(){
+ const {prjMonitorStore} = this.props;
+ const {loading,form,verified,hasRight} = prjMonitorStore;
+ if (verified && !hasRight) {
+ return (
+
+ {getLabel(2012,"对不起,您暂时没有权限!")}
+
+
+ )
+ }
+ if (verified && hasRight) {
+ return (
+
+
+ }
+ iconBgcolor='#217346'
+ buttons={[]}
+ getHeight={this.resetHeight.bind(this)}
+ buttonSpace={10}
+ showDropIcon={true}
+ dropMenuDatas={this.getRightMenu()}
+ >
+
+
+
+
+ {this.getSearchButtons()}
+
+
+
+
+ )
+ }
+ return ()
+
+ }
+
+ getRightMenu(){
+ let btns = [];
+ btns.push({
+ key: "search",
+ icon: ,
+ content:getLabel(197,"搜索"),
+ onClick: this.forwardQueryResult.bind(this)
+ });
+ return btns;
+ }
+ getSearchButtons() {
+ const { prjMonitorStore } = this.props;
+ const {clearFormFields,setSelectedTreeKey} = prjMonitorStore;
+ const btnStyle = {borderRadius: 3, minWidth: 80}
+ return [
+ (),
+ (),
+ ()
+ ]
+ }
+ forwardQueryResult(){
+ const path = "/monitorResult";
+ this.context.router.push({
+ pathname: "/main/prj"+path
+ });
+ }
+}
+
+export default WeaTools.tryCatch(React,
+ props => ,
+ {error: ""}
+)(ProjectMonitor);
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/LSimg/finish.png b/pc4mobx/prj/components/portal/LSimg/finish.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c7f0a9ac17e237245c91390cff6843d70f1d700
GIT binary patch
literal 14505
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
literal 0
HcmV?d00001
diff --git a/pc4mobx/prj/components/portal/LSimg/working.png b/pc4mobx/prj/components/portal/LSimg/working.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e53a7576d856df6323fcd0d354e8bb71a940168
GIT binary patch
literal 14505
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
+
+
+ );
+ }
+}
diff --git a/pc4mobx/prj/components/portal/TaskView.js b/pc4mobx/prj/components/portal/TaskView.js
new file mode 100644
index 0000000..2698534
--- /dev/null
+++ b/pc4mobx/prj/components/portal/TaskView.js
@@ -0,0 +1,403 @@
+import React from 'react';
+import {withRouter} from 'react-router';
+import { Button, Tabs, Card, Tooltip, Row, Col, Spin, Menu, Select, Modal } from 'antd';
+const Option = Select.Option;
+import { inject, observer } from 'mobx-react';
+import { WeaTab, WeaTop, WeaSelect, WeaSteps, WeaNewScroll, WeaDropdown, WeaTools, WeaRightMenu } from 'ecCom';
+import { toJS } from "mobx";
+const { SubMenu } = Menu;
+const Step = WeaSteps.Step;
+const TabPane = Tabs.TabPane;
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+import TaskList from '../common/TaskList'
+//项目思维导图
+import MindMapPage from "../single/mindmap/MindMapPage";
+import TaskBoard from '../single/taskBoard/taskBoard';
+import TaskCardNew from "../single/task/TaskCardNew";
+import RelateListDialog from "../dialog/relateListDialog"
+import taskBatchEditDialogStore from '../../stores/taskBatchEditDialogStore';
+import "./index.less";
+@inject("projectCardStore")
+@withRouter
+@observer
+class TaskView extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ selectkey : "1"
+ };
+ }
+
+ componentWillReceiveProps(nextprops) {
+ const {prjid} = this.props;
+ if(prjid==''||prjid==null){
+ if (this.props.location.key !== nextprops.location.key) {
+ const { projectCardStore } = nextprops;
+ const { getRightMenu } = projectCardStore;
+ getRightMenu({type:'taskview'});
+ }
+ }else{
+ if (this.props.prjid !== nextprops.prjid) {
+ const { projectCardStore } = nextprops;
+ const { getRightMenu } = projectCardStore;
+ getRightMenu({type:'taskview'});
+ }
+ }
+ }
+
+ render() {
+ const { location,projectCardStore:{ taskInfoStore, canEdit, prjCardStore, taskListStore, getRightMenu},fromPortal } = this.props;
+ let prjid = this.props.prjid;
+ if(prjid==''||prjid==null){
+ prjid = location.query.prjid;
+ }
+ const account = WeaTools.ls.getJSONObj('theme-account');
+ const height = document.body.offsetHeight - 122;
+ let scrollHeight = ($(".e9theme-layout-header").length > 0 || $(".e8theme-layout-header").length > 0) ? height - 55 : height;
+ if(fromPortal){
+ scrollHeight = scrollHeight - 51;
+ }
+ return (
+
+
+
+
+
+ { this.state.selectkey == "1" && {getRightMenu({type:'taskview'});}}/>}
+ { this.state.selectkey == "2" &&
+ {getRightMenu({type:'tasklist'});}} getRightMenu={getRightMenu} />
+ }
+ { this.state.selectkey == "3" && }
+ { this.state.selectkey == "4" && }
+ { this.state.selectkey == "5" && }
+
+
+
+
+
+
+ )
+ }
+
+ addOnClick = () =>{
+ const { location,projectCardStore:{ taskInfoStore } } = this.props;
+ let prjid = this.props.prjid;
+ if(prjid==''||prjid==null){
+ prjid = location.query.prjid;
+ }
+ if(this.state.selectkey == "1"){
+ taskInfoStore.handleDialog(true, "add", '', { prjid: prjid, parentid: "" });
+ }else if(this.state.selectkey == "2"){
+ prjCardStore.taskInfoStore.handleDialog(true, "add", '', { prjid: prjid, parentid: "" });
+ }
+ }
+
+ getButtons = () =>{
+ const {selectkey} = this.state;
+ const { projectCardStore, fromPortal, changeCallBack } = this.props;
+ const { rightMenu, prjid, taskInfoStore, prjCardStore, status, isApprove, getRightMenu } = projectCardStore;
+ const { approveplanstatus } = prjCardStore;
+ let btnArr = [];
+ btnArr.push(
+
+ {getLabel('19407','布局')}
+
+
+ );
+ rightMenu && rightMenu.length > 0 && rightMenu.map(m => {
+ let disabled = false;
+
+ if (approveplanstatus == true) {
+ if (m.type == "BTN_DOSUBMIT") {
+ disabled = true;
+ }
+ }
+
+ if(prjCardStore.taskInfoStore.selectedRowKeys.length == 0){
+ if(m.type == "BTN_DELETEBATCH"){
+ disabled = true;
+ }
+ }
+
+ if(prjCardStore.taskInfoStore.selectedRowKeys.length == 0){
+ if(m.type == "BTN_SUBMITEDIT"){
+ disabled = true;
+ }
+ }
+
+ if((status == '-1' || isApprove)){
+ if(m.type == "BTN_BREAKDOWN"){
+ disabled = true;
+ }
+ }
+
+ m.isTop == '1' && btnArr.length < 4 && btnArr.push(
+
+ );
+ });
+ return btnArr;
+ }
+
+ getRightMenu() {
+ const { projectCardStore } = this.props;
+ const { rightMenu, prjCardStore, status, isApprove } = projectCardStore;
+ const { approveplanstatus } = prjCardStore;
+ let btnArr = [];
+ rightMenu && rightMenu.length > 0 && rightMenu.map(m => {
+ let disabled = false;
+
+ if (approveplanstatus == true) {
+ if (m.type == "BTN_DOSUBMIT") {
+ disabled = true;
+ }
+ }
+
+ if(prjCardStore.taskInfoStore.selectedRowKeys.length == 0){
+ if(m.type == "BTN_DELETEBATCH"){
+ disabled = true;
+ }
+ }
+
+ if(prjCardStore.taskInfoStore.selectedRowKeys.length == 0){
+ if(m.type == "BTN_SUBMITEDIT"){
+ disabled = true;
+ }
+ }
+
+ if((status == '-1' || isApprove)){
+ if(m.type == "BTN_BREAKDOWN"){
+ disabled = true;
+ }
+ }
+
+ btnArr.push({
+ icon:
,
+ content: m.menuName,
+ disabled: disabled
+ })
+ });
+ return btnArr
+ }
+
+ onRightMenuClick(key) {
+ const {selectkey} = this.state;
+ const { projectCardStore, fromPortal, changeCallBack } = this.props;
+ const { rightMenu, prjid, taskInfoStore, prjCardStore, getRightMenu } = projectCardStore;
+ const { relateListStore } = prjCardStore;
+ rightMenu && rightMenu.length > 0 && rightMenu.map((m, i) => {
+ if (Number(key) == i) {
+ if (m.type == "BTN_ADDTASK") { //添加任务
+ if(selectkey == "1"){
+ taskInfoStore.handleDialog(true, "add", '', { prjid: prjid, parentid: "" });
+ }else if(selectkey == "2"){
+ prjCardStore.taskInfoStore.handleDialog(true, "add", '', { prjid: prjid, parentid: "" });
+ }
+ } else if (m.type == 'BTN_DOSUBMIT') { //提交执行
+ Modal.confirm({
+ title: getLabel(15172, "系统提示"),
+ content: getLabel(83919, "你确定要提交执行吗?"),
+ onOk() {
+ prjCardStore.doPlanOpt_task({ method: 'approveplan', prjid: prjid, callBack: ()=> {
+ if(fromPortal){
+ changeCallBack();
+ }
+ if(selectkey == "1"){
+ getRightMenu({type:'taskview'});
+ }else if(selectkey == "2"){
+ getRightMenu({type:'tasklist'});
+ }
+ } });
+ },
+ onCancel() { },
+ });
+ } else if (m.type == 'BTN_APPSUBMIT') { //提交执行(审批)
+ Modal.confirm({
+ title: getLabel(15172, "系统提示"),
+ content: getLabel(83921, "你确定要提交审批吗?"),
+ onOk() {
+ prjCardStore.doPlanOpt_task({ method: 'submitplan', prjid: prjid, callBack: ()=> {
+ if(fromPortal){
+ changeCallBack();
+ }
+ if(selectkey == "1"){
+ getRightMenu({type:'taskview'});
+ }else if(selectkey == "2"){
+ getRightMenu({type:'tasklist'});
+ }
+ } });
+ },
+ onCancel() { },
+ });
+ } else if (m.type == 'BTN_TASKEXPORT') { //导出任务
+ prjCardStore.doTaskExcelExp({ prjid: prjid });
+ } else if (m.type == 'BTN_SAVEPLAN') { //存为计划版本
+ prjCardStore.saveasplan({ method: 'saveasplan', prjid: prjid },() =>{prjCardStore.initData(prjid);});
+ } else if (m.type == 'BTN_TASKHISTORY') { //历史版本
+ relateListStore.handleRelateDialog(true, "history", prjid)
+ } else if (m.type == 'BTN_NOTEMEMBER') { //通知成员
+ if(selectkey == "1"){
+ relateListStore.handleRelateDialog(true, "notice", prjid);
+ }else if(selectkey == "2"){
+ prjCardStore.relateListStore.handleRelateDialog(true, "notice", prjid);
+ }
+ } else if (m.type == 'BTN_ONREQUEST') { //相关流程
+ if(selectkey == "1"){
+ relateListStore.handleRelateDialog(true, "request", prjid);
+ }else if(selectkey == "2"){
+ prjCardStore.relateListStore.handleRelateDialog(true, "request", prjid);
+ }
+ } else if (m.type == 'BTN_ONDOC') { //相关文档
+ if(selectkey == "1"){
+ relateListStore.handleRelateDialog(true, "doc", prjid);
+ }else if(selectkey == "2"){
+ prjCardStore.relateListStore.handleRelateDialog(true, "doc", prjid);
+ }
+ } else if (m.type == 'BTN_ONCOWORK') { //相关协作
+ if(selectkey == "1"){
+ relateListStore.handleRelateDialog(true, "cowork", prjid);
+ }else if(selectkey == "2"){
+ prjCardStore.relateListStore.handleRelateDialog(true, "cowork", prjid);
+ }
+ } else if (m.type == 'BTN_LOG') { //日志
+ relateListStore.handleRelateDialog(true, "log", prjid)
+ } else if(m.type == "BTN_DELETEBATCH" ){ //批量删除
+ prjCardStore.delTaskBatch("delbatch",{callBack: ()=> {
+ if(selectkey == "2"){
+ getRightMenu({type:'tasklist'});
+ }
+ }});
+ } else if(m.type == "BTN_EDITBATCH" ){ //批量编辑
+ prjCardStore.setIsBatchEdit(1);
+ prjCardStore.getPrjTaskList();
+ prjCardStore.resetTaskInfoStore();
+ getRightMenu({type:'taskBatchEdit'});
+ } else if(m.type == "BTN_BACK" ){ //返回
+ prjCardStore.setIsBatchEdit(0);
+ prjCardStore.getPrjTaskList();
+ prjCardStore.resetTaskInfoStore();
+ getRightMenu({type:'tasklist'});
+ } else if(m.type == "BTN_SUBMITEDIT" ){ //提交编辑
+ taskBatchEditDialogStore.setVisible(true);
+ } else if(m.type == "BTN_BREAKDOWN" ){ //任务分解
+ prjCardStore.triggerBreakDownWF({callBack: ()=> {
+ if(fromPortal){
+ changeCallBack();
+ }
+ if(selectkey == "1"){
+ getRightMenu({type:'taskview'});
+ }else if(selectkey == "2"){
+ getRightMenu({type:'tasklist'});
+ }
+ }});
+ }
+ }
+ });
+ }
+
+ changeOption = (key) =>{
+ const { projectCardStore, prjid } = this.props;
+ const { getRightMenu, prjCardStore } = projectCardStore;
+ this.setState({selectkey : key});
+ if(key==1){
+ getRightMenu({type:'taskview'});
+ }else if(key==2){
+ prjCardStore.prjid = prjid;
+ prjCardStore.setIsBatchEdit(0);
+ prjCardStore.getPrjTaskCondition();
+ prjCardStore.getPrjTaskVersion();
+ prjCardStore.getPrjTaskList();
+ getRightMenu({type:'tasklist'});
+ }else if(key==3){
+ getRightMenu({type:'mindmap'});
+ }else if(key==4){
+ getRightMenu({type:'taskboard'});
+ }
+ if(key!=2&&prjCardStore.taskListSearchParams){
+ prjCardStore.taskListSearchParams.version = '0';
+ }
+ }
+
+}
+
+export default TaskView;
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/cardContent/count.js b/pc4mobx/prj/components/portal/cardContent/count.js
new file mode 100644
index 0000000..f04e668
--- /dev/null
+++ b/pc4mobx/prj/components/portal/cardContent/count.js
@@ -0,0 +1,44 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-04-02 11:45:21
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-04-24 16:12:13
+ */
+import React from 'react';
+import { Row, Col, Progress, Tooltip } from 'antd';
+import { inject, observer } from 'mobx-react';
+import chunk from 'lodash/chunk';
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+export const Count = inject('projectCardStore')(observer((props) => {
+ const { jxz, rwzs, wcl, wks, xmjd, yq, yql, ywc } = props.projectCardStore.statistics;
+ const top = [{ label: getLabel('31411','项目进度'), value: xmjd, status: "", key: "0" },
+ { label: getLabel('30447','完成率'), value: wcl, status: "success", key: "1" },
+ { label: getLabel('518313','延期率'), value: yql, status: "exception", key: "2" }];
+ const boottom = [{ label: getLabel('383462','未开始'), value: wks, key: "0" },
+ { label: getLabel('1960','进行中'), value: jxz, key: "1" },
+ { label: getLabel('23774','已完成'), value: ywc, key: "2" },
+ { label: getLabel('2244','延期'), value: yq, key: "4" }];
+ return (
+
+
+ {top.length > 0 && top.map(t => (
+
+
+
+
+ ))}
+
+
+ {
+ boottom.length > 0 && boottom.map((cell) => (
+
+ {cell.value}
+ {cell.label}
+
+ ))
+ }
+
+ )
+}))
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/cardContent/header.js b/pc4mobx/prj/components/portal/cardContent/header.js
new file mode 100644
index 0000000..14dca9e
--- /dev/null
+++ b/pc4mobx/prj/components/portal/cardContent/header.js
@@ -0,0 +1,26 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-04-02 14:00:48
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-04-03 10:40:13
+ */
+import { inject, observer } from 'mobx-react';
+import { Row, Col } from 'antd';
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+const prefixCls = 'prj-portal';
+export const Header = inject('projectCardStore')(observer((props) => {
+ const { baseInfo: { members, creatername, createdate }, statistics: { rwzs }, projectInfo:{prjname} } = props.projectCardStore;
+ return (
+
+ {prjname}
+ ({creatername} {getLabel('127511','创建于')} {createdate})
+
+
+
+ {getLabel('382623','任务数')}:{rwzs}
+ {getLabel('518260','成员数')}:{members}
+
+
+
)
+}))
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/cardContent/overview.js b/pc4mobx/prj/components/portal/cardContent/overview.js
new file mode 100644
index 0000000..0c57bcb
--- /dev/null
+++ b/pc4mobx/prj/components/portal/cardContent/overview.js
@@ -0,0 +1,47 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-03-02 10:02:54
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-03-02 10:22:49
+ */
+import {Col} from 'antd';
+import Steps from './steps.js';
+import LoadingSpinner from '../LoadingSpinner.js';
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+const prefixCls = "prj-portal";
+const Ovreview = props => {
+ const {manager, managericons, stages, loading, planbegindate, planenddate} = props.overviewProp;
+ if (props.loading && stages.length === 0) {
+ return (
+
+ );
+ }
+ return (
+
+
+
{getLabel('17802','项目负责人')}
+
+
+
+
{getLabel('518321','项目计划周期')}
+
+ {planbegindate} ~
+ {planenddate}
+
+
+
+
{getLabel(26797,"项目阶段")}
+
+
+
+
+
+ )
+
+}
+export default Ovreview;
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/cardContent/steps.js b/pc4mobx/prj/components/portal/cardContent/steps.js
new file mode 100644
index 0000000..0ae0b01
--- /dev/null
+++ b/pc4mobx/prj/components/portal/cardContent/steps.js
@@ -0,0 +1,75 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-02-27 15:02:53
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-03-02 21:51:42
+ */
+import LoadingSpinner from '../LoadingSpinner.js';
+import start1 from "../LSimg/start1.png";
+import finish from "../LSimg/finish.png";
+import working from "../LSimg/working.png";
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+const prefixCls = "prj-portal";
+const Steps = props => {
+ const { stages,loading } = props;
+ if (props.loading && stages.length === 0) {
+ return (
+
+ );
+ }
+ if (stages.length === 0) {
+ return (
+
{getLabel('518322','目前项目没进度')}
+ );
+ }
+ return (
+
+ {
+ stages && stages.map((item,index)=>{
+ let imgsrc = "";
+ if(index == 0){
+ imgsrc = start1;
+ }else if(index == stages.length - 1) {
+ imgsrc = finish;
+ }else{
+ imgsrc = working;
+ }
+ return (
+
+

+
+
{item.num||0}
+
{item.name}
+
+
+ );
+ })
+ }
+
+ );
+};
+let x = 0;
+const mousedownFun = (stages,ev)=>{
+ const oEvent = ev || event;
+ oEvent.preventDefault();
+ const content = document.getElementsByClassName('prj-portal-steps-body')[0];
+ const contentBox = stages.length * document.getElementsByClassName('prj-portal-inner_item')[0].offsetWidth + (stages.length-1) * 20;
+ const scoll = contentBox - content.offsetWidth;
+ if(contentBox > content.offsetWidth){
+ x = oEvent.clientX - content.offsetLeft;
+ content.onmousemove = function(ev) {
+ const oEvent = ev || event;
+ var m = oEvent.clientX - x;
+ if(m > (scoll)) m = scoll;
+ if(m<0 && Math.abs(m) > content.offsetWidth ) m = -content.offsetWidth;
+ content.style.left = m + 'px';
+ }
+ content.onmouseup = function(ev) {
+ const oEvent = ev || event;
+ content.onmousemove = null;
+ content.onmouseup = null;
+ };
+ }
+}
+export default Steps;
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/edit/config.js b/pc4mobx/prj/components/portal/edit/config.js
new file mode 100644
index 0000000..c9c64f3
--- /dev/null
+++ b/pc4mobx/prj/components/portal/edit/config.js
@@ -0,0 +1,78 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-03-12 17:10:05
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-04-20 17:01:46
+ */
+import { Button } from 'antd';
+import { WeaLocaleProvider } from 'ecCom';
+import _ from 'lodash';
+const getLabel = WeaLocaleProvider.getLabel;
+import { objDocument, objFlow, objCustomer, objProject, objTask, upload, toolbarfun } from './configUtil';
+const ckConfig = (visibleDialog) => {
+ const height = visibleDialog ? (window.screen.width>=1920?600 - 31:400 - 31) : 50;
+ const autoGrow_minHeight = visibleDialog ? (window.screen.width>=1920?600 - 31:400 - 31) : 150;
+ const autoGrow_maxHeight = visibleDialog ? (window.screen.width>=1920?600 - 31:400 - 31) : 160;
+ const toolbar = toolbarfun(visibleDialog);
+ return {
+ toolbar: toolbar,
+ extraPlugins: 'autogrow',
+ height: height,
+ autoGrow_minHeight: autoGrow_minHeight,
+ autoGrow_maxHeight: autoGrow_maxHeight,
+ removePlugins: 'resize',
+ uploadUrl: (window.ecologyContentPath || '')+'/api/doc/upload/uploadFile?model=reply',
+ }
+}
+const bottomBarRight = (submitfun, loading="false",fun) => {
+ return {
+ Component:
+
+
+
+ }
+
+};
+const bottomBarConfig = (params, fun) => {
+ const { exchangeList = {}, type } = params;
+ const barConfig1 = [{
+ name: 'Component',
+ show:
{getLabel('518320','全屏编辑')},
+ }];
+ let barConfig2 = [];
+ if (Object.keys(exchangeList).length > 0) {
+ exchangeList.docids && barConfig2.push(objDocument);//相关文档
+ exchangeList.relatedwf && barConfig2.push(objFlow);//相关流程
+ exchangeList.relatedcus && barConfig2.push(objCustomer);//相关客户
+ exchangeList.projectids && barConfig2.push(objProject);//相关项目
+ exchangeList.relatedprj && barConfig2.push(objTask);//相关任务
+ exchangeList.relateddoc && barConfig2.push(upload({ exchangeList }));
+ }
+ return _.get({
+ 'simple': barConfig1,
+ 'complex': barConfig2
+ }, type)
+}
+export {
+ ckConfig,
+ bottomBarRight,
+ bottomBarConfig
+}
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/edit/configUtil.js b/pc4mobx/prj/components/portal/edit/configUtil.js
new file mode 100644
index 0000000..f76c13c
--- /dev/null
+++ b/pc4mobx/prj/components/portal/edit/configUtil.js
@@ -0,0 +1,104 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-03-12 16:47:08
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-04-21 10:45:05
+ */
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+const toolbarfun = (visibleDialog) => (
+ [
+ // { name: 'document', items: ['Source'], type: 'simple' },
+ { name: 'document', items: ['Source'] ,type: 'fuza'},
+ { name: 'paragraph', items: ['JustifyLeft', 'JustifyCenter', 'JustifyRight', '-', 'NumberedList', 'BulletedList'] ,type: 'fuza'},
+ { name: 'styles', items: ['Format', 'Font', 'FontSize'], type: 'fuza'},
+ { name: 'styles', items: ['FontSize'], type: 'simple' },
+ { name: 'colors', items: ['TextColor'] ,type: 'fuza'},
+ { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike',], type: 'simple'},
+ { name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike',], type: 'fuza'},
+ { name: 'basicstyles', items: ['Bold', 'Italic'] ,type: 'fuza'}
+ ].filter(i => {
+ if (visibleDialog === true) {
+ return i.type === 'fuza'
+ } else {
+ return i.type === 'simple'
+ }
+ })
+)
+const mirror = {
+ Document: { type: 37, name: getLabel(126529, "文档"), icon: 'icon-blog-Document' },
+ Flow: { type: 152, name: getLabel(131692, "流程"), icon: 'icon-blog-Process' },
+ Customer: { type: 18, name: getLabel(30043, "客户"), icon: 'icon-blog-Personnel' },
+ Project: { type: 135, name: getLabel(30046, "项目"), icon: 'icon-blog-Project' },
+ Task: { type: 'prjtsk', name: getLabel(383349, "任务"), icon: 'icon-blog-Task' },
+}
+const objDocument = {
+ name: 'Browser',
+ show:
+
+ {mirror['Document'].name}
+
,
+ type: mirror['Document'].type,
+ title: mirror['Document'].name,
+};
+const objFlow = {
+ name: 'Browser',
+ show:
+
+ {mirror['Flow'].name}
+
,
+ type: mirror['Flow'].type,
+ title: mirror['Flow'].name,
+};
+const objCustomer = {
+ name: 'Browser',
+ show:
+
+ {mirror['Customer'].name}
+
,
+ type: mirror['Customer'].type,
+ title: mirror['Customer'].name,
+};
+
+const objProject = {
+ name: 'Browser',
+ show:
+
+ {mirror['Project'].name}
+
,
+ type: mirror['Project'].type,
+ title: mirror['Project'].name,
+};
+const objTask = {
+ name: 'Browser',
+ show:
+
+ {mirror['Task'].name}
+
,
+ type: mirror['Task'].type,
+ title: mirror['Task'].name,
+};
+const upload = (params) => {
+ const { exchangeList } = params;
+ return {
+ name: 'Upload',
+ show:
+
+ {getLabel(128158, "附件")}
+
,
+ uploadId: 'project_edit',
+ uploadUrl: `${exchangeList.relateddoc.uploadUrl}?category=${exchangeList.relateddoc.category}`,
+ category: exchangeList.relateddoc.category,
+ maxUploadSize: exchangeList.relateddoc.maxSize,
+ style: { display: "inline-block", padding: 0 }
+ }
+}
+export {
+ objDocument,
+ objFlow,
+ objCustomer,
+ objProject,
+ objTask,
+ upload,
+ toolbarfun
+}
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/edit/index.js b/pc4mobx/prj/components/portal/edit/index.js
new file mode 100644
index 0000000..aaf01b3
--- /dev/null
+++ b/pc4mobx/prj/components/portal/edit/index.js
@@ -0,0 +1,51 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-03-12 15:33:18
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-04-21 14:57:29
+ */
+import React from 'react';
+import { Row } from "antd";
+import { WeaRichText, WeaNewScroll } from "ecCom";
+import { ckConfig, bottomBarRight, bottomBarConfig } from "./config.js";
+import { toJS } from "mobx"
+export default class Edit extends React.Component {
+ render() {
+ const { visibleDialog, exchangeList={}, showRich, showRichfun, richPlaceholder, setIsCreate, canSubmit } = this.props;
+ const barConfig = visibleDialog ? "complex" : "simple";
+ if (showRich || visibleDialog) {
+ const { transfStr, richChange, richSubmitfun, showDialogfun, richid, loading, value } = this.props;
+ return (
+
+ (this.richtext = richtext)}
+ ckConfig={ckConfig(visibleDialog)}
+ bottomBarConfig={bottomBarConfig({ exchangeList, type: barConfig }, this.showDialogfun)}
+ bottomBarRight={!visibleDialog && bottomBarRight(richSubmitfun,loading, (bool) => showRichfun(bool))}
+ onChange={(text) => richChange(text)}
+ onToolsChange={(name, ids, list, type) => transfStr(name, ids, list, type, 'create')}
+ value={value}
+ />
+
+
+ )
+ } else {
+ return (
+
{
+ if(canSubmit){
+ showRichfun(true);
+ setIsCreate(true);
+ }
+ }}>
+ {richPlaceholder}
+
+ )
+ }
+ }
+ showDialogfun = () => {
+ const { showDialogfun, showRichfun } = this.props;
+ showDialogfun(true);
+ showRichfun(false);
+ }
+}
\ No newline at end of file
diff --git a/pc4mobx/prj/components/portal/index.js b/pc4mobx/prj/components/portal/index.js
new file mode 100644
index 0000000..ddaf2e0
--- /dev/null
+++ b/pc4mobx/prj/components/portal/index.js
@@ -0,0 +1,670 @@
+import React from 'react';
+import { Button, Tabs, Card, Tooltip, Row, Col, Spin, Menu, Icon } from 'antd';
+import { inject, observer } from 'mobx-react';
+import { WeaTop, WeaInputSearch, WeaLeftRightLayout, WeaNewScroll, WeaEchart, WeaDropdown, WeaProgress, WeaNewScrollPagination, WeaSelect, WeaAlertPage, WeaTab, WeaRightMenu } from 'ecCom';
+import {routerShape} from 'react-router';
+const { SubMenu } = Menu;
+import AddPrjGroupDialog from '../dialog/addPrjGroupDialog';
+import {toJS} from 'mobx';
+import {Condition,getAdButtons} from '../list/portalCondition';
+import {WeaTableNew} from 'comsMobx';
+const WeaTable = WeaTableNew.WeaTable;
+import { WeaLocaleProvider } from 'ecCom';
+const getLabel = WeaLocaleProvider.getLabel;
+import loadjs from 'loadjs';
+import "./index.less";
+import ShareDialog from '../dialog/shareDialog'
+import ExchangeDialog from '../dialog/exchangeDialog'
+import ProjectDialog from '../dialog/projectDialog'
+import ItemList from "../projectBoard/ItemList";
+import ProjectCard from "./projectCard";
+@inject("projectPortalStore","queryPrjStore","projectBoardStore")
+@observer
+class ProjectPortal extends React.Component {
+ static contextTypes = {
+ router: routerShape
+ }
+ constructor(props) {
+ super(props);
+ this.state = {
+ current: 'allPrj',
+ ctrlHeight : 200,
+ viewScope : "card",
+ showSearchAd : false,
+ selectedKey : 0
+ };
+ }
+ componentDidMount() {
+ const {projectPortalStore, queryPrjStore, location:{query}, projectBoardStore} = this.props;
+ queryPrjStore.initDatas(query);
+ projectPortalStore.initDatas({viewScope:this.state.viewScope});
+ projectBoardStore.initList();
+ // if (!loadjs.isDefined('weaPrjEcharts')) {
+ // loadjs(['/js/echart/echarts.min.js'], 'weaPrjEcharts', {
+ // success: () => {
+ // projectPortalStore.initDatas({viewScope:this.state.viewScope});
+ // }
+ // });
+ // } else {
+ // projectPortalStore.initDatas({viewScope:this.state.viewScope});
+ // }
+ // console.log(this.refs);
+ // this.setState({
+ // ctrlHeight: this.refs.searGroup.height
+ // });
+
+ }
+
+ componentWillReceiveProps(nextProps){
+ const keyOld = this.props.location.key;
+ const keyNew = nextProps.location.key;
+ const query = nextProps.location.query;
+ if(keyOld !== keyNew) {
+ const { projectPortalStore, queryPrjStore, projectBoardStore } = nextProps;
+ queryPrjStore.clearStatus();
+ queryPrjStore.initDatas(query);
+ projectPortalStore.clearStatus();
+ projectPortalStore.prjGroupStore1.setId('allPrj');
+ this.setState({viewScope : "card",current: 'allPrj'});
+ projectPortalStore.initDatas({viewScope:this.state.viewScope});
+ projectBoardStore.initList();
+ // if (!loadjs.isDefined('weaPrjEcharts')) {
+ // loadjs(['/js/echart/echarts.min.js'], 'weaPrjEcharts', {
+ // success: () => {
+ // projectPortalStore.initDatas({viewScope:this.state.viewScope});
+ // projectBoardStore.initList();
+ // }
+ // });
+ // } else {
+ // projectPortalStore.initDatas({viewScope:this.state.viewScope});
+ // projectBoardStore.initList();
+ // }
+ }
+ }
+
+ componentWillUnmount (){
+ const { queryPrjStore, projectPortalStore } = this.props;
+ queryPrjStore.clearStatus();
+ projectPortalStore.clearStatus();
+ projectPortalStore.prjGroupStore1.setId('allPrj');
+ this.setState({viewScope : "card",current: 'allPrj',selectedKey:0});
+ }
+
+ render() {
+ const { projectPortalStore, queryPrjStore, projectBoardStore } = this.props;
+ const { title, prjGroupStore, groups, prjGroupStore1, tableStore, reLoad, loadding, exchangeStore, projectInfoStore, quickSearch, counts, initDatas, isLoadJs, prjtype } = projectPortalStore;
+ const { form, showSearchAd } = queryPrjStore;
+ let prjdatas = this.getProjects();
+ const formParams = form.getFormParams() || {};
+ const topTab = [
+ {
+ title: getLabel('31458','分组') ,
+ viewcondition: "0"
+ },
+ {
+ title: getLabel('320','列表'),
+ viewcondition: "1"
+ }
+ ];
+ return (
+
+
+ } buttons={this.getTopButtons()} iconBgcolor='#217346'/>
+
+
+ {/*
{quickSearch(v)}}
+ /> */}
+ {
+ this.setState({ selectedKey: v });
+ queryPrjStore.form.resetConditionValue();
+ queryPrjStore.form.updateFields({'prjtype':'-1'});
+ if(v==0){
+ initDatas({viewScope:this.state.viewScope});
+ }else if(v==1){
+ projectBoardStore.initList();
+ }
+ }}
+ />
+ {
+ if(this.state.selectedKey==0){
+ initDatas(formParams);
+ }else if(this.state.selectedKey==1){
+ projectBoardStore.getProjectList1(formParams);
+ }
+ })}
+ searchType={['base','advanced']}
+ showSearchAd={showSearchAd}
+ searchsAd={
+
+ }
+ setShowSearchAd={bool=>{queryPrjStore.setShowSearchAd(bool)}}
+ keyParam="key"
+ searchsBaseValue={formParams.name}
+ onSearchChange={v=>{queryPrjStore.appendFormFields({name:{value:v}})}}
+ onSearch={() =>{
+ if(this.state.selectedKey==0){
+ initDatas(formParams);
+ }else if(this.state.selectedKey==1){
+ projectBoardStore.getProjectList1(formParams);
+ }
+ }}
+ leftStyle={{paddingRight: 350}}
+ />
+ {
+ this.state.selectedKey==0&&
+
+ { this.setState({ scrollTop:e.target.scrollTop, }) }}>
+
+
+
+ }
+ {
+ this.state.selectedKey==1&&
+
+ }
+
+
+
+
+ }
+ // onCollapse={showLeft => console.log('showLeft:', showLeft)}
+ >
+ {
+ this.state.selectedKey==0&&this.state.viewScope=="card" && prjdatas.length==0 &&
+
+
+
+ {getLabel(83553, '暂无数据')}
+
+
+
+ }
+ {
+ this.state.selectedKey==0&&this.state.viewScope=="card" && prjdatas.length > 0 &&
+
+ {
+ prjdatas.map((item,i)=>{
+ return {item}
+ })
+ }
+
+ }
+ {
+ this.state.selectedKey==0&&this.state.viewScope=="list" &&
reLoad()}
+ getColumns={c=>this.reRenderColumns(c)}
+ tableWidth={this.tableWidth}
+ onOperatesClick={this.onOperatesClick.bind(this)}
+ />
+ }
+ {
+ this.state.selectedKey==1&&(parseInt(projectBoardStore.prjid)>0?
+ {projectBoardStore.getProjectList1(formParams);}} changeCallBack={() =>{projectBoardStore.getProjectList1(formParams);}} >
+ :
+
+
+
+ {getLabel(83553, '暂无数据')}
+
+
+
)
+ }
+
+
+
+
+
+
+ )
+ }
+
+ onEnterSearch=() =>{
+ const { projectPortalStore,queryPrjStore } = this.props;
+ const { form } = queryPrjStore;
+ const formParams = form.getFormParams() || {};
+ projectPortalStore.initDatas(formParams);
+ queryPrjStore.setShowSearhAd(false);
+ }
+ onOperatesClick(record,index,operate,flag){
+ const {projectPortalStore} = this.props;
+ const {shareStore,exchangeStore,projectInfoStore} = projectPortalStore;
+ let _href = operate && operate.href ? operate.href : "";
+ let fn = _href.replace("javascript:","");
+ fn = fn.substring(0,fn.indexOf('('));
+ let that = this;
+ if(fn != ""){
+ if("onShare"==fn){ //共享
+ shareStore.handleShareDialog(true,"prj",record.randomFieldId)
+ }else if('onNormal' == fn){ //正常
+ projectPortalStore.doPlanOpt({method:'normal',prjid:record.randomFieldId})
+ }else if('onOver' == fn){ //延期
+ projectPortalStore.doPlanOpt({method:'delay',prjid:record.randomFieldId})
+ }else if('onFinish' == fn){ //完成
+ projectPortalStore.doPlanOpt({method:'complete',prjid:record.randomFieldId})
+ }else if('onFrozen' == fn){ //冻结
+ projectPortalStore.doPlanOpt({method:'freeze',prjid:record.randomFieldId})
+ }else if('onEdit' == fn){ //编辑
+ projectInfoStore.handleDialog(true,record.randomFieldId,{viewtype:'edit',prjid:record.randomFieldId}) ;
+ }else if('onListTask' == fn){ //任务列表
+
+ }else if('onDiscuss' == fn){ //相关交流
+ exchangeStore.handleExchangeDialog(true,"prj",record.randomFieldId,{})
+ }else if('onDel' == fn){ //项目删除
+ projectPortalStore.delPrjInfo({method:"del",prjid:record.randomFieldId,from:"mymanagerproject"})
+ }
+ }
+ }
+
+ onScrollEnd = () => {
+ const { projectPortalStore, queryPrjStore } = this.props;
+ const { searchNextPage } = projectPortalStore;
+ const { form } = queryPrjStore;
+ const formParams = form.getFormParams() || {};
+ searchNextPage(formParams);
+ }
+
+ tableWidth = (columns) => {
+ let width = 0;
+ let cols = 0;
+ columns.map(col => {
+ if (col.display === 'true') {
+ let oldwidth = col.oldWidth || '10%';
+ let widthInt = parseFloat(oldwidth.replace('%', ''));
+ if (widthInt <= 0) {
+ widthInt = 10;
+ }
+ width += widthInt;
+ cols++
+ }
+ })
+ //超过10列,才出现滚动条,width>100才出现滚动条
+ if(cols<=10){
+ width = 100 ;
+ }
+ return `${width}%`;
+ }
+
+ reRenderColumns(columns){
+ columns.forEach((c,i)=>{
+ if(c.dataIndex=='finish'){
+ c.render = function(text, record){
+ return