import React from 'react';
import { CnTab as UICnTab, CnTabItem as UICnTabItem } from '@cainiaofe/cn-ui-m';
import './view.scss';
import isFunction from 'lodash/isFunction';
import {
calculateTextExprValue,
executeFunction,
executeObjectExpr,
getRealResponse,
isDesignMode,
isEmptyButNotZero,
isRequestConfig,
setDataToDs,
} from '@/common/util/util';
import isPlainObject from 'lodash/isPlainObject';
import { __tab_activeKey__ } from '@/common/util/expr-const';
import { getButtonAction } from '@/common/manager/button';
import { CnFilterOnChange, onEvent } from '@/common/util/event-name';
import { makeRequest } from '@/common/manager/request';
import { ButtonPosition } from '@/type/button-position';
class CnTab extends React.Component {
constructor(props) {
super(props);
const defaultActiveKey = this.getDefaultActiveKey();
this.state = {
activeKey: defaultActiveKey,
itemList: [],
};
this.setDataSource({
[__tab_activeKey__]: defaultActiveKey,
});
}
setDataSource = (data) => {
if (data) {
const { _context, _dataSource, _dataSourceName } = this.props;
setDataToDs({
_context,
_dataSource,
_dataSourceName,
data,
});
}
};
getDefaultActiveKey = () => {
const { dataOrigin, items, _context, activeKey } = this.props;
if (dataOrigin !== 'request') {
let first;
if (activeKey) {
first = calculateTextExprValue(activeKey, {
state: _context?.state,
recordDataSource: {},
});
} else {
if (Array.isArray(items)) {
for (const item of items) {
const { primaryKey, hidden } = item;
if (primaryKey) {
const isHidden = executeObjectExpr(
hidden,
{},
{},
_context?.state,
);
if (isHidden !== true) {
first = primaryKey;
break;
}
}
}
}
if (first === undefined) {
first = items[0]?.primaryKey;
}
}
return first;
}
};
getItems = () => {
const { items = [] } = this.props;
const { itemList = [] } = this.state;
const { dataOrigin } = this.props;
if (dataOrigin === 'request') {
return itemList;
}
return items;
};
getUrlParams = () => {
const { _context } = this.props;
return _context?.state?.urlParams || {};
};
getData = () => {
const isDesign = isDesignMode(this.props);
const { dataOrigin, requestConfig, _context } = this.props;
if (dataOrigin === 'request' && isRequestConfig(requestConfig)) {
makeRequest({
buttonConfig: {
options: {
requestConfig,
},
},
urlParamsDataSource: this.getUrlParams(),
recordDataSource: {},
state: _context?.state || {},
needSuccessToast: false,
isDesign,
}).then((res) => {
const res2 = getRealResponse(res);
const { success, data } = res2;
if (success) {
if (isPlainObject(data)) {
const { list, activeKey: originalActiveKey } = data;
const state = {
itemList: [],
};
if (Array.isArray(list) && list.length > 0) {
const newList = list.map((item) => {
if (isPlainObject(item)) {
const { label, value, title, primaryKey } = item;
if (isEmptyButNotZero(title) && label) {
item.title = label;
}
if (isEmptyButNotZero(primaryKey) && value) {
item.primaryKey = value;
}
}
return { ...item };
});
let activeKey = originalActiveKey;
if (isEmptyButNotZero(activeKey)) {
activeKey = newList[0]?.primaryKey;
}
state.itemList = newList;
if (activeKey !== undefined) {
state.activeKey = activeKey;
this.setDataSource({
[__tab_activeKey__]: activeKey,
});
}
}
this.setState(state);
this.executeEvent({
eventType: 'onTabRequestFinish',
activeKey: state.activeKey,
});
}
}
});
}
};
componentDidMount() {
this.getData();
onEvent(CnFilterOnChange, (tableInfo) => {
this.forceUpdate();
});
}
renderTitle(title, props) {
const { renderBadge = () => null } = this.props;
const badge = renderBadge(props);
if (!badge) {
return title;
}
}
clickTab = (tabKey) => {
const items = this.getItems();
const current = items.find((item) => {
if (item) {
return item.primaryKey === tabKey;
}
});
if (current) {
const { optType, url, redirectType } = current;
if (optType === 'link' && url && redirectType) {
if (redirectType === 'current') {
location.href = url;
} else if (redirectType === 'open') {
window.open(url);
}
}
}
};
renderTabItems() {
const items = this.getItems();
const { children, _context, dataOrigin, _customRenderTabItem } = this.props;
let tabItems = [];
if (dataOrigin === 'request') {
if (items.length > 0) {
tabItems = items.map((item) => {
const { title, primaryKey, disabled } = item;
let realTitle = title;
if (typeof _customRenderTabItem === 'function') {
const tempTitle = executeFunction(
_customRenderTabItem,
item,
_context?.state,
);
if (tempTitle) {
realTitle = tempTitle;
}
}
return (
);
});
}
} else {
const isDesign = isDesignMode(this.props);
const safeChildren = Array.isArray(children) ? children : [children];
safeChildren.forEach((child, index) => {
if (!child) {
return null;
}
let childProps;
if (Array.isArray(items) && items[index]) {
childProps = items[index];
} else if (child.props.componentSchema) {
childProps = child.props.componentSchema.props;
} else {
childProps = child.props;
}
const hidden = executeObjectExpr(
childProps?.hidden,
{},
{},
_context?.state,
);
if (hidden === true) {
return null;
}
const title = this.renderTitle(childProps.title, childProps);
tabItems.push(
{child}
,
);
});
}
return tabItems;
}
findItem(activeKey) {
const items = this.getItems();
let ret;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (
activeKey === item.primaryKey ||
(item.customKey && item.customKey === activeKey)
) {
ret = item;
break;
}
}
return ret ? { ...ret, customKey: ret.customKey || ret.primaryKey } : null;
}
setTabActiveKey = (activeKey) => {
this.setDataSource({
[__tab_activeKey__]: activeKey,
});
this.setState({
activeKey,
});
this.executeEvent({
eventType: 'onChange',
activeKey,
});
// const { onTabChange, onChange, fieldId, traceable } = this.props;
// const activeItem = this.findItem(activeKey);
// const key = activeItem?.customKey;
// const changeHandle = onTabChange || onChange;
// this.setState(
// {
// activeKey: activeItem.primaryKey,
// },
// () => {
// if (isFunction(changeHandle)) {
// const activeIndex = this.indexesCache.indexOf(key) + 1;
// changeHandle(activeIndex, key, activeItem);
// }
// },
// );
};
executeEvent = (config) => {
const { eventType, activeKey } = config;
const { events, _context } = this.props;
if (Array.isArray(events) && events.length > 0) {
for (const item of events) {
const { name: eventName, optType, flowList } = item;
if (eventName === eventType) {
const action = getButtonAction({
...item,
position: ButtonPosition.tabEvent,
});
if (typeof action === 'function') {
action({
buttonConfig: {
...item,
position: ButtonPosition.tabEvent,
options: {
...item,
},
},
position: ButtonPosition.tabEvent,
state: _context?.state,
urlParamsDataSource: this.getUrlParams(),
_context,
recordDataSource: activeKey,
});
}
}
}
}
};
render() {
const {
shape,
size,
excessMode,
tabPosition,
contentPadding,
unmountInactiveTabs,
extraRender,
tabRender,
onClose,
// items,
children,
// lazyLoad = true,
dataOrigin,
className,
tabAlign,
type,
} = this.props;
const { activeKey } = this.state;
const isDesign = isDesignMode(this.props);
const tabProps = {
type,
animation: false,
shape,
size,
activeKey,
excessMode,
tabPosition,
unmountInactiveTabs,
onClose,
className,
tabAlign,
};
// if (contentPadding) {
// tabProps.contentStyle = {
// padding: contentPadding,
// };
// }
if (isFunction(extraRender)) {
tabProps.extra = extraRender();
}
if (isFunction(tabRender)) {
tabProps.tabRender = tabRender;
}
if (isDesign && dataOrigin === 'request') {
return (
<>
>
);
}
return (
{this.renderTabItems()}
);
}
}
CnTab.displayName = 'CnTab';
class CnTabItem extends React.Component {
static displayName = 'CnTabItem';
render() {
return <>{this.props.children}>;
}
}
export default [CnTab, CnTabItem];
export { CnTab, CnTabItem };