antd#Steps JavaScript Examples
The following examples show how to use
antd#Steps.
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: stepComponent.js From acy-dex-interface with MIT License | 6 votes |
stepComponent = (props) => {
const [percent, setPercentage] = useState(0);
const [current, setCurrent] = useState(2);
const [status, setStatus] = useState('process');
return (
<div
className={styles.stepColor}
id="steps"
>
<Steps size="small" labelPlacement='vertical' current={current}>
<Step title="Preparation" />
<Step title="Whitelist" />
<Step title="Lottery Ticket" />
<Step title="Sale" />
<Step title="Distribution" />
</Steps>
</div>
)
}
Example #2
Source File: index.js From camel-store-admin with Apache License 2.0 | 6 votes |
render() {
const { location, children } = this.props;
return (
<PageHeaderWrapper
title="分步表单"
tabActiveKey={location.pathname}
content="将一个冗长或用户不熟悉的表单任务分成多个步骤,指导用户完成。"
>
<Card bordered={false}>
<Fragment>
<Steps current={this.getCurrentStep()} className={styles.steps}>
<Step title="填写转账信息" />
<Step title="确认转账信息" />
<Step title="完成" />
</Steps>
{children}
</Fragment>
</Card>
</PageHeaderWrapper>
);
}
Example #3
Source File: FormDemo2.js From discern with BSD 3-Clause "New" or "Revised" License | 6 votes |
render () {
return (
<div>
<CustomBreadcrumb arr={['输入', '表单','分步表单']}/>
<TypingCard source='将一个冗长或用户不熟悉的表单任务分成多个步骤,指导用户完成'/>
<Card title='分步表单' bordered={false} style={{minHeight: 600}}>
<Steps style={styles.steps} current={this.props.stepFormStore.current}>
<Step title="填写转账信息" />
<Step title="确认转账信息" />
<Step title="完成" />
</Steps>
<div>{this.showStep()}</div>
</Card>
</div>
)
}
Example #4
Source File: TableList.js From youdidao-unmanned-shop with MIT License | 6 votes |
render() {
const { updateModalVisible, handleUpdateModalVisible, values } = this.props;
const { currentStep, formVals } = this.state;
return (
<Modal
width={640}
bodyStyle={{ padding: '32px 40px 48px' }}
destroyOnClose
title="规则配置"
visible={updateModalVisible}
footer={this.renderFooter(currentStep)}
onCancel={() => handleUpdateModalVisible(false, values)}
afterClose={() => handleUpdateModalVisible()}
>
<Steps style={{ marginBottom: 28 }} size="small" current={currentStep}>
<Step title="基本信息" />
<Step title="配置规则属性" />
<Step title="设定调度周期" />
</Steps>
{this.renderContent(currentStep, formVals)}
</Modal>
);
}
Example #5
Source File: clickable.jsx From virtuoso-design-system with MIT License | 6 votes |
render() {
const { current } = this.state;
return (
<>
<Steps current={current} onChange={this.onChange}>
<Step title="Step 1" description="This is a description." />
<Step title="Step 2" description="This is a description." />
<Step title="Step 3" description="This is a description." />
</Steps>
<Divider />
<Steps current={current} onChange={this.onChange} direction="vertical">
<Step title="Step 1" description="This is a description." />
<Step title="Step 2" description="This is a description." />
<Step title="Step 3" description="This is a description." />
</Steps>
</>
);
}
Example #6
Source File: index.jsx From prometheusPro with MIT License | 6 votes |
render() {
const currentStep = this.getCurrentStep();
let stepComponent;
if (currentStep === 1) {
stepComponent = <Step2 />;
} else if (currentStep === 2) {
stepComponent = <Step3 />;
} else {
stepComponent = <Step1 />;
}
return (
<PageHeaderWrapper content="将一个冗长或用户不熟悉的表单任务分成多个步骤,指导用户完成。">
<Card bordered={false}>
<>
<Steps current={currentStep} className={styles.steps}>
<Step title="填写转账信息" />
<Step title="确认转账信息" />
<Step title="完成" />
</Steps>
{stepComponent}
</>
</Card>
</PageHeaderWrapper>
);
}
Example #7
Source File: stepComponent.js From acy-dex-interface with MIT License | 5 votes |
{ Step } = Steps
Example #8
Source File: UpdateForm.jsx From vpp with MIT License | 5 votes |
{ Step } = Steps
Example #9
Source File: index.js From QiskitFlow with Apache License 2.0 | 5 votes |
export function HomePage({ dispatch, user, loggedIn, loading }) {
useInjectReducer({ key, reducer });
useInjectSaga({ key, saga });
const loginForm = loggedIn ? '' : <Login />;
return (
<div>
<Helmet>
<title>Home</title>
</Helmet>
<Row gutter={[16, 16]}>
<Col span={18}>
<Card title="Greetings!" style={{ margin: '20px 0' }}>
<p>
Welcome to alpha version of QiskitFlow! Platform for tracking,
sharing and running quantum experiments in a clean and
understandable for developers, researchers and students manner.
Thank you for taking time and reviewing our efforts in making
quantum computing more transparent for everybody!
</p>
<p>
If you have any questions or suggestions feel free to drop an
email [email protected] or open{' '}
<a href="https://github.com/IceKhan13/QiskitFlow/issues" target="_blank">
Github issue
</a>
</p>
</Card>
<Divider />
<h2>Public experiments</h2>
<SharedRunsList />
</Col>
<Col span={6}>
<Card title="QiskitFlow info" style={{ margin: '20px 0' }}>
<b>Build</b>: 0.0.10-alpha
<br />
<b>Github</b>:{' '}
<a href="https://github.com/IceKhan13/QiskitFlow" target="_blank">
https://github.com/IceKhan13/QiskitFlow
</a>
<br />
<b>PyPi</b>:{' '}
<a href="https://pypi.org/project/qiskitflow/" target="_black">
https://pypi.org/project/qiskitflow/
</a>
</Card>
{loginForm}
<img
src="https://media.giphy.com/media/rmIGBIsDle8dEPubrG/giphy.gif"
alt="QiskitFlow 3d"
width="100%"
/>
<Card title="Roadmap" style={{ margin: '20px 0' }}>
<Steps direction="vertical" current={1}>
<Step
title="Alpha release"
description="Alpha release for closed testing"
/>
<Step title="Testing" description="Testing is in progress" />
<Step
title="General public release"
description="Release for general public with open registration"
/>
<Step
title="Experiments compiler"
description="Compiler backend for building executable images of executed experiments"
/>
</Steps>
</Card>
</Col>
</Row>
</div>
);
}
Example #10
Source File: CreatePage.js From bonded-stablecoin-ui with MIT License | 5 votes |
{ Step } = Steps
Example #11
Source File: TrackEnroll.js From codeclannigeria-frontend with MIT License | 5 votes |
function TrackEnroll({
visible,
getTracksAction,
loading,
error,
userEnrollTrackAction,
errResponse,
data,
onCancel,
}) {
const [current, setCurrent] = useState(0);
const [trackId, setTrackId] = useState(null);
const [mentorId, setMentorId] = useState(null);
const [trackTitle, setTrackTitle] = useState(null);
const [currentPage, setCurrentPage] = useState(1);
// eslint-disable-next-line
const [trackPerPage, setTrackperPage] = useState(3);
const indexOfLastTrack = currentPage * trackPerPage;
const indexOfFirstTrack = indexOfLastTrack - trackPerPage;
const { items } = data;
const paginate = pageNumber => setCurrentPage(pageNumber);
const currentTracks = items
? items.slice(indexOfFirstTrack, indexOfLastTrack)
: null;
const getTrackName = id => {
const track = items.filter(data => data.id === id);
setTrackTitle(track[0].title);
};
function next() {
const newCurrent = current + 1;
setCurrent(newCurrent);
}
function prev() {
const newCurrent = current - 1;
setCurrent(newCurrent);
}
const handleSetTrackId = e => {
setTrackId(e.target.value);
};
const handleSetMentorId = e => {
setMentorId(e.target.value);
};
const handleEnrollTrack = async (trackId, mentorId) => {
try {
await userEnrollTrackAction(trackId, mentorId);
await getTrackName(trackId);
} catch (error) {}
next();
};
useEffect(() => {
getTracksAction();
}, [getTracksAction]);
return (
<TrackEnrollStyled>
<Modal
visible={visible}
onCancel={onCancel}
className="custom-ant-modal"
footer={null}
closable={false}
>
<Steps current={current}>
{steps.map(item => (
<Step key={item.title} title={item.title} />
))}
</Steps>
{current === 0 && items ? (
<React.Fragment>
<Radio.Group onChange={handleSetTrackId} defaultValue={null}>
<div className="tracks-card">
{currentTracks ? (
currentTracks.map((item, idx) => (
<TrackCard
next={next}
data={item}
key={idx}
logo={tempCourseLogo}
/>
))
) : (
<CustomLoader />
)}
</div>
</Radio.Group>
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
<Pagination
// postPerPage={postPerPage}
total={items.length}
defaultCurrent={currentPage}
// paginate={paginate}
onChange={paginate}
pageSize={trackPerPage}
showSizeChanger={false}
/>
</div>
</React.Fragment>
) : null}
{current === 1 ? <TracksEnrollStages id={trackId} /> : null}
{current === 2 ? (
<React.Fragment>
<SelectMentorStep
trackId={trackId}
handleSetMentorId={handleSetMentorId}
/>
</React.Fragment>
) : null}
{current === 3 ? (
<EnrollmentStatus
status={error ? 'error' : 'success'}
title={trackTitle}
prev={prev}
/>
) : null}
<div className="steps-action">
{current === 0 && (
<Button type="primary" disabled={!trackId} onClick={() => next()}>
Next
</Button>
)}
{current === 1 && (
<React.Fragment>
<Button type="default" onClick={() => prev()}>
Back
</Button>
<Popconfirm
title="Are you sure?"
onConfirm={() => next()}
icon={<QuestionCircleOutlined style={{ color: 'green' }} />}
>
<Button type="primary" className="ml-2">
Next
</Button>
</Popconfirm>
</React.Fragment>
)}
{current === 2 && (
<React.Fragment>
<Button type="default" onClick={() => prev()}>
Back
</Button>
<Popconfirm
title="Are you sure?"
onConfirm={() => handleEnrollTrack(trackId, mentorId)}
icon={<QuestionCircleOutlined style={{ color: 'green' }} />}
disabled={!mentorId}
>
<Button type="primary" disabled={!mentorId} className="ml-2">
Enroll
</Button>
</Popconfirm>
</React.Fragment>
)}
{current === 3 && (
<Button type="primary" onClick={() => onCancel()}>
Done
</Button>
)}
</div>
</Modal>
</TrackEnrollStyled>
);
}
Example #12
Source File: index.js From gobench with Apache License 2.0 | 5 votes |
render() {
return (
<div>
<h5 className="mb-3">
<strong>Basic</strong>
</h5>
<div className="mb-5">
<Steps current={1}>
<Step title="Finished" description="This is a description." />
<Step title="In Progress" description="This is a description." />
<Step title="Waiting" description="This is a description." />
</Steps>
</div>
<h5 className="mb-3">
<strong>With Icons</strong>
</h5>
<div className="mb-5">
<Steps>
<Step status="finish" title="Login" icon={<UserOutlined />} />
<Step status="finish" title="Verification" icon={<SolutionOutlined />} />
<Step status="process" title="Pay" icon={<LoadingOutlined />} />
<Step status="wait" title="Done" icon={<SmileOutlined />} />
</Steps>
</div>
<h5 className="mb-3">
<strong>Centered</strong>
</h5>
<div className="mb-5">
<Steps progressDot current={1}>
<Step title="Finished" description="This is a description." />
<Step title="In Progress" description="This is a description." />
<Step title="Waiting" description="This is a description." />
</Steps>
</div>
<h5 className="mb-3">
<strong>Vertical</strong>
</h5>
<div className="mb-5">
<Steps direction="vertical" current={1}>
<Step title="Finished" description="This is a description." />
<Step title="In Progress" description="This is a description." />
<Step title="Waiting" description="This is a description." />
</Steps>
</div>
</div>
)
}
Example #13
Source File: index.js From camel-store-admin with Apache License 2.0 | 5 votes |
{ Step } = Steps
Example #14
Source File: FormDemo2.js From discern with BSD 3-Clause "New" or "Revised" License | 5 votes |
{ Step } = Steps
Example #15
Source File: TableList.js From youdidao-unmanned-shop with MIT License | 5 votes |
{ Step } = Steps
Example #16
Source File: styles.js From bank-client with MIT License | 5 votes |
StyledSteps = styled(Steps)`
&&& {
padding: 20px 20px 30px;
max-width: 1260px;
margin: 0 auto;
flex-direction: row;
.ant-steps-item {
display: flex;
align-items: center;
justify-content: center;
.ant-steps-item-icon {
margin-right: 0;
}
.ant-steps-item-content {
display: none;
}
}
${media.phone`
.ant-steps-item {
&:last-child {
flex: 1;
}
}
`}
${media.tablet`
padding: 20px 50px 30px;
.ant-steps-item {
display: inline-block;
&:last-child {
flex: none;
}
.ant-steps-item-icon {
margin: 0 8px 0 0;
}
.ant-steps-item-content {
display: inline-block;
}
}
`}
}
`
Example #17
Source File: CreateProfile.js From placement-portal with MIT License | 5 votes |
render() {
const {step, student_details, general_details} = this.state;
const {Step} = Steps;
const {Content} = Layout;
const stepConfig = [
{
title: 'General Details'
},
{
title: 'Student Details'
}
];
if (this.props.profileExists) {
return (<Redirect to="/student/dashboard"/>);
}
return(
<Layout>
<Row type='flex' justify='center'>
<Col span={24}>
<Content
style={{
margin: 10,
padding: 24,
background: "#fff"
}}
>
<Row type='flex' justify='center' style={{background: '#fff'}}>
<Col span={24}>
<Row type= 'flex' justify='center' style={{margin: 24}}>
<Typography.Title>
Create Profile
</Typography.Title>
</Row>
<Row type='flex' justify='center' style={{margin: 24}}>
<Col xs={24} sm={24} md={12}>
<Steps current={step-1}>
{stepConfig.map(item => (
<Step key={item.title} title={item.title}/>
))}
</Steps>
</Col>
</Row>
<Row type='flex' justify='center' style={{margin: 24}}>
{step === 1 ?
<Col xs={24} sm={18} md={12} lg={10} xl={10} xxl={6}>
<GeneralDetailsForm {...general_details} handleNextButton={this.handleNextButtonClick}
submittedValues={this.generalDetailsFormValues}/>
</Col>
: null}
{step === 2 ?
<Col xs={24} sm={18} md={12} lg={10} xl={10} xxl={6}>
<StudentDetailsForm {...student_details} handleConfirmButton={this.handleFormSubmission}
submittedValues={this.studentDetailsFormValues}
handleBackButton={this.handleBackButtonClick} loading={this.props.loading}/>
</Col>
: null}
</Row>
</Col>
</Row>
</Content>
</Col>
</Row>
</Layout>
)
}
Example #18
Source File: about.js From hashcat.launcher with MIT License | 5 votes |
{ Step } = Steps
Example #19
Source File: direction.jsx From virtuoso-design-system with MIT License | 5 votes |
{ Step } = Steps
Example #20
Source File: index.jsx From prometheusPro with MIT License | 5 votes |
{ Step } = Steps
Example #21
Source File: AdvancedProfile.js From acy-dex-interface with MIT License | 4 votes |
render() {
const { stepDirection, operationkey } = this.state;
const { profile, loading } = this.props;
const { advancedOperation1, advancedOperation2, advancedOperation3 } = profile;
const contentList = {
tab1: (
<Table
pagination={false}
loading={loading}
dataSource={advancedOperation1}
columns={columns}
/>
),
tab2: (
<Table
pagination={false}
loading={loading}
dataSource={advancedOperation2}
columns={columns}
/>
),
tab3: (
<Table
pagination={false}
loading={loading}
dataSource={advancedOperation3}
columns={columns}
/>
),
};
return (
<PageHeaderWrapper
title="单号:234231029431"
logo={
<img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png" />
}
action={action}
content={description}
extraContent={extra}
tabList={tabList}
>
<Card title="流程进度" style={{ marginBottom: 24 }} bordered={false}>
<Steps direction={stepDirection} progressDot={customDot} current={1}>
<Step title="创建项目" description={desc1} />
<Step title="部门初审" description={desc2} />
<Step title="财务复核" />
<Step title="完成" />
</Steps>
</Card>
<Card title="用户信息" style={{ marginBottom: 24 }} bordered={false}>
<DescriptionList style={{ marginBottom: 24 }}>
<Description term="用户姓名">付小小</Description>
<Description term="会员卡号">32943898021309809423</Description>
<Description term="身份证">3321944288191034921</Description>
<Description term="联系方式">18112345678</Description>
<Description term="联系地址">
曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口
</Description>
</DescriptionList>
<DescriptionList style={{ marginBottom: 24 }} title="信息组">
<Description term="某某数据">725</Description>
<Description term="该数据更新时间">2017-08-08</Description>
<Description> </Description>
<Description
term={
<span>
某某数据
<Tooltip title="数据说明">
<Icon
style={{ color: 'rgba(0, 0, 0, 0.43)', marginLeft: 4 }}
type="info-circle-o"
/>
</Tooltip>
</span>
}
>
725
</Description>
<Description term="该数据更新时间">2017-08-08</Description>
</DescriptionList>
<h4 style={{ marginBottom: 16 }}>信息组</h4>
<Card type="inner" title="多层级信息组">
<DescriptionList size="small" style={{ marginBottom: 16 }} title="组名称">
<Description term="负责人">林东东</Description>
<Description term="角色码">1234567</Description>
<Description term="所属部门">XX公司 - YY部</Description>
<Description term="过期时间">2017-08-08</Description>
<Description term="描述">
这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长...
</Description>
</DescriptionList>
<Divider style={{ margin: '16px 0' }} />
<DescriptionList size="small" style={{ marginBottom: 16 }} title="组名称" col="1">
<Description term="学名">
Citrullus lanatus (Thunb.) Matsum. et
Nakai一年生蔓生藤本;茎、枝粗壮,具明显的棱。卷须较粗..
</Description>
</DescriptionList>
<Divider style={{ margin: '16px 0' }} />
<DescriptionList size="small" title="组名称">
<Description term="负责人">付小小</Description>
<Description term="角色码">1234568</Description>
</DescriptionList>
</Card>
</Card>
<Card title="用户近半年来电记录" style={{ marginBottom: 24 }} bordered={false}>
<div className={styles.noData}>
<Icon type="frown-o" />
暂无数据
</div>
</Card>
<Card
className={styles.tabsCard}
bordered={false}
tabList={operationTabList}
onTabChange={this.onOperationTabChange}
>
{contentList[operationkey]}
</Card>
</PageHeaderWrapper>
);
}
Example #22
Source File: UpdateForm.jsx From vpp with MIT License | 4 votes |
UpdateForm = props => {
const [formVals, setFormVals] = useState({
name: props.values.name,
desc: props.values.desc,
key: props.values.key,
target: '0',
template: '0',
type: '1',
time: '',
frequency: 'month',
});
const [currentStep, setCurrentStep] = useState(0);
const [form] = Form.useForm();
const {
onSubmit: handleUpdate,
onCancel: handleUpdateModalVisible,
updateModalVisible,
values,
} = props;
const forward = () => setCurrentStep(currentStep + 1);
const backward = () => setCurrentStep(currentStep - 1);
const handleNext = async () => {
const fieldsValue = await form.validateFields();
setFormVals({ ...formVals, ...fieldsValue });
if (currentStep < 2) {
forward();
} else {
handleUpdate({ ...formVals, ...fieldsValue });
}
};
const renderContent = () => {
if (currentStep === 1) {
return (
<>
<FormItem name="target" label="监控对象">
<Select
style={{
width: '100%',
}}
>
<Option value="0">表一</Option>
<Option value="1">表二</Option>
</Select>
</FormItem>
<FormItem name="template" label="规则模板">
<Select
style={{
width: '100%',
}}
>
<Option value="0">规则模板一</Option>
<Option value="1">规则模板二</Option>
</Select>
</FormItem>
<FormItem name="type" label="规则类型">
<RadioGroup>
<Radio value="0">强</Radio>
<Radio value="1">弱</Radio>
</RadioGroup>
</FormItem>
</>
);
}
if (currentStep === 2) {
return (
<>
<FormItem
name="time"
label="开始时间"
rules={[
{
required: true,
message: '请选择开始时间!',
},
]}
>
<DatePicker
style={{
width: '100%',
}}
showTime
format="YYYY-MM-DD HH:mm:ss"
placeholder="选择开始时间"
/>
</FormItem>
<FormItem name="frequency" label="调度周期">
<Select
style={{
width: '100%',
}}
>
<Option value="month">月</Option>
<Option value="week">周</Option>
</Select>
</FormItem>
</>
);
}
return (
<>
<FormItem
name="name"
label="规则名称"
rules={[
{
required: true,
message: '请输入规则名称!',
},
]}
>
<Input placeholder="请输入" />
</FormItem>
<FormItem
name="desc"
label="规则描述"
rules={[
{
required: true,
message: '请输入至少五个字符的规则描述!',
min: 5,
},
]}
>
<TextArea rows={4} placeholder="请输入至少五个字符" />
</FormItem>
</>
);
};
const renderFooter = () => {
if (currentStep === 1) {
return (
<>
<Button
style={{
float: 'left',
}}
onClick={backward}
>
上一步
</Button>
<Button onClick={() => handleUpdateModalVisible(false, values)}>取消</Button>
<Button type="primary" onClick={() => handleNext()}>
下一步
</Button>
</>
);
}
if (currentStep === 2) {
return (
<>
<Button
style={{
float: 'left',
}}
onClick={backward}
>
上一步
</Button>
<Button onClick={() => handleUpdateModalVisible(false, values)}>取消</Button>
<Button type="primary" onClick={() => handleNext()}>
完成
</Button>
</>
);
}
return (
<>
<Button onClick={() => handleUpdateModalVisible(false, values)}>取消</Button>
<Button type="primary" onClick={() => handleNext()}>
下一步
</Button>
</>
);
};
return (
<Modal
width={640}
bodyStyle={{
padding: '32px 40px 48px',
}}
destroyOnClose
title="规则配置"
visible={updateModalVisible}
footer={renderFooter()}
onCancel={() => handleUpdateModalVisible()}
>
<Steps
style={{
marginBottom: 28,
}}
size="small"
current={currentStep}
>
<Step title="基本信息" />
<Step title="配置规则属性" />
<Step title="设定调度周期" />
</Steps>
<Form
{...formLayout}
form={form}
initialValues={{
target: formVals.target,
template: formVals.template,
type: formVals.type,
frequency: formVals.frequency,
name: formVals.name,
desc: formVals.desc,
}}
>
{renderContent()}
</Form>
</Modal>
);
}
Example #23
Source File: RegisterSymbols.js From bonded-stablecoin-ui with MIT License | 4 votes |
RegisterSymbols = (props) => {
let initCurrentStep = 0;
if (!props.symbol1 && !props.pendings.tokens1) {
initCurrentStep = 0;
} else if (!props.symbol2 && !props.pendings.tokens2) {
initCurrentStep = 1;
} else if (!props.symbol3 && !props.pendings.tokens3) {
initCurrentStep = 2;
} else if (!props.symbol4 && !props.pendings.tokens4) {
initCurrentStep = 3;
}
const [width] = useWindowSize();
const [currentStep, setCurrentStep] = useState(initCurrentStep);
const currentSymbol = currentStep + 1;
const [isAvailable, setIsAvailable] = useState(undefined);
const [symbolByCurrentAsset, setSymbolByCurrentAsset] = useState(undefined);
const [token, setToken] = useState(initStateValue);
const [tokenSupport, setTokenSupport] = useState(initStateValue);
const [descr, setDescr] = useState(initStateValue);
const { params, bonded_state } = useSelector((state) => state.active);
const { t } = useTranslation();
const checkRef = useRef(null);
const regRef = useRef(null);
const symbolInputRef = useRef(null);
let currentAsset;
if (currentSymbol === 1 || currentSymbol === 2 || currentSymbol === 3) {
currentAsset = props["asset" + currentSymbol];
} else if (currentSymbol === 4) {
currentAsset = props.fund_asset;
}
let currentDecimals;
if (currentSymbol === 3 || currentSymbol === 2) {
currentDecimals = props.decimals2;
} else if (currentSymbol === 4) {
currentDecimals = props.reserve_asset_decimals;
} else {
currentDecimals = props.decimals1;
}
useEffect(() => {
if (!props.symbol1 && !props.pendings.tokens1) {
setCurrentStep(0);
} else if (!props.symbol2 && !props.pendings.tokens2) {
setCurrentStep(1);
} else if (!props.symbol3 && !props.pendings.tokens3) {
setCurrentStep(2);
} else if (!props.symbol4 && !props.pendings.tokens4) {
setCurrentStep(3);
}
}, [props]);
useEffect(() => {
setIsAvailable(undefined);
setToken(initStateValue);
setTokenSupport(initStateValue);
setDescr(initStateValue);
(async () => {
const symbol = await socket.api.getSymbolByAsset(
config.TOKEN_REGISTRY,
currentAsset
);
if (symbol !== currentAsset.replace(/[+=]/, "").substr(0, 6)) {
setSymbolByCurrentAsset(symbol);
} else {
setSymbolByCurrentAsset(null);
}
})();
}, [currentStep, setSymbolByCurrentAsset, currentAsset]);
useEffect(() => {
if (isAvailable === null) {
(async () => {
const asset = await socket.api.getAssetBySymbol(
config.TOKEN_REGISTRY,
token.value
);
if (!!asset) {
setIsAvailable(false);
} else {
setIsAvailable(true);
let initDescr;
const targetCurrency = getTargetCurrency(params, bonded_state);
if (currentSymbol === 4) {
initDescr = `Stability fund shares for ${targetCurrency}-pegged stablecoin (${props.address})`;
} if (currentSymbol === 3) {
initDescr = `Stable token for ${targetCurrency}-pegged stablecoin (${props.address})`;
} else if (currentSymbol === 2) {
initDescr = `Interest token for ${targetCurrency}-pegged stablecoin (${props.address})`;
} else if (currentSymbol === 1) {
initDescr = `Growth token for ${targetCurrency}-pegged stablecoin (${props.address})`;
}
setDescr({
value: initDescr,
valid: true,
});
setTokenSupport({ value: "0.1", valid: true })
}
})();
symbolInputRef?.current.blur();
} else if (isAvailable === undefined) {
symbolInputRef?.current.focus({
cursor: 'start',
});
}
}, [isAvailable, props.address, currentSymbol]);
const data = {
asset: currentAsset,
symbol: token.value,
decimals:
(isAvailable && !symbolByCurrentAsset && currentDecimals) || undefined,
description:
(isAvailable && descr.valid && !symbolByCurrentAsset && descr.value) ||
undefined,
};
const handleChangeSymbol = (ev) => {
const targetToken = ev.target.value.toUpperCase();
// eslint-disable-next-line no-useless-escape
const reg = /^[0-9A-Z_\-]+$/;
if (reg.test(targetToken) || !targetToken) {
if (targetToken.length > 0) {
if (targetToken.length <= 40) {
if (reservedTokens.find((t) => targetToken === t)) {
setToken({ ...token, value: targetToken, valid: false });
} else {
setToken({ ...token, value: targetToken, valid: true });
}
} else {
setToken({
...token,
value: targetToken,
valid: false,
});
}
} else {
setToken({ ...token, value: targetToken, valid: false });
}
}
};
const handleChangeSupport = (ev) => {
const support = ev.target.value;
const reg = /^[0-9.]+$/;
const f = (x) =>
~(x + "").indexOf(".") ? (x + "").split(".")[1].length : 0;
if (support) {
if (reg.test(support) && f(support) <= 9) {
if (Number(support) >= 0.1) {
setTokenSupport({ ...token, value: support, valid: true });
} else {
setTokenSupport({ ...token, value: support, valid: false });
}
}
} else {
setTokenSupport({ ...token, value: "", valid: false });
}
};
const handleChangeDescr = (ev) => {
const { value } = ev.target;
if (value.length < 140) {
setDescr({ value, valid: true });
} else {
setDescr({ value, valid: false });
}
};
let helpSymbol = undefined;
if (isBoolean(isAvailable)) {
if (isAvailable) {
helpSymbol = t("reg_symbol.available", "Symbol name {{value}} is available, you can register it", { value: token.value });
} else {
helpSymbol = t("reg_symbol.taken", "This token name is already taken. This will start a dispute");
}
}
const clickOnRegBtn = (ev) => {
if (ev.key === "Enter") {
if (token.valid && descr.valid && tokenSupport.valid) {
regRef.current.click();
}
}
}
return (
<div>
<Title level={3} type="secondary">
{t("reg_symbol.title", "Register symbols")}
</Title>
<Steps
current={currentStep}
style={{ marginTop: 20 }}
direction={width > 800 ? "horizontal" : "vertical"}
>
<Step title={t("reg_symbol.step_growth", "Symbol for growth token")} />
<Step title={t("reg_symbol.step_interest", "Symbol for interest token")} />
<Step style={!props.interest ? { display: 'none' } : {}} title={t("reg_symbol.step_stable", "Symbol for stable tokens")} />
{props.isV2 && <Step title={t("reg_symbol.step_fond", "Symbol for fund tokens")} />}
</Steps>
{symbolByCurrentAsset && (
<p style={{ paddingTop: 20, maxWidth: 600 }}>
<Text type="secondary">
{t("reg_symbol.taken_desc", "This stablecoin already has a symbol {{symbol}} assigned to it. Attempting to assign a new symbol will start a dispute process which can take more than 30 days. The symbol that gets more support (in terms of GBYTE deposits) eventually wins.", { symbol: symbolByCurrentAsset })}
</Text>
</p>
)}
<Form size="large" style={{ marginTop: 35 }}>
<Form.Item
hasFeedback
extra={helpSymbol}
validateStatus={
(isAvailable === false && "warning") ||
(isAvailable === true && "success")
}
>
<Input
placeholder={t("reg_symbol.symbol", "Symbol")}
allowClear
autoFocus={true}
ref={symbolInputRef}
disabled={isBoolean(isAvailable)}
autoComplete="off"
value={token.value}
onChange={handleChangeSymbol}
onKeyPress={(ev) => {
if (ev.key === "Enter") {
if (token.valid) {
checkRef.current.click();
}
}
}}
/>
</Form.Item>
{isAvailable !== undefined && isAvailable !== null && (
<Form.Item>
<Input
placeholder={t("reg_symbol.placeholder_support", "Support (Min amount 0.1 GB)")}
suffix="GB"
autoComplete="off"
value={tokenSupport.value}
onChange={handleChangeSupport}
autoFocus={isBoolean(isAvailable)}
onKeyPress={clickOnRegBtn}
/>
</Form.Item>
)}
{isAvailable === true && !symbolByCurrentAsset && (
<Form.Item>
<Form.Item
hasFeedback
// validateStatus={descr && !descr.valid ? "error" : null}
>
<Input.TextArea
style={{ fontSize: 16 }}
rows={5}
value={descr.value}
onChange={handleChangeDescr}
placeholder={t("reg_symbol.placeholder_desc", "Description of an asset (up to 140 characters)")}
/>
</Form.Item>
</Form.Item>
)}
<Form.Item>
<Space>
{isAvailable === undefined || isAvailable === null ? (
<Button
onClick={() => {
setIsAvailable(null);
}}
key="btn-check"
loading={isAvailable === null}
disabled={token.value === "" || !token.valid}
ref={checkRef}
>
{t("reg_symbol.check_availability", "Check availability")}
</Button>
) : (
<QRButton
disabled={!token.valid || !tokenSupport.valid}
key="btn-reg"
ref={regRef}
href={generateLink(
tokenSupport.value * 1e9,
data,
props.activeWallet,
config.TOKEN_REGISTRY
)}
>
{isAvailable && !symbolByCurrentAsset
? t("reg_symbol.register", "Register")
: t("reg_symbol.register_anyway", "Register anyway")}
</QRButton>
)}
<Button
type="link"
danger
onClick={() => {
props.handleSkip(true);
}}
>
{t("reg_symbol.skip", "Skip")}
</Button>
</Space>
</Form.Item>
</Form>
</div>
);
}
Example #24
Source File: QuadraticDiplomacyVote.jsx From quadratic-diplomacy with MIT License | 4 votes |
export default function QuadraticDiplomacyVote({
voteCredits,
contributorEntries,
tx,
writeContracts,
isVoter,
mainnetProvider,
}) {
const [selectedContributors, setSelectedContributors] = useState({});
const [currentStep, setCurrentStep] = useState(1);
const [spentVoteTokens, setSpentVoteTokens] = useState(0);
const [isSendingTx, setIsSendingTx] = useState(false);
const availableVoteTokens = voteCredits?.toNumber() ?? 0;
const remainingVoteTokens = availableVoteTokens - spentVoteTokens;
const contributors = useMemo(
() =>
contributorEntries.reduce((entries, current) => {
entries[current.wallet] = 0;
return entries;
}, {}),
[contributorEntries],
);
const allContributorsSelected = Object.keys(contributors).length === Object.keys(selectedContributors).length;
if (!isVoter) {
return (
<div style={{ border: "1px solid", padding: "40px", width: 800, margin: "auto", marginTop: 64, textAlign: "left" }}>
<Title level={4} style={{ fontFamily: "Space Mono" }}>Access denied</Title>
<p>You are not part of the members of this election.</p>
</div>
);
}
const handleSelectAllContributors = () =>
allContributorsSelected ? setSelectedContributors({}) : setSelectedContributors(contributors);
const handleContributorSelection = (e, contributorAddress) => {
setSelectedContributors(prevSelectedContributors => {
if (prevSelectedContributors[contributorAddress] !== undefined) {
const state = { ...prevSelectedContributors };
delete state[contributorAddress];
return state;
} else {
return {
...prevSelectedContributors,
[contributorAddress]: contributors[contributorAddress],
};
}
});
};
const handleContributorVote = (e, op, clickedContributorAddress) => {
// adjust available vote tokens
setSpentVoteTokens(prevSpentVoteTokens => (op === "add" ? prevSpentVoteTokens + 1 : prevSpentVoteTokens - 1));
// update contributor vote tokens
setSelectedContributors(prevSelectedContributors => ({
...prevSelectedContributors,
[clickedContributorAddress]:
op === "add"
? Math.min(prevSelectedContributors[clickedContributorAddress] + 1, availableVoteTokens)
: Math.max(prevSelectedContributors[clickedContributorAddress] - 1, 0),
}));
};
const handleSubmitVotes = async () => {
const wallets = [];
const amounts = [];
Object.entries(selectedContributors).forEach(([contributorAddress, voteTokens]) => {
wallets.push(contributorAddress);
amounts.push(voteTokens);
});
setIsSendingTx(true);
await tx(writeContracts.QuadraticDiplomacyContract.voteMultiple(wallets, amounts), update => {
if (update && (update.status === "confirmed" || update.status === 1)) {
setIsSendingTx(false);
setSpentVoteTokens(0);
setCurrentStep(3);
} else if (update.error) {
setIsSendingTx(false);
}
});
};
return (
<div style={{ border: "1px solid", padding: "40px", width: 800, margin: "auto", marginTop: 64, textAlign: "left" }}>
<Steps initial={1} current={currentStep} labelPlacement="vertical">
<Steps.Step
title="Select Contributors"
subTitle={`${contributorEntries.length} contributors`}
icon={<SmileTwoTone />}
/>
<Steps.Step
title="Allocate Votes"
subTitle={`${remainingVoteTokens} votes left`}
icon={<LikeTwoTone twoToneColor="#eb2f96" />}
/>
<Steps.Step title="Done" subTitle="Thank you!" icon={<CheckCircleTwoTone twoToneColor="#52c41a" />} />
</Steps>
<Divider />
{currentStep === 1 ? (
<List
size="large"
itemLayout="horizontal"
header={<Title level={4} style={{ fontFamily: "Space Mono" }}>1. Who've you been working with?</Title>}
style={{ width: "600px", margin: "0 auto" }}
footer={
<Row justify="end">
<Button
type="primary"
onClick={() => setCurrentStep(2)}
disabled={!Object.keys(selectedContributors).length}
>
Next
</Button>
</Row>
}
dataSource={Object.entries(contributors)}
renderItem={([contributorAddress, votes], index) => (
<>
{index === 0 && (
<List.Item>
<Checkbox
indeterminate={!allContributorsSelected && Object.keys(selectedContributors).length}
checked={allContributorsSelected}
onChange={handleSelectAllContributors}
>
Select All
</Checkbox>
</List.Item>
)}
<List.Item key={contributorAddress}>
<Checkbox
size="large"
onClick={e => handleContributorSelection(e, contributorAddress)}
checked={selectedContributors[contributorAddress] !== undefined}
>
<Address address={contributorAddress} ensProvider={mainnetProvider} fontSize={16} size="short" />
</Checkbox>
</List.Item>
</>
)}
/>
) : currentStep === 2 ? (
<List
size="large"
itemLayout="horizontal"
style={{ width: "600px", margin: "0 auto" }}
header={
<Space direction="vertical">
<Title level={4} style={{ fontFamily: "Space Mono" }}>2. Allocate votes</Title>
<Title level={5}>
Remaining vote tokens:
<Badge
showZero
overflowCount={1000}
count={remainingVoteTokens}
style={{ backgroundColor: "#52c41a" }}
/>
</Title>
</Space>
}
footer={
<Row justify="end">
{!isSendingTx ? (
<>
<Button onClick={() => setCurrentStep(1)} style={{ marginRight: "8px" }} type="secondary">Go back</Button>
<Button type="primary" onClick={handleSubmitVotes}>
Commit votes
</Button>
</>
) : (
<Spin size="small" />
)}
</Row>
}
dataSource={Object.entries(selectedContributors)}
renderItem={([contributorAddress, contributor]) => (
<>
<Badge.Ribbon
showZero
overflowCount={1000}
text={<Title level={5}>{contributor} </Title>}
style={{
backgroundColor: contributor ? "#eb2f96" : "grey",
height: 24,
width: 30,
marginRight: -5,
}}
/>
<List.Item
key={contributorAddress}
extra={
<Button.Group>
<Button
danger
ghost
onClick={e => handleContributorVote(e, "remove", contributorAddress)}
disabled={!contributor}
>
<MinusOutlined />
</Button>
<Button
type="primary"
ghost
onClick={e => handleContributorVote(e, "add", contributorAddress)}
disabled={!remainingVoteTokens}
>
<PlusOutlined />
</Button>
</Button.Group>
}
>
<List.Item.Meta
avatar={
<Address address={contributorAddress} fontSize={16} size="short" ensProvider={mainnetProvider} />
}
/>
</List.Item>
</>
)}
/>
) : (
currentStep === 3 && (
<>
<Title level={3} style={{ fontFamily: "Space Mono" }}>Thank you for voting.</Title>
<p>The allocation to this workstream will be informed by your votes. See you next month!</p>
<Title level={5} style={{ marginTop: "24px" }}>Your votes:</Title>
{Object.entries(selectedContributors).map(([contributorAddress, voteTokens]) => (
<p key={contributorAddress}>
<Address address={contributorAddress} fontSize={16} size="short" ensProvider={mainnetProvider} /> (
<Text>{voteTokens}</Text>)
</p>
))}
</>
)
)}
</div>
);
}
Example #25
Source File: AdvancedProfile.js From camel-store-admin with Apache License 2.0 | 4 votes |
render() {
const { stepDirection, operationkey } = this.state;
const { profile, loading } = this.props;
const { advancedOperation1, advancedOperation2, advancedOperation3 } = profile;
const contentList = {
tab1: (
<Table
pagination={false}
loading={loading}
dataSource={advancedOperation1}
columns={columns}
/>
),
tab2: (
<Table
pagination={false}
loading={loading}
dataSource={advancedOperation2}
columns={columns}
/>
),
tab3: (
<Table
pagination={false}
loading={loading}
dataSource={advancedOperation3}
columns={columns}
/>
),
};
return (
<PageHeaderWrapper
title="单号:234231029431"
logo={
<img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png" />
}
action={action}
content={description}
extraContent={extra}
tabList={tabList}
>
<Card title="流程进度" style={{ marginBottom: 24 }} bordered={false}>
<Steps direction={stepDirection} progressDot={customDot} current={1}>
<Step title="创建项目" description={desc1} />
<Step title="部门初审" description={desc2} />
<Step title="财务复核" />
<Step title="完成" />
</Steps>
</Card>
<Card title="用户信息" style={{ marginBottom: 24 }} bordered={false}>
<DescriptionList style={{ marginBottom: 24 }}>
<Description term="用户姓名">付小小</Description>
<Description term="会员卡号">32943898021309809423</Description>
<Description term="身份证">3321944288191034921</Description>
<Description term="联系方式">18112345678</Description>
<Description term="联系地址">
曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口
</Description>
</DescriptionList>
<DescriptionList style={{ marginBottom: 24 }} title="信息组">
<Description term="某某数据">725</Description>
<Description term="该数据更新时间">2017-08-08</Description>
<Description> </Description>
<Description
term={
<span>
某某数据
<Tooltip title="数据说明">
<Icon
style={{ color: 'rgba(0, 0, 0, 0.43)', marginLeft: 4 }}
type="info-circle-o"
/>
</Tooltip>
</span>
}
>
725
</Description>
<Description term="该数据更新时间">2017-08-08</Description>
</DescriptionList>
<h4 style={{ marginBottom: 16 }}>信息组</h4>
<Card type="inner" title="多层级信息组">
<DescriptionList size="small" style={{ marginBottom: 16 }} title="组名称">
<Description term="负责人">林东东</Description>
<Description term="角色码">1234567</Description>
<Description term="所属部门">XX公司 - YY部</Description>
<Description term="过期时间">2017-08-08</Description>
<Description term="描述">
这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长...
</Description>
</DescriptionList>
<Divider style={{ margin: '16px 0' }} />
<DescriptionList size="small" style={{ marginBottom: 16 }} title="组名称" col="1">
<Description term="学名">
Citrullus lanatus (Thunb.) Matsum. et
Nakai一年生蔓生藤本;茎、枝粗壮,具明显的棱。卷须较粗..
</Description>
</DescriptionList>
<Divider style={{ margin: '16px 0' }} />
<DescriptionList size="small" title="组名称">
<Description term="负责人">付小小</Description>
<Description term="角色码">1234568</Description>
</DescriptionList>
</Card>
</Card>
<Card title="用户近半年来电记录" style={{ marginBottom: 24 }} bordered={false}>
<div className={styles.noData}>
<Icon type="frown-o" />
暂无数据
</div>
</Card>
<Card
className={styles.tabsCard}
bordered={false}
tabList={operationTabList}
onTabChange={this.onOperationTabChange}
>
{contentList[operationkey]}
</Card>
</PageHeaderWrapper>
);
}
Example #26
Source File: index.js From discern with BSD 3-Clause "New" or "Revised" License | 4 votes |
render() {
const {size, current} = this.state
const cardContent = '当任务复杂或者存在先后关系时,将其分解成一系列步骤,从而简化任务,引导用户按照流程完成任务的导航条'
return (
<div>
<CustomBreadcrumb arr={['导航', '步骤条']}/>
<TypingCard source={cardContent}/>
<Row gutter={16}>
<Col span={12}>
<Card bordered={false} className='card-item' title='基本使用'>
<Steps current={2}>
<Step title="Finished" description="This is a description."/>
<Step title="In Progress" description="This is a description."/>
<Step title="Waiting" description="This is a description."/>
</Steps>
</Card>
<Card bordered={false} className='card-item' title='基本使用'>
<Steps current={1}>
<Step title="Finished" description="This is a description."/>
<Step title="In Progress" description="This is a description."/>
<Step title="Waiting" description="This is a description."/>
</Steps>
</Card>
<Card bordered={false} className='card-item' title='步骤运行错误'>
<Steps current={1} status="error">
<Step title="Finished" description="This is a description"/>
<Step title="In Process" description="This is a description"/>
<Step title="Waiting" description="This is a description"/>
</Steps>
</Card>
<Card bordered={false} className='card-item' title='步骤切换'>
<Steps current={current}>
{steps.map(item => <Step title={item.title}
key={item.title}
description={item.content}/>)}
</Steps>
<div style={styles.stepsContent}>{steps[current].content}</div>
<div>
{
current < steps.length - 1 ?
<Button type='primary'
onClick={() => this.setState({current: current + 1})}>下一步</Button> :
<Button
onClick={() => message.success('Processing complete!')}>已完成</Button>
}
<Button
style={current === 0 ? {display: 'none'} : {marginLeft: 15}}
onClick={() => this.prev()}>上一步</Button>
</div>
</Card>
</Col>
<Col span={12}>
<Card bordered={false} className='card-item' title='大小'>
<Radio.Group style={{marginBottom: '1em'}}
onChange={(e) => this.setState({size: e.target.value})}
value={size}>
<Radio.Button value='small'>Small</Radio.Button>
<Radio.Button value='default'>Default</Radio.Button>
</Radio.Group>
<Steps current={1} size={size}>
<Step title="Finished" description="This is a description."/>
<Step title="In Progress" description="This is a description."/>
<Step title="Waiting" description="This is a description."/>
</Steps>
</Card>
<Card bordered={false} className='card-item' title='带图标'>
<Steps>
<Step status="finish" title="Login" icon={<Icon type="user"/>}/>
<Step status="finish" title="Verification"
icon={<Icon type="solution"/>}/>
<Step status="process" title="Pay"
icon={<Icon type="loading"/>}/>
<Step status="wait" title="Done" icon={<Icon type="smile-o"/>}/>
</Steps>
</Card>
<Card bordered={false} className='card-item' title='点状步骤条'>
<Steps progressDot current={2}>
<Step title="Finished" description="This is a description."/>
<Step title="In Progress" description="This is a description."/>
<Step title="Waiting" description="This is a description."/>
</Steps>
</Card>
</Col>
</Row>
<BackTop visibilityHeight={200} style={{right: 50}}/>
</div>
)
}
Example #27
Source File: index.js From placement-portal with MIT License | 4 votes |
render(){
const {
current,
steps,
job_details,
selection_criteria,
salary_details,
logistics_details
} = this.state;
const {
handleBack,
handleNext,
handleSubmit,
handleJobDetails,
handleSalaryDetails,
handleLogisticsDetails,
handleSelectionCriteria
} = this;
const jobDetailsProps = {
...job_details,
handleNext,
submitValues: handleJobDetails,
};
const selectionDetailsProps = {
...selection_criteria,
handleNext,
handleBack,
submitValues: handleSelectionCriteria
};
const salaryDetailsProps = {
...salary_details,
handleNext,
handleBack,
submitValues: handleSalaryDetails
};
const logistictsDetailsProps = {
...logistics_details,
handleBack,
handleSubmit,
submitValues: handleLogisticsDetails
};
return(
<Layout>
<Row type='flex' justify='center'>
<Col span={24}>
<Spin spinning={false} tip={"Processing..."}> {/*<Spin spinning={this.props.loading} tip={"Processing..."}></Spin>*/}
<Content
style={{
margin: 10,
padding: 24,
background: "#fff"
}}
>
<Row type='flex' justify='center' style={{background: '#fff'}}>
<Row type= 'flex' justify='center'>
<Typography.Title>
Job Application Form (JAF)
</Typography.Title>
</Row>
<Steps current={current} style={{margin: 24}}>
{steps.map(item => (
<Steps.Step key={item.title} title={item.title}/>
))}
</Steps>
<Row type='flex' justify='center' style={{background: '#fff',margin: 24}}>
{current === 0 ?
<Col>
<TheCompanyForm {...jobDetailsProps}/>
</Col>
: null}
{current === 1 ?
<Col>
<TheJobForm {...selectionDetailsProps} />
</Col>
: null}
{current === 2 ?
<Col>
<SalaryDetailsForm {...salaryDetailsProps} />
</Col>
: null}
{current === 3 ?
<Col>
<EligibilityCriteriaForm {...logistictsDetailsProps}/>
</Col>
: null}
</Row>
</Row>
</Content>
</Spin>
</Col>
</Row>
</Layout>
)
}
Example #28
Source File: newtask.js From hashcat.launcher with MIT License | 4 votes |
render() {
return (
<>
<PageHeader
title="New Task"
extra={[
<Upload
key="Import Config"
accept=".json"
maxCount={1}
showUploadList={false}
onChange={this.onClickImportConfig}
beforeUpload={() => {return false;}}
>
<Button
type="text"
icon={<ImportOutlined />}
loading={this.state.isLoadingImportConfig}
>
Import Config
</Button>
</Upload>,
<Button
key="Export Config"
type="text"
icon={<ExportOutlined />}
onClick={this.onClickExportConfig}
loading={this.state.isLoadingExportConfig}
>
Export Config
</Button>
]}
/>
<Content style={{ padding: '16px 24px' }}>
<Row gutter={[16]}>
<Col span={4}>
<Steps direction="vertical" current={this.state.step} onChange={this.onChangeStep}>
<Step title="Target" icon={<AimOutlined />} description="Select Target" />
<Step title="Attack" icon={<ToolOutlined />} description="Configure Attack" />
<Step title="Advanced" icon={<ExperimentOutlined />} description="Advanced Options" />
<Step title="Output" icon={<ExportOutlined />} description="Set Output" />
<Step title="Finalize" icon={<FileDoneOutlined />} description="Review and Finalize" />
</Steps>
</Col>
<Col span={20}>
<div className="steps-content">
{this.state.step === 0 ? (
<Form layout="vertical">
<Form.Item
label="Hash"
>
<Select
showSearch
style={{ width: "100%" }}
size="large"
placeholder="Select Hash"
value={this.state.hash}
onChange={this.onChangeHash}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._hashes.map(hash =>
<Option value={hash} key={hash} title={hash}>{filename(hash)}</Option>
)}
</Select>
</Form.Item>
<Form.Item
label="Algorithm"
>
<Select
showSearch
style={{ width: "100%" }}
size="large"
placeholder="Select Algorithm"
value={this.state.algorithm}
onChange={this.onChangeAlgorithm}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{Object.keys(this.state._algorithms).map(key =>
<Option value={Number(key)} key={Number(key)}>{key + " - " + this.state._algorithms[key]}</Option>
)}
</Select>
</Form.Item>
</Form>
) : this.state.step === 1 ? (
<Form layout="vertical" requiredMark="optional">
<Form.Item
label="Attack Mode"
required
>
<Radio.Group value={this.state.attackMode} onChange={this.onChangeAttackMode}>
<Radio value={0}>Dictionary Attack</Radio>
<Radio value={1}>Combinator Attack</Radio>
<Radio value={3}>Mask Attack</Radio>
<Radio value={6}>Hybrid1 (Dictionary + Mask)</Radio>
<Radio value={7}>Hybrid2 (Mask + Dictionary)</Radio>
</Radio.Group>
</Form.Item>
{this.state.attackMode === 0 ? (
<>
<Form.Item
label="Dictionaries"
required
>
<Select
mode="multiple"
allowClear
style={{ width: '100%' }}
placeholder="Select Dictionaries"
size="large"
onChange={this.onChangeDictionaries}
value={this.state.dictionaries}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._dictionaries.map(dictionary =>
<Option value={dictionary} key={dictionary} title={dictionary}>{filename(dictionary)}</Option>
)}
</Select>
</Form.Item>
<Form.Item
label="Rules"
>
<Select
mode="multiple"
allowClear
style={{ width: '100%' }}
placeholder={"Select Rules [max. "+maxRules+"]"}
size="large"
onChange={this.onChangeRules}
value={this.state.rules}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._rules.map(rule =>
<Option value={rule} key={rule} title={rule}>{filename(rule)}</Option>
)}
</Select>
</Form.Item>
</>
) : this.state.attackMode === 1 ? (
<Row gutter={[18, 16]}>
<Col span={12}>
<Row>
<Col span={24}>
<Form.Item
label="Left Dictionary"
required
>
<Select
showSearch
allowClear
style={{ width: '100%' }}
placeholder="Select Left Dictionary"
size="large"
onChange={this.onChangeLeftDictionary}
value={this.state.leftDictionary}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._dictionaries.map(dictionary =>
<Option value={dictionary} key={dictionary} title={dictionary}>{filename(dictionary)}</Option>
)}
</Select>
</Form.Item>
</Col>
<Col span={24}>
<Form.Item
label="Left Rule"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Left Rule"
size="large"
onChange={this.onChangeLeftRule}
value={this.state.leftRule}
/>
</Form.Item>
</Col>
</Row>
</Col>
<Col span={12}>
<Row>
<Col span={24}>
<Form.Item
label="Right Dictionary"
required
>
<Select
showSearch
allowClear
style={{ width: '100%' }}
placeholder="Select Right Dictionary"
size="large"
onChange={this.onChangeRightDictionary}
value={this.state.rightDictionary}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._dictionaries.map(dictionary =>
<Option value={dictionary} key={dictionary} title={dictionary}>{filename(dictionary)}</Option>
)}
</Select>
</Form.Item>
</Col>
<Col span={24}>
<Form.Item
label="Right Rule"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Right Rule"
size="large"
onChange={this.onChangeRightRule}
value={this.state.rightRule}
/>
</Form.Item>
</Col>
</Row>
</Col>
</Row>
) : this.state.attackMode === 3 ? (
<Row gutter={[18, 16]}>
<Col span={12}>
{this.state.maskInputType === "text" ? (
<Form.Item
label="Mask"
required
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Mask"
size="large"
onChange={this.onChangeMask}
value={this.state.mask}
suffix={
this.state.mask ? maskLength(this.state.mask) : undefined
}
/>
<Button
type="link"
style={{ padding: '0' }}
onClick={() => this.onChangeMaskInputType({type: "file"})}
>
Use .hcmask file instead
</Button>
</Form.Item>
) : this.state.maskInputType === "file" ? (
<Form.Item
label="Mask"
required
>
<Select
allowClear
style={{ width: '100%' }}
placeholder="Select Mask"
size="large"
onChange={this.onChangeMaskFile}
value={this.state.maskFile}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._masks.map(mask =>
<Option value={mask} key={mask} title={mask}>{filename(mask)}</Option>
)}
</Select>
<Button
type="link"
style={{ padding: '0' }}
onClick={() => this.onChangeMaskInputType({type: "text"})}
>
Use mask text instead
</Button>
</Form.Item>
) : "unsupported mask input type" }
<Form.Item
label="Mask increment mode"
>
<Checkbox
checked={this.state.enableMaskIncrementMode}
onChange={this.onChangeEnableMaskIncrementMode}
>
Enable
</Checkbox>
<InputNumber
disabled={!this.state.enableMaskIncrementMode}
min={maskIncrementMin}
max={maskIncrementMax}
value={this.state.maskIncrementMin}
onChange={this.onChangeMaskIncrementMin}
/>
<InputNumber
disabled={!this.state.enableMaskIncrementMode}
min={maskIncrementMin}
max={maskIncrementMax}
value={this.state.maskIncrementMax}
onChange={this.onChangeMaskIncrementMax}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Custom charset 1"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 1"
size="large"
onChange={this.onChangeCustomCharset1}
value={this.state.customCharset1}
/>
</Form.Item>
<Form.Item
label="Custom charset 2"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 2"
size="large"
onChange={this.onChangeCustomCharset2}
value={this.state.customCharset2}
/>
</Form.Item>
<Form.Item
label="Custom charset 3"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 3"
size="large"
onChange={this.onChangeCustomCharset3}
value={this.state.customCharset3}
/>
</Form.Item>
<Form.Item
label="Custom charset 4"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 4"
size="large"
onChange={this.onChangeCustomCharset4}
value={this.state.customCharset4}
/>
</Form.Item>
</Col>
</Row>
) : this.state.attackMode === 6 ? (
<Row gutter={[18, 16]}>
<Col span={24}>
<Row gutter={[18, 16]}>
<Col span={12}>
<Form.Item
label="Dictionary"
required
>
<Select
showSearch
allowClear
style={{ width: '100%' }}
placeholder="Select Dictionary"
size="large"
onChange={this.onChangeLeftDictionary}
value={this.state.leftDictionary}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._dictionaries.map(dictionary =>
<Option value={dictionary} key={dictionary} title={dictionary}>{filename(dictionary)}</Option>
)}
</Select>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Rule"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Rule"
size="large"
onChange={this.onChangeLeftRule}
value={this.state.leftRule}
/>
</Form.Item>
</Col>
</Row>
</Col>
<Col span={12}>
{this.state.maskInputType === "text" ? (
<Form.Item
label="Mask"
required
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Mask"
size="large"
onChange={this.onChangeMask}
value={this.state.mask}
suffix={
this.state.mask ? maskLength(this.state.mask) : undefined
}
/>
<Button
type="link"
style={{ padding: '0' }}
onClick={() => this.onChangeMaskInputType({type: "file"})}
>
Use .hcmask file instead
</Button>
</Form.Item>
) : this.state.maskInputType === "file" ? (
<Form.Item
label="Mask"
required
>
<Select
allowClear
style={{ width: '100%' }}
placeholder="Select Mask"
size="large"
onChange={this.onChangeMaskFile}
value={this.state.maskFile}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._masks.map(mask =>
<Option value={mask} key={mask} title={mask}>{filename(mask)}</Option>
)}
</Select>
<Button
type="link"
style={{ padding: '0' }}
onClick={() => this.onChangeMaskInputType({type: "text"})}
>
Use mask text instead
</Button>
</Form.Item>
) : "unsupported mask input type" }
<Form.Item
label="Mask increment mode"
>
<Checkbox
checked={this.state.enableMaskIncrementMode}
onChange={this.onChangeEnableMaskIncrementMode}
>
Enable
</Checkbox>
<InputNumber
disabled={!this.state.enableMaskIncrementMode}
min={maskIncrementMin}
max={maskIncrementMax}
value={this.state.maskIncrementMin}
onChange={this.onChangeMaskIncrementMin}
/>
<InputNumber
disabled={!this.state.enableMaskIncrementMode}
min={maskIncrementMin}
max={maskIncrementMax}
value={this.state.maskIncrementMax}
onChange={this.onChangeMaskIncrementMax}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Custom charset 1"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 1"
size="large"
onChange={this.onChangeCustomCharset1}
value={this.state.customCharset1}
/>
</Form.Item>
<Form.Item
label="Custom charset 2"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 2"
size="large"
onChange={this.onChangeCustomCharset2}
value={this.state.customCharset2}
/>
</Form.Item>
<Form.Item
label="Custom charset 3"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 3"
size="large"
onChange={this.onChangeCustomCharset3}
value={this.state.customCharset3}
/>
</Form.Item>
<Form.Item
label="Custom charset 4"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 4"
size="large"
onChange={this.onChangeCustomCharset4}
value={this.state.customCharset4}
/>
</Form.Item>
</Col>
</Row>
) : this.state.attackMode === 7 ? (
<Row gutter={[18, 16]}>
<Col span={12}>
{this.state.maskInputType === "text" ? (
<Form.Item
label="Mask"
required
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Mask"
size="large"
onChange={this.onChangeMask}
value={this.state.mask}
suffix={
this.state.mask ? maskLength(this.state.mask) : undefined
}
/>
<Button
type="link"
style={{ padding: '0' }}
onClick={() => this.onChangeMaskInputType({type: "file"})}
>
Use .hcmask file instead
</Button>
</Form.Item>
) : this.state.maskInputType === "file" ? (
<Form.Item
label="Mask"
required
>
<Select
allowClear
style={{ width: '100%' }}
placeholder="Select Mask"
size="large"
onChange={this.onChangeMaskFile}
value={this.state.maskFile}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._masks.map(mask =>
<Option value={mask} key={mask} title={mask}>{filename(mask)}</Option>
)}
</Select>
<Button
type="link"
style={{ padding: '0' }}
onClick={() => this.onChangeMaskInputType({type: "text"})}
>
Use mask text instead
</Button>
</Form.Item>
) : "unsupported mask input type" }
<Form.Item
label="Mask increment mode"
>
<Checkbox
checked={this.state.enableMaskIncrementMode}
onChange={this.onChangeEnableMaskIncrementMode}
>
Enable
</Checkbox>
<InputNumber
disabled={!this.state.enableMaskIncrementMode}
min={maskIncrementMin}
max={maskIncrementMax}
value={this.state.maskIncrementMin}
onChange={this.onChangeMaskIncrementMin}
/>
<InputNumber
disabled={!this.state.enableMaskIncrementMode}
min={maskIncrementMin}
max={maskIncrementMax}
value={this.state.maskIncrementMax}
onChange={this.onChangeMaskIncrementMax}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Custom charset 1"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 1"
size="large"
onChange={this.onChangeCustomCharset1}
value={this.state.customCharset1}
/>
</Form.Item>
<Form.Item
label="Custom charset 2"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 2"
size="large"
onChange={this.onChangeCustomCharset2}
value={this.state.customCharset2}
/>
</Form.Item>
<Form.Item
label="Custom charset 3"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 3"
size="large"
onChange={this.onChangeCustomCharset3}
value={this.state.customCharset3}
/>
</Form.Item>
<Form.Item
label="Custom charset 4"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Custom charset 4"
size="large"
onChange={this.onChangeCustomCharset4}
value={this.state.customCharset4}
/>
</Form.Item>
</Col>
<Col span={24}>
<Row gutter={[18, 16]}>
<Col span={12}>
<Form.Item
label="Dictionary"
required
>
<Select
showSearch
allowClear
style={{ width: '100%' }}
placeholder="Select Dictionary"
size="large"
onChange={this.onChangeRightDictionary}
value={this.state.rightDictionary}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{this.state._dictionaries.map(dictionary =>
<Option value={dictionary} key={dictionary} title={dictionary}>{filename(dictionary)}</Option>
)}
</Select>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Rule"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Rule"
size="large"
onChange={this.onChangeRightRule}
value={this.state.rightRule}
/>
</Form.Item>
</Col>
</Row>
</Col>
</Row>
) : (
"Select Attack Mode"
)}
</Form>
) : this.state.step === 2 ? (
<Form layout="vertical">
<Collapse ghost onChange={this.onChangeAdvancedOptionsCollapse} activeKey={this.state.advancedOptionsCollapse}>
<Panel header="General" key="General">
<Row gutter={[18, 16]}>
<Col>
<Checkbox
checked={this.state.quiet}
onChange={this.onChangeQuiet}
>
Quiet
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.disablePotFile}
onChange={this.onChangeDisablePotFile}
>
Disable Pot File
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.disableLogFile}
onChange={this.onChangeDisableLogFile}
>
Disable Log File
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.enableOptimizedKernel}
onChange={this.onChangeEnableOptimizedKernel}
>
Enable optimized kernel
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.enableSlowerCandidateGenerators}
onChange={this.onChangeEnableSlowerCandidateGenerators}
>
Enable slower candidate generators
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.removeFoundHashes}
onChange={this.onChangeRemoveFoundHashes}
>
Remove found hashes
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.ignoreUsernames}
onChange={this.onChangeIgnoreUsernames}
>
Ignore Usernames
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.disableSelfTest}
onChange={this.onChangeDisableSelfTest}
>
Disable self-test (Not Recommended)
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.ignoreWarnings}
onChange={this.onChangeIgnoreWarnings}
>
Ignore warnings (Not Recommended)
</Checkbox>
</Col>
</Row>
</Panel>
<Panel header="Devices" key="Devices">
<Row gutter={[18, 16]}>
<Col span={8}>
<Form.Item
label="Devices IDs"
>
<Select
mode="multiple"
allowClear
style={{ width: '100%' }}
placeholder="Select Devices IDs"
size="large"
onChange={this.onChangeDevicesIDs}
value={this.state.devicesIDs}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{Array.from(Array(16)).map((x,i) =>
<Option value={i+1} key={i+1}>{"Device #"+(i+1)}</Option>
)}
</Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
label="Devices Types"
>
<Select
mode="multiple"
allowClear
style={{ width: '100%' }}
placeholder="Select Devices Types"
size="large"
onChange={this.onChangeDevicesTypes}
value={this.state.devicesTypes}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
<Option value={1} key={1}>CPU</Option>
<Option value={2} key={2}>GPU</Option>
<Option value={3} key={3}>FPGA, DSP, Co-Processor</Option>
</Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
label="Workload Profile"
tooltip={
<Table
columns={[
{
title: 'Performance',
dataIndex: 'performance',
key: 'Performance'
},
{
title: 'Runtime',
dataIndex: 'runtime',
key: 'Runtime'
},
{
title: 'Power Consumption',
dataIndex: 'powerConsumption',
key: 'Power Consumption'
},
{
title: 'Desktop Impact',
dataIndex: 'desktopImpact',
key: 'Desktop Impact'
}
]}
dataSource={[
{
key: '1',
performance: 'Low',
runtime: '2 ms',
powerConsumption: 'Low',
desktopImpact: 'Minimal'
},
{
key: '2',
performance: 'Default',
runtime: '12 ms',
powerConsumption: 'Economic',
desktopImpact: 'Noticeable'
},
{
key: '3',
performance: 'High',
runtime: '96 ms',
powerConsumption: 'High',
desktopImpact: 'Unresponsive'
},
{
key: '4',
performance: 'Nightmare',
runtime: '480 ms',
powerConsumption: 'Insane',
desktopImpact: 'Headless'
}
]}
size="small"
pagination={false}
style={{ overflow: 'auto' }}
/>
}
>
<Select
allowClear
style={{ width: '100%' }}
placeholder="Select Workload Profile"
size="large"
onChange={this.onChangeWorkloadProfile}
value={this.state.workloadProfile}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
<Option value={1} key={1}>Low</Option>
<Option value={2} key={2}>Default</Option>
<Option value={3} key={3}>High</Option>
<Option value={4} key={4}>Nightmare</Option>
</Select>
</Form.Item>
</Col>
</Row>
<Row gutter={[18, 16]}>
<Col>
<Button
loading={this.state.isLoadingDevicesInfo}
onClick={this.onClickDevicesInfo}
>
Devices Info
</Button>
</Col>
<Col>
<Button
loading={this.state.isLoadingBenchmark}
onClick={this.onClickBenchmark}
>
Benchmark
</Button>
</Col>
</Row>
</Panel>
<Panel header="Markov" key="Markov">
<Row gutter={[18, 16]}>
<Col>
<Checkbox
checked={this.state.markovDisable}
onChange={this.onChangeMarkovDisable}
>
Disables markov-chains, emulates classic brute-force
</Checkbox>
</Col>
<Col>
<Checkbox
checked={this.state.markovClassic}
onChange={this.onChangeMarkovClassic}
>
Enables classic markov-chains, no per-position
</Checkbox>
</Col>
<Col span={24}>
<Row gutter={[18, 16]}>
<Col span={8}>
<Form.Item
label="Threshold X when to stop accepting new markov-chains"
>
<InputNumber
value={this.state.markovThreshold}
onChange={this.onChangeMarkovThreshold}
/>
</Form.Item>
</Col>
</Row>
</Col>
</Row>
</Panel>
<Panel header="Monitor" key="Monitor">
<Row gutter={[18, 16]}>
<Col>
<Checkbox
checked={this.state.disableMonitor}
onChange={this.onChangeDisableMonitor}
>
Disable Monitor
</Checkbox>
</Col>
<Col span={24}>
<Row gutter={[18, 16]}>
<Col span={8}>
<Form.Item
label="Temp Abort (°C)"
>
<Select
allowClear
style={{ width: '100%' }}
placeholder="Select Temp Abort (°C)"
size="large"
onChange={this.onChangeTempAbort}
value={this.state.tempAbort}
disabled={this.state.disableMonitor}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
<Option value={60} key={60}>60 °C</Option>
<Option value={65} key={65}>65 °C</Option>
<Option value={70} key={70}>70 °C</Option>
<Option value={75} key={75}>75 °C</Option>
<Option value={80} key={80}>80 °C</Option>
<Option value={85} key={85}>85 °C</Option>
<Option value={90} key={90}>90 °C</Option>
<Option value={95} key={95}>95 °C</Option>
<Option value={100} key={100}>100 °C</Option>
</Select>
</Form.Item>
</Col>
</Row>
</Col>
</Row>
</Panel>
<Panel header="Extra Arguments" key="Extra Arguments">
<Form.Item
label="Extra Arguments"
>
<Input
allowClear
style={{ width: '100%' }}
placeholder="Set Extra Arguments"
size="large"
onChange={this.onChangeExtraArguments}
value={this.state.extraArguments.join(" ")}
/>
</Form.Item>
</Panel>
<Panel header="Misc" key="Misc">
<Form.Item
label="Status Timer"
>
<Select
allowClear
style={{ width: '100%' }}
placeholder="Select Status Timer"
size="large"
onChange={this.onChangeStatusTimer}
value={this.state.statusTimer}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
<Option value={10} key={10}>10 Seconds</Option>
<Option value={20} key={20}>20 Seconds</Option>
<Option value={30} key={30}>30 Seconds</Option>
<Option value={45} key={45}>45 Seconds</Option>
<Option value={60} key={60}>60 Seconds</Option>
<Option value={90} key={90}>90 Seconds</Option>
<Option value={120} key={120}>120 Seconds</Option>
<Option value={300} key={300}>300 Seconds</Option>
</Select>
</Form.Item>
</Panel>
</Collapse>
</Form>
) : this.state.step === 3 ? (
<Form layout="vertical">
<Form.Item
label="Output File"
extra={this.state.outputFile ? this.state.outputFile : null}
>
<Button
type="primary"
onClick={this.onChangeOutputFile}
loading={this.state.isLoadingSetOutputFile}
>
Set Output File
</Button>
</Form.Item>
<Form.Item
label="Output Format"
>
<Select
mode="multiple"
allowClear
style={{ width: '100%' }}
placeholder="Select Output Format"
size="large"
onChange={this.onChangeOutputFormat}
value={this.state.outputFormat}
filterOption={(input, option) =>
String(option.value).toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
String(option.children).toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
<Option value={1} key={1}>hash[:salt]</Option>
<Option value={2} key={2}>plain</Option>
<Option value={3} key={3}>hex_plain</Option>
<Option value={4} key={4}>crack_pos</Option>
<Option value={5} key={5}>timestamp absolute</Option>
<Option value={6} key={6}>timestamp relative</Option>
</Select>
</Form.Item>
</Form>
) : this.state.step === 4 ? (
<Space direction="vertical">
<Form layout="vertical">
<Form.Item
label="Priority"
tooltip={
<Typography>
Tasks are started automatically in a descending order of priority.
<br />
Set to -1 to disable auto-start.
</Typography>
}
>
<InputNumber
min={-1}
max={999}
value={this.state.priority}
onChange={this.onChangePriority}
bordered={true}
/>
</Form.Item>
</Form>
<Space size="large" direction="horizontal">
<Button
type="primary"
icon={<PlusOutlined />}
onClick={this.onClickCreateTask}
loading={this.state.isLoadingCreateTask}
>
Create Task
</Button>
<Checkbox
checked={this.state.preserveTaskConfig}
onChange={this.onChangePreserveTaskConfig}
>
Preserve task config
</Checkbox>
</Space>
</Space>
) : null }
</div>
</Col>
</Row>
</Content>
</>
)
}
Example #29
Source File: direction.jsx From virtuoso-design-system with MIT License | 4 votes |
// ==== End Badge ====
render() {
const { currentStep } = this.state;
return (
<div className="direction-components">
<Row>
<Col span={24}>
<Divider orientation="left">Cascader example</Divider>
<Cascader
suffixIcon={<SearchIcon />}
options={cascaderOptions}
onChange={this.onCascaderChange}
placeholder="یک مورد انتخاب کنید"
popupPlacement={this.props.popupPlacement}
/>
With search:
<Cascader
suffixIcon={<SmileOutlined />}
options={cascaderOptions}
onChange={this.onCascaderChange}
placeholder="Select an item"
popupPlacement={this.props.popupPlacement}
showSearch={this.cascaderFilter}
/>
</Col>
</Row>
<br />
<Row>
<Col span={12}>
<Divider orientation="left">Switch example</Divider>
<Switch defaultChecked />
<Switch loading defaultChecked />
<Switch size="small" loading />
</Col>
<Col span={12}>
<Divider orientation="left">Radio Group example</Divider>
<Radio.Group defaultValue="c" buttonStyle="solid">
<Radio.Button value="a">تهران</Radio.Button>
<Radio.Button value="b" disabled>
اصفهان
</Radio.Button>
<Radio.Button value="c">فارس</Radio.Button>
<Radio.Button value="d">خوزستان</Radio.Button>
</Radio.Group>
</Col>
</Row>
<br />
<Row>
<Col span={12}>
<Divider orientation="left">Button example</Divider>
<div className="button-demo">
<Button type="primary" icon={<DownloadOutlined />} />
<Button type="primary" shape="circle" icon={<DownloadOutlined />} />
<Button type="primary" shape="round" icon={<DownloadOutlined />} />
<Button type="primary" shape="round" icon={<DownloadOutlined />}>
Download
</Button>
<Button type="primary" icon={<DownloadOutlined />}>
Download
</Button>
<br />
<Button.Group>
<Button type="primary">
<LeftOutlined />
Backward
</Button>
<Button type="primary">
Forward
<RightOutlined />
</Button>
</Button.Group>
<Button type="primary" loading>
Loading
</Button>
<Button type="primary" size="small" loading>
Loading
</Button>
</div>
</Col>
<Col span={12}>
<Divider orientation="left">Tree example</Divider>
<Tree
showLine
checkable
defaultExpandedKeys={['0-0-0', '0-0-1']}
defaultSelectedKeys={['0-0-0', '0-0-1']}
defaultCheckedKeys={['0-0-0', '0-0-1']}
>
<TreeNode title="parent 1" key="0-0">
<TreeNode title="parent 1-0" key="0-0-0" disabled>
<TreeNode title="leaf" key="0-0-0-0" disableCheckbox />
<TreeNode title="leaf" key="0-0-0-1" />
</TreeNode>
<TreeNode title="parent 1-1" key="0-0-1">
<TreeNode title={<span style={{ color: '#1890ff' }}>sss</span>} key="0-0-1-0" />
</TreeNode>
</TreeNode>
</Tree>
</Col>
</Row>
<br />
<Row>
<Col span={24}>
<Divider orientation="left">Input (Input Group) example</Divider>
<InputGroup size="large">
<Row gutter={8}>
<Col span={5}>
<Input defaultValue="0571" />
</Col>
<Col span={8}>
<Input defaultValue="26888888" />
</Col>
</Row>
</InputGroup>
<br />
<InputGroup compact>
<Input style={{ width: '20%' }} defaultValue="0571" />
<Input style={{ width: '30%' }} defaultValue="26888888" />
</InputGroup>
<br />
<InputGroup compact>
<Select defaultValue="Option1">
<Option value="Option1">Option1</Option>
<Option value="Option2">Option2</Option>
</Select>
<Input style={{ width: '50%' }} defaultValue="input content" />
<InputNumber />
</InputGroup>
<br />
<Search placeholder="input search text" enterButton="Search" size="large" />
<br />
<br />
<div style={{ marginBottom: 16 }}>
<Input
addonBefore={this.selectBefore}
addonAfter={this.selectAfter}
defaultValue="mysite"
/>
</div>
<br />
<Row>
<Col span={12}>
<Divider orientation="left">Select example</Divider>
<Select mode="multiple" defaultValue="مورچه" style={{ width: 120 }}>
<Option value="jack">Jack</Option>
<Option value="مورچه">مورچه</Option>
<Option value="disabled" disabled>
Disabled
</Option>
<Option value="Yiminghe">yiminghe</Option>
</Select>
<Select defaultValue="مورچه" style={{ width: 120 }} disabled>
<Option value="مورچه">مورچه</Option>
</Select>
<Select defaultValue="مورچه" style={{ width: 120 }} loading>
<Option value="مورچه">مورچه</Option>
</Select>
<Select
showSearch
style={{ width: 200 }}
placeholder="Select a person"
optionFilterProp="children"
filterOption={(input, option) =>
option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
<Option value="jack">Jack</Option>
<Option value="سعید">سعید</Option>
<Option value="tom">Tom</Option>
</Select>
</Col>
<Col span={12}>
<Divider orientation="left">TreeSelect example</Divider>
<div>
<TreeSelect
showSearch
style={{ width: '100%' }}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="Please select"
allowClear
treeDefaultExpandAll
>
<TreeNode value="parent 1" title="parent 1" key="0-1">
<TreeNode value="parent 1-0" title="parent 1-0" key="0-1-1">
<TreeNode value="leaf1" title="my leaf" key="random" />
<TreeNode value="leaf2" title="your leaf" key="random1" />
</TreeNode>
<TreeNode value="parent 1-1" title="parent 1-1" key="random2">
<TreeNode
value="sss"
title={<b style={{ color: '#08c' }}>sss</b>}
key="random3"
/>
</TreeNode>
</TreeNode>
</TreeSelect>
</div>
</Col>
</Row>
<br />
<Row>
<Col span={24}>
<Divider orientation="left">Modal example</Divider>
<div>
<Button type="primary" onClick={this.showModal}>
Open Modal
</Button>
<Modal
title="پنچره ساده"
visible={this.state.modalVisible}
onOk={this.handleOk}
onCancel={this.handleCancel}
>
<p>نگاشتههای خود را اینجا قراردهید</p>
<p>نگاشتههای خود را اینجا قراردهید</p>
<p>نگاشتههای خود را اینجا قراردهید</p>
</Modal>
</div>
</Col>
</Row>
<br />
<Row>
<Col span={24}>
<Divider orientation="left">Steps example</Divider>
<div>
<Steps progressDot current={currentStep}>
<Step title="Finished" description="This is a description." />
<Step title="In Progress" description="This is a description." />
<Step title="Waiting" description="This is a description." />
</Steps>
<br />
<Steps current={currentStep} onChange={this.onStepsChange}>
<Step title="Step 1" description="This is a description." />
<Step title="Step 2" description="This is a description." />
<Step title="Step 3" description="This is a description." />
</Steps>
</div>
</Col>
</Row>
<br />
<Row>
<Col span={12}>
<Divider orientation="left">Rate example</Divider>
<div>
<Rate defaultValue={2.5} />
<br />
<strong>* Note:</strong> Half star not implemented in RTL direction, it will be
supported after <a href="https://github.com/react-component/rate">rc-rate</a>{' '}
implement rtl support.
</div>
</Col>
<Col span={12}>
<Divider orientation="left">Badge example</Divider>
<div>
<div>
<Badge count={this.state.badgeCount}>
<a href="#" className="head-example" />
</Badge>
<ButtonGroup>
<Button onClick={this.declineBadge}>
<MinusOutlined />
</Button>
<Button onClick={this.increaseBadge}>
<PlusOutlined />
</Button>
</ButtonGroup>
</div>
<div style={{ marginTop: 10 }}>
<Badge dot={this.state.showBadge}>
<a href="#" className="head-example" />
</Badge>
<Switch onChange={this.onChangeBadge} checked={this.state.showBadge} />
</div>
</div>
</Col>
</Row>
</Col>
</Row>
<br />
<br />
<Row>
<Col span={24}>
<Divider orientation="left">Pagination example</Divider>
<Pagination showSizeChanger defaultCurrent={3} total={500} />
</Col>
</Row>
<br />
<Row>
<Col span={24}>
<Divider orientation="left">Grid System example</Divider>
<div className="grid-demo">
<div className="code-box-demo">
<p>
<strong>* Note:</strong> Every calculation in RTL grid system is from right side
(offset, push, etc.)
</p>
<Row>
<Col span={8}>col-8</Col>
<Col span={8} offset={8}>
col-8
</Col>
</Row>
<Row>
<Col span={6} offset={6}>
col-6 col-offset-6
</Col>
<Col span={6} offset={6}>
col-6 col-offset-6
</Col>
</Row>
<Row>
<Col span={12} offset={6}>
col-12 col-offset-6
</Col>
</Row>
<Row>
<Col span={18} push={6}>
col-18 col-push-6
</Col>
<Col span={6} pull={18}>
col-6 col-pull-18
</Col>
</Row>
</div>
</div>
</Col>
</Row>
</div>
);
}