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 0000000..6c7f0a9
Binary files /dev/null and b/pc4mobx/prj/components/portal/LSimg/finish.png differ
diff --git a/pc4mobx/prj/components/portal/LSimg/start1.png b/pc4mobx/prj/components/portal/LSimg/start1.png
new file mode 100644
index 0000000..3b124e8
Binary files /dev/null and b/pc4mobx/prj/components/portal/LSimg/start1.png differ
diff --git a/pc4mobx/prj/components/portal/LSimg/working.png b/pc4mobx/prj/components/portal/LSimg/working.png
new file mode 100644
index 0000000..0e53a75
Binary files /dev/null and b/pc4mobx/prj/components/portal/LSimg/working.png differ
diff --git a/pc4mobx/prj/components/portal/LoadingSpinner.js b/pc4mobx/prj/components/portal/LoadingSpinner.js
new file mode 100644
index 0000000..922843a
--- /dev/null
+++ b/pc4mobx/prj/components/portal/LoadingSpinner.js
@@ -0,0 +1,38 @@
+/*
+ * @Author: lusx
+ * @Date: 2020-02-27 15:45:53
+ * @Last Modified by: lusx
+ * @Last Modified time: 2020-02-27 15:50:41
+ */
+import React from 'react';
+
+const style = {
+ borderRadius: '50%',
+ width: '40px',
+ height: '40px',
+ //margin: 'auto',
+ position: 'relative',
+ borderTop: '3px solid rgba(0, 0, 0, 0.1)',
+ borderRight: '3px solid rgba(0, 0, 0, 0.1)',
+ borderBottom: '3px solid rgba(0, 0, 0, 0.1)',
+ borderLeft: '3px solid #818a91',
+ transform: 'translateZ(0)',
+ animation: 'loading-spinner 0.5s infinite linear',
+};
+
+export default class LoadingSpinner extends React.Component {
+ render() {
+ return (
+
+
+
+ );
+ }
+}
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
+
+
+ }
+ } else {
+ // c.render = function(text, record){
+ // let valueSpan = record[c.dataIndex + "span"] !== undefined ? record[c.dataIndex + "span"] : record[c.dataIndex];
+ // return
+ // }
+ }
+ })
+ return columns;
+ }
+
+ handleClick = e => {
+ const {projectPortalStore,queryPrjStore} = this.props;
+ queryPrjStore.form.resetConditionValue();
+ queryPrjStore.form.updateFields({'prjtype':'-1'});
+ projectPortalStore.setPrjType('-1');
+ projectPortalStore.initDatas({groupid:e.key});
+ projectPortalStore.prjGroupStore1.setId(e.key);
+ this.setState({
+ current: e.key,
+ });
+ };
+
+ getProjects = () => {
+ let row = [];
+ let col= [];
+ const { prjDatas, collectProject, counts, getPrjSearchDatas } = this.props.projectPortalStore;
+ let datas = prjDatas;
+ datas.map((item,index)=>{
+ let data = [];
+ let data2 = [];
+ let dataall = [];
+ for (var i = 0; i < item.xdata.length; i++) {
+
+ data.push([item.xdata[i],item.data[i]]);
+ data2.push([item.xdata[i],item.data2[i]]);
+ dataall.push([item.xdata[i],item.dataall[i]]);
+ }
+
+ col.push(
+
+
+
+
+
+ {this.forwardProjectCard("?prjid="+item.id)}}>{item.name}
+
+
+ {item.dynamic}
+
+
+
+
+ window.pointerXY(e)} >
+
+
+
+
+
+
+
+
+
+
+ {/* 底部按钮组 */}
+
+
+
+
+ {
+ collectProject({prjid:item.id,type:item.isGuanZhu?0:1});
+ item.isGuanZhu=!item.isGuanZhu;
+ if(item.isGuanZhu){
+ counts.mineStar++;
+ }else{
+ counts.mineStar--;
+ }
+ getPrjSearchDatas();
+ }}/>
+
+
+
+
+ )
+ if((index+1)%4 == 0){
+ row.push(col);
+ col= [];
+ }
+ if(index == datas.length-1){
+ row.push(col);
+ col= [];
+ }
+
+ });
+ return row;
+ }
+
+ getTopButtons = () => {
+ const { projectPortalStore, queryPrjStore } = this.props;
+ const { prjtypes, initDatas, setPrjType, setOrderBy, prjtype } = projectPortalStore;
+ const { form } = queryPrjStore;
+ const formParams = form.getFormParams() || {};
+ const options = [
+ {
+ key: "",
+ selected:true,
+ showname: ""
+ },
+ {
+ key: "createtime",
+ showname: getLabel('518253','按创建时间')
+ },
+ {
+ key: "manager",
+ showname: getLabel('518254','按项目经理')
+ }
+ ];
+ let buttons = [];
+ if(this.state.selectedKey==0){
+ buttons.push(
+
+
+ {getLabel('586','项目类型')}
+
+
+
+
+
+
+ {
+ queryPrjStore.appendFormFields({prjtype:{value:v}})
+ setPrjType(v);
+ initDatas(formParams);
+ }}
+ />
+
+
+ );
+ buttons.push(
+
+
+ {getLabel('338','排序')}
+
+
+
+
+
+
+ {
+ setOrderBy(v);
+ initDatas();
+ }}
+ />
+
+
+ );
+ if(this.state.viewScope == "card"){
+ buttons.push(
}
+
+ )
+ } else if (field.conditionType == "DATEPICKER") {
+ item.push(