BasicInfo.tsx 5.19 KB
Newer Older
1
2
3
import React, { useState, useCallback } from 'react';
import { Stack, Callout, Link, IconButton } from '@fluentui/react';
import { useId } from '@uifabric/react-hooks';
Lijiaoa's avatar
Lijiaoa committed
4
5
6
7
import { EXPERIMENT } from '@static/datamodel';
import { formatTimestamp } from '@static/function';
import LogPanel from '@components/nav/slideNav/LogPanel';
import { BestMetricContext } from '../Overview';
8
import { styles } from './basicInfoStyles';
Lijiaoa's avatar
Lijiaoa committed
9
10
import '@style/common/experimentStatusColor.scss';
import '@style/experiment/overview/basic.scss';
11

12
export const BasicInfo = (): any => {
13
14
15
16
    const labelId: string = useId('callout-label');
    const descriptionId: string = useId('callout-description');
    const ref = React.createRef<HTMLDivElement>();
    const [isCalloutVisible, setCalloutVisible] = useState(false);
Lijiaoa's avatar
Lijiaoa committed
17
    const [isShowLogPanel, setShowLogPanel] = useState(false);
18
19
20
    const onDismiss = useCallback(() => setCalloutVisible(false), []);
    const showCallout = useCallback(() => setCalloutVisible(true), []);

Lijiaoa's avatar
Lijiaoa committed
21
22
    const closeLogPanel = useCallback(() => setShowLogPanel(false), []);
    const ShowLogPanel = useCallback(() => setShowLogPanel(true), []);
23
24
25

    return (
        <div>
26
            <Stack horizontal horizontalAlign='space-between' className='marginTop'>
Lijiaoa's avatar
Lijiaoa committed
27
28
                <div className='basic'>
                    <p>Name</p>
29
                    <div className='ellipsis'>{EXPERIMENT.profile.params.experimentName || '--'}</div>
30
                    <p className='marginTop'>ID</p>
31
                    <div className='ellipsis'>{EXPERIMENT.profile.id}</div>
Lijiaoa's avatar
Lijiaoa committed
32
33
34
35
36
37
38
                </div>
                <div className='basic'>
                    <p>Status</p>
                    <Stack horizontal className='status'>
                        <span className={`${EXPERIMENT.status} status-text`}>{EXPERIMENT.status}</span>
                        {EXPERIMENT.status === 'ERROR' ? (
                            <div>
39
                                <div className={`${styles.buttonArea} error-info-icon`} ref={ref}>
Lijiaoa's avatar
Lijiaoa committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
                                    <IconButton
                                        iconProps={{ iconName: 'info' }}
                                        onClick={isCalloutVisible ? onDismiss : showCallout}
                                    />
                                </div>
                                {isCalloutVisible && (
                                    <Callout
                                        className={styles.callout}
                                        ariaLabelledBy={labelId}
                                        ariaDescribedBy={descriptionId}
                                        role='alertdialog'
                                        gapSpace={0}
                                        target={ref}
                                        onDismiss={onDismiss}
                                        setInitialFocus={true}
                                    >
Lijiaoa's avatar
Lijiaoa committed
56
57
                                        <div className={`${styles.header} font`}>
                                            <p className={`${styles.title} color333`} id={labelId}>
Lijiaoa's avatar
Lijiaoa committed
58
59
60
                                                Error
                                            </p>
                                        </div>
Lijiaoa's avatar
Lijiaoa committed
61
62
                                        <div className={`${styles.inner} font`}>
                                            <p className={`${styles.subtext} color333`} id={descriptionId}>
Lijiaoa's avatar
Lijiaoa committed
63
64
65
                                                {EXPERIMENT.error}
                                            </p>
                                            <div className={styles.actions}>
Lijiaoa's avatar
Lijiaoa committed
66
                                                <Link className={styles.link} onClick={ShowLogPanel}>
Lijiaoa's avatar
Lijiaoa committed
67
                                                    Learn more
Lijiaoa's avatar
Lijiaoa committed
68
69
                                                </Link>
                                            </div>
70
                                        </div>
Lijiaoa's avatar
Lijiaoa committed
71
72
                                    </Callout>
                                )}
73
                            </div>
Lijiaoa's avatar
Lijiaoa committed
74
75
76
77
78
                        ) : null}
                    </Stack>
                    <BestMetricContext.Consumer>
                        {(value): React.ReactNode => (
                            <Stack className='bestMetric'>
79
                                <p className='marginTop'>Best metric</p>
Lijiaoa's avatar
Lijiaoa committed
80
81
82
83
84
85
86
87
88
                                <div className={EXPERIMENT.status}>
                                    {isNaN(value.bestAccuracy) ? 'N/A' : value.bestAccuracy.toFixed(6)}
                                </div>
                            </Stack>
                        )}
                    </BestMetricContext.Consumer>
                </div>
                <div className='basic'>
                    <p>Start time</p>
89
                    <div className='ellipsis'>{formatTimestamp(EXPERIMENT.profile.startTime)}</div>
90
                    <p className='marginTop'>End time</p>
91
                    <div className='ellipsis'>{formatTimestamp(EXPERIMENT.profile.endTime)}</div>
Lijiaoa's avatar
Lijiaoa committed
92
93
                </div>
            </Stack>
94
            {/* learn about click -> default active key is dispatcher. */}
Lijiaoa's avatar
Lijiaoa committed
95
            {isShowLogPanel ? <LogPanel closePanel={closeLogPanel} activeTab='dispatcher' /> : null}
96
97
98
        </div>
    );
};