reactstrap#Row TypeScript Examples
The following examples show how to use
reactstrap#Row.
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: row.tsx From resume-nextjs with MIT License | 6 votes |
export default function ExperienceRow({
item,
index,
}: PropsWithChildren<{ item: IExperience.Item; index: number }>) {
return (
<div>
{index > 0 ? <hr /> : ''}
<Row>
<Col sm={12} md={3} className="text-md-right">
{createWorkingPeriod(item.startedAt, item.endedAt)}
</Col>
<Col sm={12} md={9}>
<h4>{item.title}</h4>
<i style={Style.gray}>{item.position}</i>
<ul className="pt-3">
{item.descriptions.map((description, descIndex) => (
<li key={descIndex.toString()}>{description}</li>
))}
{createSkillKeywords(item.skillKeywords)}
</ul>
</Col>
</Row>
</div>
);
}
Example #2
Source File: MainInputFormRunStep.tsx From nextclade with MIT License | 6 votes |
export function MainInputFormRunStep() {
return (
<MainInputFormContainer fluid>
<Row noGutters>
<Col>
<DatasetCurrent />
</Col>
</Row>
<Row noGutters className="my-3">
<Col>
<MainInputFormSequenceFilePicker />
</Col>
</Row>
</MainInputFormContainer>
)
}
Example #3
Source File: CommonRow.tsx From resume-nextjs with MIT License | 6 votes |
export function CommonRows({
index,
payload,
}: PropsWithChildren<{ payload: IRow.Payload; index: number }>) {
const { left, right } = payload;
const isNeedDescriptionPadding = !!(right.title || right.subTitle);
return (
<div>
{index > 0 ? <hr /> : ''}
<Row>
<Col sm={12} md={3} className="text-md-right">
<Row>
<Col md={12}>
<h4 style={Style.gray}>{left.title}</h4>
</Col>
{left.subTitle ? <Col md={12}>{left.subTitle}</Col> : ''}
</Row>
</Col>
<Col sm={12} md={9}>
{right.title ? <h4>{right.title}</h4> : ''}
{right.subTitle ? <i style={Style.gray}>{right.subTitle}</i> : ''}
{right.descriptions ? (
<CommonDescription
descriptions={right.descriptions}
option={{ padding: isNeedDescriptionPadding }}
/>
) : (
''
)}
</Col>
</Row>
</div>
);
}
Example #4
Source File: ErrorContent.tsx From nextclade with MIT License | 6 votes |
export function ErrorContent(props: { error?: unknown }) {
const error = useMemo(() => sanitizeError(props.error), [props.error])
if (!props.error) {
return null
}
return (
<Row noGutters>
<Col>
<Row noGutters>
<Col>
<ErrorContentMessage error={error} />
</Col>
</Row>
<Row noGutters>
<Col>
<ErrorContentStack error={error} />
</Col>
</Row>
</Col>
</Row>
)
}
Example #5
Source File: index.tsx From resume-nextjs with MIT License | 6 votes |
function Component({ payload }: PropsWithChildren<{ payload: Payload }>) {
const totalPeriod = () => {
if (payload.disableTotalPeriod) {
return '';
}
return (
<span style={{ fontSize: '50%' }}>
<Badge>{getFormattingExperienceTotalDuration(payload)}</Badge>
</span>
);
};
// 여기는 기간 표시, Skill Keywords 같은 특이 요소가 있어서 CommonSection, CommonRow 로 못바꾸지 않을까..
return (
<div className="mt-5">
<EmptyRowCol>
<Row className="pb-3">
<Col>
<h2 style={Style.blue}>EXPERIENCE {totalPeriod()}</h2>
</Col>
</Row>
{payload.list.map((item, index) => (
<ExperienceRow key={index.toString()} item={item} index={index} />
))}
</EmptyRowCol>
</div>
);
}
Example #6
Source File: History.tsx From mops-vida-pm-watchdog with MIT License | 6 votes |
History = () => {
const history = useSelector((state) => state.report.history);
const onDownload = () => {
const encoded = JSON.stringify(history, null, 2);
const link = document.createElement('a');
link.href = URL.createObjectURL(new Blob([encoded], { type: 'application/json' }));
link.download = makeDownloadFile();
link.click();
};
return (
<Row hidden={history.length === 0}>
<h1>
History{' '}
<Button size='sm' color='link' onClick={onDownload}>
Download
</Button>
</h1>
<Table responsive borderless size='sm'>
<thead>
<tr>
<th>#</th>
<th>
PM <sub>2.5</sub>
</th>
</tr>
</thead>
<tbody>
{history.map(({ recordDate, pm25 }, index) => (
<tr key={index}>
<td>{recordDate?.toLocaleString()}</td>
<td>{pm25}</td>
</tr>
))}
</tbody>
</Table>
</Row>
);
}
Example #7
Source File: index.tsx From atorch-console with MIT License | 6 votes |
AtorchConsole: React.FC = () => {
const dispatch = useDispatch();
const connected = useSelector((state) => state.report.connected);
const latest = useSelector((state) => state.report.latest);
const onConnect = () => dispatch(connect());
return (
<Container className={locals.container}>
<Row className='ml-2 justify-content-center'>
<Button outline onClick={onConnect}>
{connected ? 'Disconnect' : 'Connect'}
</Button>
</Row>
<PrintReport packet={latest} />
</Container>
);
}
Example #8
Source File: index.tsx From resume-nextjs with MIT License | 6 votes |
function Component({ payload }: PropsWithChildren<{ payload: IFooter.Payload }>) {
return (
<Row>
<Col style={Style.footerCover}>
<div style={Style.footer} className="text-center mt-2">
<EmptyRowCol>
<small>
v.{`${payload.version} / `}
{/* Github 주소는 origin repository 의 주소를 넣는다. */}
<HrefTargetBlank url="https://github.com/uyu423/resume-nextjs" text="Github" />
{' / '}
Thanks for <HrefTargetBlank url="https://blog.outsider.ne.kr/1234" text="Outsider" />
</small>
</EmptyRowCol>
<EmptyRowCol>
<small>
<HrefTargetBlank url="https://nextjs.org/" text="Next.js" /> v{payload.nextVersion}
{' / '}
<HrefTargetBlank url="https://reactjs.org/" text="React.js" /> v{payload.reactVersion}
{' / '}
<HrefTargetBlank url="https://getbootstrap.com" text="Bootstrap" /> v
{payload.bootstrapVersion}
</small>
</EmptyRowCol>
<br />
</div>
</Col>
</Row>
);
}
Example #9
Source File: UploadedFileInfo.tsx From nextclade with MIT License | 5 votes |
export function UploadedFileInfo({ description, error, onRemove }: UploadedFileInfoProps) {
const { t } = useTranslation()
const hasErrors = !isNil(error)
const errorComponent = useMemo(
() =>
error && (
<ErrorWrapper>
<ErrorWrapperInternal>
<FileError key={error} error={error} />
</ErrorWrapperInternal>
</ErrorWrapper>
),
[error],
)
return (
<Container>
<InfoWrapper>
<InfoWrapperInternal>
<Row noGutters className="my-auto">
<Col>
<IconsContainer>
<FileStatusIcon hasErrors={hasErrors} />
</IconsContainer>
</Col>
</Row>
<Row noGutters className="my-auto">
<Col>
<TextContainer>
<Description>{description}</Description>
</TextContainer>
</Col>
</Row>
<Row noGutters className="my-auto">
<Col>
<ButtonContainer>
<RemoveButton color="secondary" onClick={onRemove}>
{t('Remove')}
</RemoveButton>
</ButtonContainer>
</Col>
</Row>
</InfoWrapperInternal>
</InfoWrapper>
{errorComponent}
</Container>
)
}
Example #10
Source File: index.tsx From resume-nextjs with MIT License | 5 votes |
export function EmptyRowCol<T = {}>({ children }: PropsWithChildren<T>) {
return (
<Row>
<Col>{children}</Col>
</Row>
);
}
Example #11
Source File: index.tsx From atorch-console with MIT License | 5 votes |
PrintReport: React.FC<Props> = ({ packet }) => { const type = packet?.type ?? 0; let record: React.ReactNode[][]; if (packet instanceof ACMeterPacket) { record = [ ['Voltage', <FormattedUnit value={packet.mVoltage} unit='V' />], ['Ampere', <FormattedUnit value={packet.mAmpere} unit='A' />], ['Watt', <FormattedUnit value={packet.mWatt} unit='W' />], ['W·h', <FormattedUnit value={packet.mWh} unit='W·h' />, <Command onClick={CommandSet.resetWh.bind(null, type)}>Reset</Command>], [CO2Name, <FormattedUnit value={getCO2(packet.mWh)} unit='g' />], ['Price', `${packet.price.toFixed(2)} $/kW·h`, <SetupPriceCommand type={type} value={packet.price} />], ['Fee', `${packet.fee.toFixed(5)} $`], ['Frequency', `${packet.frequency.toFixed(1)} Hz`], ['PF', packet.pf.toFixed(2)], ['Temperature', <FormattedTemperature value={packet.temperature} />], ['Duration', packet.duration], ['Backlight Time', <FormattedBacklightTime time={packet.backlightTime} />, <SetupBacklightTimeCommand type={type} value={packet.backlightTime} />], ]; } else if (packet instanceof DCMeterPacket) { record = [ ['Voltage', <FormattedUnit value={packet.mVoltage} unit='V' />], ['Ampere', <FormattedUnit value={packet.mAmpere} unit='A' />], ['Watt', <FormattedUnit value={packet.mWatt} unit='W' />], ['W·h', <FormattedUnit value={packet.mWh} unit='W·h' />, <Command onClick={CommandSet.resetWh.bind(null, type)}>Reset</Command>], [CO2Name, <FormattedUnit value={getCO2(packet.mWh)} unit='g' />], ['Price', `${packet.price.toFixed(2)} $/kW·h`, <SetupPriceCommand type={type} value={packet.price} />], ['Fee', `${packet.fee.toFixed(5)} $`], ['Temperature', <FormattedTemperature value={packet.temperature} />], ['Duration', packet.duration], ['Backlight Time', <FormattedBacklightTime time={packet.backlightTime} />, <SetupBacklightTimeCommand type={type} value={packet.backlightTime} />], ]; } else if (packet instanceof USBMeterPacket) { record = [ ['Voltage', <FormattedUnit value={packet.mVoltage} unit='V' />], ['Ampere', <FormattedUnit value={packet.mAmpere} unit='A' />], ['Watt', <FormattedUnit value={packet.mWatt} unit='W' />], ['A·h', <FormattedUnit value={packet.mAh} unit='A·h' />, <Command onClick={CommandSet.resetAh.bind(null, type)}>Reset</Command>], ['W·h', <FormattedUnit value={packet.mWh} unit='W·h' />, <Command onClick={CommandSet.resetWh.bind(null, type)}>Reset</Command>], [CO2Name, <FormattedUnit value={getCO2(packet.mWh)} unit='g' />], ['USB D-', <FormattedUnit value={packet.dataN} unit='V' />], ['USB D+', <FormattedUnit value={packet.dataP} unit='V' />], ['Temperature', <FormattedTemperature value={packet.temperature} />], ['Duration', packet.duration, <Command onClick={CommandSet.resetDuration.bind(null, type)}>Reset</Command>], ['Backlight Time', <FormattedBacklightTime time={packet.backlightTime} />], ]; } else { return <p>Not connected to device.</p>; } return ( <> <Row className='ml-2 justify-content-center'> <Report record={record} /> </Row> <Row className='ml-2 justify-content-center'> <Toolbar type={type} /> </Row> </> ); }
Example #12
Source File: app.tsx From website with Apache License 2.0 | 5 votes |
function App(): JSX.Element {
const { x, y, place, isLoading } = useContext(Context);
const showChart = shouldShowChart(x.value, y.value, place.value);
const showChooseStatVarMessage = shouldShowChooseStatVarMessage(
x.value,
y.value,
place.value
);
const showInfo = !showChart && !showChooseStatVarMessage;
const [isSvModalOpen, updateSvModalOpen] = useState(false);
const toggleSvModalCallback = () => updateSvModalOpen(!isSvModalOpen);
return (
<>
<StatVarChooser
openSvHierarchyModal={isSvModalOpen}
openSvHierarchyModalCallback={toggleSvModalCallback}
/>
<div id="plot-container">
<Container fluid={true}>
{!showChart && (
<Row>
<h1 className="mb-4">Scatter Plot Explorer</h1>
</Row>
)}
<Row>
<PlaceOptions toggleSvHierarchyModal={toggleSvModalCallback} />
</Row>
{showChooseStatVarMessage && (
<Row className="info-message">
Choose 2 statistical variables from the left pane.
</Row>
)}
{showInfo && (
<Row>
<Info />
</Row>
)}
{showChart && (
<Row id="chart-row">
<ChartLoader />
</Row>
)}
</Container>
</div>
<Spinner isOpen={shouldDisplaySpinner(isLoading)} />
</>
);
}
Example #13
Source File: FilePickerStyles.tsx From nextclade with MIT License | 5 votes |
RowFill = styled(Row)`
flex: 1;
`
Example #14
Source File: Home.tsx From reference-merchant with Apache License 2.0 | 5 votes |
function Home(props) {
const { t } = useTranslation("layout");
const [selectedProduct, setSelectedProduct] = useState<Product>();
const [products, setProducts] = useState<Product[] | undefined>();
const [demoMode, setDemoMode] = useState<boolean>(props.demoMode === undefined ? false : true);
const getProducts = async () => {
try {
setProducts(await new BackendClient().getProductsList());
} catch (e) {
console.error(e);
}
};
useEffect(() => {
//noinspection JSIgnoredPromiseFromCall
getProducts();
}, []);
return (
<>
<TestnetWarning />
<Container>
<h1 className="text-center font-weight-bold mt-5">{t("name")}</h1>
<section className="mt-5">
{products && (
<Row>
{products.map((product, i) => (
<Col key={product.gtin} md={6} lg={4}>
<Card key={product.gtin} className="mb-4">
<CardImg top src={product.image_url} />
<CardBody>
<CardTitle className="font-weight-bold h5">{product.name}</CardTitle>
<CardText>{product.description}</CardText>
</CardBody>
<CardFooter>
<Row>
<Col>
<div>
<strong>Price:</strong> {product.price / 1000000} {product.currency}
</div>
</Col>
<Col lg={4} className="text-right">
<Button
color="secondary"
block
className="btn-sm"
onClick={() => setSelectedProduct(products[i])}
>
Buy Now
</Button>
</Col>
</Row>
</CardFooter>
</Card>
</Col>
))}
</Row>
)}
{!products && <ProductsLoader />}
</section>
</Container>
<Payment
demoMode={demoMode}
product={selectedProduct}
isOpen={!!selectedProduct}
onClose={() => setSelectedProduct(undefined)}
/>
</>
);
}
Example #15
Source File: app.tsx From website with Apache License 2.0 | 5 votes |
function App({
query,
loading,
onSearch,
chartsData,
}: AppPropType): JSX.Element {
return (
<>
<div id="plot-container">
<Container fluid={true}>
<Row>
<Card className="place-options-card">
<Container className="place-options" fluid={true}>
<div className="place-options-section">
<TextSearchBar
onSearch={onSearch}
initialValue={query}
placeholder='For example "People with Doctorate Degrees in France"'
/>
</div>
</Container>
</Card>
</Row>
{chartsData && !loading && (
<Row>
<Card>
<div id="main" className="col-md-9x col-lg-10">
<StatVarResults {...chartsData} />
</div>
</Card>
</Row>
)}
<div id="screen" style={{ display: loading ? "block" : "none" }}>
<div id="spinner"></div>
</div>
</Container>
</div>
</>
);
}
Example #16
Source File: Tab.tsx From opensaas with MIT License | 5 votes |
VerticalTabs: React.FC<TabsProps> = (props) => {
const {
tabs,
navClass = '',
tabContentClass = '',
activeClass = '',
activeTabId = '1',
pills,
verticalIcons = true,
} = props;
const [activeTab, setActiveTab] = React.useState(activeTabId);
const toggle = (tab: string) => {
if (activeTab !== tab) setActiveTab(tab);
};
return (
<div className='tab d-flex flex-row'>
<Nav
vertical
pills={pills}
tabs
className={classNames({ 'border-0 m-0 p-0 bg-white': activeClass, 'border-0': pills })}>
{tabs.map((tab: TabType, index: number) => {
const { label, tabId } = tab;
const klassName = verticalIcons ? 'text-center' : 'd-flex align-items-center justify-content-between';
return (
<TabItem
key={index}
tabId={tabId}
activeClass={activeClass}
className={navClass}
activeTab={activeTab}
toggle={toggle}>
<div className={klassName}>{label}</div>
</TabItem>
);
})}
</Nav>
<TabContent className={`ml-1 ${tabContentClass}`} activeTab={activeTab}>
{tabs.map((tab: TabType, index: number) => {
const { tabId, content } = tab;
return (
<TabPane key={index} tabId={tabId}>
<Row>
<Col sm='12'>{content}</Col>
</Row>
</TabPane>
);
})}
</TabContent>
</div>
);
}
Example #17
Source File: TutorHistory.tsx From TutorBase with MIT License | 5 votes |
TutorHistory = () => {
let tutorData = useSelector(selectTutorData);
let [dropDownOpen, setDropdownOpen] = useState<boolean>(false);
let [dropDownValue, setDropdownValue] = useState<String>("All");
let [appointments, setAppointments] = useState<Array<Appointment>>([]);
let dispatch = useDispatch();
useEffect(() => {
const getAppointments = async () => {
return (await api.GetTutorAppointments(tutorData.tutorId)).data.reverse();
}
getAppointments().then(value => {
setAppointments(value);
dispatch(tutorDataActions.setAppointment(value));
}
)
}, [tutorData.tutorId, dispatch]);
let filteredAppointments = appointments;
if (dropDownValue==="Denied"){
filteredAppointments = appointments.filter((appointment) => !appointment.confirmed);
} else if (dropDownValue==="Completed"){
filteredAppointments = appointments.filter((appointment) => appointment.confirmed);
}
let meetingCards = filteredAppointments.map(appointment => (
<MeetingCard appt={appointment} isTutor={true} includePrevious={true}/>
));
return (
<Container fluid>
<Row className="title" style={{ marginTop: '25px'}}>
<div className="profile-text">History</div>
</Row>
<hr></hr>
<Dropdown isOpen={dropDownOpen} toggle={() => {setDropdownOpen(!dropDownOpen)}}>
<DropdownToggle caret >
{dropDownValue}
</DropdownToggle>
<DropdownMenu>
<DropdownItem
onClick={(event) => {
setDropdownValue("All");
setDropdownOpen(false);
}}>All</DropdownItem>
<DropdownItem
onClick={(event) => {
setDropdownValue("Completed");
setDropdownOpen(false);
}}>Completed</DropdownItem>
<DropdownItem
onClick={(event) => {
setDropdownValue("Denied");
setDropdownOpen(false);
}}>Denied</DropdownItem>
</DropdownMenu>
</Dropdown>
{meetingCards}
</Container>
);
}
Example #18
Source File: Typography.tsx From opensaas with MIT License | 5 votes |
Typography: React.FC = () => {
return (
<div className='relative'>
<Widget>
<Col>
{Object.entries(COLORS).map(([color]: [string, any], i: number) => {
return Object.entries(SIZES).map(([size]: [string, any], j: number) => {
if (color !== 'black') {
const arr = [];
for (let k = 1; k < 10; k++) {
arr.push(
<Row key={`${i}${j}${k}`}>
<Col sm={2} className='text-sm'>
<code>
.text-{color}-{k}00 .text-{size}
</code>
</Col>
<Col sm={10}>
<div className={`text-${color}-${k}00 text-${size}`}>Default full text</div>
</Col>
</Row>,
);
}
return arr;
} else {
return (
<Row key={`${i}${j}`}>
<Col sm={2} className='text-sm'>
<code>
.text-{color} .text-{size}
</code>
</Col>
<Col sm={10}>
<div className={`text-${color} text-${size}`}>Default full text</div>
</Col>
</Row>
);
}
});
})}
</Col>
</Widget>
</div>
);
}
Example #19
Source File: CitationButton.tsx From nextclade with MIT License | 5 votes |
export function CitationButton() {
const { t } = useTranslation()
const [showCitation, setShowCitation] = useState(false)
const toggleOpen = useCallback(() => setShowCitation((showCitation) => !showCitation), [])
const open = useCallback(() => setShowCitation(true), [])
const close = useCallback(() => setShowCitation(false), [])
const text = t('Citation')
const closeText = t('Close this window')
return (
<>
<ButtonCitationBase type="button" onClick={open} title={text}>
<HiOutlineAcademicCap className="mr-xl-2" />
<span className="d-none d-xl-inline">{text}</span>
</ButtonCitationBase>
<Modal centered isOpen={showCitation} toggle={toggleOpen} fade={false} size="lg">
<ModalHeader toggle={close} tag="div">
<h2 className="text-center">{text}</h2>
</ModalHeader>
<ModalBody>
<Citation />
</ModalBody>
<ModalFooter>
<Container fluid>
<Row noGutters className="my-2">
<Col className="d-flex w-100">
<ButtonOk className="ml-auto" type="button" color="success" onClick={close} title={closeText}>
{t('OK')}
</ButtonOk>
</Col>
</Row>
</Container>
</ModalFooter>
</Modal>
</>
)
}
Example #20
Source File: ClientHistory.tsx From TutorBase with MIT License | 5 votes |
ClientHistory = () => {
let clientData = useSelector(selectClientData);
let [dropDownOpen, setDropdownOpen] = useState<boolean>(false);
let [dropDownValue, setDropdownValue] = useState<String>("All");
let [appointments, setAppointments] = useState<Array<Appointment>>([]);
let dispatch = useDispatch();
useEffect(() => {
const getAppointments = async () => {
return (await api.GetClientAppointments(clientData.clientId)).data.reverse();
}
getAppointments().then(value => {
setAppointments(value);
dispatch(clientDataActions.setAppointment(value));
}
)
}, [clientData.clientId, dispatch]);
let filteredAppointments = appointments;
if (dropDownValue==="Denied"){
filteredAppointments = appointments.filter((appointment) => !appointment.confirmed);
} else if (dropDownValue==="Completed"){
filteredAppointments = appointments.filter((appointment) => appointment.confirmed);
}
let meetingCards = filteredAppointments.map(appointment => (
<MeetingCard appt={appointment} isTutor={false} includePrevious={true}/>
));
return (
<Container fluid style={{maxWidth:"100vw"}}>
<Row className="title" style={{ marginTop: '25px'}}>
<div className="profile-text">History</div>
</Row>
<hr></hr>
<Dropdown isOpen={dropDownOpen} toggle={() => {setDropdownOpen(!dropDownOpen)}}>
<DropdownToggle caret >
{dropDownValue}
</DropdownToggle>
<DropdownMenu>
<DropdownItem
onClick={(event) => {
setDropdownValue("All");
setDropdownOpen(false);
}}>All</DropdownItem>
<DropdownItem
onClick={(event) => {
setDropdownValue("Completed");
setDropdownOpen(false);
}}>Completed</DropdownItem>
<DropdownItem
onClick={(event) => {
setDropdownValue("Denied");
setDropdownOpen(false);
}}>Denied</DropdownItem>
</DropdownMenu>
</Dropdown>
{meetingCards}
</Container>
);
}
Example #21
Source File: PeptideMarkerMutationGroup.tsx From nextclade with MIT License | 4 votes |
function PeptideMarkerMutationGroupUnmemoed({
seqName,
group,
pixelsPerAa,
...restProps
}: PeptideMarkerMutationGroupProps) {
const { t } = useTranslationSafe()
const [showTooltip, setShowTooltip] = useState(false)
const onMouseEnter = useCallback(() => setShowTooltip(true), [])
const onMouseLeave = useCallback(() => setShowTooltip(false), [])
const { gene, changes, codonAaRange, nucSubstitutions, nucDeletions } = group
const id = getSafeId('aa-mutation-group-marker', { seqName, gene, begin: codonAaRange.begin })
const minWidth = (AA_MIN_WIDTH_PX * 6) / (5 + changes.length)
const pixelsPerAaAdjusted = Math.max(minWidth, pixelsPerAa)
const width = changes.length * Math.max(pixelsPerAaAdjusted, pixelsPerAa)
// position mutation group at 'center of group' - half the group width
const x =
((codonAaRange.begin + codonAaRange.end) * pixelsPerAa -
(codonAaRange.end - codonAaRange.begin) * pixelsPerAaAdjusted) /
2
let changesHead = changes
let changesTail: typeof changes = []
if (changes.length > 6) {
changesHead = changes.slice(0, 3)
changesTail = changes.slice(-3)
}
const totalNucChanges = nucSubstitutions.length + nucDeletions.length
return (
<g id={id}>
<rect fill="#999a" x={x - 0.5} y={-10} width={width + 1} stroke="#aaaa" strokeWidth={0.5} height={32} />
<svg x={x} y={-9.5} height={29} {...restProps}>
<g onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
{changes.map((change) => (
<PeptideMarkerMutation
key={change.codon}
change={change}
parentGroup={group}
pixelsPerAa={pixelsPerAaAdjusted}
/>
))}
<Tooltip target={id} isOpen={showTooltip} wide fullWidth>
<TableSlim borderless className="mb-1">
<thead />
<tbody>
<tr>
<td colSpan={2}>
<h5>{seqName}</h5>
</td>
</tr>
<tr className="mb-2">
<td colSpan={2}>
<h6>{t('Aminoacid changes ({{count}})', { count: changes.length })}</h6>
</td>
</tr>
{changesHead.map((change) => (
<tr key={change.codon}>
<td>{change.type === 'substitution' ? t('Substitution') : t('Deletion')}</td>
<td>
<AminoacidMutationBadge mutation={change} />
</td>
</tr>
))}
{changesTail.length > 0 && (
<tr>
<td>{'...'}</td>
<td>{'...'}</td>
</tr>
)}
{changesTail.length > 0 &&
changesTail.map((change) => (
<tr key={change.codon}>
<td>{change.type === 'substitution' ? t('Substitution') : t('Deletion')}</td>
<td>
<AminoacidMutationBadge mutation={change} />
</td>
</tr>
))}
{totalNucChanges > 0 && (
<tr>
<td colSpan={2}>
<h6 className="mt-3">{t('Nucleotide changes nearby ({{count}})', { count: totalNucChanges })}</h6>
</td>
</tr>
)}
{nucSubstitutions.map((mut) => (
<tr key={mut.pos}>
<td>{t('Substitution')}</td>
<td>{<NucleotideMutationBadge mutation={mut} />}</td>
</tr>
))}
{nucDeletions.map((del) => (
<tr key={del.start}>
<td>{t('Deletion')}</td>
<td>{formatRange(del.start, del.start + del.length)}</td>
</tr>
))}
<tr>
<td colSpan={2}>
<Row noGutters className="mt-3">
<Col>
<h6>{'Context'}</h6>
</Col>
</Row>
<Row noGutters>
<Col>
<PeptideContext group={group} />
</Col>
</Row>
</td>
</tr>
</tbody>
</TableSlim>
</Tooltip>
</g>
</svg>
</g>
)
}
Example #22
Source File: index.tsx From mops-vida-pm-watchdog with MIT License | 4 votes |
SensorConsole: React.FC = () => {
const dispatch = useDispatch();
const connected = useSelector((state) => state.report.connected);
const shuttingdown = useSelector((state) => state.report.shuttingdown);
const latest = useSelector((state) => state.report.latest);
const onConnect = async () => {
if (connected) {
await dispatch(disconnect());
} else {
await dispatch(requestDevice());
await dispatch(connect());
}
};
const onShutdown = () => dispatch(shutdown());
const onReadHistory = () => dispatch(readHistory());
return (
<Container className={locals.container}>
<Row>
<ButtonGroup>
<Button color={connected ? 'success' : 'primary'} onClick={onConnect}>
{connected ? 'Disconnect' : 'Connect'}
</Button>
<Button disabled={!connected} color={connected ? 'danger' : undefined} onClick={onShutdown}>
{shuttingdown ? 'Shutting down' : 'Shutdown'}
</Button>
<Button disabled={!connected} color={connected ? 'info' : undefined} onClick={onReadHistory}>
Read history (one-time)
</Button>
</ButtonGroup>
</Row>
<Row>
<h1>Real-time</h1>
<Table className={locals.table} responsive borderless>
<thead>
<tr>
<th className={locals.field}>#</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>
PM <sub>2.5</sub>
</td>
<td className='text-monospace'>
<FormattedPM25 value={latest.pm25} />
</td>
</tr>
<tr>
<td>Battery</td>
<td>
<Progress value={latest.batteryCapacity ?? 0}>
{latest.batteryCapacity ? `${latest.batteryCapacity}%` : 'N/A'} {latest.batteryCharging ? '(Charging)' : '(Discharge)'}
</Progress>
</td>
</tr>
<tr>
<td>Record date</td>
<td className='text-monospace'>
<RecordDate value={latest.recordDate} />
</td>
</tr>
<tr>
<td>Runtime</td>
<td className='text-monospace'>{latest.runTime ? prettyDuration(latest.runTime * 1000) : 'N/A'}</td>
</tr>
<tr>
<td>Boot time</td>
<td className='text-monospace'>{latest.bootTime ? prettyDuration(latest.bootTime * 1000) : 'N/A'}</td>
</tr>
<tr>
<td>Measurement Interval</td>
<td className='text-monospace'>
<MeasurementInterval />
</td>
</tr>
<tr>
<td>Firmare Version</td>
<td className='text-monospace'>{latest.version ?? 'N/A'}</td>
</tr>
</tbody>
</Table>
</Row>
<History />
</Container>
);
}
Example #23
Source File: LoginPage.tsx From TutorBase with MIT License | 4 votes |
export function LoginPage() {
const history = useHistory();
const CASRedirect = () => {
window.location.href = ApiBaseAddress + 'api/login';
}
const handleAuthentication = (event: any) => {
console.log("searching");
event.preventDefault();
fetch("/login/cas", {
method: "get",
headers: {
"Content-Type": "application/json",
},
// body: JSON.stringify(this.state),
})
.then((res) => res.json())
.then((data) => {
//Callback function after states been updated.
console.log(data.message);
if (data.message === "success") {
console.log("success");
//Pass properties to next application
//NOTE: Re-write this. Not safe
// history.push({
// pathname: "/home", //---Change path as desired.
// email: this.state.email,
// });
history.push("/home/schedule")
} else if (data.message === "failure") {
console.log("failure");
console.log("Incorrect credentials");
}
})
.catch((error) => alert(error.message));
};
return (
<Container>
<Helmet>
<meta charSet="utf-8" />
<title>TutorBase - Login</title>
</Helmet>
<LoginBacking>
<LoginPrompt>
<Row>
<Col style={{ textAlign: "center", paddingTop: "3em" }}>
<img src={tb_logo} style={{ maxWidth: "100%" }} alt="Rensselaer" />
</Col>
</Row>
<Row>
<Col style={{ textAlign: "center" }}>
A better system to connect students and tutors at RPI.
</Col>
</Row>
<Row>
<Col style={{display: 'flex', justifyContent: 'center', alignItems: 'center'}}>
<Button
onClick={() => CASRedirect()}
color="danger"
size="lg"
style={{margin: '1em'}}>
Login
</Button>
</Col>
</Row>
<Row>
<Col style={{textAlign: 'center'}}>
An <a href="https://rcos.io/"> RCOS</a> project.
<a href="https://github.com/DangItJason/TutorBase">
<img style={{ maxWidth: "80%", maxHeight: "80%" }}
src={git_logo}
alt="GitHub" />
</a>
</Col>
</Row>
</LoginPrompt>
<Row>
<Col style={{textAlign: "center"}}>
<a href="https://www.rpi.edu">
<img src={rpi_logo} style={{maxWidth: "100%"}} alt="Rensselaer"/>
</a>
</Col>
</Row>
</LoginBacking>
</Container>
);
}
Example #24
Source File: page.tsx From website with Apache License 2.0 | 4 votes |
export function Page(): JSX.Element {
const [selectedOptions, setSelectedOptions] = useState<DownloadOptions>(null);
const [previewDisabled, setPreviewDisabled] = useState(false);
const [showPreview, setShowPreview] = useState(false);
const [validationErrors, setValidationErrors] = useState<ValidationErrors>({
incompleteSelectionMessage: "",
maxDate: false,
minDate: false,
});
const [isSvModalOpen, updateSvModalOpen] = useState(false);
const toggleSvModalCallback = () => updateSvModalOpen(!isSvModalOpen);
useEffect(() => {
if (showPreview) {
setPreviewDisabled(true);
}
}, [selectedOptions]);
useEffect(() => {
getOptionsFromURL();
}, []);
if (!selectedOptions) {
return <></>;
}
const getDataButtonText = showPreview ? "Update" : "Preview";
const showInfo =
_.isEmpty(validationErrors.incompleteSelectionMessage) && !showPreview;
return (
// TODO: Try to move the options into a separate component.
<>
<StatVarChooser
statVars={selectedOptions.selectedStatVars}
placeDcid={selectedOptions.selectedPlace.dcid}
enclosedPlaceType={selectedOptions.enclosedPlaceType}
onStatVarSelected={selectSV}
onStatVarRemoved={removeSV}
openSvHierarchyModal={isSvModalOpen}
openSvHierarchyModalCallback={toggleSvModalCallback}
/>
<div id="plot-container">
<h1 className="mb-4">Download Tool</h1>
<div className="download-options-container">
<PlaceSelector
selectedPlace={selectedOptions.selectedPlace}
enclosedPlaceType={selectedOptions.enclosedPlaceType}
onPlaceSelected={(place) =>
setSelectedOptions((prev) => {
return { ...prev, selectedPlace: place, enclosedPlaceType: "" };
})
}
onEnclosedPlaceTypeSelected={(enclosedPlaceType) =>
setSelectedOptions((prev) => {
return { ...prev, enclosedPlaceType };
})
}
>
<div className="download-option-section">
<div className="download-option-label">Date</div>
<div className="download-date-options">
<FormGroup radio="true">
<Label radio="true">
<Input
id="latest-date"
type="radio"
name="date"
defaultChecked={!selectedOptions.dateRange}
onClick={() =>
setSelectedOptions((prev) => {
return { ...prev, dateRange: false };
})
}
/>
Latest Date
</Label>
</FormGroup>
<FormGroup radio="true" className="download-date-range-section">
<Label radio="true" className="download-date-range-container">
<Input
id="date-range"
type="radio"
name="date"
defaultChecked={selectedOptions.dateRange}
onClick={() =>
setSelectedOptions((prev) => {
return { ...prev, dateRange: true };
})
}
/>
Date Range:
</Label>
<div className="download-date-range-input-section">
<div className="download-date-range-input-container">
<div>
<FormGroup>
<Input
className={`download-date-range-input${
validationErrors.minDate ? "-error" : ""
}`}
type="text"
onChange={(e) => {
const date = e.target.value;
setSelectedOptions((prev) => {
return { ...prev, minDate: date };
});
}}
disabled={!selectedOptions.dateRange}
value={selectedOptions.minDate}
onBlur={(e) => validateDate(e.target.value, true)}
/>
</FormGroup>
</div>
<span>to</span>
<div>
<FormGroup>
<Input
className={`download-date-range-input${
validationErrors.maxDate ? "-error" : ""
}`}
type="text"
onChange={(e) => {
const date = e.target.value;
setSelectedOptions((prev) => {
return { ...prev, maxDate: date };
});
}}
disabled={!selectedOptions.dateRange}
value={selectedOptions.maxDate}
onBlur={(e) => validateDate(e.target.value, false)}
/>
</FormGroup>
</div>
</div>
<div
className={`download-date-range-hint${
validationErrors.minDate || validationErrors.maxDate
? "-error"
: ""
}`}
>
YYYY or YYYY-MM or YYYY-MM-DD
</div>
</div>
</FormGroup>
</div>
</div>
<div className="download-option-section">
<div className="download-option-label">Variables</div>
{_.isEmpty(selectedOptions.selectedStatVars) ? (
"None selected"
) : (
<div className="download-sv-chips">
{Object.keys(selectedOptions.selectedStatVars).map((sv) => {
return (
<Chip
key={sv}
id={sv}
title={selectedOptions.selectedStatVars[sv].title || sv}
removeChip={removeSV}
/>
);
})}
</div>
)}
</div>
<Row className="d-lg-none">
<Col>
<Button color="primary" onClick={toggleSvModalCallback}>
Select variable
</Button>
</Col>
</Row>
<Button onClick={onGetDataButtonClicked} color="primary">
{getDataButtonText}
</Button>
</PlaceSelector>
</div>
{!_.isEmpty(validationErrors.incompleteSelectionMessage) && (
<div>{validationErrors.incompleteSelectionMessage}</div>
)}
{showPreview && (
<div>{previewDisabled ? "disabled preview" : "preview"}</div>
)}
{showInfo && <div>info text</div>}
</div>
</>
);
function selectSV(sv: string, svInfo: StatVarInfo): void {
setSelectedOptions((prev) => {
const updatedSV = _.cloneDeep(prev.selectedStatVars);
updatedSV[sv] = svInfo;
return { ...prev, selectedStatVars: updatedSV };
});
}
function removeSV(sv: string): void {
setSelectedOptions((prev) => {
const updatedSV = _.cloneDeep(prev.selectedStatVars);
if (sv in updatedSV) {
delete updatedSV[sv];
}
return { ...prev, selectedStatVars: updatedSV };
});
}
function getOptionsFromURL(): void {
const options = {
dateRange: false,
enclosedPlaceType: "",
maxDate: "",
minDate: "",
selectedPlace: { dcid: "", name: "", types: null },
selectedStatVars: {},
};
if (!window.location.hash) {
setSelectedOptions(options);
}
const urlParams = new URLSearchParams(window.location.hash.split("#")[1]);
const place = urlParams.get(URL_PARAM_KEYS.PLACE);
const placePromise = place
? getNamedTypedPlace(place)
: Promise.resolve({ dcid: "", name: "", types: null });
const statVarsParam = urlParams.get(URL_PARAM_KEYS.STAT_VARS);
const statVarsList = statVarsParam ? statVarsParam.split(SEPARATOR) : [];
const svInfoPromise = !_.isEmpty(statVarsList)
? getStatVarInfo(statVarsList)
: Promise.resolve({});
options.enclosedPlaceType = urlParams.get(URL_PARAM_KEYS.PLACE_TYPE) || "";
options.dateRange =
urlParams.get(URL_PARAM_KEYS.DATE_RANGE) === PARAM_VALUE_TRUE;
options.minDate = urlParams.get(URL_PARAM_KEYS.MIN_DATE) || "";
options.maxDate = urlParams.get(URL_PARAM_KEYS.MAX_DATE) || "";
Promise.all([placePromise, svInfoPromise])
.then(([place, svInfo]) => {
setSelectedOptions({
...options,
selectedPlace: place,
selectedStatVars: svInfo,
});
})
.catch(() => {
const emptySvInfo = {};
statVarsList.forEach((sv) => (emptySvInfo[sv] = {}));
setSelectedOptions({
...options,
selectedPlace: { dcid: place, name: place, types: [] },
selectedStatVars: emptySvInfo,
});
});
}
function updateURL(): void {
const urlParams = new URLSearchParams(window.location.hash.split("#")[1]);
const urlParamVals = {
[URL_PARAM_KEYS.PLACE_TYPE]: selectedOptions.enclosedPlaceType,
[URL_PARAM_KEYS.PLACE]: selectedOptions.selectedPlace
? selectedOptions.selectedPlace.dcid
: "",
[URL_PARAM_KEYS.STAT_VARS]: Object.keys(
selectedOptions.selectedStatVars
).join(SEPARATOR),
[URL_PARAM_KEYS.DATE_RANGE]: selectedOptions.dateRange
? PARAM_VALUE_TRUE
: "",
[URL_PARAM_KEYS.MIN_DATE]: selectedOptions.minDate,
[URL_PARAM_KEYS.MAX_DATE]: selectedOptions.maxDate,
};
for (const key of Object.keys(urlParamVals)) {
const val = urlParamVals[key];
if (_.isEmpty(val)) {
urlParams.delete(key);
} else {
urlParams.set(key, val);
}
}
window.location.hash = urlParams.toString();
}
function validateDate(date: string, isMinDate: boolean): void {
const dateError = !_.isEmpty(date) && !isValidDate(date);
setValidationErrors((prev) => {
return {
...prev,
maxDate: !isMinDate ? dateError : prev.maxDate,
minDate: isMinDate ? dateError : prev.minDate,
};
});
}
function onGetDataButtonClicked(): void {
let incompleteSelectionMessage = "";
if (selectedOptions.dateRange) {
if (
(!_.isEmpty(selectedOptions.minDate) &&
!isValidDate(selectedOptions.minDate)) ||
(!_.isEmpty(selectedOptions.maxDate) &&
!isValidDate(selectedOptions.maxDate))
) {
incompleteSelectionMessage = "Invalid dates entered.";
}
}
if (
_.isEmpty(selectedOptions.selectedStatVars) ||
_.isEmpty(selectedOptions.selectedPlace) ||
_.isEmpty(selectedOptions.enclosedPlaceType)
) {
incompleteSelectionMessage =
"Please select a place, place type, and at least one variable.";
}
setValidationErrors((prev) => {
return { ...prev, incompleteSelectionMessage };
});
if (!_.isEmpty(incompleteSelectionMessage)) {
return;
}
setShowPreview(true);
setPreviewDisabled(false);
updateURL();
}
}
Example #25
Source File: ClientSettings.tsx From TutorBase with MIT License | 4 votes |
ClientSettings = () => {
let clientData = useSelector(selectClientData);
let dispatch = useDispatch();
let [nameModalOpen, setNameModalOpen] = useState<boolean>(false);
let [imgModalOpen, setImgModalOpen] = useState<boolean>(false);
let [tempName, setTempName] = useState<Name>({
first_name: "",
last_name: ""
});
let [clientName, setClientName] = useState<Name>({
first_name: "",
last_name: ""
});
let [croppedImg, setCroppedImg] = useState<string>("");
let [clientImg, setClientImg] = useState<string>("");
const saveNameChange = async () => {
let name: Name = {first_name: tempName.first_name, last_name: tempName.last_name};
await api.SetClientName(name, clientData.clientId);
setClientName(name);
dispatch(clientDataActions.setFirstName(tempName.first_name));
dispatch(clientDataActions.setLastName(tempName.last_name));
setNameModalOpen(false);
}
const handleImageSave = async (img: string) => {
await api.SetClientProfileImage(img, clientData.clientId);
setClientImg(img);
dispatch(clientDataActions.setProfileImage(img));
}
const saveImgChange = async () => {
if(croppedImg.toString() !== "") {
CompressAndSaveImg(croppedImg, clientData.first_name + clientData.last_name + "-photo", handleImageSave);
} else {
handleImageSave(croppedImg);
}
setImgModalOpen(false);
}
const cancelNameChange = () => {
setNameModalOpen(false);
setTempName(clientName);
}
const cancelImgChange = () => {
setCroppedImg("");
setImgModalOpen(false);
}
useEffect(() => {
const getUser = async () => {
return (await api.GetUserById(clientData.clientId)).data;
}
getUser().then(value => {
setTempName({first_name: value[0].first_name, last_name: value[0].last_name});
setClientName({first_name: value[0].first_name, last_name: value[0].last_name});
setClientImg(value[0].profile_img);
dispatch(clientDataActions.setFirstName(value[0].first_name));
dispatch(clientDataActions.setLastName(value[0].last_name));
dispatch(clientDataActions.setProfileImage(value[0].profile_img));
});
}, [clientData.clientId, dispatch]);
return (
<Container className="settings" fluid>
<Row className="title" style={{ marginTop: '25px'}}>
<div className="profile-text">Settings</div>
</Row>
<hr></hr>
<Row>
<ListGroup>
<ListGroupItem className="img-item">
<img src={clientImg === "" ? defaultUser : clientImg} width="200px"/>
<a href="#" className="modal-link" onClick={() => setImgModalOpen(true)}>
<span className="heading-item"><FontAwesomeIcon icon={faEdit} className="font-adj"/></span>
</a>
<Modal isOpen={imgModalOpen} fade={false} toggle={() => {setImgModalOpen(!imgModalOpen)}} className="img-modal">
<ModalHeader toggle={() => {cancelImgChange()}}>Edit Profile Photo</ModalHeader>
<ModalBody>
Change your profile photo here.
<hr/>
<Avatar
width={250}
height={250}
cropColor="#E66064"
closeIconColor="#E66064"
onCrop={(img) => setCroppedImg(img)}
onClose={() => {setCroppedImg("")}}
onBeforeFileLoad={() => {}}
src={clientImg === "" ? defaultUser : clientImg}
/>
</ModalBody>
<ModalFooter>
<Button className="btn-red" onClick={() => {saveImgChange()}}>Save</Button>
<Button color="secondary" onClick={() => {cancelImgChange()}}>Cancel</Button>
</ModalFooter>
</Modal>
</ListGroupItem>
<ListGroupItem className="name-item">
<span className="heading-item">{clientName.first_name} {clientName.last_name}</span>
<a href="#" className="modal-link" onClick={() => {setNameModalOpen(true)}}>
<span className="heading-item"><FontAwesomeIcon icon={faEdit} className="font-adj"/></span>
</a>
<Modal isOpen={nameModalOpen} fade={false} toggle={() => {setNameModalOpen(!nameModalOpen)}} className="name-modal">
<ModalHeader toggle={() => {cancelNameChange()}}>Edit Name</ModalHeader>
<ModalBody>
Change your name here.
<hr/>
<InputGroup>
First Name:<Input id="first-name" value={tempName.first_name} onChange={(value) => setTempName({first_name: value.target.value, last_name: tempName.last_name})} />
</InputGroup>
<InputGroup>
Last Name:<Input id="last-name" value={tempName.last_name} onChange={(value) => setTempName({first_name: tempName.first_name, last_name: value.target.value})} />
</InputGroup>
</ModalBody>
<ModalFooter>
<Button className="btn-red" onClick={() => {saveNameChange()}}>Save</Button>
<Button color="secondary" onClick={() => {cancelNameChange()}}>Cancel</Button>
</ModalFooter>
</Modal>
</ListGroupItem>
</ListGroup>
</Row>
</Container>
);
}
Example #26
Source File: page.tsx From website with Apache License 2.0 | 4 votes |
render(): JSX.Element {
const numPlaces = Object.keys(this.state.placeName).length;
const numStatVarInfo = Object.keys(this.state.statVarInfo).length;
const namedPlaces: NamedPlace[] = [];
for (const place in this.state.placeName) {
namedPlaces.push({ dcid: place, name: this.state.placeName[place] });
}
const statVarTokens = Array.from(
getTokensFromUrl(TIMELINE_URL_PARAM_KEYS.STAT_VAR, statVarSep)
);
const statVars = statVarTokens.map((sv) =>
sv.includes("|") ? sv.split("|")[0] : sv
);
const deselectSVs = (svList: string[]) => {
const availableSVs = statVars.filter((sv) => svList.indexOf(sv) === -1);
const statVarTokenInfo = {
name: TIMELINE_URL_PARAM_KEYS.STAT_VAR,
sep: statVarSep,
tokens: new Set(availableSVs),
};
setTokensToUrl([statVarTokenInfo]);
};
const svToSvInfo = {};
for (const sv of statVars) {
svToSvInfo[sv] =
sv in this.state.statVarInfo ? this.state.statVarInfo[sv] : {};
}
return (
<>
<StatVarWidget
openSvHierarchyModal={this.state.showSvHierarchyModal}
openSvHierarchyModalCallback={this.toggleSvHierarchyModal}
collapsible={true}
svHierarchyType={StatVarHierarchyType.SCATTER}
samplePlaces={namedPlaces}
deselectSVs={deselectSVs}
selectedSVs={svToSvInfo}
selectSV={(sv) =>
addToken(TIMELINE_URL_PARAM_KEYS.STAT_VAR, statVarSep, sv)
}
/>
<div id="plot-container">
<Container fluid={true}>
{numPlaces === 0 && <h1 className="mb-4">Timelines Explorer</h1>}
<Card id="place-search">
<Row>
<Col sm={12}>
<p>Select places:</p>
</Col>
<Col sm={12}>
<SearchBar
places={this.state.placeName}
addPlace={(place) =>
addToken(TIMELINE_URL_PARAM_KEYS.PLACE, placeSep, place)
}
removePlace={(place) => {
removeToken(
TIMELINE_URL_PARAM_KEYS.PLACE,
placeSep,
place
);
}}
/>
</Col>
</Row>
<Row className="d-lg-none">
<Col>
<Button color="primary" onClick={this.toggleSvHierarchyModal}>
Select variables
</Button>
</Col>
</Row>
</Card>
{numPlaces === 0 && <Info />}
{numPlaces !== 0 && numStatVarInfo !== 0 && (
<div id="chart-region">
<ChartRegion
placeName={this.state.placeName}
statVarInfo={this.state.statVarInfo}
statVarOrder={statVars}
></ChartRegion>
</div>
)}
</Container>
</div>
</>
);
}
Example #27
Source File: ConfirmationDetails.tsx From reference-merchant with Apache License 2.0 | 4 votes |
function ConfirmationDetails({ orderId }: OrderDetailsProps) {
const { t } = useTranslation(["order", "layout"]);
const [order, setOrder] = useState<Order | undefined | null>();
useEffect(() => {
let isOutdated = false;
const fetchOrder = async () => {
try {
const fetched = await new BackendClient().getOrderDetails(orderId);
if (!isOutdated) {
setOrder(fetched);
}
} catch (e) {
console.error("Unexpected error", e);
}
};
// noinspection JSIgnoredPromiseFromCall
fetchOrder();
return () => {
isOutdated = true;
};
}, [orderId]);
const cashOut = async () => {
const client = new BackendClient();
await client.payout(order!.vaspPaymentRef);
const fetched = await new BackendClient().getOrderDetails(orderId);
if (fetched) {
setOrder(fetched);
}
};
// Show spinner if order is undefined - it is being loaded
let orderInfo = (
<div className="d-flex justify-content-center">
<Spinner color="primary" />
</div>
);
if (order !== undefined) {
if (order === null) {
// There is no order with this ID
orderInfo = (
<Alert color="danger">
<i className="fa fa-close" /> {t("unknown")}
</Alert>
);
} else {
orderInfo = (
<>
<div style={{ display: "flex", alignItems: "center" }}>
<i className="fa fa-check-circle fa-4x" style={{ color: "#59a559" }} />
<div style={{ marginLeft: 20, fontSize: 20, fontWeight: 500, color: "black" }}>
{t("order_on_the_way")}
</div>
</div>
<div className="h5 mt-4 mb-4 font-weight-normal text-body">
{t("got_your_order")} <br />
{t("order_summary")}
</div>
<Row style={{ alignItems: "center" }}>
<Col xs={3}>
<img
src={order.products[0].product.image_url}
width="75"
height="75"
alt={"product image"}
/>
</Col>
<Col>{order.products[0].product.name}</Col>
<Col style={{ textAlign: "right" }}>
{t("qty")}. {order.products[0].quantity}
</Col>
</Row>
<Row className="mt-4">
<Col xs={8}>{t("items_Total")}</Col>
<Col xs={4} style={{ textAlign: "right" }}>
{order.totalPrice / 1000000} XUS
</Col>
</Row>
<Row className="mt-1">
<Col xs={9}>{t("shipping")}</Col>
<Col xs={3} className="pl-2">
{t("free")}
</Col>
</Row>
<Row className="mt-1">
<Col xs={9}>{t("duties_taxes")}</Col>
<Col xs={3} className="pl-2">
{t("free")}
</Col>
</Row>
<Row className="mt-1">
<Col xs={8} className="font-weight-bold">
{t("total_order")}
</Col>
<Col xs={4} style={{ textAlign: "right" }} className="font-weight-bold">
{order.totalPrice / 1000000} XUS
</Col>
</Row>
</>
);
}
}
return (
<>
<TestnetWarning />
<Container className="container-very-narrow pt-5">
<div className="text-center">
<div className="h2">{t("layout:name")}</div>
</div>
<div className="d-flex flex-column justify-content-center m-3">{orderInfo}</div>
</Container>
</>
);
}
Example #28
Source File: SeqViewSettings.tsx From nextclade with MIT License | 4 votes |
export function SeqViewSettings() {
const { t } = useTranslationSafe()
const [maxNucMarkers, setMaxNucMarkers] = useRecoilStateDeferred(maxNucMarkersAtom)
const [seqMarkerMissingHeightState, setSeqMarkerMissingHeightState] = useSeqMarkerState(
seqMarkerMissingHeightStateAtom,
)
const [seqMarkerGapHeightState, setSeqMarkerGapHeightState] = useSeqMarkerState(seqMarkerGapHeightStateAtom)
const [seqMarkerMutationHeightState, setSeqMarkerMutationHeightState] = useSeqMarkerState(
seqMarkerMutationHeightStateAtom,
)
const [seqMarkerUnsequencedHeightState, setSeqMarkerUnsequencedHeightState] = useSeqMarkerState(
seqMarkerUnsequencedHeightStateAtom,
)
return (
<Container fluid>
<Row noGutters>
<Col>
<Form>
<NumericField
identifier="max-nuc-markers"
label={t('Maximum number of nucleotide sequence view markers')}
title={t(
'Sets threshold on maximum number of markers (mutations, deletions etc.) to display in nucleotide views. Reducing this number increases performance. If the threshold is reached, then the nucleotide sequence view will be disabled.',
)}
min={0}
max={1_000_000}
value={maxNucMarkers}
onValueChanged={setMaxNucMarkers}
/>
<FormGroup>
{t('Missing')}
<Multitoggle
values={SEQ_MARKER_HEIGHT_STATES}
value={seqMarkerMissingHeightState}
onChange={setSeqMarkerMissingHeightState}
/>
</FormGroup>
<FormGroup>
<Label>
{t('Gaps')}
<Multitoggle
values={SEQ_MARKER_HEIGHT_STATES}
value={seqMarkerGapHeightState}
onChange={setSeqMarkerGapHeightState}
/>
</Label>
</FormGroup>
<FormGroup>
<Label>
{t('Mutations')}
<Multitoggle
values={SEQ_MARKER_HEIGHT_STATES}
value={seqMarkerMutationHeightState}
onChange={setSeqMarkerMutationHeightState}
/>
</Label>
</FormGroup>
<FormGroup>
<Label>
{t('Unsequenced')}
<Multitoggle
values={SEQ_MARKER_HEIGHT_STATES}
value={seqMarkerUnsequencedHeightState}
onChange={setSeqMarkerUnsequencedHeightState}
/>
</Label>
</FormGroup>
</Form>
</Col>
</Row>
</Container>
)
}
Example #29
Source File: DiemCheckout.tsx From reference-merchant with Apache License 2.0 | 4 votes |
export default function DiemCheckout({ paymentId, orderId, demoMode }: DiemCheckoutProps) {
const [paymentOptions, setPaymentOptions] = useState<
PaymentOptions | undefined
>();
const [selectedOption, setSelectedOption] = useState(0);
const [chooseWallet, setChooseWallet] = useState(true);
useEffect(() => {
let isOutdated = false;
const fetchOrder = async () => {
try {
const fetched = await new Vasp().getPaymentOptions(paymentId);
if (!isOutdated) {
setPaymentOptions(fetched);
}
} catch (e) {
console.error("Unexpected error", e);
}
};
// noinspection JSIgnoredPromiseFromCall
fetchOrder();
return () => {
isOutdated = true;
};
}, [paymentId]);
const onCurrencyClick = (index: number) => setSelectedOption(index);
if (!paymentOptions) {
return <div>Loading...</div>;
}
const handleClick = () => {
setChooseWallet(false)
}
return (
<>
<div className="w-100">
<Row>
<Col className="text-nowrap text-right">Total price:</Col>
<Col className="d-flex align-items-center">
<span className="text-nowrap">
{fiatToHumanFriendly(paymentOptions.fiatPrice)}{" "}
{paymentOptions.fiatCurrency}
</span>
<FontAwesomeIcon size="xs" icon={faQuestionCircle} className="ml-2" id="totalPriceHelp" />
<UncontrolledTooltip target="totalPriceHelp">
The price in fiat set by the merchant
</UncontrolledTooltip>
</Col>
</Row>
<Row>
<Col className="text-nowrap text-right align-self-center">
Payment currency:
</Col>
<Col className="d-flex align-items-center">
<UncontrolledDropdown>
<DropdownToggle caret color="outline-dark" className="py-0 px-2">
{paymentOptions.options[selectedOption].currency}
</DropdownToggle>
<DropdownMenu>
{paymentOptions.options.map((op, i) => (
<DropdownItem
key={op.currency}
onClick={() => onCurrencyClick(i)}
>
{op.currency}
</DropdownItem>
))}
</DropdownMenu>
</UncontrolledDropdown>
<FontAwesomeIcon size="xs" icon={faQuestionCircle} className="ml-2" id="currencyHelp" />
<UncontrolledTooltip target="currencyHelp">
Please select a Diem currency
</UncontrolledTooltip>
</Col>
</Row>
<Row>
<Col className="text-nowrap text-right">Total to pay:</Col>
<Col className="d-flex align-items-center">
<span className="text-nowrap">
{diemToHumanFriendly(
paymentOptions.options[selectedOption].amount
)}{" "}
{paymentOptions.options[selectedOption].currency}
</span>
<FontAwesomeIcon size="xs" icon={faQuestionCircle} className="ml-2" id="totalToPayHelp" />
<UncontrolledTooltip target="totalToPayHelp">
The amount you will be changed in Diem
</UncontrolledTooltip>
</Col>
</Row>
</div>
<div>
{!chooseWallet ? (
<>
<QRCode
className="img-fluid mt-4"
size={192}
value={paymentOptions.options[selectedOption].paymentLink}
imageSettings={{
src: require("../logo.svg"),
height: 32,
width: 32,
excavate: true,
}}
/>
<div className="text-center small py-4 font-weight-bold">
- OR -
</div>
<div className="text-center">
<Button color="primary" size="sm" onClick={() => setChooseWallet(true)}>
Open in Diem wallet
</Button>
</div>
</>
) : (
<>
<div className="mt-4">
<div className="text-center">Choose your wallet:</div>
<PayWithDiem
paymentInfo={paymentOptions}
orderId={orderId}
demoMode={demoMode}
/>
</div>
<div className="text-center small py-4 font-weight-bold">
- OR -
</div>
<div className="text-center">
<Button color="primary" size="sm" onClick={()=>handleClick()}>
Scan QR
</Button>
</div>
</>
)}
</div>
</>
);
}