@ant-design/icons#EllipsisOutlined JavaScript Examples
The following examples show how to use
@ant-design/icons#EllipsisOutlined.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.jsx From erp-crm with MIT License | 6 votes |
export default function RecentTable({ ...props }) {
let { entity, dataTableColumns } = props;
dataTableColumns = [
...dataTableColumns,
{
title: '',
render: (row) => (
<Dropdown overlay={DropDownRowMenu({ row })} trigger={['click']}>
<EllipsisOutlined style={{ cursor: 'pointer', fontSize: '24px' }} />
</Dropdown>
),
},
];
const asyncList = () => {
return request.list({ entity });
};
const { result, isLoading, isSuccess } = useFetch(asyncList);
const firstFiveItems = () => {
if (isSuccess && result) return result.slice(0, 5);
return [];
};
return (
<>
<Table
columns={dataTableColumns}
rowKey={(item) => item._id}
dataSource={isSuccess && firstFiveItems()}
pagination={false}
loading={isLoading}
/>
</>
);
}
Example #2
Source File: index.jsx From starter-antd-admin-crud-auth-mern with MIT License | 6 votes |
export default function RecentTable({ ...props }) {
let { entity, dataTableColumns } = props;
dataTableColumns = [
...dataTableColumns,
{
title: "",
render: (row) => (
<Dropdown overlay={DropDownRowMenu({ row })} trigger={["click"]}>
<EllipsisOutlined style={{ cursor: "pointer", fontSize: "24px" }} />
</Dropdown>
),
},
];
const asyncList = () => {
return request.list(entity);
};
const { result, isLoading, isSuccess } = useFetch(asyncList);
const firstFiveItems = () => {
if (isSuccess && result) return result.slice(0, 5);
return [];
};
return (
<>
<Table
columns={dataTableColumns}
rowKey={(item) => item._id}
dataSource={isSuccess && firstFiveItems()}
pagination={false}
loading={isLoading}
/>
</>
);
}
Example #3
Source File: index.js From the-eye-knows-the-garbage with MIT License | 6 votes |
TableDropdown = function TableDropdown(_ref3) {
var propsClassName = _ref3.className,
style = _ref3.style,
onSelect = _ref3.onSelect,
_ref3$menus = _ref3.menus,
menus = _ref3$menus === void 0 ? [] : _ref3$menus;
return React.createElement(ConfigConsumer, null, function (_ref4) {
var getPrefixCls = _ref4.getPrefixCls;
var className = getPrefixCls('pro-table-dropdown');
var menu = React.createElement(_Menu, {
onClick: function onClick(params) {
return onSelect && onSelect(params.key);
}
}, menus.map(function (item) {
return React.createElement(_Menu.Item, {
key: item.key
}, item.name);
}));
return React.createElement(_Dropdown, {
overlay: menu,
className: classnames(className, propsClassName)
}, React.createElement("a", {
style: style
}, React.createElement(EllipsisOutlined, null)));
});
}
Example #4
Source File: loading.jsx From virtuoso-design-system with MIT License | 6 votes |
render() {
const { loading } = this.state;
return (
<>
<Switch checked={!loading} onChange={this.onChange} />
<Card style={{ width: 300, marginTop: 16 }} loading={loading}>
<Meta
avatar={
<Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
}
title="Card title"
description="This is the description"
/>
</Card>
<Card
style={{ width: 300, marginTop: 16 }}
actions={[
<SettingOutlined key="setting" />,
<EditOutlined key="edit" />,
<EllipsisOutlined key="ellipsis" />,
]}
>
<Skeleton loading={loading} avatar active>
<Meta
avatar={
<Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
}
title="Card title"
description="This is the description"
/>
</Skeleton>
</Card>
</>
);
}
Example #5
Source File: meta.jsx From virtuoso-design-system with MIT License | 6 votes |
storiesOf('antd/card', module).add('meta', () =>
<Card
style={{ width: 300 }}
cover={
<img
alt="example"
src="https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png"
/>
}
actions={[
<SettingOutlined key="setting" />,
<EditOutlined key="edit" />,
<EllipsisOutlined key="ellipsis" />,
]}
>
<Meta
avatar={<Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />}
title="Card title"
description="This is the description"
/>
</Card>,
{ docs: { page: () => (<><h1 id="enus">en-US</h1>
<p>A Card that supports <code>cover</code>, <code>avatar</code>, <code>title</code> and <code>description</code>.</p></>) } });
Example #6
Source File: content.jsx From virtuoso-design-system with MIT License | 6 votes |
DropdownMenu = () => (
<Dropdown key="more" overlay={menu}>
<Button
style={{
border: 'none',
padding: 0,
}}
>
<EllipsisOutlined
style={{
fontSize: 20,
verticalAlign: 'top',
}}
/>
</Button>
</Dropdown>
)
Example #7
Source File: index.js From gobench with Apache License 2.0 | 5 votes |
render() {
return (
<div>
<div className="row">
<div className="col-lg-6">
<h5 className="mb-3">
<strong>Basic</strong>
</h5>
<div className="mb-5">
<div className="mb-3">
<Card title="Default size card" extra={<a href="#">More</a>} style={{ width: 300 }}>
<p>Card content</p>
<p>Card content</p>
<p>Card content</p>
</Card>
</div>
<div className="mb-3">
<Card
size="small"
title="Small size card"
extra={<a href="#">More</a>}
style={{ width: 300 }}
>
<p>Card content</p>
<p>Card content</p>
<p>Card content</p>
</Card>
</div>
</div>
</div>
<div className="col-lg-6">
<h5 className="mb-3">
<strong>Advanced</strong>
</h5>
<div className="mb-5">
<div className="mb-3">
<Card
style={{ width: 300 }}
cover={
<img
alt="example"
src="https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png"
/>
}
actions={[
<SettingOutlined key="setting" />,
<EditOutlined key="edit" />,
<EllipsisOutlined key="ellipsis" />,
]}
>
<Meta
avatar={
<Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
}
title="Card title"
description="This is the description"
/>
</Card>
</div>
<div className="mb-3">
<Card style={{ width: 300, marginTop: 16 }} loading>
<Meta
avatar={
<Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
}
title="Card title"
description="This is the description"
/>
</Card>
</div>
</div>
</div>
</div>
</div>
)
}
Example #8
Source File: index.jsx From erp-crm with MIT License | 5 votes |
export default function DataTable({ config, DropDownRowMenu, AddNewItem }) {
let { entity, dataTableColumns, dataTableTitle } = config;
dataTableColumns = [
...dataTableColumns,
{
title: '',
render: (row) => (
<Dropdown overlay={DropDownRowMenu({ row })} trigger={['click']}>
<EllipsisOutlined style={{ cursor: 'pointer', fontSize: '24px' }} />
</Dropdown>
),
},
];
const { result: listResult, isLoading: listIsLoading } = useSelector(selectListItems);
const { pagination, items } = listResult;
const dispatch = useDispatch();
const handelDataTableLoad = useCallback((pagination) => {
const options = { page: pagination.current || 1 };
dispatch(crud.list({ entity, options }));
}, []);
useEffect(() => {
dispatch(crud.list({ entity }));
}, []);
return (
<>
<PageHeader
onBack={() => window.history.back()}
title={dataTableTitle}
ghost={false}
extra={[
<Button onClick={handelDataTableLoad} key={`${uniqueId()}`}>
Refresh
</Button>,
<AddNewItem key={`${uniqueId()}`} config={config} />,
]}
style={{
padding: '20px 0px',
}}
></PageHeader>
<Table
columns={dataTableColumns}
rowKey={(item) => item._id}
dataSource={items}
pagination={pagination}
loading={listIsLoading}
onChange={handelDataTableLoad}
/>
</>
);
}
Example #9
Source File: DataTable.jsx From erp-crm with MIT License | 5 votes |
export default function DataTable({ config, DataTableDropMenu }) {
let { entity, dataTableColumns } = config;
const { DATATABLE_TITLE } = config;
dataTableColumns = [
...dataTableColumns,
{
title: '',
render: (row) => (
<Dropdown overlay={DataTableDropMenu({ row, entity })} trigger={['click']}>
<EllipsisOutlined style={{ cursor: 'pointer', fontSize: '24px' }} />
</Dropdown>
),
},
];
const { result: listResult, isLoading: listIsLoading } = useSelector(selectListItems);
const { pagination, items } = listResult;
const dispatch = useDispatch();
const handelDataTableLoad = useCallback((pagination) => {
const options = { page: pagination.current || 1 };
dispatch(erp.list({ entity, options }));
}, []);
// const handelCurrency = () => {
// dispatch(settings.currency({ value: '€' }));
// dispatch(settings.currencyPosition({ position: 'before' }));
// };
useEffect(() => {
dispatch(erp.list({ entity }));
}, []);
return (
<>
<PageHeader
title={DATATABLE_TITLE}
ghost={true}
extra={[
<Button onClick={handelDataTableLoad} key={`${uniqueId()}`} icon={<RedoOutlined />}>
Refresh
</Button>,
// <Button onClick={handelCurrency} key={`${uniqueId()}`} icon={<RedoOutlined />}>
// Change Currency
// </Button>,
<AddNewItem config={config} key={`${uniqueId()}`} />,
]}
style={{
padding: '20px 0px',
}}
></PageHeader>
<Table
columns={dataTableColumns}
rowKey={(item) => item._id}
dataSource={items}
pagination={pagination}
loading={listIsLoading}
onChange={handelDataTableLoad}
/>
</>
);
}
Example #10
Source File: index.jsx From starter-antd-admin-crud-auth-mern with MIT License | 5 votes |
export default function DataTable({ config, DropDownRowMenu, AddNewItem }) {
let { entity, dataTableColumns, dataTableTitle } = config;
dataTableColumns = [
...dataTableColumns,
{
title: "",
render: (row) => (
<Dropdown overlay={DropDownRowMenu({ row })} trigger={["click"]}>
<EllipsisOutlined style={{ cursor: "pointer", fontSize: "24px" }} />
</Dropdown>
),
},
];
const { result: listResult, isLoading: listIsLoading } = useSelector(
selectListItems
);
const { pagination, items } = listResult;
const dispatch = useDispatch();
const handelDataTableLoad = useCallback((pagination) => {
dispatch(crud.list(entity, pagination.current));
}, []);
useEffect(() => {
dispatch(crud.list(entity));
}, []);
return (
<>
<PageHeader
onBack={() => window.history.back()}
title={dataTableTitle}
ghost={false}
extra={[
<Button onClick={handelDataTableLoad} key={`${uniqueId()}`}>
Refresh
</Button>,
<AddNewItem key={`${uniqueId()}`} config={config} />,
]}
style={{
padding: "20px 0px",
}}
></PageHeader>
<Table
columns={dataTableColumns}
rowKey={(item) => item._id}
dataSource={items}
pagination={pagination}
loading={listIsLoading}
onChange={handelDataTableLoad}
/>
</>
);
}
Example #11
Source File: index.jsx From ui with MIT License | 4 votes |
DataProcessingPage = ({ experimentId, experimentData }) => {
const dispatch = useDispatch();
const { navigateTo } = useAppRouter();
const pipelineStatus = useSelector(getBackendStatus(experimentId))?.status?.pipeline;
const processingConfig = useSelector((state) => state.experimentSettings.processing);
const sampleKeys = useSelector((state) => state.experimentSettings.info.sampleIds);
const samples = useSelector((state) => state.samples);
const pipelineStatusKey = pipelineStatus?.status;
const pipelineRunning = pipelineStatusKey === 'RUNNING';
// Pipeline is not loaded (either running or in an errored state)
const pipelineErrors = ['FAILED', 'TIMED_OUT', 'ABORTED'];
const pipelineHadErrors = pipelineErrors.includes(pipelineStatusKey);
const pipelineNotFinished = pipelineRunning || pipelineHadErrors;
const completedSteps = pipelineStatus?.completedSteps || [];
const changedQCFilters = useSelector(
(state) => state.experimentSettings.processing.meta.changedQCFilters,
);
const changesOutstanding = Boolean(changedQCFilters.size);
const [stepIdx, setStepIdx] = useState(0);
const [runQCModalVisible, setRunQCModalVisible] = useState(false);
const [inputsList, setInputsList] = useState([]);
useEffect(() => {
// If processingConfig is not loaded then reload
if (Object.keys(processingConfig).length <= 1) {
dispatch(loadProcessingSettings(experimentId));
}
dispatch(loadSamples(experimentId));
dispatch(loadCellSets(experimentId));
}, []);
// Checks if the step is in the 'completed steps' list we get from the pipeline status
const isStepComplete = (stepName) => {
if (stepName === undefined) {
return true;
}
const lowerCaseStepName = stepName.toLowerCase();
const stepAppearances = _.filter(
completedSteps,
(stepPipelineName) => stepPipelineName.toLowerCase().includes(lowerCaseStepName),
);
return stepAppearances.length > 0;
};
const onConfigChange = useCallback((key) => {
dispatch(addChangedQCFilter(key));
});
const prefixSampleName = (name) => {
// eslint-disable-next-line no-param-reassign
if (!name.match(/$sample/ig)) name = `Sample ${name}`;
return name;
};
useEffect(() => {
if (sampleKeys && sampleKeys.length > 0 && Object.keys(samples).filter((key) => key !== 'meta').length > 0) {
const list = sampleKeys?.map((sampleId) => ({
key: sampleId,
headerName: prefixSampleName(samples[sampleId].name),
params: { key: sampleId },
}));
setInputsList(list);
}
}, [samples, sampleKeys]);
const steps = [
{
key: 'classifier',
name: getUserFriendlyQCStepName('classifier'),
description: 'The Classifier filter is based on the ‘emptyDrops’ method which distinguishes between droplets containing cells and ambient RNA. Droplets are filtered based on the False Discovery Rate (FDR) value - the red line on the density plot. In the knee plot, the ‘mixed’ population shown in grey contains some cells that are filtered out and some that remain and can be filtered further in the next filter.',
multiSample: true,
render: (key) => (
<SingleComponentMultipleDataContainer
defaultActiveKey={sampleKeys}
inputsList={inputsList}
baseComponentRenderer={(sample) => (
<Classifier
id='classifier'
experimentId={experimentId}
filtering
key={key}
sampleId={sample.key}
sampleIds={sampleKeys}
onConfigChange={() => onConfigChange(key)}
stepDisabled={!processingConfig[key]?.enabled}
/>
)}
/>
),
},
{
key: 'cellSizeDistribution',
name: getUserFriendlyQCStepName('cellSizeDistribution'),
description: 'The number of unique molecular identifiers (#UMIs) per cell distinguishes real cells (high #UMIs per cell) from empty droplets (low #UMIs per cell). This filter is used to detect empty droplets and fine-tunes the Classifier filter. In some datasets this filter might be used instead of the Classifier filter.',
multiSample: true,
render: (key) => (
<SingleComponentMultipleDataContainer
defaultActiveKey={sampleKeys}
inputsList={inputsList}
baseComponentRenderer={(sample) => (
<CellSizeDistribution
experimentId={experimentId}
filtering
key={key}
sampleId={sample.key}
sampleIds={sampleKeys}
onConfigChange={() => onConfigChange(key)}
stepDisabled={!processingConfig[key].enabled}
/>
)}
/>
),
},
{
key: 'mitochondrialContent',
name: getUserFriendlyQCStepName('mitochondrialContent'),
description: 'A high percentage of mitochondrial reads is an indicator of cell death. UMIs mapped to mitochondrial genes are calculated as a percentage of total UMIs. The percentage of mitochondrial reads depends on the cell type. The typical cut-off range is 10-50%, with the default cut-off set to 3 median absolute deviations above the median.',
multiSample: true,
render: (key) => (
<SingleComponentMultipleDataContainer
defaultActiveKey={sampleKeys}
inputsList={inputsList}
baseComponentRenderer={(sample) => (
<MitochondrialContent
experimentId={experimentId}
filtering
key={key}
sampleId={sample.key}
sampleIds={sampleKeys}
onConfigChange={() => onConfigChange(key)}
stepDisabled={!processingConfig[key].enabled}
/>
)}
/>
),
},
{
key: 'numGenesVsNumUmis',
name: getUserFriendlyQCStepName('numGenesVsNumUmis'),
description: 'The number of expressed genes per cell and number of UMIs per cell is expected to have a linear relationship. This filter is used to exclude outliers (e.g. many UMIs originating from only a few genes).',
multiSample: true,
render: (key) => (
<SingleComponentMultipleDataContainer
defaultActiveKey={sampleKeys}
inputsList={inputsList}
baseComponentRenderer={(sample) => (
<GenesVsUMIs
experimentId={experimentId}
filtering
key={key}
sampleId={sample.key}
sampleIds={sampleKeys}
onConfigChange={() => onConfigChange(key)}
stepDisabled={!processingConfig[key].enabled}
/>
)}
/>
),
},
{
key: 'doubletScores',
name: getUserFriendlyQCStepName('doubletScores'),
description:
<span>
Droplets may contain more than one cell.
In such cases, it is not possible to distinguish which reads came from which cell.
Such “cells” cause problems in the downstream analysis as they appear as an intermediate type.
“Cells” with a high probability of being a doublet should be excluded.
The probability of being a doublet is calculated using ‘scDblFinder’.
For each sample, the default threshold tries to minimize both the deviation in the
expected number of doublets and the error of a trained classifier. For more details see
{' '}
<a href='https://bioconductor.org/packages/devel/bioc/vignettes/scDblFinder/inst/doc/scDblFinder.html#thresholding' rel='noreferrer' target='_blank'>scDblFinder thresholding</a>
.
</span>,
multiSample: true,
render: (key) => (
<SingleComponentMultipleDataContainer
defaultActiveKey={sampleKeys}
inputsList={inputsList}
baseComponentRenderer={(sample) => (
<DoubletScores
experimentId={experimentId}
filtering
key={key}
sampleId={sample.key}
sampleIds={sampleKeys}
onConfigChange={() => onConfigChange(key)}
stepDisabled={!processingConfig[key].enabled}
/>
)}
/>
),
},
{
key: 'dataIntegration',
name: getUserFriendlyQCStepName('dataIntegration'),
multiSample: false,
render: (key, expId) => (
<DataIntegration
experimentId={expId}
key={key}
onConfigChange={() => onConfigChange(key)}
disableDataIntegration={sampleKeys && sampleKeys.length === 1}
/>
),
},
{
key: 'configureEmbedding',
name: getUserFriendlyQCStepName('configureEmbedding'),
description: 'Cells and clusters are visualized in a 2-dimensional embedding. The UMAP or t-SNE embedding plot can be selected and customized. The clustering method (e.g. Louvain) and resolution are set here.',
multiSample: false,
render: (key, expId) => (
<ConfigureEmbedding
experimentId={expId}
key={key}
onConfigChange={() => onConfigChange(key)}
/>
),
},
];
const currentStep = steps[stepIdx];
// check that the order and identities of the QC steps above match
// the canonical representation
console.assert(_.isEqual(qcSteps, steps.map((s) => s.key)));
const changeStepId = (newStepIdx) => {
setStepIdx(newStepIdx);
};
const renderRunButton = (runMessage, useSmall = true) => (
<Tooltip title='Run data processing with the changed settings'>
<Button
data-testid='runFilterButton'
type='primary'
onClick={() => setRunQCModalVisible(true)}
style={{ minWidth: '80px' }}
size={useSmall ? 'small' : 'medium'}
>
{runMessage}
</Button>
</Tooltip>
);
const renderRunOrDiscardButtons = () => {
if (pipelineHadErrors) {
return renderRunButton('Run Data Processing', false);
} if (changesOutstanding) {
return (
<Alert
message={<>Your new settings are not yet applied</>}
type='info'
showIcon
style={{
paddingTop: '3px', paddingBottom: '3px', paddingLeft: '10px', paddingRight: '10px',
}}
action={(
<Space size='small'>
{renderRunButton('Run', true)}
<Tooltip title='Discard your changes since the last run'>
<Button
id='discardChangesButton'
data-testid='discardChangesButton'
type='primary'
onClick={() => { dispatch(discardChangedQCFilters()); }}
style={{ width: '80px' }}
size='small'
>
Discard
</Button>
</Tooltip>
</Space>
)}
/>
);
}
};
// Called when the pipeline is triggered to be run by the user.
const onPipelineRun = () => {
setRunQCModalVisible(false);
dispatch(runQC(experimentId));
};
const renderTitle = () => {
const stepEnabled = processingConfig[currentStep.key]?.enabled;
const prefiltered = processingConfig[currentStep.key]?.prefiltered || false;
return (
<>
<Row justify='space-between'>
<Col style={{ paddingBottom: '8px' }}>
{/* Should be just wide enough that no ellipsis appears */}
<Row>
<Col style={{ paddingBottom: '8px', paddingRight: '8px' }}>
<Space size='small'>
<Select
value={stepIdx}
onChange={(idx) => {
changeStepId(idx);
}}
style={{ fontWeight: 'bold', width: 290 }}
placeholder='Jump to a step...'
>
{
steps.map(
({ name, key }, i) => {
const disabledByPipeline = (pipelineNotFinished && !isStepComplete(key));
const text = `${i + 1}. ${name}`;
return (
<Option
value={i}
key={key}
disabled={
disabledByPipeline
}
>
{processingConfig[key]?.enabled === false ? (
<>
{/* disabled */}
<Text
type='secondary'
>
<CloseOutlined />
</Text>
<span
style={{ marginLeft: '0.25rem', textDecoration: 'line-through' }}
>
{text}
</span>
</>
) : !disabledByPipeline ? (
<>
{/* finished */}
<Text
type='success'
>
<CheckOutlined />
</Text>
<span
style={{ marginLeft: '0.25rem' }}
>
{text}
</span>
</>
) : pipelineRunning && !isStepComplete(key) ? (
<>
{/* incomplete */}
<Text
type='warning'
strong
>
<EllipsisOutlined />
</Text>
<span style={{ marginLeft: '0.25rem' }}>{text}</span>
</>
) : pipelineNotFinished
&& !pipelineRunning
&& !isStepComplete(key) ? (
<>
<Text
type='danger'
strong
>
<WarningOutlined />
</Text>
<span style={{ marginLeft: '0.25rem' }}>{text}</span>
</>
) : <></>}
</Option>
);
},
)
}
</Select>
{currentStep.description && (
<Tooltip title={currentStep.description}>
<Button icon={<InfoCircleOutlined />} />
</Tooltip>
)}
{currentStep.multiSample && (
<Tooltip title={`${!stepEnabled ? 'Enable this filter' : 'Disable this filter'}`}>
<Button
disabled={prefiltered}
data-testid='enableFilterButton'
onClick={async () => {
await dispatch(saveProcessingSettings(experimentId, currentStep.key));
if (!processingConfig.meta.saveSettingsError) {
dispatch(setQCStepEnabled(
currentStep.key, !stepEnabled,
));
}
}}
>
{
stepEnabled ? 'Disable' : 'Enable'
}
</Button>
</Tooltip>
)}
</Space>
</Col>
<Col>
{renderRunOrDiscardButtons()}
</Col>
</Row>
</Col>
<Col>
<Row align='middle' justify='space-between'>
<Col>
<StatusIndicator
experimentId={experimentId}
allSteps={steps}
currentStep={stepIdx}
completedSteps={completedSteps}
/>
<Space size='small'>
<Tooltip title='Previous'>
<Button
data-testid='pipelinePrevStep'
disabled={stepIdx === 0}
icon={<LeftOutlined />}
onClick={() => changeStepId(Math.max(stepIdx - 1, 0))}
size='small'
/>
</Tooltip>
{stepIdx !== steps.length - 1 ? (
<Tooltip title='Next'>
<Button
data-testid='pipelineNextStep'
onClick={() => {
const newStepIdx = Math.min(stepIdx + 1, steps.length - 1);
changeStepId(newStepIdx);
}}
disabled={steps[stepIdx + 1] !== undefined
&& pipelineNotFinished
&& !isStepComplete(steps[stepIdx + 1].key)}
icon={<RightOutlined />}
size='small'
/>
</Tooltip>
)
: (
<Tooltip title='Finish QC'>
<Button
type='primary'
disabled={steps[stepIdx + 1]
&& pipelineNotFinished
&& !isStepComplete(steps[stepIdx + 1].key)}
icon={<CheckOutlined />}
size='small'
onClick={() => navigateTo(modules.DATA_EXPLORATION, { experimentId })}
/>
</Tooltip>
)}
</Space>
</Col>
</Row>
</Col>
</Row>
</>
);
};
const renderContent = () => {
const { render, key } = currentStep;
if (pipelineRunning && !isStepComplete(key)) {
return <div><PipelineRedirectToDataProcessing pipelineStatus='runningStep' /></div>;
}
if (pipelineNotFinished && !isStepComplete(key)) {
return (
<div>
<div style={{ display: 'flex', justifyContent: 'center' }}>
<PlatformError
description={'We don\'t have anything for this step.'}
reason='The last run ended before this step could be finished.'
onClick={() => { onPipelineRun(); }}
/>
</div>
</div>
);
}
if (samples.meta.loading
|| processingConfig.meta.loading
|| Object.keys(processingConfig).length <= 1
) {
return (
<div className='preloadContextSkeleton' style={{ padding: '16px 0px' }}>
<Skeleton.Input style={{ width: '100%', height: 400 }} active />
</div>
);
}
if (samples.meta.error || processingConfig.meta.loadingSettingsError) {
return (
<PlatformError
error={samples.meta.error.toString()
|| processingConfig.meta.loadingSettingsError.toString()}
onClick={() => { dispatch(loadSamples(experimentId)); }}
/>
);
}
return (
<Space direction='vertical' style={{ width: '100%' }}>
{
'enabled' in processingConfig[key] && !processingConfig[key].enabled ? (
<Alert
message={processingConfig[key]?.prefiltered
? 'This filter is disabled because the one of the sample(s) is pre-filtered. Click \'Next\' to continue processing your data.'
: 'This filter is disabled. You can still modify and save changes, but the filter will not be applied to your data.'}
type='info'
showIcon
/>
) : <></>
}
{render(key, experimentId)}
</Space>
);
};
return (
<>
<Header
experimentId={experimentId}
experimentData={experimentData}
title='Data Processing'
/>
<Space direction='vertical' style={{ width: '100%', padding: '0 10px' }}>
{runQCModalVisible && (
<Modal
title='Run data processing with the changed settings'
visible
onCancel={() => setRunQCModalVisible(false)}
onOk={() => onPipelineRun()}
okText='Start'
>
<p>
This might take several minutes.
Your navigation within Cellenics will be restricted during this time.
Do you want to start?
</p>
</Modal>
)}
<Card
title={renderTitle()}
>
{renderContent()}
</Card>
</Space>
</>
);
}
Example #12
Source File: DataTable.jsx From starter-antd-admin-crud-auth-mern with MIT License | 4 votes |
export default function DataTable({ config, DropDownRowMenu, AddNewItem }) {
const inputColorRef = useRef(null);
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [tableItemsList, setTableItemsList] = useState([]);
const [coloredRow, setColoredRow] = useState({});
const openColorBox = () => {
inputColorRef.current.click();
};
const handelColorChange = (e) => {
const tmpObj = {};
const tmpColoredRows = selectedRowKeys.map((x) => {
tmpObj[x] = e.target.value;
});
setColoredRow({ ...coloredRow, ...tmpObj });
setSelectedRowKeys([]);
};
function MakeNewColor() {
return (
<div style={{ position: "relative", display: "inline-block" }}>
<Button onClick={openColorBox}>Make new Color</Button>
<input
type="color"
ref={inputColorRef}
onChange={handelColorChange}
style={{
opacity: 0,
position: "absolute",
left: 0,
top: "10px",
width: "100%",
}}
/>
</div>
);
}
let { entity, dataTableColumns, dataTableTitle } = config;
const newDataTableColumns = dataTableColumns.map((obj) => ({
...obj,
render: (text, row) => {
return {
props: {
style: {
background: coloredRow[row._id] ? coloredRow[row._id] : "",
color: coloredRow[row._id] ? inverseColor(coloredRow[row._id]) : "",
},
},
children: text,
};
},
}));
dataTableColumns = [
...newDataTableColumns,
{
title: "",
render: (row) => {
return {
props: {
style: {
background: coloredRow[row._id] ? coloredRow[row._id] : "",
color: coloredRow[row._id]
? inverseColor(coloredRow[row._id])
: "",
},
},
children: (
<Dropdown overlay={DropDownRowMenu({ row })} trigger={["click"]}>
<EllipsisOutlined
style={{ cursor: "pointer", fontSize: "24px" }}
/>
</Dropdown>
),
};
},
},
];
const { result: listResult, isLoading: listIsLoading } =
useSelector(selectListItems);
const { pagination, items } = listResult;
const dispatch = useDispatch();
const handelDataTableLoad = useCallback((pagination) => {
dispatch(crud.list(entity, pagination.current));
}, []);
useEffect(() => {
dispatch(crud.list(entity));
}, []);
useEffect(() => {
const listIds = items.map((x) => x._id);
setTableItemsList(listIds);
}, [items]);
const [firstRow, setFirstRow] = useState();
const [onSelect, setSelect] = useState(false);
const onClickRow = (record, rowIndex) => {
return {
onClick: () => {
// const exist = selectedRowKeys.includes(record._id);
// if (exist) {
// let filtered = selectedRowKeys.filter(function (value) {
// return value != record._id;
// });
// setSelectedRowKeys(filtered);
// } else {
// setSelectedRowKeys([...selectedRowKeys, record._id]);
// }
},
onMouseDown: () => {
setFirstRow(rowIndex);
setSelectedRowKeys([record._id]);
setSelect(true);
},
onMouseEnter: () => {
if (onSelect) {
const selectedRange = tableItemsList.slice(firstRow, rowIndex + 1);
setSelectedRowKeys(selectedRange);
}
},
onMouseUp: () => {
setSelect(false);
},
};
};
const handelColorRow = (checked, record, index, originNode) => {
return {
props: {
style: {
background: coloredRow[record._id] ? coloredRow[record._id] : "",
},
},
// children: originNode,
};
};
const onSelectChange = (selectedKeys, selectedRows) => {
setSelectedRowKeys(selectedKeys);
console.log("selectedRowKeys changed: ", selectedRowKeys);
};
const rowSelection = {
selectedRowKeys,
onChange: onSelectChange,
hideSelectAll: true,
columnWidth: 0,
renderCell: handelColorRow,
selectedRowKeys: selectedRowKeys,
};
return (
<>
<PageHeader
onBack={() => window.history.back()}
title={dataTableTitle}
ghost={false}
extra={[
<MakeNewColor key={`${uniqueId()}`} config={config} />,
<Button onClick={handelDataTableLoad} key={`${uniqueId()}`}>
Refresh
</Button>,
<AddNewItem key={`${uniqueId()}`} config={config} />,
]}
style={{
padding: "20px 0px",
}}
></PageHeader>
<Table
columns={dataTableColumns}
rowKey={(item) => item._id}
rowSelection={rowSelection}
onRow={onClickRow}
ellipsis={true}
// rowClassName={setRowClassName}
size={"small"}
dataSource={items}
pagination={pagination}
loading={listIsLoading}
onChange={handelDataTableLoad}
/>
</>
);
}
Example #13
Source File: index.jsx From prometheusPro with MIT License | 4 votes |
Applications = props => {
const { list } = props;
const itemMenu = (
<Menu>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="https://www.alipay.com/">
1st menu item
</a>
</Menu.Item>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="https://www.taobao.com/">
2nd menu item
</a>
</Menu.Item>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="https://www.tmall.com/">
3d menu item
</a>
</Menu.Item>
</Menu>
);
const CardInfo = ({ activeUser, newUser }) => (
<div className={stylesApplications.cardInfo}>
<div>
<p>活跃用户</p>
<p>{activeUser}</p>
</div>
<div>
<p>新增用户</p>
<p>{newUser}</p>
</div>
</div>
);
return (
<List
rowKey="id"
className={stylesApplications.filterCardList}
grid={{
gutter: 24,
xxl: 3,
xl: 2,
lg: 2,
md: 2,
sm: 2,
xs: 1,
}}
dataSource={list}
renderItem={item => (
<List.Item key={item.id}>
<Card
hoverable
bodyStyle={{
paddingBottom: 20,
}}
actions={[
<Tooltip key="download" title="下载">
<DownloadOutlined />
</Tooltip>,
<Tooltip title="编辑" key="edit">
<EditOutlined />
</Tooltip>,
<Tooltip title="分享" key="share">
<ShareAltOutlined />
</Tooltip>,
<Dropdown overlay={itemMenu} key="ellipsis">
<EllipsisOutlined />
</Dropdown>,
]}
>
<Card.Meta avatar={<Avatar size="small" src={item.avatar} />} title={item.title} />
<div className={stylesApplications.cardItemContent}>
<CardInfo
activeUser={formatWan(item.activeUser)}
newUser={numeral(item.newUser).format('0,0')}
/>
</div>
</Card>
</List.Item>
)}
/>
);
}
Example #14
Source File: index.jsx From prometheusPro with MIT License | 4 votes |
render() {
const { rangePickerValue, salesType, currentTabKey } = this.state;
const { dashboardAndanalysis, loading } = this.props;
const {
visitData,
visitData2,
salesData,
searchData,
offlineData,
offlineChartData,
salesTypeData,
salesTypeDataOnline,
salesTypeDataOffline,
} = dashboardAndanalysis;
let salesPieData;
if (salesType === 'all') {
salesPieData = salesTypeData;
} else {
salesPieData = salesType === 'online' ? salesTypeDataOnline : salesTypeDataOffline;
}
const menu = (
<Menu>
<Menu.Item>操作一</Menu.Item>
<Menu.Item>操作二</Menu.Item>
</Menu>
);
const dropdownGroup = (
<span className={styles.iconGroup}>
<Dropdown overlay={menu} placement="bottomRight">
<EllipsisOutlined />
</Dropdown>
</span>
);
const activeKey = currentTabKey || (offlineData[0] && offlineData[0].name);
return (
<GridContent>
<React.Fragment>
<Suspense fallback={<PageLoading />}>
<IntroduceRow loading={loading} visitData={visitData} />
</Suspense>
<Suspense fallback={null}>
<SalesCard
rangePickerValue={rangePickerValue}
salesData={salesData}
isActive={this.isActive}
handleRangePickerChange={this.handleRangePickerChange}
loading={loading}
selectDate={this.selectDate}
/>
</Suspense>
<Row
gutter={24}
type="flex"
style={{
marginTop: 24,
}}
>
<Col xl={12} lg={24} md={24} sm={24} xs={24}>
<Suspense fallback={null}>
<TopSearch
loading={loading}
visitData2={visitData2}
searchData={searchData}
dropdownGroup={dropdownGroup}
/>
</Suspense>
</Col>
<Col xl={12} lg={24} md={24} sm={24} xs={24}>
<Suspense fallback={null}>
<ProportionSales
dropdownGroup={dropdownGroup}
salesType={salesType}
loading={loading}
salesPieData={salesPieData}
handleChangeSalesType={this.handleChangeSalesType}
/>
</Suspense>
</Col>
</Row>
<Suspense fallback={null}>
<OfflineData
activeKey={activeKey}
loading={loading}
offlineData={offlineData}
offlineChartData={offlineChartData}
handleTabChange={this.handleTabChange}
/>
</Suspense>
</React.Fragment>
</GridContent>
);
}
Example #15
Source File: index.jsx From prometheusPro with MIT License | 4 votes |
render() {
const {
listAndsearchAndapplications: { list },
loading,
form,
} = this.props;
const { getFieldDecorator } = form;
const CardInfo = ({ activeUser, newUser }) => (
<div className={styles.cardInfo}>
<div>
<p>活跃用户</p>
<p>{activeUser}</p>
</div>
<div>
<p>新增用户</p>
<p>{newUser}</p>
</div>
</div>
);
const formItemLayout = {
wrapperCol: {
xs: {
span: 24,
},
sm: {
span: 16,
},
},
};
const itemMenu = (
<Menu>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="https://www.alipay.com/">
1st menu item
</a>
</Menu.Item>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="https://www.taobao.com/">
2nd menu item
</a>
</Menu.Item>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="https://www.tmall.com/">
3d menu item
</a>
</Menu.Item>
</Menu>
);
return (
<div className={styles.filterCardList}>
<Card bordered={false}>
<Form layout="inline">
<StandardFormRow
title="所属类目"
block
style={{
paddingBottom: 11,
}}
>
<FormItem>
{getFieldDecorator('category')(
<TagSelect expandable>
<TagSelect.Option value="cat1">类目一</TagSelect.Option>
<TagSelect.Option value="cat2">类目二</TagSelect.Option>
<TagSelect.Option value="cat3">类目三</TagSelect.Option>
<TagSelect.Option value="cat4">类目四</TagSelect.Option>
<TagSelect.Option value="cat5">类目五</TagSelect.Option>
<TagSelect.Option value="cat6">类目六</TagSelect.Option>
<TagSelect.Option value="cat7">类目七</TagSelect.Option>
<TagSelect.Option value="cat8">类目八</TagSelect.Option>
<TagSelect.Option value="cat9">类目九</TagSelect.Option>
<TagSelect.Option value="cat10">类目十</TagSelect.Option>
<TagSelect.Option value="cat11">类目十一</TagSelect.Option>
<TagSelect.Option value="cat12">类目十二</TagSelect.Option>
</TagSelect>,
)}
</FormItem>
</StandardFormRow>
<StandardFormRow title="其它选项" grid last>
<Row gutter={16}>
<Col lg={8} md={10} sm={10} xs={24}>
<FormItem {...formItemLayout} label="作者">
{getFieldDecorator(
'author',
{},
)(
<Select
placeholder="不限"
style={{
maxWidth: 200,
width: '100%',
}}
>
<Option value="lisa">王昭君</Option>
</Select>,
)}
</FormItem>
</Col>
<Col lg={8} md={10} sm={10} xs={24}>
<FormItem {...formItemLayout} label="好评度">
{getFieldDecorator(
'rate',
{},
)(
<Select
placeholder="不限"
style={{
maxWidth: 200,
width: '100%',
}}
>
<Option value="good">优秀</Option>
<Option value="normal">普通</Option>
</Select>,
)}
</FormItem>
</Col>
</Row>
</StandardFormRow>
</Form>
</Card>
<br />
<List
rowKey="id"
grid={{
gutter: 24,
xl: 4,
lg: 3,
md: 3,
sm: 2,
xs: 1,
}}
loading={loading}
dataSource={list}
renderItem={item => (
<List.Item key={item.id}>
<Card
hoverable
bodyStyle={{
paddingBottom: 20,
}}
actions={[
<Tooltip key="download" title="下载">
<DownloadOutlined />
</Tooltip>,
<Tooltip key="edit" title="编辑">
<EditOutlined />
</Tooltip>,
<Tooltip title="分享" key="share">
<ShareAltOutlined />
</Tooltip>,
<Dropdown key="ellipsis" overlay={itemMenu}>
<EllipsisOutlined />
</Dropdown>,
]}
>
<Card.Meta avatar={<Avatar size="small" src={item.avatar} />} title={item.title} />
<div className={styles.cardItemContent}>
<CardInfo
activeUser={formatWan(item.activeUser)}
newUser={numeral(item.newUser).format('0,0')}
/>
</div>
</Card>
</List.Item>
)}
/>
</div>
);
}