import React from 'react';
import classnames from 'classnames';
import Card from 'components/DetailCard';
import { toJS } from 'mobx';
import { has } from 'lodash';
import { isAdminPage } from 'utils/index';
import { getPath, getLinkRender } from 'utils/route-map';
import styles from './index.less';
export default class BaseDetail extends React.Component {
constructor(props) {
super(props);
this.init();
}
componentDidMount() {
this.fetchData();
}
get id() {
const { id } = this.props.match.params;
return id;
}
get currentUser() {
const { user } = this.props.rootStore || {};
return user || {};
}
get currentProjectId() {
return this.props.rootStore.projectId;
}
get projectId() {
const { project_id, tenant_id, owner, owner_id } = this.detailData;
return project_id || tenant_id || owner || owner_id;
}
get isMyResource() {
return this.projectId === this.currentProjectId;
}
get detailData() {
return this.props.detail || toJS(this.store.detail);
}
get isLoading() {
return this.store.isLoading;
}
get routing() {
return this.props.rootStore.routing;
}
get path() {
const { location: { pathname = '' } = {} } = this.props;
return pathname || '';
}
get leftCards() {
return [];
}
get rightCards() {
return [];
}
get isAdminPage() {
const { pathname = '' } = this.props.location || {};
return isAdminPage(pathname);
}
get shouldFetchDetail() {
return false;
}
get leftCardsStyle() {
return {};
}
getRouteName(routeName) {
return this.isAdminPage ? `${routeName}Admin` : routeName;
}
getRoutePath(routeName, params = {}, query = {}) {
const realName = this.getRouteName(routeName);
return getPath({ key: realName, params, query });
}
getLinkRender(routeName, value, params = {}, query = {}) {
const realName = this.getRouteName(routeName);
return getLinkRender({ key: realName, params, query, value });
}
fetchData = (params) => {
if (this.shouldFetchDetail && this.store.fetchDetail) {
this.store
.fetchDetail({
id: this.id,
...params,
})
.catch(this.catch);
}
};
init() {
this.store = {};
}
renderLeftCards() {
return this.leftCards.map((it, index) => {
const {
title,
titleHelp,
options,
render,
labelCol,
contentCol,
button,
sourceData = undefined,
} = it;
if (render) {
return render();
}
return (
<Card
key={`card-left-${index}`}
className="detail-left-card"
data={sourceData || this.detailData}
title={title}
titleHelp={titleHelp}
options={options}
loading={this.isLoading}
labelCol={labelCol}
contentCol={contentCol}
button={button}
/>
);
});
}
renderRightCards() {
return this.rightCards.map((it, index) => {
const { title, options, labelCol, titleHelp, render, button, className } =
it;
if (render) {
return render();
}
let realLabelCol = 8;
let contentCol = 16;
if (has(it, 'labelCol')) {
realLabelCol = labelCol;
contentCol = 24 - realLabelCol;
}
return (
<Card
key={`card-right-${index}`}
className={classnames('detail-right-card', className)}
data={this.detailData}
title={title}
titleHelp={titleHelp}
options={options}
loading={this.isLoading}
labelCol={realLabelCol}
contentCol={contentCol}
button={button}
/>
);
});
}
renderModal() {
return null;
}
render() {
return (
<div className={classnames(styles.main)}>
<div
className={styles['left-side']}
id="detail-left-side"
style={this.leftCardsStyle}
>
{this.renderLeftCards()}
</div>
<div className={styles['right-side']} id="detail-right-side">
{this.renderRightCards()}
</div>
{this.renderModal()}
</div>
);
}
}