forked from jbms/beancount-import
-
Notifications
You must be signed in to change notification settings - Fork 0
/
journal_errors.tsx
118 lines (108 loc) · 3.03 KB
/
journal_errors.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import * as React from "react";
import styled from "styled-components";
import { JournalError } from "./server_connection";
import {
AssociatedDataViewController,
AssociatedDataViewContext,
CommonJournalPrefixContext
} from "./app";
import {
ServerVirtualListComponent,
ServerVirtualListState
} from "./server_virtual_list";
class ErrorsVirtualListComponent extends ServerVirtualListComponent<
JournalError
> {}
const JournalErrorList = styled(ErrorsVirtualListComponent)`
overflow-y: scroll;
flex: 1;
`;
const JournalErrorElement = styled.div`
cursor: pointer;
padding: 12px 8px;
border-bottom: 1px solid var(--color-main-accent);
min-width: 100%;
box-sizing: border-box;
:hover {
background-color: var(--color-hover-bg);
color: var(--color-hover-text);
}
`;
const JournalErrorMessage = styled.div`
line-height: 1.4;
`;
const JournalErrorSource = styled.div`
font-size: var(--font-size-sans-small);
border-top: 1px solid var(--color-main-accent);
margin: 6px 0 2px;
padding: 6px 0 0px;
white-space: nowrap;
`;
interface JournalErrorsComponentProps {
listState: ServerVirtualListState<JournalError>;
}
export class JournalErrorComponent extends React.PureComponent<{
error: JournalError;
associatedDataViewController: AssociatedDataViewController;
commonJournalPrefix: string;
}> {
render() {
const { error, commonJournalPrefix } = this.props;
const [severity, message, meta] = error;
const { filename, lineno } = meta;
return (
<JournalErrorElement onClick={this.handleErrorClick}>
<JournalErrorMessage>
<strong>{severity}</strong>:<br />
{message}
</JournalErrorMessage>
{filename && (
<JournalErrorSource>
<em>File:</em> {filename.substring(commonJournalPrefix.length)}
{lineno !== undefined && `:${lineno}`}
</JournalErrorSource>
)}
</JournalErrorElement>
);
}
private handleErrorClick = (event: React.MouseEvent<HTMLElement>) => {
const index = parseInt(event.currentTarget.dataset.index!);
this.props.associatedDataViewController.selectFileByMeta(
this.props.error[2]
);
};
}
export class JournalErrorsComponent extends React.PureComponent<
JournalErrorsComponentProps
> {
private renderItem(
entry: JournalError,
index: number,
ref: React.RefObject<any>
) {
return (
<AssociatedDataViewContext.Consumer key={index}>
{dataViewController => (
<CommonJournalPrefixContext.Consumer>
{commonJournalPrefix => (
<JournalErrorComponent
ref={ref}
error={entry}
associatedDataViewController={dataViewController}
commonJournalPrefix={commonJournalPrefix}
/>
)}
</CommonJournalPrefixContext.Consumer>
)}
</AssociatedDataViewContext.Consumer>
);
}
render() {
return (
<JournalErrorList
listState={this.props.listState}
renderItem={this.renderItem}
/>
);
}
}