import * as React from 'react'; import { IBtn, ITopic, IQuotaQuery, IConnectionInfo } from 'types/base-type'; import { showAllPermissionModal, showPermissionModal, showTopicEditModal, showApplyQuatoModal, applyExpandModal, showTopicApplyQuatoModal } from 'container/modal'; import { applyOnlineModal } from 'container/modal'; import { Tooltip } from 'component/antd'; import { topic } from 'store/topic'; import { region } from 'store/region'; import { cellStyle } from 'constants/table'; import { MoreBtns } from 'container/custom-component'; import { app } from 'store/app'; import './index.less'; /** * 0: 无权限 申请权限 * 1: 可消费 申请配额,只能申请消费配额, 申请权限(申请发送) * 2: 可发送 申请配额,只能申请发送配额, 申请权限(申请消费) * 3: 可消费发送 申请配额,可以申请发送及消费配额 * 4: 可管理 可编辑,可以申请发送及消费配额 */ export const renderMyTopicOperation = (record: ITopic) => { const twoBtns = getTopicBtn(record).splice(0, 2); const leftBtns = getTopicBtn(record).splice(2); return ( <> <span className="table-operation"> {twoBtns.map((item, index) => ( item.clickFunc ? <a type="javascript;" key={index} onClick={() => item.clickFunc(record)}>{item.label}</a> : <span key={index} className="mr-10">{item.label}</span> ))} {getTopicBtn(record).length > 2 && <MoreBtns btns={leftBtns} data={record} />} </span> </>); }; const getTopicBtn = (record: ITopic) => { const btnList: IBtn[] = [{ label: '申请权限', show: [0, 1, 2].indexOf(record.access) > -1, clickFunc: (item: ITopic) => { showPermissionModal(item); }, }, { label: '申请配额', show: [1, 2, 3, 4].indexOf(record.access) > -1, clickFunc: (item: ITopic) => { applyQuotaQuery(item); }, }, { label: '申请分区', show: true, clickFunc: (item: ITopic) => { applyExpandModal(item); }, }, { label: '申请下线', show: record.access === 4, clickFunc: (item: ITopic) => { applyOnlineModal(item); }, }, { label: '编辑', show: record.access === 4, clickFunc: (item: ITopic) => { showTopicEditModal(item); }, }]; const origin = btnList.filter((item: IBtn) => item.show); return origin; }; export const renderAllTopicOperation = (item: ITopic) => { return ( <> {item.needAuth && <a className="mr-10" onClick={() => showAllPermissionModal(item)}>申请权限</a>} </> ); }; export const applyQuotaQuery = (item: ITopic) => { topic.getQuotaQuery(item.appId, item.clusterId, item.topicName).then((data) => { const record = data && data.length ? data[0] : {} as IQuotaQuery; showApplyQuatoModal(item, record); }); }; export const applyTopicQuotaQuery = async (item: ITopic) => { await app.getTopicAppQuota(item.clusterId, item.topicName); await showTopicApplyQuatoModal(item); }; export const getOnlineColumns = () => { const columns = [ { title: 'AppID', dataIndex: 'appId', key: 'appId', }, { title: 'HostName', dataIndex: 'hostname', key: 'hostname', onCell: () => ({ style: { maxWidth: 120, ...cellStyle, }, }), render: (text: string) => { return ( <Tooltip placement="bottomLeft" title={text} > {text} </Tooltip>); }, }, { title: 'ClientType', dataIndex: 'clientType', key: 'clientType', }, ]; return columns; }; export const getAllTopicColumns = (urlPrefix: string) => { const columns = [ { title: 'Topic名称', dataIndex: 'topicName', key: 'topicName', width: '25%', onCell: () => ({ style: { maxWidth: 250, ...cellStyle, }, }), sorter: (a: ITopic, b: ITopic) => a.topicName.charCodeAt(0) - b.topicName.charCodeAt(0), render: (text: string, record: ITopic) => { return ( <Tooltip placement="bottomLeft" title={record.topicName} > <a // tslint:disable-next-line:max-line-length href={`${urlPrefix}/topic/topic-detail?clusterId=${record.clusterId}&topic=${record.topicName}®ion=${region.currentRegion}&needAuth=${record.needAuth}`} >{text}</a> </Tooltip>); }, }, { title: '集群名称', dataIndex: 'clusterName', key: 'clusterName', width: '20%', }, { title: 'Topic描述', dataIndex: 'description', key: 'description', width: '25%', onCell: () => ({ style: { maxWidth: 250, ...cellStyle, }, }), render: (text: string) => <Tooltip placement="bottomLeft" title={text} >{text}</Tooltip>, }, { title: '负责人', dataIndex: 'appPrincipals', key: 'appPrincipals', width: '20%', onCell: () => ({ style: { maxWidth: 100, ...cellStyle, }, }), render: (text: string) => <Tooltip placement="bottomLeft" title={text} >{text}</Tooltip>, }, { title: '操作', dataIndex: 'operation', key: 'operation', width: '10%', render: (text: string, item: ITopic) => ( renderAllTopicOperation(item) ), }, ]; return columns; }; export const getExpireColumns = (urlPrefix: string) => { return [ { title: 'Topic名称', dataIndex: 'topicName', key: 'topicName', width: '35%', sorter: (a: ITopic, b: ITopic) => a.topicName.charCodeAt(0) - b.topicName.charCodeAt(0), render: (t: string, r: ITopic) => { return ( <Tooltip placement="bottomLeft" title={r.topicName} > <a // tslint:disable-next-line:max-line-length href={`${urlPrefix}/topic/topic-detail?clusterId=${r.clusterId}&topic=${r.topicName}®ion=${region.currentRegion}`} > {t} </a> </Tooltip>); }, }, { title: '所属集群', dataIndex: 'clusterName', key: 'clusterName', width: '20%', }, { title: '关联应用', dataIndex: 'appName', key: 'appName', width: '20%', }, { title: '消费者个数', dataIndex: 'fetchConnectionNum', key: 'fetchConnectionNum', width: '10%', }, ]; }; export const getMyTopicColumns = (urlPrefix: string) => { return [ { title: 'Topic名称', dataIndex: 'topicName', key: 'topicName', width: '21%', sorter: (a: ITopic, b: ITopic) => a.topicName.charCodeAt(0) - b.topicName.charCodeAt(0), render: (t: string, r: ITopic) => { return ( <Tooltip placement="bottomLeft" title={r.topicName} > <a // tslint:disable-next-line:max-line-length href={`${urlPrefix}/topic/topic-detail?clusterId=${r.clusterId}&topic=${r.topicName}®ion=${region.currentRegion}`} > {t} </a> </Tooltip>); }, }, { title: 'Bytes in(KB/s)', dataIndex: 'bytesIn', key: 'bytesIn', width: '12%', sorter: (a: ITopic, b: ITopic) => b.bytesIn - a.bytesIn, render: (t: number) => t === null ? '' : (t / 1024).toFixed(2), }, { title: 'Bytes out(KB/s)', dataIndex: 'bytesOut', key: 'bytesOut', width: '12%', sorter: (a: ITopic, b: ITopic) => b.bytesOut - a.bytesOut, render: (t: number) => t === null ? '' : (t / 1024).toFixed(2), }, { title: '所属集群', dataIndex: 'clusterName', key: 'clusterName', width: '15%', }, { title: '关联应用', dataIndex: 'appName', key: 'appName', width: '12%', render: (text: string, record: ITopic) => ( <> <Tooltip placement="bottomLeft" title={record.appId} > {text} </Tooltip> </> ), }, { title: '操作', dataIndex: 'action', key: 'action', width: '35%', render: (val: string, item: ITopic, index: number) => ( renderMyTopicOperation(item) ), }, ]; }; export const getApplyOnlineColumns = () => { const columns = [ { title: 'AppID', dataIndex: 'appId', key: 'appId', width: '22%', sorter: (a: IConnectionInfo, b: IConnectionInfo) => a.appId.charCodeAt(0) - b.appId.charCodeAt(0), }, { title: '主机名', dataIndex: 'hostname', key: 'hostname', width: '40%', onCell: () => ({ style: { maxWidth: 250, ...cellStyle, }, }), render: (t: string) => { return ( <Tooltip placement="bottomLeft" title={t} >{t}</Tooltip> ); }, }, { title: '客户端版本', dataIndex: 'clientVersion', key: 'clientVersion', width: '20%', }, { title: '客户端类型', dataIndex: 'clientType', key: 'clientType', width: '18%', render: (t: string) => <span>{t === 'consumer' ? '消费' : '生产'}</span>, }, ]; return columns; };