antd#Statistic TypeScript Examples
The following examples show how to use
antd#Statistic.
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.tsx From ant-design-pro-V4 with MIT License | 6 votes |
ExtraContent: FC<Record<string, any>> = () => (
<div className={styles.extraContent}>
<div className={styles.statItem}>
<Statistic title="项目数" value={56} />
</div>
<div className={styles.statItem}>
<Statistic title="团队内排名" value={8} suffix="/ 24" />
</div>
<div className={styles.statItem}>
<Statistic title="项目访问" value={2223} />
</div>
</div>
)
Example #2
Source File: StickerWidget.tsx From leek with Apache License 2.0 | 6 votes |
export default function ({ icon, number, text, tooltip }) {
return (
<StickerWidgetWrapper className="leekStickerWidget">
<div className="leekIconWrapper">{icon}</div>
<div className="leekContentWrapper">
<Statistic title={text} value={number} />
</div>
<div style={{ fontSize: "18px", padding: "7px" }}>
<Tooltip title={tooltip}>
<InfoCircleOutlined />
</Tooltip>
</div>
</StickerWidgetWrapper>
);
}
Example #3
Source File: MITMYakScriptLoader.tsx From yakit with GNU Affero General Public License v3.0 | 6 votes |
StatusCardViewer = React.memo((p: { status: StatusCardProps[] }) => {
return <Row gutter={12}>
{p.status.map(i => {
return <Col span={6} style={{marginBottom: 8}}>
<Card hoverable={true} bordered={true} size={"small"}>
<Statistic title={i.Id} value={i.Data}/>
</Card>
</Col>
})}
</Row>
})
Example #4
Source File: index.tsx From nanolooker with MIT License | 6 votes |
LoadingStatistic = ({ isLoading, title, tooltip, ...rest }: LoadingStatisticProps) => ( <> {isLoading ? <div className="ant-statistic-title">{title}</div> : null} <Skeleton loading={isLoading} active paragraph={false} className="isloading-skeleton-width" > <Statistic title={ <> {title} {tooltip ? ( <Tooltip placement="right" title={tooltip}> <QuestionCircle /> </Tooltip> ) : null} </> } {...rest} /> </Skeleton> </> )
Example #5
Source File: index.tsx From ui with GNU Affero General Public License v3.0 | 6 votes |
Index: NextPage = () => {
const { t } = useTranslation()
const { data, loading } = useQuery<AdminStatisticQueryData, AdminStatisticQueryVariables>(
ADMIN_STATISTIC_QUERY
)
return (
<Structure title={t('admin:home')} selected={'home'} loading={loading}>
<Row gutter={16}>
<Col sm={8} xs={24}>
<Statistic title={t('statistic:totalForms')} value={data && data.forms.total} />
</Col>
<Col sm={8} xs={24}>
<Statistic title={t('statistic:totalUsers')} value={data && data.users.total} />
</Col>
<Col sm={8} xs={24}>
<Statistic
title={t('statistic:totalSubmissions')}
value={data && data.submissions.total}
/>
</Col>
</Row>
</Structure>
)
}
Example #6
Source File: ElementInfo.tsx From posthog-foss with MIT License | 5 votes |
export function ElementInfo(): JSX.Element | null {
const { clickCount } = useValues(heatmapLogic)
const { hoverElementMeta, selectedElementMeta } = useValues(elementsLogic)
const { createAction } = useActions(elementsLogic)
const activeMeta = hoverElementMeta || selectedElementMeta
if (!activeMeta) {
return null
}
const { element, position, count, actionStep } = activeMeta
return (
<>
<div style={{ padding: 15, borderLeft: '5px solid #8F98FF', background: 'hsla(235, 100%, 99%, 1)' }}>
<h1 className="section-title">Selected Element</h1>
<ActionStep actionStep={actionStep} />
</div>
{position ? (
<div style={{ padding: 15, borderLeft: '5px solid #FF9870', background: 'hsla(19, 99%, 99%, 1)' }}>
<h1 className="section-title">Stats</h1>
<p>
<CalendarOutlined /> <u>Last 7 days</u>
</p>
<Row gutter={16}>
<Col span={16}>
<Statistic
title="Clicks"
value={count || 0}
suffix={`/ ${clickCount} (${
clickCount === 0 ? '-' : Math.round(((count || 0) / clickCount) * 10000) / 100
}%)`}
/>
</Col>
<Col span={8}>
<Statistic title="Ranking" prefix="#" value={position || 0} />
</Col>
</Row>
</div>
) : null}
<div style={{ padding: 15, borderLeft: '5px solid #94D674', background: 'hsla(100, 74%, 98%, 1)' }}>
<h1 className="section-title">Actions ({activeMeta.actions.length})</h1>
{activeMeta.actions.length === 0 ? (
<p>No actions include this element</p>
) : (
<ActionsListView actions={activeMeta.actions.map((a) => a.action)} />
)}
<Button size="small" onClick={() => createAction(element)}>
<PlusOutlined /> Create a new action
</Button>
</div>
</>
)
}
Example #7
Source File: index.tsx From metaplex with Apache License 2.0 | 5 votes |
AmountLabel = (props: IAmountLabel) => {
const {
amount: _amount,
displayUSD = true,
displaySymbol = '',
title = '',
style = {},
containerStyle = {},
iconSize = 38,
customPrefix,
ended,
tokenInfo,
} = props;
// Add formattedAmount to be able to parse USD value and retain abbreviation of value
const amount = typeof _amount === 'string' ? parseFloat(_amount) : _amount;
let formattedAmount = `${amount}`;
if (amount >= 1) {
formattedAmount = formatAmount(amount);
}
const solPrice = useSolPrice();
const altSplPrice = useAllSplPrices().filter(
a => a.tokenMint == tokenInfo?.address,
)[0]?.tokenPrice;
const tokenPrice =
tokenInfo?.address == WRAPPED_SOL_MINT.toBase58() ? solPrice : altSplPrice;
const [priceUSD, setPriceUSD] = useState<number | undefined>(undefined);
useEffect(() => {
setPriceUSD(tokenPrice * amount);
}, [amount, tokenPrice, altSplPrice]);
const PriceNaN = isNaN(amount);
return (
<div style={{ display: 'flex', ...containerStyle }}>
{PriceNaN === false && (
<Statistic
style={style}
className="create-statistic"
title={title || ''}
value={`${formattedAmount} ${displaySymbol || ''}`}
prefix={
customPrefix || (
<TokenCircle
iconSize={iconSize}
iconFile={
tokenInfo?.logoURI == '' ? undefined : tokenInfo?.logoURI
}
/>
)
}
/>
)}
{displayUSD && (
<div className="usd">
{PriceNaN === false ? (
priceUSD ? (
formatUSD.format(priceUSD)
) : (
'$N/A'
)
) : (
<div className="placebid">{ended ? 'N/A' : 'Place Bid'}</div>
)}
</div>
)}
</div>
);
}
Example #8
Source File: TicketsWidget.tsx From condo with MIT License | 5 votes |
TicketsWidget = () => {
const intl = useIntl()
const NoDataTitle = intl.formatMessage({ id: 'NoData' })
const TicketsWidgetTitle = intl.formatMessage({ id: 'component.ticketswidget.Title' })
const TicketsWidgetShortTitle = intl.formatMessage({ id: 'component.ticketswidget.Title.Short' })
const userOrganization = useOrganization()
const userOrganizationId = get(userOrganization, ['organization', 'id'])
const [ticketData, setTicketData] = useState<TicketReportData[]>([])
const [loading, setLoading] = useState(false)
const { isSmall } = useLayoutContext()
const [loadTicketsWidgetData] = useLazyQuery(GET_TICKET_WIDGET_REPORT_DATA, {
onError: error => {
setLoading(false)
notification.error(error)
setTicketData(null)
},
fetchPolicy: 'cache-and-network',
onCompleted: (response) => {
const { result: { data } } = response
setTicketData(data)
setLoading(false)
},
})
const filterChange = (filter: string) => {
setLoading(true)
loadTicketsWidgetData({ variables: { data: { periodType: filter, offset: 0, userOrganizationId } } })
}
return (
<StatsCard
title={isSmall ? TicketsWidgetShortTitle : TicketsWidgetTitle}
link='/reports/detail/report-by-tickets'
onFilterChange={filterChange}
loading={loading}
dependencyArray={[userOrganizationId]}
>
<Row gutter={[40, 20]} justify={'center'}>
{
ticketData === null
? (
<BasicEmptyListView>
<Typography.Text>{NoDataTitle}</Typography.Text>
</BasicEmptyListView>
)
: (
ticketData.map((e, i) => (
<StatsContainer key={i}>
<Statistic
title={e.statusName}
prefix={<span style={{ fontSize: 30, fontWeight: 600 }}>{e.currentValue}</span>}
valueRender={() => <GrowthPanel value={e.growth} />}
/>
</StatsContainer>
))
)
}
</Row>
</StatsCard>
)
}
Example #9
Source File: index.tsx From nanolooker with MIT License | 5 votes |
ActiveDifficulty: React.FC = () => {
const { t } = useTranslation();
const [isLoading, setIsLoading] = React.useState(false);
const {
activeDifficulty: { network_minimum, network_current, multiplier },
getActiveDifficulty,
}: UseActiveDifficultyReturn = useActiveDifficulty();
const refreshActiveDifficulty = async () => {
setIsLoading(true);
await refreshActionDelay(getActiveDifficulty);
setIsLoading(false);
};
const opacity = isLoading ? 0.5 : 1;
return (
<Card
size="small"
title={t("pages.status.activeDifficulty")}
extra={
<Tooltip title={t("pages.status.reload")}>
<Button
type="primary"
icon={<ReloadOutlined />}
size="small"
onClick={refreshActiveDifficulty}
loading={isLoading}
/>
</Tooltip>
}
>
<Skeleton active loading={!network_current}>
<Statistic
title={t("pages.status.networkMinimum")}
value={network_minimum}
style={{ opacity }}
/>
<Statistic
title={t("pages.status.networkCurrent")}
value={network_current}
style={{ opacity }}
/>
<Statistic
title={t("pages.status.multiplier")}
value={multiplier}
style={{ opacity }}
/>
</Skeleton>
</Card>
);
}
Example #10
Source File: index.tsx From nanolooker with MIT License | 5 votes |
ConfirmationsPerSecond = () => {
const { t } = useTranslation();
const { confirmationsPerSecond: nodeCps } = useConfirmationsPerSecond();
const { confirmationsPerSecond: networkCps } = useNanoTicker();
return nodeCps ? (
<>
{networkCps ? (
<>
<Text style={{ fontSize: 13, textAlign: "center", display: "block" }}>
{t("pages.home.cpsNetwork")}
</Text>
<div className="cps-container">
<Statistic
suffix={t("transaction.cps")}
value={networkCps?.toFixed(2)}
style={{ display: "inline-block" }}
/>
</div>
</>
) : null}
{nodeCps ? (
<Text style={{ fontSize: 13, textAlign: "center", display: "block" }}>
{t("pages.home.cpsLocal")}
</Text>
) : null}
<div className="cps-container">
{!nodeCps || !parseFloat(nodeCps) ? (
<Skeleton paragraph={false} active />
) : (
<Statistic
suffix={t("transaction.cps")}
value={nodeCps}
style={{ display: "inline-block" }}
/>
)}
<Tooltip placement="right" title={t("tooltips.cps")}>
<QuestionCircle />
</Tooltip>
</div>
</>
) : null;
}
Example #11
Source File: index.tsx From metaplex with Apache License 2.0 | 4 votes |
ReviewStep = (props: {
confirm: () => void;
attributes: AuctionState;
setAttributes: Function;
connection: Connection;
}) => {
const [showFundsIssueModal, setShowFundsIssueModal] = useState(false);
const [cost, setCost] = useState(0);
const { account } = useNativeAccount();
useEffect(() => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const rentCall = Promise.all([
props.connection.getMinimumBalanceForRentExemption(MintLayout.span),
props.connection.getMinimumBalanceForRentExemption(MAX_METADATA_LEN),
]);
// TODO: add
}, [setCost]);
const balance = (account?.lamports || 0) / LAMPORTS_PER_SOL;
const item = props.attributes.items?.[0];
const handleConfirm = () => {
props.setAttributes({
...props.attributes,
startListTS: props.attributes.startListTS || moment().unix(),
startSaleTS: props.attributes.startSaleTS || moment().unix(),
});
props.confirm();
};
return (
<>
<Row className="call-to-action">
<h2>Review and list</h2>
<p>Review your listing before publishing.</p>
</Row>
<Row className="content-action">
<Col xl={12}>
{item?.metadata.info && (
<ArtCard pubkey={item.metadata.pubkey} small={true} />
)}
</Col>
<Col className="section" xl={12}>
<Statistic
className="create-statistic"
title="Copies"
value={
props.attributes.editions === undefined
? 'Unique'
: props.attributes.editions
}
/>
{cost ? (
<AmountLabel
title="Cost to Create"
amount={cost}
tokenInfo={useTokenList().tokenMap.get(
WRAPPED_SOL_MINT.toString(),
)}
/>
) : (
<Spin />
)}
</Col>
</Row>
<Row style={{ display: 'block' }}>
<Divider />
<Statistic
className="create-statistic"
title="Start date"
value={
props.attributes.startSaleTS
? moment
.unix(props.attributes.startSaleTS as number)
.format('dddd, MMMM Do YYYY, h:mm a')
: 'Right after successfully published'
}
/>
<br />
{props.attributes.startListTS && (
<Statistic
className="create-statistic"
title="Listing go live date"
value={moment
.unix(props.attributes.startListTS as number)
.format('dddd, MMMM Do YYYY, h:mm a')}
/>
)}
<Divider />
<Statistic
className="create-statistic"
title="Sale ends"
value={
props.attributes.endTS
? moment
.unix(props.attributes.endTS as number)
.format('dddd, MMMM Do YYYY, h:mm a')
: 'Until sold'
}
/>
</Row>
<Row>
<Button
type="primary"
size="large"
onClick={() => {
if (balance < MINIMUM_SAFE_FEE_AUCTION_CREATION) {
setShowFundsIssueModal(true);
} else {
handleConfirm();
}
}}
className="action-btn"
>
{props.attributes.category === AuctionCategory.InstantSale
? 'List for Sale'
: 'Publish Auction'}
</Button>
<FundsIssueModal
message={'Estimated Minimum Fee'}
minimumFunds={MINIMUM_SAFE_FEE_AUCTION_CREATION}
currentFunds={balance}
isModalVisible={showFundsIssueModal}
onClose={() => setShowFundsIssueModal(false)}
/>
</Row>
</>
);
}
Example #12
Source File: App.tsx From pcap2socks-gui with MIT License | 4 votes |
renderRunning = () => {
return (
<div className="content-content">
<Row className="content-content-row" gutter={[16, 16]} justify="center">
<Col className="content-content-col" span={24}>
{(() => {
if (Number.isNaN(this.state.time)) {
return <QuestionCircleTwoTone className="content-content-icon" />;
} else {
return <CheckCircleTwoTone className="content-content-icon" twoToneColor="#52c41a" />;
}
})()}
</Col>
</Row>
<Row className="content-content-row" gutter={[16, 32]} justify="center">
<Col className="content-content-col" span={24}>
<Paragraph>
<Title level={3}>
{(() => {
if (Number.isNaN(this.state.time)) {
return "未运行";
} else {
return "运行中";
}
})()}
</Title>
</Paragraph>
</Col>
</Row>
<Row gutter={[16, 0]} justify="center">
<Col xs={24} sm={12} md={6} style={{ marginBottom: "16px" }}>
<Card className="card" hoverable>
<Statistic
precision={2}
prefix={<ClockCircleOutlined />}
title="运行时间"
value={Convert.convertTime(this.state.time)}
/>
</Card>
</Col>
<Col xs={24} sm={12} md={6} style={{ marginBottom: "16px" }}>
<Card className="card" hoverable>
<Statistic
prefix={<HourglassOutlined />}
title="延迟"
value={Convert.convertDuration(this.state.latency)}
valueStyle={(() => {
if (this.state.latency === Infinity) {
return { color: "#cf1322" };
} else if (this.state.latency >= 100) {
return { color: "#faad14" };
}
})()}
suffix={Convert.convertDurationUnit(this.state.latency)}
/>
</Card>
</Col>
<Col xs={24} sm={12} md={6} style={{ marginBottom: "16px" }}>
<Card hoverable onClick={this.switchTraffic}>
<Statistic
precision={2}
prefix={<ArrowUpOutlined />}
title="上传"
value={this.showUploadValue()}
suffix={this.showUploadUnit()}
/>
</Card>
</Col>
<Col xs={24} sm={12} md={6} style={{ marginBottom: "16px" }}>
<Card hoverable onClick={this.switchTraffic}>
<Statistic
precision={2}
prefix={<ArrowDownOutlined />}
title="下载"
value={this.showDownloadValue()}
suffix={this.showDownloadUnit()}
/>
</Card>
</Col>
</Row>
</div>
);
};
Example #13
Source File: base.tsx From yakit with GNU Affero General Public License v3.0 | 4 votes |
PluginResultUI: React.FC<PluginResultUIProp> = React.memo((props) => {
const {loading, results, featureType = [], feature = [], progress, script, statusCards} = props;
const [active, setActive] = useState(props.defaultConsole ? "console" : "feature-0");
const xtermRef = useRef(null)
const timer = useRef<any>(null)
useEffect(() => {
if (!xtermRef) {
return
}
if (props.onXtermRef) props.onXtermRef(xtermRef);
}, [xtermRef])
let progressBars: { id: string, node: React.ReactNode }[] = [];
progress.forEach((v) => {
progressBars.push({
id: v.id, node: <Card size={"small"} hoverable={false} bordered={true} title={`任务进度ID:${v.id}`}>
<Progress percent={parseInt((v.progress * 100).toFixed(0))} status="active"/>
</Card>,
})
})
// progressBars = progressBars.sort((a, b) => a.id.localeCompare(b.id));
const features: { feature: string, params: any, key: string }[] = featureType.filter(i => {
return i.level === "json-feature"
}).map(i => {
try {
let res = JSON.parse(i.data) as { feature: string, params: any, key: string };
if (!res.key) {
res.key = randomString(50)
}
return res
} catch (e) {
return {feature: "", params: undefined, key: ""}
}
}).filter(i => i.feature !== "");
const finalFeatures = features.length > 0 ?
features.filter((data, i) => features.indexOf(data) === i)
: [];
const timelineItemProps = (results || []).filter(i => {
return !((i?.level || "").startsWith("json-feature") || (i?.level || "").startsWith("feature-"))
}).splice(0, 25);
return <div style={{width: "100%", height: "100%", overflow: "hidden auto"}}>
{/* <div style={{width: "100%", height: "100%", display: "flex", flexDirection: "column", overflow: "auto"}}> */}
{props.debugMode && props.onXtermRef && <>
<div style={{width: "100%", height: 240}}>
<XTerm ref={xtermRef} options={{convertEol: true, rows: 8}}
onResize={(r) => {
xtermFit(xtermRef, 50, 18)
}}
customKeyEventHandler={(e) => {
if (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) {
const str = xtermRef?.current ? (xtermRef.current as any).terminal.getSelection() : ""
if (timer.current) {
clearTimeout(timer.current)
timer.current = null
}
timer.current = setTimeout(() => {
ipcRenderer.invoke("copy-clipboard", str).finally(() => {
timer.current = null
})
}, 300)
}
return true
}}
/>
</div>
</>}
{statusCards.length > 0 && <div style={{marginTop: 8, marginBottom: 8}}>
<Row gutter={8}>
{statusCards.map((card, cardIndex) => {
return <Col key={card.tag} span={8} style={{marginBottom: 8}}>
<Card hoverable={true} bodyStyle={{padding: 12}}>
<div>
<h2>{card.tag}</h2>
<div style={{display: 'flex', justifyContent: 'space-between'}}>
{card.info.map((info, infoIndex) => {
return <Statistic valueStyle={{
color: idToColor(info.Id),
textAlign: `${(infoIndex >= 1) && (card.info.length === infoIndex + 1) ? 'right' : 'left'}`
}} key={info.Id} title={card.info.length > 1 ? info.Id : ''} value={info.Data}/>
})}
</div>
</div>
</Card>
</Col>
})}
</Row>
</div>}
{progressBars.length > 0 && <div style={{marginTop: 4, marginBottom: 8}}>
{progressBars.map(i => i.node)}
</div>}
<Tabs
style={{flex: 1}}
className={"main-content-tabs"}
size={"small"}
activeKey={active}
onChange={activeKey => {
setActive(activeKey)
setTimeout(() => {
if (xtermRef && props.debugMode) xtermFit(xtermRef, 50, 18)
}, 50);
}}
>
{(finalFeatures || []).map((i, index) => {
return <Tabs.TabPane
tab={YakitFeatureTabName(i.feature, i.params)}
key={`feature-${index}`}>
<YakitFeatureRender
params={i.params} feature={i.feature}
execResultsLog={feature || []}
/>
</Tabs.TabPane>
})}
<Tabs.TabPane tab={"基础插件信息 / 日志"} key={finalFeatures.length > 0 ? "log" : "feature-0"}>
{<>
{/*<Divider orientation={"left"}>Yakit Module Output</Divider>*/}
<AutoCard
size={"small"} hoverable={true} bordered={true} title={<Space>
<div>
任务额外日志与结果
</div>
{(timelineItemProps || []).length > 0 ? formatDate(timelineItemProps[0].timestamp) : ""}
</Space>}
style={{marginBottom: 20, marginRight: 2}}
bodyStyle={{overflowY: "auto"}}
>
<Timeline pending={loading} style={{marginTop: 10, marginBottom: 10}}>
{(timelineItemProps || []).reverse().map((e, index) => {
return <Timeline.Item key={index} color={LogLevelToCode(e.level)}>
<YakitLogFormatter data={e.data} level={e.level} timestamp={e.timestamp}
onlyTime={true}/>
</Timeline.Item>
})}
</Timeline>
</AutoCard>
</>}
</Tabs.TabPane>
{!props.debugMode && props.onXtermRef && <Tabs.TabPane tab={"Console"} key={"console"}>
<div style={{width: "100%", height: "100%"}}>
<CVXterm
ref={xtermRef}
options={{convertEol: true}}
/>
{/* <XTerm ref={xtermRef} options={{convertEol: true, rows: 8}}
onResize={(r) => {
xtermFit(xtermRef, 50, 18)
}}
customKeyEventHandler={(e) => {
if (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) {
const str = xtermRef?.current ? (xtermRef.current as any).terminal.getSelection() : ""
if (timer.current) {
clearTimeout(timer.current)
timer.current = null
}
timer.current = setTimeout(() => {
ipcRenderer.invoke("copy-clipboard", str).finally(() => {
timer.current = null
})
}, 300)
}
return true
}}
/> */}
</div>
</Tabs.TabPane>}
</Tabs>
{/* </div> */}
</div>
})
Example #14
Source File: WalletState.tsx From subscan-multisig-react with Apache License 2.0 | 4 votes |
// eslint-disable-next-line complexity
export function WalletState() {
const { t } = useTranslation();
const history = useHistory();
const { network, api, networkConfig } = useApi();
const {
multisigAccount,
setMultisigAccount,
inProgress,
queryInProgress,
confirmedAccount,
refreshConfirmedAccount,
} = useMultisigContext();
const [isAccountsDisplay, setIsAccountsDisplay] = useState<boolean>(false);
const [isExtrinsicDisplay, setIsExtrinsicDisplay] = useState(false);
const [isTransferDisplay, setIsTransferDisplay] = useState(false);
const isExtensionAccount = useIsInjected();
const [renameModalVisible, setRenameModalVisible] = useState(false);
const [renameInput, setRenameInput] = useState('');
const [deleteModalVisible, setDeleteModalVisible] = useState(false);
const { supportSubql, mainColor } = useMemo(() => {
return {
supportSubql: !!networkConfig?.api?.subql,
mainColor: getThemeColor(network),
};
}, [network, networkConfig]);
const showTransferButton = useMemo(() => {
return (
isFunction(api?.tx?.balances?.transfer) &&
isFunction(api?.tx?.balances?.transferKeepAlive) &&
isFunction(api?.tx?.balances?.transferAll)
);
}, [api]);
const states = useMemo<{ label: string; count: number | undefined }[]>(() => {
const res = [];
res.push({
label: 'multisig.In Progress',
count: inProgress.length,
});
if (supportSubql) {
res.push({ label: 'multisig.Confirmed Extrinsic', count: confirmedAccount });
}
res.push(
{
label: 'multisig.Threshold',
count: multisigAccount?.meta.threshold as number,
},
{
label: 'multisig.Members',
// eslint-disable-next-line @typescript-eslint/no-explicit-any
count: (multisigAccount?.meta.who as any)?.length as number,
}
);
return res;
}, [inProgress.length, confirmedAccount, multisigAccount?.meta.threshold, multisigAccount?.meta.who, supportSubql]);
const renameWallet = useCallback(
({ name }: { name: string }) => {
try {
const pair = keyring.getPair(multisigAccount?.address as string);
keyring.saveAccountMeta(pair, {
name,
whenEdited: Date.now(),
});
message.success(t('success'));
setRenameModalVisible(false);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const { meta, ...others } = multisigAccount!;
if (setMultisigAccount) {
setMultisigAccount({
...others,
meta: {
...meta,
name,
},
});
}
} catch (error: unknown) {
if (error instanceof Error) {
message.error(error.message);
}
}
},
[multisigAccount, t, setMultisigAccount]
);
const deleteWallet = useCallback(() => {
try {
keyring.forgetAccount(multisigAccount?.address as string);
message.success(t('success'));
history.push('/' + history.location.hash);
} catch (error: unknown) {
if (error instanceof Error) {
message.error(error.message);
}
}
}, [multisigAccount?.address, t, history]);
useEffect(() => {
const id = setInterval(() => refreshConfirmedAccount(), LONG_DURATION);
return () => clearInterval(id);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const exportAccountConfig = () => {
if (!multisigAccount) {
return;
}
const config = {
name: multisigAccount.meta.name,
members: multisigAccount.meta.addressPair as KeyringJson[],
threshold: multisigAccount.meta.threshold,
scope: getMultiAccountScope(multisigAccount.publicKey),
};
const blob = new Blob([JSON.stringify(config)], { type: 'text/plain;charset=utf-8' });
saveAs(blob, `${multisigAccount.address}.json`);
};
const menu = (
<Menu>
{/* <Menu.Item key="0">
<a href="https://www.antgroup.com">View in Subscan</a>
</Menu.Item> */}
<Menu.Item key="1" onClick={exportAccountConfig}>
Export config
</Menu.Item>
<Menu.Item
key="3"
onClick={() => {
setRenameInput(multisigAccount?.meta.name || '');
setRenameModalVisible(true);
}}
>
Rename
</Menu.Item>
<Menu.Item key="4" onClick={() => setDeleteModalVisible(true)}>
Delete
</Menu.Item>
</Menu>
);
return (
<Space direction="vertical" className="w-full">
<div className="flex flex-col md:flex-row items-start md:items-center md:justify-between">
<div className="self-stretch md:self-center">
<div className="flex items-center gap-4 md:w-auto w-full">
<Text className="whitespace-nowrap font-semibold text-xl leading-none" style={{ color: mainColor }}>
{multisigAccount?.meta.name}
</Text>
<Dropdown overlay={menu} trigger={['click']} placement="bottomCenter">
<SettingOutlined
className="rounded-full opacity-60 cursor-pointer p-1"
style={{
color: mainColor,
backgroundColor: mainColor + '40',
}}
onClick={(e) => e.preventDefault()}
/>
</Dropdown>
</div>
<div className="flex flex-col md:flex-row md:items-center gap-4 md:w-auto w-full mt-2 mb-4 md:mb-0">
<SubscanLink address={multisigAccount?.address} copyable></SubscanLink>
</div>
</div>
{((multisigAccount?.meta.addressPair as KeyringJson[]) || []).some((pair) =>
isExtensionAccount(pair.address)
) && (
<div className="flex items-center mt-2 md:mt-0">
{showTransferButton && (
<Button
onClick={() => setIsTransferDisplay(true)}
type="default"
size="large"
className="w-full md:w-auto mt-4 md:mt-0 mr-4"
style={{ color: mainColor }}
>
{t('transfer')}
</Button>
)}
<Button
onClick={() => setIsExtrinsicDisplay(true)}
type="primary"
size="large"
className="w-full md:w-auto mt-4 md:mt-0"
>
{t('submit_extrinsic')}
</Button>
</div>
)}
</div>
<div style={{ height: '1px', backgroundColor: mainColor, opacity: 0.1 }} className="mt-2" />
<Space size="middle" className="items-center hidden md:flex mt-2">
{states.map((state, index) => (
<Space key={index}>
<b>{t(state.label)}</b>
<span>{state.count}</span>
</Space>
))}
<div
style={{ border: 'solid 1px #DBDBDB', transform: isAccountsDisplay ? 'rotate(180deg)' : '' }}
className="w-12 h-6 flex items-center justify-center rounded-md cursor-pointer"
onClick={() => setIsAccountsDisplay(!isAccountsDisplay)}
>
<img src={iconDown} />
</div>
</Space>
<div className="grid md:hidden grid-cols-2">
{states.map((state, index) => (
<Statistic title={t(state.label)} value={state.count} key={index} className="text-center" />
))}
<Button type="ghost" className="col-span-2" onClick={() => setIsAccountsDisplay(!isAccountsDisplay)}>
{t(isAccountsDisplay ? 'wallet:Hide members' : 'wallet:Show members')}
</Button>
</div>
{isAccountsDisplay && multisigAccount && <Members record={multisigAccount} />}
<Modal
title={t('submit_extrinsic')}
visible={isExtrinsicDisplay}
onCancel={() => setIsExtrinsicDisplay(false)}
style={{ minWidth: 800 }}
footer={null}
destroyOnClose
>
<ExtrinsicLaunch
onTxSuccess={() => {
setIsExtrinsicDisplay(false);
queryInProgress();
}}
/>
</Modal>
{isTransferDisplay && (
<Transfer
key="modal-transfer"
onClose={() => setIsTransferDisplay(false)}
senderId={multisigAccount?.address}
onTxSuccess={() => {
setIsTransferDisplay(false);
queryInProgress();
}}
/>
)}
<Modal
title={null}
footer={null}
visible={renameModalVisible}
destroyOnClose
onCancel={() => setRenameModalVisible(false)}
bodyStyle={{
paddingLeft: '80px',
paddingRight: '80px',
paddingBottom: '60px',
}}
>
<div className="text-center text-black-800 text-xl font-semibold leading-none">Rename</div>
<div className="text-sm text-black-800 font-semibold mt-6 mb-1">Name</div>
<Input
value={renameInput}
onChange={(e) => {
setRenameInput(e.target.value);
}}
/>
<Row gutter={16} className="mt-5">
<Col span={12}>
<Button
block
type="primary"
onClick={() => {
if (!renameInput.trim()) {
return;
}
renameWallet({ name: renameInput });
}}
>
OK
</Button>
</Col>
<Col span={12}>
<Button
block
style={{
color: mainColor,
}}
onClick={() => {
setRenameModalVisible(false);
}}
>
Cancel
</Button>
</Col>
</Row>
</Modal>
<ConfirmDialog
visible={deleteModalVisible}
onCancel={() => setDeleteModalVisible(false)}
title="Delete Wallet"
content={`Are you sure to delete “${multisigAccount?.meta.name}” ?`}
onConfirm={deleteWallet}
/>
</Space>
);
}
Example #15
Source File: palette.tsx From jmix-frontend with Apache License 2.0 | 4 votes |
palette = () => (
<Palette>
<Category name="Text">
<Component name="Formatted Message">
<Variant>
<FormattedMessage />
</Variant>
</Component>
<Component name="Heading">
<Variant name="h1">
<Typography.Title></Typography.Title>
</Variant>
<Variant name="h2">
<Typography.Title level={2}></Typography.Title>
</Variant>
<Variant name="h3">
<Typography.Title level={3}></Typography.Title>
</Variant>
<Variant name="h4">
<Typography.Title level={4}></Typography.Title>
</Variant>
<Variant name="h5">
<Typography.Title level={5}></Typography.Title>
</Variant>
</Component>
<Component name="Text">
<Variant>
<Typography.Text></Typography.Text>
</Variant>
<Variant name="Secondary">
<Typography.Text type="secondary"></Typography.Text>
</Variant>
<Variant name="Success">
<Typography.Text type="success"></Typography.Text>
</Variant>
<Variant name="Warning">
<Typography.Text type="warning"></Typography.Text>
</Variant>
<Variant name="Danger">
<Typography.Text type="danger"></Typography.Text>
</Variant>
<Variant name="Disabled">
<Typography.Text disabled></Typography.Text>
</Variant>
</Component>
</Category>
<Category name="Layout">
<Component name="Divider">
<Variant>
<Divider />
</Variant>
</Component>
<Component name="Grid">
<Variant name="Simple Row">
<Row></Row>
</Variant>
<Variant name="Two columns">
<Row>
<Col span={12}></Col>
<Col span={12}></Col>
</Row>
</Variant>
<Variant name="Three columns">
<Row>
<Col span={8}></Col>
<Col span={8}></Col>
<Col span={8}></Col>
</Row>
</Variant>
</Component>
<Component name="Space">
<Variant>
<Space />
</Variant>
<Variant name="Small">
<Space size={"small"} />
</Variant>
<Variant name="Large">
<Space size={"large"} />
</Variant>
</Component>
</Category>
<Category name="Controls">
<Component name="Autocomplete">
<Variant>
<AutoComplete placeholder="input here" />
</Variant>
</Component>
<Component name="Button">
<Variant>
<Button></Button>
</Variant>
<Variant name="Primary">
<Button type="primary"></Button>
</Variant>
<Variant name="Link">
<Button type="link"></Button>
</Variant>
<Variant name="Dropdown">
<Dropdown
trigger={["click"]}
overlay={
<Menu>
<Menu.Item></Menu.Item>
<Menu.Item></Menu.Item>
<Menu.Item></Menu.Item>
</Menu>
}
>
<Button></Button>
</Dropdown>
</Variant>
</Component>
<Component name="Checkbox">
<Variant>
<Checkbox />
</Variant>
</Component>
<Component name="Switch">
<Variant>
<Switch />
</Variant>
</Component>
<Component name="Radio Group">
<Variant>
<Radio.Group>
<Radio value={1}>A</Radio>
<Radio value={2}>B</Radio>
<Radio value={3}>C</Radio>
<Radio value={4}>D</Radio>
</Radio.Group>
</Variant>
<Variant name="Button">
<Radio.Group>
<Radio.Button value={1}>A</Radio.Button>
<Radio.Button value={2}>B</Radio.Button>
<Radio.Button value={3}>C</Radio.Button>
<Radio.Button value={4}>D</Radio.Button>
</Radio.Group>
</Variant>
</Component>
<Component name="DatePicker">
<Variant>
<DatePicker />
</Variant>
<Variant name="Range">
<DatePicker.RangePicker />
</Variant>
</Component>
<Component name="TimePicker">
<Variant>
<TimePicker />
</Variant>
<Variant name="Range">
<TimePicker.RangePicker />
</Variant>
</Component>
<Component name="Input">
<Variant>
<Input />
</Variant>
<Variant name="Number">
<InputNumber />
</Variant>
</Component>
<Component name="Select">
<Variant>
<Select defaultValue="1">
<Select.Option value="1">1</Select.Option>
<Select.Option value="2">2</Select.Option>
</Select>
</Variant>
<Variant name="Multiple">
<Select defaultValue={["1"]} mode="multiple" allowClear>
<Select.Option value="1">1</Select.Option>
<Select.Option value="2">2</Select.Option>
</Select>
</Variant>
</Component>
<Component name="Link">
<Variant>
<Typography.Link href="" target="_blank"></Typography.Link>
</Variant>
</Component>
<Component name="Slider">
<Variant>
<Slider defaultValue={30} />
</Variant>
<Variant name="Range">
<Slider range defaultValue={[20, 50]} />
</Variant>
</Component>
</Category>
<Category name="Data Display">
<Component name="Field">
<Variant>
<Field
entityName={ENTITY_NAME}
disabled={readOnlyMode}
propertyName=""
formItemProps={{
style: { marginBottom: "12px" }
}}
/>
</Variant>
</Component>
<Component name="Card">
<Variant>
<Card />
</Variant>
<Variant name="With Title">
<Card>
<Card title="Card title">
<p>Card content</p>
</Card>
</Card>
</Variant>
<Variant name="My custom card">
<Card>
<Card title="Card title">
<p>Card content</p>
<Avatar />
</Card>
</Card>
</Variant>
</Component>
<Component name="Tabs">
<Variant>
<Tabs defaultActiveKey="1">
<Tabs.TabPane tab="Tab 1" key="1">
Content of Tab Pane 1
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 2" key="2">
Content of Tab Pane 2
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 3" key="3">
Content of Tab Pane 3
</Tabs.TabPane>
</Tabs>
</Variant>
<Variant name="Tab Pane">
<Tabs.TabPane></Tabs.TabPane>
</Variant>
</Component>
<Component name="Collapse">
<Variant>
<Collapse defaultActiveKey="1">
<Collapse.Panel
header="This is panel header 1"
key="1"
></Collapse.Panel>
<Collapse.Panel
header="This is panel header 2"
key="2"
></Collapse.Panel>
<Collapse.Panel
header="This is panel header 3"
key="3"
></Collapse.Panel>
</Collapse>
</Variant>
</Component>
<Component name="Image">
<Variant>
<Image width={200} src="" />
</Variant>
</Component>
<Component name="Avatar">
<Variant>
<Avatar icon={<UserOutlined />} />
</Variant>
<Variant name="Image">
<Avatar src="https://joeschmoe.io/api/v1/random" />
</Variant>
</Component>
<Component name="Badge">
<Variant>
<Badge count={1}></Badge>
</Variant>
</Component>
<Component name="Statistic">
<Variant>
<Statistic title="Title" value={112893} />
</Variant>
</Component>
<Component name="Alert">
<Variant name="Success">
<Alert message="Text" type="success" />
</Variant>
<Variant name="Info">
<Alert message="Text" type="info" />
</Variant>
<Variant name="Warning">
<Alert message="Text" type="warning" />
</Variant>
<Variant name="Error">
<Alert message="Text" type="error" />
</Variant>
</Component>
<Component name="List">
<Variant>
<List
bordered
dataSource={[]}
renderItem={item => <List.Item></List.Item>}
/>
</Variant>
</Component>
</Category>
<Category name="Icons">
<Component name="Arrow">
<Variant name="Up">
<ArrowUpOutlined />
</Variant>
<Variant name="Down">
<ArrowDownOutlined />
</Variant>
<Variant name="Left">
<ArrowLeftOutlined />
</Variant>
<Variant name="Right">
<ArrowRightOutlined />
</Variant>
</Component>
<Component name="Question">
<Variant>
<QuestionOutlined />
</Variant>
<Variant name="Circle">
<QuestionCircleOutlined />
</Variant>
</Component>
<Component name="Plus">
<Variant>
<PlusOutlined />
</Variant>
<Variant name="Circle">
<PlusCircleOutlined />
</Variant>
</Component>
<Component name="Info">
<Variant>
<InfoOutlined />
</Variant>
<Variant name="Circle">
<InfoCircleOutlined />
</Variant>
</Component>
<Component name="Exclamation">
<Variant>
<ExclamationOutlined />
</Variant>
<Variant name="Circle">
<ExclamationCircleOutlined />
</Variant>
</Component>
<Component name="Close">
<Variant>
<CloseOutlined />
</Variant>
<Variant name="Circle">
<CloseCircleOutlined />
</Variant>
</Component>
<Component name="Check">
<Variant>
<CheckOutlined />
</Variant>
<Variant name="Circle">
<CheckCircleOutlined />
</Variant>
</Component>
<Component name="Edit">
<Variant>
<EditOutlined />
</Variant>
</Component>
<Component name="Copy">
<Variant>
<CopyOutlined />
</Variant>
</Component>
<Component name="Delete">
<Variant>
<DeleteOutlined />
</Variant>
</Component>
<Component name="Bars">
<Variant>
<BarsOutlined />
</Variant>
</Component>
<Component name="Bell">
<Variant>
<BellOutlined />
</Variant>
</Component>
<Component name="Clear">
<Variant>
<ClearOutlined />
</Variant>
</Component>
<Component name="Download">
<Variant>
<DownloadOutlined />
</Variant>
</Component>
<Component name="Upload">
<Variant>
<UploadOutlined />
</Variant>
</Component>
<Component name="Sync">
<Variant>
<SyncOutlined />
</Variant>
</Component>
<Component name="Save">
<Variant>
<SaveOutlined />
</Variant>
</Component>
<Component name="Search">
<Variant>
<SearchOutlined />
</Variant>
</Component>
<Component name="Settings">
<Variant>
<SettingOutlined />
</Variant>
</Component>
<Component name="Paperclip">
<Variant>
<PaperClipOutlined />
</Variant>
</Component>
<Component name="Phone">
<Variant>
<PhoneOutlined />
</Variant>
</Component>
<Component name="Mail">
<Variant>
<MailOutlined />
</Variant>
</Component>
<Component name="Home">
<Variant>
<HomeOutlined />
</Variant>
</Component>
<Component name="Contacts">
<Variant>
<ContactsOutlined />
</Variant>
</Component>
<Component name="User">
<Variant>
<UserOutlined />
</Variant>
<Variant name="Add">
<UserAddOutlined />
</Variant>
<Variant name="Remove">
<UserDeleteOutlined />
</Variant>
</Component>
<Component name="Team">
<Variant>
<TeamOutlined />
</Variant>
</Component>
</Category>
<Category name="Screens">
<Component name="ExampleCustomScreen">
<Variant>
<ExampleCustomScreen />
</Variant>
</Component>
<Component name="CustomEntityFilterTest">
<Variant>
<CustomEntityFilterTest />
</Variant>
</Component>
<Component name="CustomFormControls">
<Variant>
<CustomFormControls />
</Variant>
</Component>
<Component name="CustomDataDisplayComponents">
<Variant>
<CustomDataDisplayComponents />
</Variant>
</Component>
<Component name="CustomAppLayouts">
<Variant>
<CustomAppLayouts />
</Variant>
</Component>
<Component name="CustomControls">
<Variant>
<CustomControls />
</Variant>
</Component>
<Component name="ErrorBoundaryTests">
<Variant>
<ErrorBoundaryTests />
</Variant>
</Component>
<Component name="TestBlankScreen">
<Variant>
<TestBlankScreen />
</Variant>
</Component>
<Component name="CarEditor">
<Variant>
<CarEditor />
</Variant>
</Component>
<Component name="CarBrowserCards">
<Variant>
<CarBrowserCards />
</Variant>
</Component>
<Component name="CarBrowserList">
<Variant>
<CarBrowserList />
</Variant>
</Component>
<Component name="CarBrowserTable">
<Variant>
<CarBrowserTable />
</Variant>
</Component>
<Component name="CarCardsGrid">
<Variant>
<CarCardsGrid />
</Variant>
</Component>
<Component name="FavoriteCars">
<Variant>
<FavoriteCars />
</Variant>
</Component>
<Component name="CarCardsWithDetails">
<Variant>
<CarCardsWithDetails />
</Variant>
</Component>
<Component name="CarTableWithFilters">
<Variant>
<CarTableWithFilters />
</Variant>
</Component>
<Component name="CarMasterDetail">
<Variant>
<CarMasterDetail />
</Variant>
</Component>
<Component name="FormWizardCompositionO2O">
<Variant>
<FormWizardCompositionO2O />
</Variant>
</Component>
<Component name="FormWizardEditor">
<Variant>
<FormWizardEditor />
</Variant>
</Component>
<Component name="FormWizardBrowserTable">
<Variant>
<FormWizardBrowserTable />
</Variant>
</Component>
<Component name="CarMultiSelectionTable">
<Variant>
<CarMultiSelectionTable />
</Variant>
</Component>
<Component name="DatatypesTestEditor">
<Variant>
<DatatypesTestEditor />
</Variant>
</Component>
<Component name="DatatypesTestBrowserCards">
<Variant>
<DatatypesTestBrowserCards />
</Variant>
</Component>
<Component name="DatatypesTestBrowserList">
<Variant>
<DatatypesTestBrowserList />
</Variant>
</Component>
<Component name="DatatypesTestBrowserTable">
<Variant>
<DatatypesTestBrowserTable />
</Variant>
</Component>
<Component name="DatatypesTestCards">
<Variant>
<DatatypesTestCards />
</Variant>
</Component>
<Component name="AssociationO2OEditor">
<Variant>
<AssociationO2OEditor />
</Variant>
</Component>
<Component name="AssociationO2OBrowserTable">
<Variant>
<AssociationO2OBrowserTable />
</Variant>
</Component>
<Component name="AssociationO2MEditor">
<Variant>
<AssociationO2MEditor />
</Variant>
</Component>
<Component name="AssociationO2MBrowserTable">
<Variant>
<AssociationO2MBrowserTable />
</Variant>
</Component>
<Component name="AssociationM2OEditor">
<Variant>
<AssociationM2OEditor />
</Variant>
</Component>
<Component name="AssociationM2OBrowserTable">
<Variant>
<AssociationM2OBrowserTable />
</Variant>
</Component>
<Component name="AssociationM2MEditor">
<Variant>
<AssociationM2MEditor />
</Variant>
</Component>
<Component name="AssociationM2MBrowserTable">
<Variant>
<AssociationM2MBrowserTable />
</Variant>
</Component>
<Component name="CompositionO2OEditor">
<Variant>
<CompositionO2OEditor />
</Variant>
</Component>
<Component name="CompositionO2OBrowserTable">
<Variant>
<CompositionO2OBrowserTable />
</Variant>
</Component>
<Component name="CompositionO2MEditor">
<Variant>
<CompositionO2MEditor />
</Variant>
</Component>
<Component name="CompositionO2MBrowserTable">
<Variant>
<CompositionO2MBrowserTable />
</Variant>
</Component>
<Component name="DeeplyNestedTestEntityEditor">
<Variant>
<DeeplyNestedTestEntityEditor />
</Variant>
</Component>
<Component name="DeeplyNestedO2MTestEntityTable">
<Variant>
<DeeplyNestedO2MTestEntityTable />
</Variant>
</Component>
<Component name="DeeplyNestedO2MTestEntityEditor">
<Variant>
<DeeplyNestedO2MTestEntityEditor />
</Variant>
</Component>
<Component name="IntIdEditor">
<Variant>
<IntIdEditor />
</Variant>
</Component>
<Component name="IntIdBrowserTable">
<Variant>
<IntIdBrowserTable />
</Variant>
</Component>
<Component name="IntIdBrowserCards">
<Variant>
<IntIdBrowserCards />
</Variant>
</Component>
<Component name="IntIdBrowserList">
<Variant>
<IntIdBrowserList />
</Variant>
</Component>
<Component name="IntIdentityIdCards">
<Variant>
<IntIdentityIdCards />
</Variant>
</Component>
<Component name="IntIdentityIdEditor">
<Variant>
<IntIdentityIdEditor />
</Variant>
</Component>
<Component name="IntIdentityIdBrowserTable">
<Variant>
<IntIdentityIdBrowserTable />
</Variant>
</Component>
<Component name="IntIdentityIdBrowserCards">
<Variant>
<IntIdentityIdBrowserCards />
</Variant>
</Component>
<Component name="IntIdentityIdBrowserList">
<Variant>
<IntIdentityIdBrowserList />
</Variant>
</Component>
<Component name="StringIdCards">
<Variant>
<StringIdCards />
</Variant>
</Component>
<Component name="StringIdMgtCardsEdit">
<Variant>
<StringIdMgtCardsEdit />
</Variant>
</Component>
<Component name="StringIdBrowserCards">
<Variant>
<StringIdBrowserCards />
</Variant>
</Component>
<Component name="StringIdBrowserList">
<Variant>
<StringIdBrowserList />
</Variant>
</Component>
<Component name="StringIdBrowserTable">
<Variant>
<StringIdBrowserTable />
</Variant>
</Component>
<Component name="WeirdStringIdEditor">
<Variant>
<WeirdStringIdEditor />
</Variant>
</Component>
<Component name="WeirdStringIdBrowserCards">
<Variant>
<WeirdStringIdBrowserCards />
</Variant>
</Component>
<Component name="WeirdStringIdBrowserList">
<Variant>
<WeirdStringIdBrowserList />
</Variant>
</Component>
<Component name="WeirdStringIdBrowserTable">
<Variant>
<WeirdStringIdBrowserTable />
</Variant>
</Component>
<Component name="BoringStringIdEditor">
<Variant>
<BoringStringIdEditor />
</Variant>
</Component>
<Component name="BoringStringIdBrowserTable">
<Variant>
<BoringStringIdBrowserTable />
</Variant>
</Component>
<Component name="TrickyIdEditor">
<Variant>
<TrickyIdEditor />
</Variant>
</Component>
<Component name="TrickyIdBrowserTable">
<Variant>
<TrickyIdBrowserTable />
</Variant>
</Component>
</Category>
</Palette>
)
Example #16
Source File: index.tsx From metaplex with Apache License 2.0 | 4 votes |
LaunchStep = (props: {
confirm: () => void;
attributes: IMetadataExtension;
files: File[];
connection: Connection;
}) => {
const [cost, setCost] = useState(0);
const { image } = useArtworkFiles(props.files, props.attributes);
const files = props.files;
const metadata = props.attributes;
useEffect(() => {
const rentCall = Promise.all([
props.connection.getMinimumBalanceForRentExemption(MintLayout.span),
props.connection.getMinimumBalanceForRentExemption(MAX_METADATA_LEN),
]);
if (files.length)
getAssetCostToStore([
...files,
new File([JSON.stringify(metadata)], 'metadata.json'),
]).then(async lamports => {
const sol = lamports / LAMPORT_MULTIPLIER;
// TODO: cache this and batch in one call
const [mintRent, metadataRent] = await rentCall;
// const uriStr = 'x';
// let uriBuilder = '';
// for (let i = 0; i < MAX_URI_LENGTH; i++) {
// uriBuilder += uriStr;
// }
const additionalSol = (metadataRent + mintRent) / LAMPORT_MULTIPLIER;
// TODO: add fees based on number of transactions and signers
setCost(sol + additionalSol);
});
}, [files, metadata, setCost]);
return (
<>
<Row className="call-to-action">
<h2>Launch your creation</h2>
<p>
Provide detailed description of your creative process to engage with
your audience.
</p>
</Row>
<Row className="content-action" justify="space-around">
<Col>
{props.attributes.image && (
<ArtCard
image={image}
animationURL={props.attributes.animation_url}
category={props.attributes.properties?.category}
name={props.attributes.name}
symbol={props.attributes.symbol}
small={true}
artView={props.files[1]?.type === 'unknown'}
className="art-create-card"
/>
)}
</Col>
<Col className="section" style={{ minWidth: 300 }}>
<Statistic
className="create-statistic"
title="Royalty Percentage"
value={props.attributes.seller_fee_basis_points / 100}
precision={2}
suffix="%"
/>
{cost ? (
<AmountLabel
title="Cost to Create"
amount={cost.toFixed(5)}
tokenInfo={useTokenList().tokenMap.get(
WRAPPED_SOL_MINT.toString(),
)}
/>
) : (
<Spin />
)}
</Col>
</Row>
<Row>
<Button
type="primary"
size="large"
onClick={props.confirm}
className="action-btn"
>
Pay with SOL
</Button>
<Button
disabled={true}
size="large"
onClick={props.confirm}
className="action-btn"
>
Pay with Credit Card
</Button>
</Row>
</>
);
}
Example #17
Source File: monitor.tsx From leek with Apache License 2.0 | 4 votes |
MonitorPage = () => {
const service = new StatsService();
const { currentTheme } = useThemeSwitcher();
const [loading, setLoading] = useState<boolean>();
const [totalHits, setTotalHits] = useState<number>(0);
const [statesDistribution, setStatesDistribution] = useState<any>([]);
const [queuesDistribution, setQueuesDistribution] = useState<any>([]);
const [topExecutions, setTopExecutions] = useState<any>([]);
const [topSlow, setTopSlow] = useState<any>([]);
const [tasksOverTimeDistribution, setTasksOverTimeDistribution] =
useState<any>([]);
// Filters
const { currentApp, currentEnv } = useApplication();
const [filters, setFilters] = useState<any>();
const [timeDistributionTSType, setTimeDistributionTSType] =
useState<any>("timestamp");
const [timeFilters, setTimeFilters] = useState<any>({
timestamp_type: "timestamp",
interval_type: "past",
offset: 900000,
});
function handleFilterChange(values) {
setFilters(values);
}
useEffect(() => {
if (!currentApp) return;
let allFilters = {
...filters,
...timeFilters,
};
setLoading(true);
service
.charts(
currentApp,
currentEnv,
"desc",
allFilters,
timeDistributionTSType
)
.then(handleAPIResponse)
.then((result: any) => {
setStatesDistribution(result.aggregations.statesDistribution.buckets);
let totalInQueues = 0;
setQueuesDistribution(
result.aggregations.queuesDistribution.buckets.map(
({ key, doc_count }) => {
totalInQueues += doc_count;
return { id: key, label: key, value: doc_count };
}
)
);
let tasksDistribution =
result.aggregations.tasksDistribution.buckets.map(
({ key, statesDistribution, runtimeDistribution, doc_count }) => {
let tasksStatesSeries = {
QUEUED: 0,
RECEIVED: 0,
STARTED: 0,
SUCCEEDED: 0,
FAILED: 0,
REJECTED: 0,
REVOKED: 0,
RETRY: 0,
RECOVERED: 0,
CRITICAL: 0,
};
const states = statesDistribution.buckets.reduce(
(result, item) => {
result[item.key] = item.doc_count;
return result;
},
tasksStatesSeries
);
return {
id: key,
runtime: runtimeDistribution.value,
executions: doc_count,
...states,
};
}
);
setTopExecutions(tasksDistribution.slice(0, 5));
setTopSlow(
[...tasksDistribution]
.sort(function (a, b) {
return b.runtime - a.runtime;
})
.slice(0, 5)
.filter((task) => {
return task.runtime;
})
);
setTasksOverTimeDistribution([
{
id: "tasks",
data: result.aggregations.timeDistribution.buckets.map(
({ key, doc_count }) => ({
x: moment(key).format("YYYY-MM-DD HH:mm:ss"),
y: doc_count,
})
),
},
]);
setTotalHits(totalInQueues);
}, handleAPIError)
.catch(handleAPIError)
.finally(() => setLoading(false));
}, [currentApp, currentEnv, filters, timeFilters, timeDistributionTSType]);
return (
<>
<Helmet>
<html lang="en" />
<title>Monitor</title>
<meta name="description" content="Tasks monitor" />
<meta name="keywords" content="celery, monitor" />
</Helmet>
<Row style={{ marginBottom: "16px" }} gutter={[12, 12]}>
<Col xxl={5} xl={6} md={7} lg={8} sm={24} xs={24}>
<AttributesFilter
onFilter={handleFilterChange}
filters={timeFilters}
/>
</Col>
<Col xxl={19} xl={18} md={17} lg={16} sm={24} xs={24}>
<Card size="small">
<Row
align="middle"
style={{ textAlign: "center" }}
justify="space-between"
>
<Col>
<TimeFilter
timeFilter={timeFilters}
onTimeFilterChange={setTimeFilters}
/>
</Col>
<Col>
<Statistic
title="Total Filtered"
value={totalHits}
prefix={<FilterOutlined />}
/>
</Col>
</Row>
</Card>
<Row style={{ width: "100%", marginTop: 13 }} gutter={[10, 0]}>
<Col span={12}>
<Card
bodyStyle={{
paddingBottom: 0,
paddingRight: 0,
paddingLeft: 0,
}}
size="small"
style={{ width: "100%" }}
title="States distribution"
>
<Row style={{ height: "400px" }}>
<LeekPie data={statesDistribution} theme={currentTheme} />
</Row>
</Card>
</Col>
<Col span={12}>
<Card
bodyStyle={{
paddingBottom: 0,
paddingRight: 0,
paddingLeft: 0,
}}
size="small"
style={{ width: "100%" }}
title="Queues distribution"
>
<Row style={{ height: "400px" }}>
<LeekWaffle
total={totalHits}
data={queuesDistribution}
theme={currentTheme}
/>
</Row>
</Card>
</Col>
</Row>
<Row justify="center" style={{ width: "100%", marginTop: 13 }}>
<Card
bodyStyle={{ paddingBottom: 0, paddingRight: 0, paddingLeft: 0 }}
size="small"
style={{ width: "100%" }}
title="Top 5 Executed Tasks"
>
<Row style={{ height: "400px" }}>
<LeekBar
data={topExecutions}
keys={StatesKeys}
theme={currentTheme}
/>
</Row>
</Card>
</Row>
<Row justify="center" style={{ width: "100%", marginTop: 13 }}>
<Card
bodyStyle={{ paddingBottom: 0, paddingRight: 0, paddingLeft: 0 }}
size="small"
style={{ width: "100%" }}
title="Tasks over time distribution"
extra={[
<Select
key="timestamp"
defaultValue="timestamp"
dropdownMatchSelectWidth
style={{ width: 115 }}
size="small"
onChange={(type) => setTimeDistributionTSType(type)}
>
<Option value="timestamp">Seen</Option>
<Option value="queued_at">Queued</Option>
<Option value="received_at">Received</Option>
<Option value="started_at">Started</Option>
<Option value="succeeded_at">Succeeded</Option>
<Option value="failed_at">Failed</Option>
<Option value="retried_at">Retried</Option>
<Option value="rejected_at">Rejected</Option>
<Option value="revoked_at">Revoked</Option>
<Option value="eta">ETA</Option>
<Option value="expires">Expires</Option>
</Select>,
]}
>
<Row style={{ height: "400px" }}>
<LeekLine
data={tasksOverTimeDistribution}
theme={currentTheme}
/>
</Row>
</Card>
</Row>
<Row justify="center" style={{ width: "100%", marginTop: 13 }}>
<Card
bodyStyle={{ paddingBottom: 0, paddingRight: 0, paddingLeft: 0 }}
size="small"
style={{ width: "100%" }}
title={
<>
Top 5 Slow <TaskState state={"SUCCEEDED"} />
<TaskState state={"RECOVERED"} />
Tasks
</>
}
>
<Row style={{ height: "400px" }}>
<LeekVerticalBar
data={topSlow}
keys={["runtime"]}
color="yellow_orange_red"
theme={currentTheme}
/>
</Row>
</Card>
</Row>
</Col>
</Row>
</>
);
}
Example #18
Source File: index.tsx From leek with Apache License 2.0 | 4 votes |
IndexPage = () => {
const { currentApp, currentEnv } = useApplication();
const [stats, setStats] = useState<any>({});
const stats_widgets = StatsWidgets(stats);
// Metadata
const metricsService = new MetricsService();
const [seenWorkers, setSeenWorkers] = useState<
MetricsContextData["seenWorkers"]
>([]);
const [seenTasks, setSeenTasks] = useState<MetricsContextData["seenTasks"]>(
[]
);
const [processedEvents, setProcessedEvents] =
useState<MetricsContextData["processedEvents"]>(0);
const [processedTasks, setProcessedTasks] =
useState<MetricsContextData["processedTasks"]>(0);
const [seenStates, setSeenStates] = useState<
MetricsContextData["seenStates"]
>([]);
const [seenTaskStates, setSeenTaskStates] = useState<
MetricsContextData["seenStates"]
>([]);
const [seenRoutingKeys, setSeenRoutingKeys] = useState<
MetricsContextData["seenRoutingKeys"]
>([]);
const [seenQueues, setSeenQueues] = useState<
MetricsContextData["seenQueues"]
>([]);
const [searchDriftLoading, setSearchDriftLoading] = useState<boolean>(true);
const [searchDrift, setSearchDrift] = useState<any>(null);
const [timeFilters, setTimeFilters] = useState<any>({
timestamp_type: "timestamp",
interval_type: "past",
offset: 900000,
});
function getSearchDrift() {
if (!currentApp || !currentEnv) return;
setSearchDriftLoading(true);
metricsService
.getSearchDrift(currentApp, currentEnv)
.then(handleAPIResponse)
.then((result: any) => {
setSearchDrift(result);
}, handleAPIError)
.catch(handleAPIError)
.finally(() => setSearchDriftLoading(false));
}
function getMetrics() {
if (!currentApp) return;
metricsService
.getBasicMetrics(currentApp, currentEnv, timeFilters)
.then(handleAPIResponse)
.then((result: any) => {
setProcessedEvents(result.aggregations.processed_events.value);
const processed = result.aggregations.seen_states.buckets.reduce(
(result, item) => {
if (!workerStates.includes(item.key)) {
return result + item.doc_count;
}
return result;
},
0
);
setProcessedTasks(processed);
setSeenWorkers(result.aggregations.seen_workers.buckets);
setSeenTasks(result.aggregations.seen_tasks.buckets);
setSeenStates(result.aggregations.seen_states.buckets);
setSeenTaskStates(
tasksStatesDefaults
.map(
(obj) =>
result.aggregations.seen_states.buckets.find(
(o) => o.key === obj.key
) || obj
)
.filter((item) => !workerStates.includes(item.key))
);
setSeenRoutingKeys(result.aggregations.seen_routing_keys.buckets);
setSeenQueues(result.aggregations.seen_queues.buckets);
}, handleAPIError)
.catch(handleAPIError);
}
useEffect(() => {
let adapted = {
SEEN_TASKS: seenTasks.length,
SEEN_WORKERS: seenWorkers.length,
PROCESSED_EVENTS: processedEvents,
PROCESSED_TASKS: processedTasks,
TASKS: 0,
EVENTS: 0,
// Tasks
QUEUED: 0,
RECEIVED: 0,
STARTED: 0,
SUCCEEDED: 0,
FAILED: 0,
REJECTED: 0,
REVOKED: 0,
IGNORED: 0,
RETRY: 0,
RECOVERED: 0,
CRITICAL: 0,
// Worker
ONLINE: 0,
HEARTBEAT: 0,
OFFLINE: 0,
};
seenStates.map((task, _) => (adapted[task.key] = task.doc_count));
setStats(adapted);
}, [seenTasks, seenWorkers, seenStates]);
useEffect(() => {
getMetrics();
getSearchDrift();
return () => {
clearInterval(metricsInterval);
};
}, []);
useEffect(() => {
// Stop refreshing metadata
if (metricsInterval) clearInterval(metricsInterval);
// If no application specified, return
if (!currentApp) return;
// Else, get metrics every 10 seconds
getMetrics();
getSearchDrift();
metricsInterval = setInterval(() => {
getMetrics();
getSearchDrift();
}, 10000);
}, [currentApp, currentEnv, timeFilters]);
return (
<>
<Helmet>
<html lang="en" />
<title>Metrics</title>
<meta name="description" content="Events metrics" />
<meta name="keywords" content="celery, tasks" />
</Helmet>
<Row justify="space-between" align="middle" style={{ marginBottom: 16 }}>
<Statistic
loading={searchDriftLoading}
title={
<Tooltip title="The time of the latest event processed by leek.">
<span>Latest Event </span>
<InfoCircleOutlined />
</Tooltip>
}
value={
searchDrift && searchDrift.latest_event_timestamp
? moment(searchDrift.latest_event_timestamp).format(
"MMM D HH:mm:ss Z"
)
: ""
}
valueStyle={{ fontSize: 17.5 }}
prefix={<FieldTimeOutlined />}
/>
<Affix
style={{
position: "fixed",
left: "50%",
transform: "translate(-50%, 0)",
}}
>
<Row>
<TimeFilter
timeFilter={timeFilters}
onTimeFilterChange={setTimeFilters}
/>
</Row>
</Affix>
<Statistic
loading={searchDriftLoading}
title={
<Tooltip title="How many events in the queue waiting to be indexed.">
<span>Current Drift </span>
<InfoCircleOutlined />
</Tooltip>
}
value={
searchDrift && searchDrift.messages_count
? searchDrift.messages_count
: "0"
}
valueStyle={{ fontSize: 17.5 }}
prefix={<EyeInvisibleOutlined />}
/>
</Row>
<Row gutter={16} justify="center" align="middle">
{stats_widgets.map((widget, idx) => (
<Col
lg={12}
md={12}
sm={12}
xs={24}
key={idx}
style={{ marginBottom: "16px" }}
>
<StickerWidget
number={widget.number}
text={widget.text}
icon={widget.icon}
tooltip={widget.tooltip}
/>
</Col>
))}
</Row>
</>
);
}
Example #19
Source File: palette.tsx From jmix-frontend with Apache License 2.0 | 4 votes |
palette = () =>
<Palette>
<Category name="Text">
<Component name="Formatted Message">
<Variant>
<FormattedMessage />
</Variant>
</Component>
<Component name="Heading">
<Variant name='h1'>
<Typography.Title></Typography.Title>
</Variant>
<Variant name='h2'>
<Typography.Title level = {2}></Typography.Title>
</Variant>
<Variant name='h3'>
<Typography.Title level = {3}></Typography.Title>
</Variant>
<Variant name='h4'>
<Typography.Title level = {4}></Typography.Title>
</Variant>
<Variant name='h5'>
<Typography.Title level = {5}></Typography.Title>
</Variant>
</Component>
<Component name='Text'>
<Variant>
<Typography.Text></Typography.Text>
</Variant>
<Variant name = 'Secondary'>
<Typography.Text type="secondary"></Typography.Text>
</Variant>
<Variant name = 'Success'>
<Typography.Text type="success"></Typography.Text>
</Variant>
<Variant name = 'Warning'>
<Typography.Text type="warning"></Typography.Text>
</Variant>
<Variant name = 'Danger'>
<Typography.Text type="danger"></Typography.Text>
</Variant>
<Variant name = 'Disabled'>
<Typography.Text disabled></Typography.Text>
</Variant>
</Component>
</Category>
<Category name="Layout">
<Component name="Divider">
<Variant>
<Divider />
</Variant>
</Component>
<Component name="Grid">
<Variant name="Simple Row">
<Row></Row>
</Variant>
<Variant name="Two columns">
<Row>
<Col span={12}></Col>
<Col span={12}></Col>
</Row>
</Variant>
<Variant name="Three columns">
<Row>
<Col span={8}></Col>
<Col span={8}></Col>
<Col span={8}></Col>
</Row>
</Variant>
</Component>
<Component name="Space">
<Variant>
<Space />
</Variant>
<Variant name="Small">
<Space size={"small"} />
</Variant>
<Variant name="Large">
<Space size={"large"} />
</Variant>
</Component>
</Category>
<Category name="Controls">
<Component name="Autocomplete">
<Variant>
<AutoComplete placeholder="input here" />
</Variant>
</Component>
<Component name="Button">
<Variant>
<Button></Button>
</Variant>
<Variant name="Primary">
<Button type="primary" ></Button>
</Variant>
<Variant name="Link">
<Button type="link" ></Button>
</Variant>
<Variant name="Dropdown">
<Dropdown
trigger={['click']}
overlay={<Menu>
<Menu.Item>
</Menu.Item>
<Menu.Item>
</Menu.Item>
<Menu.Item>
</Menu.Item>
</Menu>}
>
<Button></Button>
</Dropdown>
</Variant>
</Component>
<Component name="Checkbox">
<Variant>
<Checkbox />
</Variant>
</Component>
<Component name='Switch'>
<Variant>
<Switch />
</Variant>
</Component>
<Component name='Radio Group'>
<Variant>
<Radio.Group>
<Radio value={1}>A</Radio>
<Radio value={2}>B</Radio>
<Radio value={3}>C</Radio>
<Radio value={4}>D</Radio>
</Radio.Group>
</Variant>
<Variant name = 'Button'>
<Radio.Group>
<Radio.Button value={1}>A</Radio.Button>
<Radio.Button value={2}>B</Radio.Button>
<Radio.Button value={3}>C</Radio.Button>
<Radio.Button value={4}>D</Radio.Button>
</Radio.Group>
</Variant>
</Component>
<Component name="DatePicker">
<Variant>
<DatePicker />
</Variant>
<Variant name="Range">
<DatePicker.RangePicker />
</Variant>
</Component>
<Component name="TimePicker">
<Variant>
<TimePicker />
</Variant>
<Variant name="Range">
<TimePicker.RangePicker />
</Variant>
</Component>
<Component name="Input">
<Variant>
<Input />
</Variant>
<Variant name='Number'>
<InputNumber />
</Variant>
</Component>
<Component name='Select'>
<Variant>
<Select defaultValue="1">
<Select.Option value="1">1</Select.Option>
<Select.Option value="2">2</Select.Option>
</Select>
</Variant>
<Variant name='Multiple'>
<Select
defaultValue={["1"]}
mode="multiple"
allowClear
>
<Select.Option value="1">1</Select.Option>
<Select.Option value="2">2</Select.Option>
</Select>
</Variant>
</Component>
<Component name="Link">
<Variant>
<Typography.Link href="" target="_blank">
</Typography.Link>
</Variant>
</Component>
<Component name='Slider'>
<Variant>
<Slider defaultValue={30} />
</Variant>
<Variant name = 'Range'>
<Slider range defaultValue={[20, 50]}/>
</Variant>
</Component>
</Category>
<Category name="Data Display">
<Component name="Field">
<Variant>
<Field
entityName={ENTITY_NAME}
disabled={readOnlyMode}
propertyName=''
formItemProps={{
style: { marginBottom: "12px" }
}}
/>
</Variant>
</Component>
<Component name="Card">
<Variant>
<Card />
</Variant>
<Variant name="With Title">
<Card>
<Card title="Card title">
<p>Card content</p>
</Card>
</Card>
</Variant>
<Variant name="My custom card">
<Card>
<Card title="Card title">
<p>Card content</p>
<Avatar />
</Card>
</Card>
</Variant>
</Component>
<Component name="Tabs">
<Variant>
<Tabs defaultActiveKey="1">
<Tabs.TabPane tab="Tab 1" key="1">
Content of Tab Pane 1
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 2" key="2">
Content of Tab Pane 2
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 3" key="3">
Content of Tab Pane 3
</Tabs.TabPane>
</Tabs>
</Variant>
<Variant name = "Tab Pane">
<Tabs.TabPane>
</Tabs.TabPane>
</Variant>
</Component>
<Component name="Collapse">
<Variant>
<Collapse defaultActiveKey='1'>
<Collapse.Panel header="This is panel header 1" key="1">
</Collapse.Panel>
<Collapse.Panel header="This is panel header 2" key="2">
</Collapse.Panel>
<Collapse.Panel header="This is panel header 3" key="3">
</Collapse.Panel>
</Collapse>
</Variant>
</Component>
<Component name="Image">
<Variant>
<Image
width={200}
src=""
/>
</Variant>
</Component>
<Component name="Avatar">
<Variant>
<Avatar icon={<UserOutlined />} />
</Variant>
<Variant name="Image">
<Avatar src="https://joeschmoe.io/api/v1/random" />
</Variant>
</Component>
<Component name="Badge">
<Variant>
<Badge count={1}>
</Badge>
</Variant>
</Component>
<Component name="Statistic">
<Variant>
<Statistic title="Title" value={112893} />
</Variant>
</Component>
<Component name="Alert">
<Variant name="Success">
<Alert message="Text" type="success" />
</Variant>
<Variant name="Info">
<Alert message="Text" type="info" />
</Variant>
<Variant name="Warning">
<Alert message="Text" type="warning" />
</Variant>
<Variant name="Error">
<Alert message="Text" type="error" />
</Variant>
</Component>
<Component name='List'>
<Variant>
<List
bordered
dataSource={[]}
renderItem={item => (
<List.Item>
</List.Item>
)}
/>
</Variant>
</Component>
</Category>
<Category name="Icons">
<Component name="Arrow">
<Variant name = 'Up'>
<ArrowUpOutlined />
</Variant>
<Variant name = 'Down'>
<ArrowDownOutlined />
</Variant>
<Variant name = 'Left'>
<ArrowLeftOutlined />
</Variant>
<Variant name = 'Right'>
<ArrowRightOutlined />
</Variant>
</Component>
<Component name = 'Question'>
<Variant>
<QuestionOutlined />
</Variant>
<Variant name = 'Circle'>
<QuestionCircleOutlined />
</Variant>
</Component>
<Component name = 'Plus'>
<Variant>
<PlusOutlined />
</Variant>
<Variant name = 'Circle'>
<PlusCircleOutlined />
</Variant>
</Component>
<Component name = 'Info'>
<Variant>
<InfoOutlined />
</Variant>
<Variant name = 'Circle'>
<InfoCircleOutlined />
</Variant>
</Component>
<Component name = 'Exclamation'>
<Variant>
<ExclamationOutlined />
</Variant>
<Variant name = 'Circle'>
<ExclamationCircleOutlined />
</Variant>
</Component>
<Component name = 'Close'>
<Variant>
<CloseOutlined />
</Variant>
<Variant name = 'Circle'>
<CloseCircleOutlined />
</Variant>
</Component>
<Component name = 'Check'>
<Variant>
<CheckOutlined />
</Variant>
<Variant name = 'Circle'>
<CheckCircleOutlined />
</Variant>
</Component>
<Component name = 'Edit'>
<Variant>
<EditOutlined />
</Variant>
</Component>
<Component name = 'Copy'>
<Variant>
<CopyOutlined />
</Variant>
</Component>
<Component name = 'Delete'>
<Variant>
<DeleteOutlined />
</Variant>
</Component>
<Component name = 'Bars'>
<Variant>
<BarsOutlined />
</Variant>
</Component>
<Component name = 'Bell'>
<Variant>
<BellOutlined />
</Variant>
</Component>
<Component name = 'Clear'>
<Variant>
<ClearOutlined />
</Variant>
</Component>
<Component name = 'Download'>
<Variant>
<DownloadOutlined />
</Variant>
</Component>
<Component name = 'Upload'>
<Variant>
<UploadOutlined />
</Variant>
</Component>
<Component name = 'Sync'>
<Variant>
<SyncOutlined />
</Variant>
</Component>
<Component name = 'Save'>
<Variant>
<SaveOutlined />
</Variant>
</Component>
<Component name = 'Search'>
<Variant>
<SearchOutlined />
</Variant>
</Component>
<Component name = 'Settings'>
<Variant>
<SettingOutlined />
</Variant>
</Component>
<Component name = 'Paperclip'>
<Variant>
<PaperClipOutlined />
</Variant>
</Component>
<Component name = 'Phone'>
<Variant>
<PhoneOutlined />
</Variant>
</Component>
<Component name = 'Mail'>
<Variant>
<MailOutlined />
</Variant>
</Component>
<Component name = 'Home'>
<Variant>
<HomeOutlined />
</Variant>
</Component>
<Component name = 'Contacts'>
<Variant>
<ContactsOutlined />
</Variant>
</Component>
<Component name = 'User'>
<Variant>
<UserOutlined />
</Variant>
<Variant name = 'Add'>
<UserAddOutlined />
</Variant>
<Variant name = 'Remove'>
<UserDeleteOutlined />
</Variant>
</Component>
<Component name = 'Team'>
<Variant>
<TeamOutlined />
</Variant>
</Component>
</Category>
</Palette>