|
|
@ -1,10 +1,18 @@ |
|
|
|
import * as React from 'react'; |
|
|
|
import * as React from 'react'; |
|
|
|
import { ISummaryProjectData } from '../../interfaces/ISummaryProjectData'; |
|
|
|
import { ISummaryProjectData } from '../../interfaces/ISummaryProjectData'; |
|
|
|
import { DetailsList, SelectionMode, DetailsListLayoutMode } from 'office-ui-fabric-react/lib/DetailsList'; |
|
|
|
import { |
|
|
|
|
|
|
|
DetailsList, |
|
|
|
|
|
|
|
SelectionMode, |
|
|
|
|
|
|
|
DetailsListLayoutMode, |
|
|
|
|
|
|
|
ConstrainMode, |
|
|
|
|
|
|
|
DetailsRow |
|
|
|
|
|
|
|
} from "office-ui-fabric-react/lib/DetailsList"; |
|
|
|
import { values } from '@uifabric/utilities/lib'; |
|
|
|
import { values } from '@uifabric/utilities/lib'; |
|
|
|
|
|
|
|
import { sp, Web, Field } from "@pnp/sp"; |
|
|
|
|
|
|
|
|
|
|
|
export interface IComponentProps{ |
|
|
|
export interface IComponentProps { |
|
|
|
projectInfo: ISummaryProjectData |
|
|
|
order: string; |
|
|
|
|
|
|
|
context: any; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export interface IComponentState { |
|
|
|
export interface IComponentState { |
|
|
@ -16,108 +24,99 @@ export interface IComponentState { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default class SummaryContainer extends React.Component<IComponentProps, IComponentState> { |
|
|
|
export default class SummaryContainer extends React.Component<IComponentProps,IComponentState> { |
|
|
|
public state = { |
|
|
|
public state = { |
|
|
|
items: null |
|
|
|
items: [] |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
componentDidMount(){ |
|
|
|
componentDidMount() { |
|
|
|
const {projectInfo} =this.props; |
|
|
|
const { order, context } = this.props; |
|
|
|
let missCount = 0; |
|
|
|
let relUrl = context.pageContext.web.serverRelativeUrl; |
|
|
|
let rows = [ |
|
|
|
let prjCode = relUrl ? relUrl.split("/")[relUrl.split("/").length - 1] : ""; |
|
|
|
{ |
|
|
|
|
|
|
|
key: 1, |
|
|
|
let web = new Web("http://portal.vertex.spb.ru/PMIS"); |
|
|
|
fieldName: 'Руководитель проекта', |
|
|
|
let webMDM = new Web("http://portal.vertex.spb.ru/sites/mdm"); |
|
|
|
value: projectInfo.chief, |
|
|
|
let dispItems = webMDM.lists.getById("35b69b82-eb54-46fb-a8b4-2c763b11e10f").items.select("Title, Order0").get(); |
|
|
|
}, |
|
|
|
let fields = web.lists.getById("eeba7db6-4c28-41a2-a54e-82a2aaf0ca15").fields.get(); |
|
|
|
{ |
|
|
|
|
|
|
|
key: 2, |
|
|
|
Promise.all([dispItems, fields]).then(result=>{ |
|
|
|
fieldName: 'Статус', |
|
|
|
let sortedDispItems = result[0].sort((a, b) => a.Order0 - b.Order0); |
|
|
|
value: projectInfo.status, |
|
|
|
let allFields = result[1]; |
|
|
|
}, |
|
|
|
return sortedDispItems.map(dispItem => {
|
|
|
|
{ |
|
|
|
let item = allFields.filter(e => dispItem.Title == e.StaticName); |
|
|
|
key: 3, |
|
|
|
return { |
|
|
|
fieldName: 'Код проекта', |
|
|
|
key: dispItem.Order0, |
|
|
|
value: projectInfo.code, |
|
|
|
fieldName: item[0].LookupField |
|
|
|
}, |
|
|
|
? `${dispItem.Title}/Title` |
|
|
|
{ |
|
|
|
: dispItem.Title, |
|
|
|
key: 4, |
|
|
|
fieldRuTitle: item[0].Title, |
|
|
|
fieldName: 'Портфель проектов', |
|
|
|
LookupField: item[0].LookupField ? dispItem.Title : "" |
|
|
|
value: projectInfo.portfolio, |
|
|
|
};
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 5, |
|
|
|
|
|
|
|
fieldName: 'Программа проектов', |
|
|
|
|
|
|
|
value: projectInfo.programm, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 6, |
|
|
|
|
|
|
|
fieldName: 'Тип проекта', |
|
|
|
|
|
|
|
value: projectInfo.type, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 7, |
|
|
|
|
|
|
|
fieldName: 'Цель проекта', |
|
|
|
|
|
|
|
value: projectInfo.target, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 8, |
|
|
|
|
|
|
|
fieldName: 'Задачи проекта', |
|
|
|
|
|
|
|
value: projectInfo.task, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 9, |
|
|
|
|
|
|
|
fieldName: 'Заказчик проекта', |
|
|
|
|
|
|
|
value: projectInfo.customer, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 10, |
|
|
|
|
|
|
|
fieldName: 'Куратор проекта', |
|
|
|
|
|
|
|
value: projectInfo.curator, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
key: 11, |
|
|
|
|
|
|
|
fieldName: 'Координатор проекта', |
|
|
|
|
|
|
|
value: projectInfo.coordinator, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
].filter(e=>{ |
|
|
|
|
|
|
|
return e.value !== "" |
|
|
|
|
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
}).then(res=>{ |
|
|
|
|
|
|
|
let selectedFields = res.map(e=>e.fieldName).join(', '); |
|
|
|
|
|
|
|
let lookupFields = res.filter(e=> e.LookupField !== "").map(e=>e.LookupField).join(', '); |
|
|
|
|
|
|
|
|
|
|
|
this.setState({items: rows}); |
|
|
|
let toState = []; |
|
|
|
|
|
|
|
web.lists |
|
|
|
|
|
|
|
.getById("eeba7db6-4c28-41a2-a54e-82a2aaf0ca15") |
|
|
|
|
|
|
|
.items.filter( |
|
|
|
|
|
|
|
"Code_project eq '" + prjCode + "'" |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
.select(selectedFields) |
|
|
|
|
|
|
|
.expand(lookupFields) |
|
|
|
|
|
|
|
.get() |
|
|
|
|
|
|
|
.then(currentProject => { |
|
|
|
|
|
|
|
res.forEach(e=>{ |
|
|
|
|
|
|
|
let fieldValue = !e.fieldName.match(/\/Title/gi)?currentProject[0][e.fieldName] : currentProject[0][e.fieldName.split('/')[0]]? currentProject[0][e.fieldName.split('/')[0]]['Title'] : '' |
|
|
|
|
|
|
|
if (fieldValue){ |
|
|
|
|
|
|
|
toState.push({ |
|
|
|
|
|
|
|
key: e.key, |
|
|
|
|
|
|
|
fieldName: e.fieldRuTitle, |
|
|
|
|
|
|
|
value: fieldValue |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
this.setState({ items: toState }); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public columns = [ |
|
|
|
public columns = [ |
|
|
|
{ |
|
|
|
{ |
|
|
|
key: 'column1', |
|
|
|
key: "column1", |
|
|
|
name: 'Название', |
|
|
|
name: "Название", |
|
|
|
fieldName: 'fieldName', |
|
|
|
fieldName: "fieldName", |
|
|
|
minWidth: 16, |
|
|
|
minWidth: 16, |
|
|
|
maxWidth: 150 |
|
|
|
maxWidth: 150, |
|
|
|
|
|
|
|
canResizeColumns: true, |
|
|
|
|
|
|
|
isMultiline: true |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
{ |
|
|
|
key: 'column2', |
|
|
|
key: "column2", |
|
|
|
name: 'Значение', |
|
|
|
name: "Значение", |
|
|
|
fieldName: 'value', |
|
|
|
fieldName: "value", |
|
|
|
minWidth: 16, |
|
|
|
minWidth: 16, |
|
|
|
maxWidth: 100 |
|
|
|
canResizeColumns: true, |
|
|
|
}, |
|
|
|
isMultiline: true |
|
|
|
] |
|
|
|
} |
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
public render(): React.ReactElement<IComponentProps> { |
|
|
|
public render(): React.ReactElement<IComponentProps> { |
|
|
|
const {items} = this.state; |
|
|
|
const { items } = this.state; |
|
|
|
return ( |
|
|
|
return ( |
|
|
|
<div> |
|
|
|
<div> |
|
|
|
<DetailsList |
|
|
|
<DetailsList |
|
|
|
|
|
|
|
setKey="items" |
|
|
|
items={items} |
|
|
|
items={items} |
|
|
|
columns={this.columns} |
|
|
|
columns={this.columns} |
|
|
|
compact={true} |
|
|
|
compact={true} |
|
|
|
isHeaderVisible={false} |
|
|
|
isHeaderVisible={false} |
|
|
|
selectionMode={SelectionMode.none} |
|
|
|
|
|
|
|
layoutMode={DetailsListLayoutMode.justified} |
|
|
|
layoutMode={DetailsListLayoutMode.justified} |
|
|
|
|
|
|
|
selectionMode={SelectionMode.none} |
|
|
|
|
|
|
|
constrainMode={ConstrainMode.horizontalConstrained} |
|
|
|
/> |
|
|
|
/> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|