let AppCard = ({ app, icon, }) => { let canBrowse = app.serverInfo.error ? null : () => history.push(html`/apps/${app.slug}/browser`); let versionMessage = app.serverInfo.error ? <div className={styles.serverVersion}>Server not reachable: <span className={styles.ago}>{app.serverInfo.error.toString()}</span></div>: <div className={styles.serverVersion}> Server URL: <span className={styles.ago}>{app.serverURL || 'unknown'}</span> Server version: <span className={styles.ago}>{app.serverInfo.parseServerVersion || 'unknown'}</span> </div>; return <li onClick={canBrowse}> <a className={styles.icon}> {icon ? <img src={'appicons/' + icon} width={56} height={56}/> : <Icon width={56} height={56} name='blank-app-outline' fill='#1E384D' />} </a> <div className={styles.details}> <a className={styles.appname}>{app.name}</a> {versionMessage} </div> <CountsSection className={styles.glance} title='At a glance'> <AppBadge production={app.production} /> <Metric number={dash(app.users, prettyNumber(app.users))} label='total users' /> <Metric number={dash(app.installations, prettyNumber(app.installations))} label='total installations' /> </CountsSection> </li> }
let StatusBar = ({ errorMessage, rowsMigrated, classesMigrated, migrationSpeed, secondsRemainingStr, detailsVisible, }) => { let classes = [styles.statusBar, detailsVisible ? styles.statusBottomCorners : '']; if (errorMessage) { classes.push(styles.migrationStatusError); return <div className={classes.join(' ')}>{errorMessage}</div> } return <div className={classes.join(' ')}> <StatusBarNote note='Rows Migrated: ' value={prettyNumber(rowsMigrated)} /> <StatusBarNote note='Classes Migrated: ' value={prettyNumber(classesMigrated)} /> <StatusBarNote note='Speed: ' value={prettyNumber(migrationSpeed) + ' rows/s'} /> <StatusBarNote note='ETA: ' value={secondsRemainingStr} /> </div> }
{labels.map((v, i) => <div key={v} className={styles.label} style={{ top: labelHeights[i] }}>{prettyNumber(v)}</div>)}